스프링 데이터 프로젝트들의 예시
JPA 추가를 위한 의존성 : spring-boot-starter-data-jpa
JPA 객체를 선언하려면 반드시 @Entity 어노테이션을 추가해야 한다. 또한 ID 속성에는 @Id 어노테이션을 지정하여 이 속성이 객체를 고유 식별함을 나타내야 한다.
또한 Id 속성에는 데이터베이스가 자동으로 생성해 주는 Id값이 사용된다. 이때 @GeneratedValue 어노테이션을 사용하면 데이터베이스에 새로운 데이터를 넣을 때마다 아이디를 어떻게 설정할지 고민하지 않아도 된다.
| 전략 | 동작 방식 | 사용 DB 예시 | 장점 | 단점 | 실무 사용 |
|---|---|---|---|---|---|
IDENTITY | DB가 PK를 직접 생성 (AUTO_INCREMENT) | MySQL, MariaDB | 설정 단순, 직관적 | 배치 INSERT 비효율, INSERT 시점에 PK 확정 | 많이 사용 |
SEQUENCE | DB 시퀀스에서 PK 조회 | PostgreSQL, Oracle | 성능 우수, 배치 처리 유리 | 시퀀스 관리 필요 | 권장 |
TABLE | 별도 테이블로 PK 관리 | 모든 DB | DB 독립성 | 성능 저하, 락 경합 | 거의 미사용 |
AUTO | DB 방언에 따라 자동 선택 | 모든 DB | 빠른 초기 설정 | DB 변경 시 동작 달라짐 | 초기 단계 |
| 옵션 | 설명 | 주의 사항 |
|---|---|---|
| name | JPA 내부에서 참조하는 시퀀스 이름 | @GeneratedValue의 generator와 일치 |
| sequenceName | 실제 DB 시퀀스 이름 | DB에 존재해야 함 |
| allocationSize | 한 번에 가져올 ID 개수 | DB 시퀀스 increment와 정합성 필요 |
JPA에서는 객체가 인자가 없는 생성자를 가져야 하므로 @NoArgsConstructor 어노테이션을 지정한다. 만약 인자가 있는 생성자도 함께 가지고 싶다면 @RequiredArgsConstructor 를 추가하면 된다. 또한 @NoArgsConstructor 에서는 access 속성을 설정하여 외부의 사용을 막을 수도 있다.
JDBC 버전의 레포지토리에서는 레포지토리가 제공하는 메서드를 명시적으로 선언하였지만, 스프링 데이터에서는 JpaRepository 인터페이스를 확장하여 사용할 수 있다.
아래의 예시와 같이 선언하면 된다.
package com.example.domain.ex.repository;
import com.example.domain.ex.entity.ex;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ExRepository extends JpaRepository<Ex, Long> {
}
인터페이스를 선언했기 때문에 메서드와 인터페이스 모두를 구현해야 한다고 생각할 수 있지만 JPA는 애플리케이션이 시작될 때 각 인터페이스의 구현 클래스 등을 자동으로 생성해 준다.