JPA에서 엔티티의 기본 키(ID)는 두 가지 방식으로 생성할 수 있습니다.
✅ 직접 할당: @Id만 사용. 애플리케이션 코드에서 ID 값을 명시적으로 설정합니다.
✅ 자동 생성: @Id + @GeneratedValue를 함께 사용. JPA가 식별자 생성 전략에 따라 자동으로 ID를 할당합니다.
자동 생성의 경우, @GeneratedValue의 strategy 속성을 통해 사용할 수 있는 4가지 전략은 다음과 같습니다:
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
public enum GenerationType {
AUTO,
IDENTITY,
SEQUENCE,
TABLE
}
1️⃣ IDENTITY 전략: DB에게 맡기는 전략
사용 DB: MySQL, PostgreSQL 등
특징: DB의 auto_increment 기능을 활용하여 식별자 생성
동작 방식:
persist() 호출 시 즉시 INSERT 실행
DB가 ID 생성 → JPA가 그 값을 받아서 영속성 컨텍스트에 저장
장점: 설정이 간편하고 DB가 ID를 관리하므로 별도 시퀀스 설정 불필요
단점:
쓰기 지연(persist 후 insert 지연)이 불가능
배치 INSERT 불가 (ID를 먼저 알아야 하므로)
테스트 시 DB 의존도 높음
2️⃣ SEQUENCE 전략: 시퀀스 객체를 활용한 유연한 전략
사용 DB: Oracle, PostgreSQL, H2 등 (시퀀스 지원 DB)
동작 방식:
persist() 시, 먼저 DB에서 시퀀스 값을 조회 (select nextval from sequence)
ID 값을 엔티티에 할당한 후 INSERT 수행
장점:
쓰기 지연 및 배치 INSERT 가능
시퀀스 값을 미리 가져오기 때문에 영속성 컨텍스트 내부에서 ID 사용 가능
단점:
시퀀스 이름 및 증가값 설정 필요
DB 시퀀스가 없는 환경에서는 사용 불가
3️⃣ TABLE 전략: 테이블로 시퀀스를 흉내내는 전략
사용 DB: 모든 DB에서 사용 가능
동작 방식:
별도의 키 생성 테이블을 만들고, SELECT 후 UPDATE로 ID 증가
장점: DB에 독립적 (모든 DB에서 작동)
단점:
성능 가장 느림 (SELECT + UPDATE로 2회 통신 필요)
동시성 처리 주의 (락이나 낙관적 제어 필요)
4️⃣ AUTO 전략: JPA가 알아서 결정
동작 방식: 사용하는 DB 방언(dialect)에 따라 적절한 전략을 자동 선택
예: MySQL → IDENTITY, Oracle → SEQUENCE
장점: 개발 초기에 DB를 바꿔도 코드 변경이 필요 없음
단점: DB마다 동작 방식이 달라짐 → 이식성과 예측 가능성 낮음
현업에서는 AUTO 전략은 학습이나 테스트용으로 사용하고, 운영 환경에서는 명시적으로 전략을 지정하는 것을 권장합니다.