Chapter 15: 고급 주제와 성능 최적화
1. 예외 처리
1-1. JPA 표준 예외 정리
JPA 표준 예외들은 모두
unchecked exception
이다why?
javax.persistence.PersistenceException의 자식 class인데, 이 예외 클래스는 RuntimeException의 자식!
JPA 표준 예외는 크게 2가지로 나눌 수 있음
트랜잭션 롤백을
표시하는
예외심각한 예외 → 복구해선 안 됨
해당 예외 발생 시 트랜잭션을 강제로 커밋해도 커밋되지 X
대신에 javax.persistence.RollbackException 발생
트랜잭션 롤백을
표시하지 않는
예외심각한 예외 X
개발자가 트랜잭션을 커밋할지 롤백할지 판단하면 됨
1-2. 스프링 프레임워크의 JPA 예외 변환
스프링 프레임워크는 데이터 접근 계층에 대한 예외를 추상화해서 개발자에게 제공한다
JPA 예외를 스프링 프레임워크가 제공하는
추상화된 예외로 변경
하려면 PersistenceExceptionTranslationPostProcessor를스프링 빈
으로 등록이것은
@Repository
annotation을 사용한 곳에 예외 변환 AOP를 적용해서 변환해 준다
1-3. 트랜잭션 롤백 시 주의사항
트랜잭션을 롤백하는 것은 DB 반영사항만 롤백하는 것이지, 수정한 Java 객체까지 원상태로 복구해주지는 않는다
따라서 트랜잭션이 롤백된 영속성 컨텍스트를 그대로 사용하는 것은 위험하다
새로운 영속성 컨텍스트를 생성해서 사용하거나,
EntityManager.clear()
를 호출해서 영속성 컨텍스트를 초기화한 다음에 사용해야 한다
2. 엔티티 비교
영속성 컨텍스트
내부에는 엔티티 인스턴스를 보관하기 위한1차 캐시
가 있다이 1차 캐시는 영속성 컨텍스트와 생명주기를 같이 한다
영속성 컨텍스트를 통해 데이터를
저장
하거나조회
하면, 1차 캐시에 엔티티가 저장된다이 1차 캐시 덕분에
변경 감지
기능도 동작하고, 이름 그대로 1차 캐시로 사용되어 DB를 통하지 않고 데이터를 바로 조회할 수도 있다
같은 영속성 컨텍스트에서 엔티티를 조회하면 항상 같은 엔티티 인스턴스를 반환한다
equals 비교 수준이 아니라 정말 주소값이 같은 인스턴스를 반환한다
2-1. 영속성 컨텍스트가 같을 때 엔티티 비교
영속성 컨텍스트가 같을 때 엔티티를 비교하면, 아래의 3가지 조건을 모두 만족한다
동일성 (identical):
==
비교가 같다동등성 (equivalent):
equals()
비교가 같다DB 동등성:
@Id
인 DB 식별자가 같다
Last updated