🐱🏍 스프링 데이터 JPA 구현체 분석
- JpaRepository --> SimpleJpaRepository
👀 !! 매우 중요
save()
메서드
- 새로운 엔티티면 저장 (
persist()
)
- 새로운 엔티티가 아니면 병합 (
merge()
) "DB에서 한번 SELECT를 한다" (치명적 단점)
📍 @Transactional
: 트랜잭션 적용
- JPA의 모든 변경은 트랜잭션 안에서 동작
- 스프링 데이터 JPA는 변경(등록, 수정, 삭제) 메서드를 트랜잭션 처리
- 서비스 계층에서 트랜잭션을 시작하지 않으면 Repository에서 트랜잭션 시작
- 서비스 계층에서 트랜잭션을 시작하면 Repository는 해당 트랜잭션을 전파 받아서 사용
- 그래서 스프링 데이터 JPA를 사용할 때 트랜잭션이 없어도 데이터 등록, 변경이 가능 했다. ( "트랜잭션이 Repository 계층에 걸려있는것임")
📍 @Transactional(readOnly = true)
- 데이터를 단순히 조회만하고 변경하지 않는 트랜잭션일때 사용하면 성능이 향상된다.
🐱🏍새로운 엔티티를 구별하는 방법
- 새로운 엔티티를 판단하는 기본 전략
- 식별자가 객체일 때
null
로 판단
- 식별자가 자바 기본 타입일 때 '0'으로 판단
- Persistable 인터페이스를 구현해서 판단 로직 변경가능
Persistable
인터페이스를 사용해서 새로운 엔티티 확인 여부를 직접 구현하는게 효과적이다.
✔ 참고로 등록시간 (@CreatedDate
)을 조합해서 사용하면 이 필드로 새로운 엔티티 여부를 편리하게 확인할수 있다.
(@CreatedDate
에 값이 없으면 새로운 엔티티로 판단함으로)