실전! 스프링 데이터 JPA

Ch05. 스프링 데이터 JPA 분석 - SpringDataJPA 구현체 분석

webmaster 2021. 12. 28. 11:59
728x90

SimpleJpaRepository : JPA 구현체

  • Jpa의 내부 기능을 활용해서 CRUD 기능을 제공한다.
  • Count와 같은 쿼리는 JPA에서 제공하는 것이 아니기 때문에 StringQuery를 가지고 있다.
  • @Repository : 스프링 컴포넌트로 등록, JPA Exception을 SpringFramework에서 제공하는 Exception으로 변경한다
  • @Transactional : 기본적으로 스프링 데이터 JPA는 트렌젝션을 걸고 시작한다.
    • 트랜잭션을 SpringDataJpa가 제공해 주기떄문에 내 코드에 @Transactional이 없어도 동작한다.
    • JPA의 모든 변경은 트랜잭션 안에서 동작
    • 스프링 데이터 JPA는 변경(등록, 수정, 삭제) 메서드를 트랜잭션 처리
    • 서비스 계층에서 트랜잭션을 시작하지 않으면 리파지토리에서 트랜잭션 시작
    • 서비스 계층에서 트랜잭션을 시작하면 리파지토리는 해당 트랜잭션을 전파받아서 사용
    • 그래서 SpringDataJPA를 사용할 때 트랜잭션이 없어도 데이터 등록, 변경이 가능했음(사실은 트랜잭션이 리포지토리 계층에 걸려있는 것임)
  • @Transactional(readOnly = true)
    • 데이터를 단순히 조회만 하고 변경하지 않는 트랜잭션에서 readOnly = true 옵션을 사용하면 flush를 생략해서 약간의 성능 향상을 얻을 수 있음

save() 메서드

SPringDataJPA의 Save 메소드

  • 새로운 엔티티면 저장( persist )
  • 새로운 엔티티가 아니면 병합(merge)
  • Merge 같은경우 준영 속상 태인 데이터를 영속 상태로 변경할 때 사용하지 업데이트할 때 사용하는 것이 아니다.(업데이트 같은 경우 변경 감지를 사용해라)

 

728x90