스프링 데이터 JPA 분석

yeoro·2022년 7월 3일
0

스프링 데이터 JPA 구현체 분석

SimpleRepository

  • 조회 : JPA 기능 사용

@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가 영속성을 벗어난 후 다시 영속성 상태가 되어야 될 때 써야 한다.


0개의 댓글