JPA

    JpaRepository의 save() 메서드 내부동작 - Persist vs Merge

    1. 알고자 하는 것 - JpaRepository의 save() 메서드의 동작에 대해 내부 코드를 확인한다. - 내부 코드 중 persist와 merge의 차이를 테스트코드로 확인한다. 2. 알게된 것 JpaRepository의 save 메서드 내부 확인 - 일반적으로 JpaRepository는 다음과 같이 인터페이스 형식으로 상속받아 편리하게 기본 CRUD 메서드를 사용한다. public interface MemberRepository extends JpaRepository { } - 이 때, JpaRepository 인터페이스를 구현한 SimpleJpaRepository를 target으로 가지는 Proxy가 Bean으로 등록된다. - 실제 CRUD 동작은 SimpleJpaRepository가 수행하는..

    JPA Dirty Checking 시 update query 분석 (+ 모든 필드가 업데이트 되는 이유)

    1. 알고자 하는 것 - JPA의 Dirty Checking 시 발생하는 update query를 확인한다. - 수정된 필드만 update query를 날리는 것이 아닌, 모든 필드에 대해 update query가 나가는 이유를 분석한다. 2. 알게된 것 JPA의 Dirty Checking 시 발생하는 update query를 확인 - JPA의 Dirty Checking(변경 감지)은 트랜잭션 내에서 Entity의 변경사항을 DB에 자동으로 반영해주는 기능이다. - 영속성 컨텍스트 내에서 최초 조회 시의 Entity에 대한 스냅샷을 보관하고 - 트랜잭션 커밋 시 EntityManager가 flush를 수행할 때, 스냅샷과 Entity를 비교한다. - 변경 내용에 대해 쓰기 지연 SQL 저장소에 updat..

    @Transactional(readOnly = true)를 왜 붙여야 하나요

    스프링으로 개발하면서 필연적으로 사용하게 되는 @Transactional. 우리는 스프링의 AOP를 통해 @Transactional 어노테이션만으로 손쉽게 Service Layer에서 트랜잭션을 걸 수 있다. 일반적으로, 조회용 메서드에 대해서는 @Transactional(readOnly = true) 를 설정함으로써 성능상 이점을 얻을 수 있다고 한다. 그렇구나,, 하고 넘어갈 수도 있지만 딱 한 깊이만 더 들어가서 학습한다면 더 다채로운 지식을 얻을 수 있지 않을까? 더도말고 딱 한 번만 더 깊이 들어가보자. 왜? 라는 물음을 통해 readOnly = true 시에 어떠한 성능상 이점 + 추가적인 장점이 있는지 알아보며 지식을 한층 더 넓혀보자 :) 그래서, 왜? (1) - JPA 관련 그래서 왜 r..

    Entity Class에 Lombok @NoArgsConstructor(access=PROTECTED)를 붙이는 이유

    코드를 작성하면서 습관적으로 Entity Class에 @NoArgsConstructor(access = AccessLevel.PROTECTED) Lombok 어노테이션을 붙여왔다. 이번에 아래 내용에 대해 명확하게 정리하고자 한다. 0. Lombok의 @NoArgsConstructor 어노테이션이란 1. JPA의 Entity Class에 @NoArgsConstructor (기본 생성자) 가 필요한 이유 2. JPA의 Entity Class에서 기본 생성자의 access level을 Public 또는 Protected로 제한하는 이유 3. @NoArgsConstructor의 access level을 Protected로 제한하였을 때의 장점 0. Lombok의 @NoArgsConstructor 어노테이션이란..

    fetch join + Paging (limit) 처리 시 발생하는 문제 및 해결

    발생 문제 : JPA를 통해 아래와 같은 연관관계를 갖는 엔티티를 조회 할 때, fetch join과 Paging을 함께 사용하여 조회 시 fetch join이 적용되지 않고 DB를 Full Scan하여 페이징을 적용하는 상황이 발생한다. 다음과 같이 하나의 Review에 대해 N개의 Image를 가지는 1:N 연관관계로 구성되어 있다. Paging을 사용하여 10개의 Review를 연관된 Image Entity와 함께 fetch join으로 가져오고자 다음과 같은 쿼리를 작성하였다. // ReviewRepository.class @Query("select r from Review r " + "join r.company c " + "fetch join r.images i " + // LAZY fetch에..

    Entity 삭제 시 JdbcSQLIntegrityConstraintViolationException: Referential integrity constraint violation 오류 발생

    Spring을 통해 장소와 해당 장소에 대한 이벤트를 CRUD하는 API를 설계하던 중 발생한 문제이다. Entity 연관관계 구성 Place Entity와 Event Entity가 1:N 양방향 연관관계로 구성되어 있다. Entity 설계 - Place @Getter @ToString @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity public class Place { // 내용과 관련있는 프로퍼티만 설명함. @Id @GeneratedValue @Column(name = "place_id") private Long id; @ToString.Exclude @OrderBy("id") @OneToMany(mappedBy = "place") privat..