Spring Data JPA
- 스프링 프레임워크 내에서 JPA를 쉽게 사용할 수 있도록 도와주는 라이브러리
- 이를 통해 데이터베이스와의 CRUD 작업을 간단한 인터페이스와 메서드로 처리 가능
- 복잡한 SQL 쿼리 작성 없이도 데이터베이스 연산 수행 가능
주요 특징
- Repository 지원 : 인터페이스 기반의 리포지토리를 통해 기본적인 CRUD 메서드와 쿼리 메서드 생성
- 쿼리 메서드 : 메서드 이름만으로도 다양한 조건의 쿼리 생성 가능
- 추상화 및 자동화 : 데이터 접근 로직을 추상화하여 개발자가 비즈니스 로직에 집중할 수 있도록 지원
새로운 Entity 판단 방법
- 기본적으로 엔티티의 ID값의 상태를 확인하여 엔티티가 새로운지 여부 판단
- 기본방식
- ID가 null인지 여부로 판단
- 엔티티의 ID가 null이면 새로운 엔티티로 간주, null이 아니면 이미 존재하는 엔티티로 판단
- 커스텀 방식 (Persistable 인터페이스)
- 기본 방식이 적합하지 않은 경우 (복합키 사용이나 ID가 미리 할당되는 경우)
- Persistable 인터페이스를 구현하여
isNew()
메서드를 오버라이드 - 엔티티 생성 시각, 특정 플래그 등 추가적인 로직을 반영하여 새로운 엔티티 여부 판단
save()시 식별자가 존재하는 경우 어떻게 동작할까?
save() 작동 방식
- 저장하려는 엔티티가 새로운 엔티티인 경우 persist, 그렇지 않은 경우 merge 진행
merge = select쿼리 후 insert 쿼리 작동
-
@Id 타입이 primitive 타입이 아닌 경우 : null 인 경우에만 새로운 엔티티로 판단
-
primitive 타입 중 해당 Wrapper 클래스가 Number의 하위 타입인 경우(int, long) : 해당 값이 0인 경우에만 새로운 엔티티라 판단
Persistable - 새로운 엔티티 판별 여부 설정
@GeneratedValue를 사용하지 않고 @Id만 사용할 경우 식별자가 이미 있는 상태로 save()를 호출하므로 merge가 호출됨
@Persistable
- 엔티티가 Persistable 인터페이스를 구현하여 isNew를 구현함으로써 새로운 엔티티 판별 여부를 직접 설정할 수 있음