org.springframework.data.jpa.repository.support.SimpleRepository
@Repository
적용@Transactional
트랜잭션 적용SimpleJpaRepository
에 구현된 메소드들이 이미 트랜잭션 안에서 처리되도록 구성됐기 때문에 사용 시 트랜잭션 없이 데이터 등록, 변경 가능@Transactional(readOnly = true)
flush()
를 생략save()
메서드persist()
merge()
null
인지 여부로 판단0
인지 여부로 판단save()
실행 순서save()
호출 시 isNew()
메소드를 이용해 엔티티의 ID가 null
또는 0
인지 확인persist()
, nomerge()
만약 ID값을 직접 넣은 후 save()
호출한다면?
ID가 null
또는 0
이 아니기 때문에 merge()
호출
select
쿼리 이후 없다고 판단한 뒤 insert
쿼리
매우 비효율적
Persistable
인터페이스를 구현해 isNew()
메소드를 재정의
등록 시간(@CreatedDate
)을 이용하면 새로운 엔티티 여부를 쉽게 확인 가능
@CreatedDate
에 값이 없으면 새로운 엔티티Persistable
구현 예시
@Entity
@EntityListeners(AuditingEntityListener.class)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Item implements Persistable<Long> {
@Id
private Long id;
@CreatedDate
private LocalDateTime createdDate;
public Item(Long id) {
this.id = id;
}
@Override
public Long getId() {
return id;
}
@Override
public boolean isNew() {
return createdDate == null;
}
}
"본 포스트는 작성자가 공부한 내용을 바탕으로 작성한 글입니다.
잘못된 내용이 있을 시 언제든 댓글로 피드백 부탁드리겠습니다.
항상 정확한 내용을 포스팅하도록 노력하겠습니다."