스프링 데이터 JPA 구현체 분석
SimpleRepository
@Repository
- Spring Bean의 컴포넌트 대상이 된다. Spring이 읽고 컨테이너에 올린다.
- JPA와 JDBC 등이 일으키는 영속성 계층의 예외는 종류가 서로 다르다. -> Spring이 제공하는 exception으로 바꿔주기 때문에 JPA, JDBC 등 구현 기술을 바꿔도 비즈니스 로직에 영향을 주지 않는다.
@Transactional
- Class 레벨에서 readOnly로 선언 (조회 메소드가 많기 때문)
- Method 레벨에서 readOnly 없이 override 하며 선언 (save, delete, ...)
- 서비스 계층에서의 선언
- O : 서비스에서 시작한 트랜잭션을 리파지토리에서 전파 받아 사용
- X : 리파지토리에서 트랜잭션 시작
- 트랜잭션이 리파지토리에 걸려있기 때문에 서비스 계층에서 선언없이 사용할 수 있다.
readOnly = true
- JDBC의 경우 트랜잭션을 걸면 DB Connection에 setAutoCommit을 false로 넘긴다.
- 실제 트랜잭션을 얻는 과정과 같지만 flush 및 dirty checking을 생략해서 약간의 성능 향상을 얻을 수 있다. (JPA는 트랜잭션이 끝날 때 기본적으로 flush 수행)
Save()
- merge의 단점은 DB에 select 쿼리를 한 번 날린다는 것.
- merge 사용 보다는 dirty checking을 통한 데이터 변경을 권장한다.
- merge는 영속성 상태의 entity가 영속성을 벗어난 후 다시 영속성 상태가 되어야 될 때 써야 한다.