JPA에서 엔티티의 기본 키(PK)를 자동 생성하려면 @GeneratedValue를 사용한다.
하지만 이때 어떤 strategy를 설정하느냐에 따라 동작 방식과 퍼포먼스가 달라진다.
PostgreSQL 환경을 기준으로 @GeneratedValue 사용법과 추천 설정을 정리한다.
기본 사용법
@Id
@GeneratedValue
private Long id;
- strategy를 생략하면 JPA는 기본 전략인 GenerationType.AUTO를 적용한다.
- AUTO는 사용하는 DB에 맞춰 자동으로 전략을 결정한다.
- PostgreSQL에서는 AUTO → SEQUENCE 전략으로 동작한다.
전략별 동작 차이
전략설명PostgreSQL 지원 여부특징
AUTO | DB에 따라 자동 선택 | O | PostgreSQL에서는 SEQUENCE 선택됨 |
IDENTITY | DB의 auto-increment 사용 | O (v10 이상) | insert 즉시 실행됨, 배치 어려움 |
SEQUENCE | DB 시퀀스 사용 | O | 퍼포먼스 우수, 배치 insert 가능 |
TABLE | 별도 테이블로 시퀀스 관리 | O | 느림, 거의 안 씀 |
PostgreSQL에서는 SEQUENCE 전략 권장
PostgreSQL은 Oracle처럼 SEQUENCE를 잘 지원하기 때문에,
자동 생성 전략으로는 GenerationType.SEQUENCE를 명시적으로 사용하는 것이 더 안정적이다.
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "member_seq")
@SequenceGenerator(
name = "member_seq",
sequenceName = "member_seq", // 실제 DB에 생성될 시퀀스 이름
allocationSize = 1 // 기본값 50 → 1로 줄이면 ID 순차성 유지 가능
)
private Long id;
주의: 위 설정을 사용하면, DB에 member_seq라는 시퀀스가 있어야 하며, 없으면 JPA가 자동 생성할 수 있도록 설정하거나 직접 생성해야 한다.
그럼 아무 설정도 안 하면 어떻게 될까?
@Id
@GeneratedValue
private Long id;
- PostgreSQL에서는 자동으로 hibernate_sequence라는 시퀀스를 생성해서 사용한다.
- 문제는 모든 테이블이 이 시퀀스를 공유할 수 있다는 것.
- 테이블마다 시퀀스를 분리하고 싶다면 @SequenceGenerator로 명시하는 것이 바람직하다.
실무 기준 추천 방식
- 학습용/간단한 프로젝트 → @GeneratedValue만 써도 무방
- 실무 프로젝트 → @GeneratedValue(strategy = SEQUENCE) + @SequenceGenerator 명시
'Spring > MVC' 카테고리의 다른 글
# HWP 템플릿에 동적으로 ROW 삽입하는 방법 (전자정부프레임워크 + MyBatis) (0) | 2025.07.01 |
---|---|
# Spring Boot - POI로 엑셀 다운로드 기능 만들기 (maven) (1) | 2025.06.04 |
# java - 예외처리 @Valid (1) | 2025.05.27 |
# 프론트엔드와 백엔드에서 각각 시간 포맷 처리하는 이유 (Spring Boot + JS) (0) | 2025.05.12 |
# FileInputStream - 파일 다운로드 처리 (0) | 2025.02.17 |