Cute Running Puppy

Spring/MVC

# Entity - @GeneratedValue 전략 정리 (JPA + postgreSQL 기준)

뭉지맘 2025. 5. 29. 15:39

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 명시