JPA의 경우 예외가 발생하면 JPA 예외가 발생하게 된다.
- EntityManager은 순수한 JPA 기술이며, 스프링과 관계가 없다 따라서 엔티티 매니저는 예외가 발생하면 JPA 관련 예외를 발생시킨다.
- JPA는 PersistenceException과 그 하위 예외를 발생시킨다.
- 추가로 IllegalStateException, IllegalArgumentException을 발생시킬 수 있다.
- 그렇다면 JPA 예외를 스프링 예외 추상화로 변환할 수 있을까?
@Repository의 기능
- @Repository가 붙은 클래스는 컴포넌트 스캔의 대상이 된다.
- @Repository가 붙은 클래스는 예외 변환 AOP의 적용 대상이 된다.
- 스프링과 JPA를 함께 사용하는 경우 스프링은 JPA 예외 변환기(PersistenceExceptionTranslator)를 등록한다
- 예외 변환 AOP 프록시는 JPA 예외가 발생하면 이를 통해 스프링 데이터 접근 예외로 변환한다.
*참고*
스프링 부트는 PersistenceExceptionTranslationPostProcessor 를 자동으로 등록하는데, 여기에서 @Repository 를 AOP 프록시로 만드는 어드바이저가 등록된다.
잡한 과정을 거쳐서 실제 예외를 변환하는데, 실제 JPA 예외를 변환하는 코드는 EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible() 이다.
'Spring > JDBC' 카테고리의 다른 글
[Spring DB] 스프링 데이터 JPA - 2 (주요 기능과 적용) (0) | 2024.08.19 |
---|---|
[Spring DB] 스프링 데이터 JPA - 1 (등장 이유와 기능) (0) | 2024.08.19 |
[Spring DB] JPA - 2 (설정과 사용) (0) | 2024.08.19 |
[Spring DB] JPA - 1(ORM 개념) (0) | 2024.08.19 |
[Spring] 데이터 접근 기술 테스트 (0) | 2024.08.14 |