스프링 데이터 JPA 분석
- @Repository : 컴포넌트 스캔 대상으로 지정할뿐만 아니라 JPA 예외를 스프링이 추상화한 예외로 변환시켜주기에 다른 기술(JDBC, MyBatis ...)을 사용하더라도 통합적으로 예외를 관리할 수 있게 해준다.
- 스프링 데이터 JPA의 각 메소드 구현체마다 @Transactional로 선언이 되어 있다.
- 조회용 메소드는 readOnly 속성으로 되어 있다.
- 데이터 변경 없이 단순 조회만 하기 위한 목적으로 flush를 생략함으로 약간의 성능 최적화가 이루어진다.
- 서비스 계층에서 트랜잭션을 시작하지 않으면 레포지토리에서 트랜잭션이 시작되게 된다.
- 조회용 메소드는 readOnly 속성으로 되어 있다.
- save() : 새로운 엔티티라면 저장(persist), 새로운 엔티티가 아니면 병합(merge)를 한다.
- merge는 원하는 값만 바꿀 수 없고 전체를 다 변경해야하기에 실무에서 쓰기에 어렵다.
- 데이터를 수정할 때는 merge 대신 변경 감지 기능을 사용해야 한다.
- 새로운 엔티티를 구별하는 방법
- 식별자가 객체일 때 => null인지 아닌지로 판단
- 식별자가 자바 기본 타입일 때 => 0인지 아닌지로 판단
- Persistable 인터페이스를 구현해서 판단 로직 변경 가능
- persist()가 호출될 때 @GenerateValue에 의해서 ID 식별자 값을 생성해서 주입해준다.
- 스프링 데이터 JPA에서 식별자 값을 @GenerateValue에 의해서 자동 생성하는 것이 아니고 직접 할당하는 경우 persist()가 호출되는 것이 아니라 merge()가 호출된다.
- merge()가 호출됨에 따라 select 쿼리가 수행되기 때문에 더 비효율적이다.
- 이런 경우에는 엔티티에서 Persistable을 구현함으로 새로운 엔티티 확인 여부를 구현하는 것이 좋다.
- @CreatedDate를 조합해서 사용하면 새로운 엔티티 여부를 쉽게 확인할 수 있다.
@Entity
@EntityListeners(AuditingEntityListener.class)
public class Item implements Persistable<String> {
@Id
@GeneratedValue
private String id;
@CreatedDate
private LocalDateTime createdDate;
public Item(String id) {
this.id = id;
}
@Override
public boolean isNew() {
return createdDate == null;
}
}
- Persistable 인터페이스의 isNew() 메소드를 구현함으로 새로운 엔티티인지 구별할 수 있다.
출처 : [인프런 김영한 실전 스프링 데이터 JPA]
실전! 스프링 데이터 JPA 강의 | 김영한 - 인프런
김영한 | 스프링 데이터 JPA는 기존의 한계를 넘어 마치 마법처럼 리포지토리에 구현 클래스 없이 인터페이스만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 모두 제
www.inflearn.com
'Spring > [인프런 김영한 실전 스프링 데이터 JPA]' 카테고리의 다른 글
[인프런 김영한 실전 스프링 데이터 JPA] 나머지 기능들 (0) | 2024.09.12 |
---|---|
[인프런 김영한 실전 스프링 데이터 JPA] 확장 기능 (3) | 2024.09.11 |
[인프런 김영한 실전 스프링 데이터 JPA] 쿼리 메소드 기능 (1) | 2024.09.11 |
[인프런 김영한 실전 스프링 데이터 JPA] 공통 인터페이스 기능 (0) | 2024.09.10 |