스프링/6. 스프링 DB-2

27. JPA 예외

sdafdq 2023. 10. 11. 09:33

앞서 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