사용자 정의 Repository Best Practice 사용자 정의 Repository를 만들 때 가장 좋은 방법을 소개합니다. 일반적으로 사용자 정의 Repository라고 함은, JpaRepository를 상속해서 쿼리 메서드를 이용하는 것이 아니라 구현체에서 직접 JPA를 사용하거나 MyBatis, JdbcTemplate, QueryDSL 등을 이용해 구현한 것을 말합니다. 상대적으로(?) 나쁜 예시 Entity가 Member, Team이 존재하고 Member는 JpaRepository를 사용하고 Team은 사용자 정의 Repository를 사용한다고 가정하면 그냥 구현해도 상관없습니다. 하지만 MemberRepository가 존재하는데 CustomMemberRepository를 따로 만들어서 S..
모든 소스 코드는 여기에서 확인 가능합니다. Hint SQL에서 Hint를 사용하듯이 JPA에서도 JPA 구현체에 힌트를 전달할 수 있습니다. 조회만 사용하기(Read Only) 기본적으로 JPA를 이용해 데이터를 조회하게되면 영속성 컨텍스트에 저장되어 관리되고, 그 값을 수정한 뒤 flush()하거나 dirty checking이 발생하면 업데이트 쿼리도 발생하게 됩니다. Hint를 사용하여 영속성 컨텍스트에 저장되는 것을 방지해 메모리 낭비를 막고 혹시 모를 변경사항에 대해 업데이트되지 않도록 할 수 있습니다. 먼저 Repository에 이름으로 사용자를 조회하는 메서드를 추가합니다. package io.lcalmsky.springdatajpa.domain.repository; import io.lca..
모든 소스 코드는 여기에서 확인 가능합니다. Fetch Join과 @GraphEntity를 소개하기 전에 JPA를 사용하다보면 겪을 수 있는 사례 하나를 소개합니다. Member Entity와 Team Entity가 다대일 관계(@ManyToOne) 일 때 Entity 클래스에 서로의 관계를 표시해줍니다. Entity간 연관관계가 있고 JPA를 이용하여 조회해야 하는 상황에서는 되도록이면 FetchType.LAZY 사용을 권장합니다. 관계 파악을 위해 소스 코드를 살펴봅시다. (설명에 필요 없는 import문 등은 생략하였습니다.) @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString public class Member ..
모든 소스 코드는 여기에서 확인 가능합니다. JPA는 보통 데이터를 가져와서 변경하면 변경 감지(dirty checking)를 통해 DB에 업데이트 퀴리를 수행합니다. 이런 업데이트들은 건 별로 select 이후 update가 이루어지기 때문에 수천 건을 업데이트 해야하는 경우 비효율적일 수 있습니다. JPA를 사용해서도 수 천, 수 만 건의 데이터를 한 번에 업데이트 하는 벌크 업데이트(Bulk Update)쿼리를 사용할 수 있습니다. @Modifying 애너테이션 벌크 업데이트를 하기 위해선 @Query와 함께 @Modifying 애너테이션을 사용해야 합니다. 나이가 N살 이상인 전체 회원의 나이를 1씩 증가시켜야 한다는 요구사항이 존재한다고 가정하고 이를 구현한 소스 코드 입니다. package i..
모든 소스 코드는 여기에서 확인 가능합니다. 그동안 API에서 페이징 처리를 위해 page와 size를 받아 공식을 계산해서 SQL문을 수정해보신 경험이 있을 겁니다. 스프링 데이터 JPA는 매우 편리하게 표준화된 페이징 및 정렬 방식을 제공합니다. 페이징과 정렬 파라미터 org.springframework.data.domain.Sort: 정렬 인터페이스 org.springframework.data.domain.Pageable: 페이징 인터페이스(내부에 Sort 포함) 반환 타입 org.springframework.data.domain.Page: total count를 포함하는 페이징 결과 타입, count 쿼리를 추가로 수행 org.springframework.data.domain.Slice: tota..
모든 소스 코드는 여기에서 확인 가능합니다. 스프링 데이터 JPA를 사용하면 기본 인터페이스 외에도 메서드 추가 만으로 직접 구현체를 구현하지 않아도 기능을 사용할 수 있습니다. 쿼리 메서드 기능 메서드 이름으로 쿼리 생성 메서드 이름을 분석하여 JPQL 쿼리를 수행합니다. package io.lcalmsky.springdatajpa.domain.entity; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString; import javax.persistence.*; @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTE..
자바의 ORM 표준 기술로 애플리케이션과 JDBC API 사이의 인터페이스 역할을 합니다. 여기서 ORM(Object-Relational Mapping)은 객체와 관계형 데이터베이스 간의 매핑을 말합니다. ORM 프레임워크가 해당 기능을 제공합니다. 즉, ORM 프레임워크를 이용하면 자바 컬렉션을 사용하듯이 데이터베이스의 데이터를 다룰 수 있습니다. ORM 프레임워크는 Entity라고 부르는 객체를 분석하여 SQL문을 생성하고 JDBC API를 사용하여 데이터베이스와 연동합니다. 단순히 연동만 하는 것이 아니라 앞서 다뤘던 문제들(이전 포스팅 참조, SQL의 문제점, 객체와 데이터베이스의 체계와 한계)을 극복할 수 있게 해줍니다. 따라서 보다 정교한 모델링을 각각의 환경에 맞게 할 수 있습니다. 한마디로..
객체지향 프로그래밍은 추상화, 캡슐화, 상속, 다형성 등 복잡성을 제어하기 위한 다양한 방법을 제공합니다. 그래서 대부분 큰 시스템을 구축한 곳에서는 객체지향 언어를 채택하여 개발하고 있습니다. 애플리케이션에서 사용하는 도메인 모델을 객체로 정의하게 되면 위와 같은 객체지향 프로그래밍의 장점을 활용할 수 있습니다. 객체를 정의하여 인스턴스화 하더라도 이는 메모리에 상주하기 때문에 애플리케이션이 종료하는 시점에 같이 사라지게 됩니다. 따라서 이 메모리에 상주시킬 데이터를 영구적으로 보관하기 위한 장소가 필요합니다. 객체는 속성과 기능을 가지는데 기능은 이미 클래스에 정의되어 있으므로 속성만 영구적인 보관 장소에서 불러와 인스턴스화 시키면 속성과 기능을 모두 사용할 수 있는 상태가 됩니다. 이때 영구적인 보..
제목을 편의상 SQL의 문제점이라고 적었습니다만 소스코드에서 직접 SQL을 다룰 때 발생하는 문제에 대해 이야기해보려고 합니다. 자바로 개발하는 대부분의 애플리케이션에서는 관계형 데이터베이스를 저장소로 사용합니다. 데이터 관리를 위해선 SQL을 사용해야 하고 이는 자바 개발자에게는 매우 익숙한 환경 & 상황이라고 할 수 있습니다. 1. 필연적인 반복 자바 애플리케이션에서 JDBC API를 이용하여 데이터베이스와 연동하기 위해서는 수많은 반복을 필요로 합니다. CRUD를 위한 API를 만드는 작업과 조회한 결과를 매핑하는 작업 등이 이에 해당합니다. 간단히 예를 들어보겠습니다. 축덕인 저는 축구 선수들의 스탯을 기록하는 player라는 테이블을 생성하였습니다. package io.lcalmsky.jpa.j..
JPA는 데이터베이스 기술보다는 데이터를 객체지향 관점으로 관리할 수 있는 객체지향 기술로 전 세계 스프링 개발자들이 가장 많이 사용하는 데이터 처리 기술입니다. 보통 JPA를 처음 접한 개발자들은 여느 다른 프레임워크와 마찬가지로 '와! 이런 걸 어떻게 생각해냈지?'라는 생각을 하게 될 것입니다. 기존의 JDBC API부터 JdbcTemplate, iBatis, myBatis에 이르기까지 점점 편리해졌다고는 하지만 약간의 노가다(?)가 포함된 작업들을 해왔던 개발자들에게는 하나의 단비와도 같은 기술이라고 할 수 있겠습니다. 자바 ORM 표준인 JPA는 SQL 작성 없이 객체를 데이터베이스에 직접 저장할 수 있게 도와주고, 객체와 관계형 데이터베이스를 매핑해줍니다. JPA를 도입하게되면 개발 생산성, 유..
- Total
- Today
- Yesterday
- Linux
- intellij
- 헥사고날 아키텍처
- proto3
- gRPC
- 스프링 부트 회원 가입
- 스프링 부트 튜토리얼
- Spring Data JPA
- 함께 자라기
- spring boot application
- QueryDSL
- Java
- Spring Boot Tutorial
- 클린 아키텍처
- 스프링 부트
- leetcode
- Jackson
- 알고리즘
- spring boot app
- r
- 함께 자라기 후기
- Spring Boot
- Spring Boot JPA
- spring boot jwt
- JSON
- 스프링 부트 애플리케이션
- JPA
- 스프링 데이터 jpa
- @ManyToOne
- 스프링부트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |