백엔드/스프링 데이터 JPA
[Spring Data JPA] [6] 스프링 데이터 JPA 분석
RE-Heat
2023. 9. 13. 23:59
인프런 김영한 님의 강의를 듣고 작성한 글입니다.
[1] 스프링 데이터 JPA 구현체 분석
SimpleJpaRepository
- @Repository 적용: JPA 예외를 스프링이 추상화한 예외로 변환
- @Transactional(readOnly = true)
- 데이터를 단순히 조회만 하고 변경하지 않는 트랜잭션에서 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] 새로운 엔티티 구별하는 방법