앞서 JPA는 EntityManager를 통해 사용한다고 했다.
EntityManager는 순수 JPA기술이다. 스프링과는 관계가 없다.
따라서, 예외도 JPA관련 예외를 발생시킨다. (아닌 것도 있긴 하다.)
PersistenceException 및 하위
그럼 또 예외를 JPA라는 특정 기술에 의존하게 될 수도 있다.
그렇다면 어떻게 스프링 예외(DataAccessException)으로 변화할까?
바로 @Repository이다.
우리가 Spring MVC에서 @Controller, @Service, @Repository 이렇게 있는데, 일단 기본적으로 컴포넌트 스캔의 대상이 되고, (컴포넌트 스캔의 범위 내라면. 스캔범위를 설정 안해놓으면 main이었나 java였었나.. 여튼 되게 상위부터 스캔했음)
@Controller : 컨트롤러로 사용한다.
@Service : 이거는 사실 그냥 깡통임.
@Repository : 예외 변환 AOP의 적용 대상이 된다.
이렇게 컴포넌트 스캔 + 추가기능이 있음. @Service 빼고.
스프링과 JPA 함께 사용 시 스프링이 PersistenceExceptionTranslator을 빈으로 등록함.
이렇게 된다.
뭔가 @Repository도 쓰면 저렇게 프록시로 감싸지는 듯.
PersistenceExceptionTranslationPostProcessor
이름 보면 대충 JPA예외 번역기 먼저처리기
딱 JPA예외 번역기 먼저 처리해주는 그런 클래스이다. 스프링 부트가 빈에 자동등록함
여기에 @Repository를 AOP 프록시로 만드는 어드바이저가 등록된다.
실제 예외로 변환하는 코드는
EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible()
'스프링 > 6. 스프링 DB-2' 카테고리의 다른 글
29. 스프링 데이터 JPA 전체적인 기능 (0) | 2023.10.12 |
---|---|
28. 스프링 데이터 JPA (0) | 2023.10.11 |
26. JPA 적용 (0) | 2023.10.11 |
25. ORM -JPA (0) | 2023.10.10 |
24. ORM (0) | 2023.10.10 |