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가지 조건을 모두 만족한다

  1. 동일성 (identical): == 비교가 같다

  2. 동등성 (equivalent): equals() 비교가 같다

  3. DB 동등성: @Id 인 DB 식별자가 같다

Last updated