본문 바로가기

Back-end/JPA

(9)
[JPA] MapStruct DTO <-> Entity MapStruct는 Entity와 Dto 간에 변환할 때 자동으로 매핑시켜 변환되도록 도와주는 라이브러리입니다. MapStruct는 구성 접근법에 대한 규약에 근거하여 Java Bean 종류 간의 매핑 구현을 크게 단순화한 code generator 입니다. Entity와 Dto 간의 매핑을 위해 getter / setter 를 남발하며 직접 구현하는 것을 지원하는 라이브러리는 크게 ModelMapper와 MapStruct가 있습니다. MapStruct는 컴파일 시 미리 생성된 구현체를 통해 Mapping 하기 때문에 속도적인 측면에서 이점이 있어 채택하게 되었습니다. MapStruct가 ModelMapper 보다 장점이라고 생각되는 것 매핑 속도가 빠름 명시적임 (변수들이 어떻게 매핑되는지 확인 가능)..
[JPA] 복합 기본키 설정 복합 기본 키 JPA에서 복합 기본 키를 사용하려면 별도의 식별자 클래스를 만들어야 한다. 그리고 엔티티에 @IdClass를 사용해서 식별자 클래스를 지정하면 된다. 복합 키는 별도의 식별자 클래스로 만들어야 한다. Serializable을 구현해야 한다. equals와 hashCode 메소드를 구현해야 한다. 기본 생성자가 있어야 한다. 식별자 클래스는 public이어야 한다. @IdClass를 사용하는 방법 외에 @EmbeddedId를 사용하는 방법도 있다 IDClassScheduleAttendanceTransaction.java 파일 생성 @Builder @NoArgsConstructor public class IDClassScheduleAttendanceTransaction implements S..
[JPA] 더티 체킹(Dirty Checking) 이란? 더티 체킹(Dirty Checking) 이란? 더티 체킹은 Transaction 안에서 엔티티의 변경이 일어나면, 변경 내용을 자동으로 데이터베이스에 반영하는 JPA 특징입니다. Dirty Checking의 뜻은 변경 감지 정도로 생각할 수 있습니다. 변경을 감지해서 DB에 반영합니다. 데이터베이스에 변경 데이터를 저장하는 시점 1. Transaction Commit 2. EntityManager Flush 3. JPQL 사용 JPA에서는 트랜잭션이 끝나는 시점에서 변화가 있는 모든 엔티티 객체를 데이터베이스에 자동으로 반영해줍니다. 변화의 기준은 최초 조회 상태 JPA에서는 엔티티를 조회하면 해당 엔티티의 조회 상태 그대로 스냅샷을 만듭니다. 트랜잭션이 끝나는 시점에 스냅샷과 현재의 상태를 비교해 다른..
[JPA] Fetch Type란? Fetch Type이란 Fetch Type은 JPA가 하나의 Entity를 조회할 때, 연관관계가 있는 객체들을 어떻게 가져올 것이냐를 나타내는 설정값입니다. Fetch Type은 크게 Eager와 Lazy 두가지 전략이 있습니다. Fetch Type Issue 상황이라는 것은 하나의 Entity를 로드할 때, 아래의 두가지 전략 중 고민하는 상황을 말합니다. 연관 관계에 있는 Entity를 모두 가져온다 -> Eager 전략 연관 관계에 있는 Entity 가져오지 않고, getter로 접근할 때 가져온다 -> Lazy 전략 Fetch Type이 동작하는 시점 JPA Entity Manager에 의해 관리되는 Persistence Context에 Entity가 Managed 상태로 올라올 때의 동작입니다..
[JPA] N+1 문제가 발생하는 이유와 해결 방법 N+1 쿼리는 JPA의 프록시로 인한 지연 로딩 때문에 발생합니다. 정확한 의미는 1개의 쿼리를 실행했을 때, 내부에 존재하는 컬렉션들을 조회해오면서 생기는 문제입니다. 즉시 로딩으로 데이터를 가져오는 경우 지연 로딩으로 데이터를 가져온 이후에 가져온 데이터에서 하위 엔티티를 다시 조회하는 경우 기본적으로 되도록이면 @OneToMany의 매핑을 하지 않을 수 있다면 하지 않는 것이 최고의 예방책입니다. 해결 방법 Fetch Join JPQL의 join Fetch를 사용합니다. (inner join) 쿼리 한 번으로 해결할 수 있습니다. FetchType = LAZY -> EAGER ManyToOne, OneToOne의 FetchType = LAZY -> EAGER 변경 @EntityGraph @Entit..
[JPA] JPA Propagation 전파 단계 JPA Propagation은 트랜잭션 동작 도중 다른 트랜잭션을 호출(실행)하는 상황에 선택할 수 있는 옵션 @Transactional의 propagation 속성을 통해 피호출 트랜잭션의 입장에서는 호출한 쪽의 트랜잭션을 그대로 사용할 수도 있고, 새롭게 트랜잭션을 생성할 수도 있습니다. REQUIRED: default 값이며, 부모 트랜잭션 내에서 실행하며 부모 트랜잭션이 없을 경우 새로운 트랜잭션을 생성합니다. REQUIRED_NEW: 기존에 트랜잭션이 있으면 그것을 중단하고, 새로운 것을 생성합니다. 이 외에도 종류가 REQUIRED_NEW, SUPPORTS, MANDATORY, NOT_SUPPORT, NEVER, NESTED 가 있습니다. 참고: https://n1tjrgns.tistory.c..
[JPA] JPA 영속성 컨텍스트의 이점 5가지 영속성 컨텍스트(Persistence Context) Entity를 영구적으로 저장하는 환경을 의미합니다. JPA에서 가장 중요한 용어이고 논리적인 개념입니다. 영속성 컨텍스트는 EntityManager를 생성할 때 함께 만들어지고 EntityManager를 통해 접근하고 관리할 수 있습니다. 영속성 컨텍스트는 엔티티를 식별자 값으로 구분하기 때문에 영속 상태의 엔티티는 반드시 식별자값이 존재해야하고 없다면 예외가 발생합니다. 영속성 컨텍스트에 엔티티를 저장하면 트랜잭션을 커밋하는 순간 데이터베이스에 반영합니다. 영속성 컨텍스트 이점 1차 캐시: 조회가 가능하며 1차 캐시에 없으면 DB에서 조회하여 1차 캐시에 올려 놓습니다. 영속성 컨텍스트는 내부에 Map 형태로 된 1차 캐시를 가지고 있습니다. ke..
[JPA] JPA를 사용하는 이유 JPA를 사용하는 이유는 객체지향 프레임워크이기 때문입니다. JPA를 사용하면 비지니스 로직이 RDBMS에 의존하는 것이 아니라, 자바 코드로 표현될 수 있기 때문입니다. 그로 인해서 생산성이 높아진다고 볼 수 있습니다. 또, JPA는 JPQL로 SQL를 추상화하기 때문에 RDBMS Vendor에 관계없이 동일한 쿼리를 작성해서 같은 동작을 기대할 수 있다는 장점도 가지고 있습니다. 이는 Database dialect를 지원하기 때문에 갖는 장점입니다. 사용 이유 생산성 JPA를 사용하면 자바 컬렉션에 저장하듯이 JPA에게 저장할 객체를 전달하면 된다. 지루하고 반복적인 코드를 개발자가 직접 작성하지 않아도 되며, DDL문도 자동으로 생성해주기 때문에 데이터베이스 설계 중심을 객체 설계 중심으로 변경할 ..