JPA 표준 예외들은 PersistenceException의 자식 클래스이다.
그리고 이 예외 클래스는 RuntimeException의 자식이다.
따라서 JPA 예외는 모두 unchecked 예외이다.
트랜잭션 롤백을 표시하는 예외는 심각한 예외 → 복구해서는 안된다.
이 예외 발생 시 트랜잭션 강제 커밋해도 커밋 안되고 RollbackException 예외 발생.
트랜잭션 롤백을 표시하지 않는 예외는 심각한 예외 X → 개발자가 커밋할지 롤백할지 판단하면 된다.
서비스 계층에서 데이터 접근 계층의 구현 기술에 직접 의존하는 것은 좋은 설계 x.
서비스 계층에서 JPA의 예외를 직접 사용하면 JPA에 의존하게 된다. → 스프링 프레임워크가 데이터 접근 계층에 대한 예외를 추상회해서 개발자에게 제공한다.
→ @Repository 사용한 곳에 예외 변환 AOP를 적용해 JPA 예외를 스프링 프레임워크가 추상화한 예외로 변환해준다. (AOP 인터셉터가 동작해서 예외 변환해준다)
** @Repository, 정확히 기능이 뭐지? AOP로 Repository 등록하는데, 그러면 Spring data JPA로 생성한 인터페이스도 동일하게 aop로 생성되나?