[10분 테코톡] 잉, 페퍼의Spring Data JPA 삽질일지

KIM YONG GU·2023년 10월 26일
0

우아한테크

목록 보기
24/41

문제상황 1

save 메서드 통과, 테스트 메서드 assertThat.isEqualTo 시행, findById 메서드 통과

위의 모든 기능을 테스트해보니 동시성 보장이 되지 않음 (테스트 실패)

Entity의 생명주기

save() 분기처리

isNew() 확인하기

올바른 엔티티 동일성 보장하기

삭제된 엔티티란 무엇일까?

조회는 할 수 있지만, 값을 가져올 수 없는 상태

문제상황 2 : 중복된 엔티티

1차 캐시 : id값이 없는 엔티티의 경우

쓰기지연 : id값이 있는 엔티티의 경우

deleteAll()

flush는 언제 발생할까?

  1. 강제로 flush 명령을 할 때
  2. JPAL 쿼리가 실행될 때
  3. 트랜잭션이 커밋 시

문제상황 2 : 해결방법

문제상황 3

1년 이후 연령 데이터를 수정하기 위해 업데이트를 실시 -> 실패(?)

정합성 문제 사용

변경감지(Dirty Checking)

flush 쿼리실행 이후 이후 JPQL 쿼리가 실행


Flush와 JPQL에 대하여

Flush는 JPA(Java Persistence API)와 관련된 개념 중 하나로, 영속성 컨텍스트(Persistence Context)의 변경 내용을 데이터베이스에 동기화하는 작업을 의미합니다. JPQL(Java Persistence Query Language) 쿼리와 Flush 간의 관계는 다음과 같이 설명할 수 있습니다:

  • 영속성 컨텍스트와 엔티티: JPA는 영속성 컨텍스트를 통해 엔티티 객체를 관리합니다. 영속성 컨텍스트는 엔티티의 상태를 추적하고, 데이터베이스와의 동기화를 관리합니다.

  • JPQL 쿼리 실행: JPQL은 JPA에서 엔티티를 조회하거나 조작하기 위한 쿼리 언어입니다. JPQL 쿼리를 실행하면 데이터베이스에서 데이터를 가져오거나 업데이트하게 됩니다.

  • Flush 작업: 영속성 컨텍스트의 변경 내용을 데이터베이스와 동기화하기 위해 Flush 작업이 수행됩니다. Flush는 영속성 컨텍스트에 보류 중인 변경(추가, 수정, 삭제)을 데이터베이스에 반영하는 역할을 합니다.

  • JPQL 쿼리와 Flush: JPQL 쿼리를 실행하면 데이터베이스에 대한 변경 내용이 먼저 영속성 컨텍스트에 저장됩니다. 그런 다음 Flush 작업이 트랜잭션 커밋이나 명시적으로 Flush할 때 자동으로 실행되어 데이터베이스에 변경 내용을 반영합니다.

JPQL 쿼리를 실행한 후 데이터베이스에 대한 변경 내용을 즉시 반영하려면 Flush를 수동으로 호출할 수도 있습니다. 이것은 JPA의 EntityManager 인터페이스에서 flush() 메서드를 사용하여 수행할 수 있습니다.

즉, JPQL 쿼리와 Flush는 영속성 컨텍스트와 데이터베이스 간의 변경 내용을 동기화하는 데 사용되며, JPQL 쿼리 실행 후에 변경 내용을 데이터베이스에 반영하기 위해 Flush 작업이 필요합니다.

문제상황 3 : 해결방법

문제상황 4 - 소트 문제

Proxy (엔티티를 상속받은 가짜 개체)

문제상황 4 : 해결방법

Equals & hashCode

상단 문제코드, 하단이 해결방법.

profile
Engineer, Look Beyond the Code.

0개의 댓글