백엔드/스프링 데이터 JPA

[Spring Data JPA] [6] 스프링 데이터 JPA 분석

RE-Heat 2023. 9. 13. 23:59

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-JPA-%EC%8B%A4%EC%A0%84/dashboard

 

실전! 스프링 데이터 JPA - 인프런 | 강의

스프링 데이터 JPA는 기존의 한계를 넘어 마치 마법처럼 리포지토리에 구현 클래스 없이 인터페이스만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 모두 제공합니다.

www.inflearn.com

인프런 김영한 님의 강의를 듣고 작성한 글입니다.

 

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

SimpleJpaRepository

  • @Repository 적용: JPA 예외를 스프링이 추상화한 예외로 변환
  • @Transactional(readOnly = true)
    • 데이터를 단순히 조회만 하고 변경하지 않는 트랜잭션에서 readOnly = true 옵션을 사용하면 플러 
      시를 생략해서 약간의 성능 향상을 얻을 수 있음
  • @Transactional 트랜잭션 적용
    • JPA의 모든 변경은 트랜잭션 안에서 동작
    • 스프링데이터 JPA는 변경(등록, 수정, 삭제) 메서드를 트랜잭션 처리
    • 서비스계층에서 트랜잭션을 시작하지 않으면 리파지토리에서 트랜잭션 시작
    • 서비스계층에서 트랜잭션을 시작하면 리파지토리는 해당트랜잭션을 전파받아서 사용
    • 그래서 스프링데이터 JPA를 사용할 때 트랜잭션이 없어도 데이터등록, 변경이 가능했음
      • (사실은 트랜잭션이 리포지토리 계층에 걸려있는 것)
  • @Transcational(readOnly=true)가 전체적으로 적용되지만, 각 메소드에 붙어있는 @Transactional 우선순위가 더 높다. 그래서 등록, 수정, 삭제 메서드는 읽기 전용이 아니므로 따로 붙여 줌.

 

save()메서드

  • 새로운 엔티티면 persist(저장)
  • 새로운 엔티티가 아니면 병합(merge)
    • merge는 DB에서 데이터를 가져와서 그 값을 바꿔치기 한다. 다만 변경감지와 달리 변경을 원하지 않았던 값에 null이 들어갈 위험이 있다.
    • 따라서 가급적 merge보단 변경감지로 updategodi gksek. 
    • merge는 준영속상태에서 영속상태로 바꿀 때 쓰임.

merge 관련 자세한 내용은 [JPA 활용1] [5] 웹 계층 개발(하편) 참고

 

[2] 새로운 엔티티 구별하는 방법