예외처리
트랜잭션 롤백을 표시하는 예외
트랜잭션 롤백을 표시하지 않는 예외
엔티티 비교
-
1차 캐시는 영속성 컨텍스트와 생명주기를 같이 한다. 영속성 컨텍스트를 더 정확히 이해하기 위해서는 1차캐시의 가장 큰 장점인 애플리케이션 수준의 반복 가능한 읽기를 이해해야 한다.
-
영속성 컨텍스트가 같으면 엔티티를 비교할 때 다음 조건을 만족해야 한다.
- == (동일성)
- equals() (동등성)
- @Id인 데이터베이스 식별자가 같음. (데이터베이스 동등성)
-
영속성 컨텍스트가 다르면 엔티티를 비교할 때 다음 조건을 만족해야 한다.
- == (동일성) : 비교가 실패한다.
- equals() (동등성) : 비교가 만족한다. 단, equals()를 구현해야 한다.
- @Id인 데이터베이스 식별자가 같음. (데이터베이스 동등성)
프록시 심화 주제
- 영속성 컨텍스트는 자신이 관리하는 엔티티의 동일성(identity)을 보장한다.
- 영속성 컨텍스트는 한 번 프록시로 노출한 엔티티는 계속 프록시로 노출한다. 영속성 컨텍스트가 영속 엔티티의 동일성을 보장 할 수 있기 때문이다.
프록시 타입 비교
- 프록시 타입 비교시 instanceof 사용.
상속관계와 프록시
- 프록시를 부모 타입으로 조회하면 문제가 발생.
- 문재 해결
- JPQL로 대상 직접 조회
- 프록시 벗기기
- 기능을 위한 별도의 인터페이스 제공.
- 비지턴 패턴 사용
성능 최적화
N+1 문제
- 지연로딩으로 사용하고, 성능 최적화가 필요한 곳에 fetch join을 사용해야한다.
읽기 전용 쿼리의 성능 최적화
- 아래와 같이 읽기 전용으로 설정하면 트랜잭션을 커밋해도 영속성 컨텍스트를 플러시하지 않는다.
@Transactional(readOnly = true)
배치 처리
- 메모리 부족을 피하기 위해, 일정 단위마다 영속성 컨텍스트의 엔티티를 데이터베이스에 플러시하고 영속성 컨텍스트를 초기화해야 한다.
항상 좋은 글 감사합니다.