본문 바로가기
  • 오늘도 한걸음. 수고많았어요.^^
  • 조금씩 꾸준히 오래 가자.ㅎ
IT기술/spring

[jpa] @GeneratedValue 전략 살펴보기

by 미노드 2024. 8. 14.

PK를 지정할 때 값을 자동으로 증가 시키기 위해 @GeneratedValue를 사용하는 편입니다.

여기서 들어갈 수 있는 전략으로 어떤게 있는지 정리해 보겠습니다.

1. GenerationType.AUTO

  • JPA가 사용하는 기본 전략입니다. 데이터베이스에 따라 자동으로 적절한 생성 전략을 선택합니다.
  • 어떤 데이터베이스에서는 시퀀스를 사용하고, 어떤 데이터베이스에서는 테이블을 사용하게 됩니다.
@GeneratedValue(strategy = GenerationType.AUTO)

2. GenerationType.IDENTITY

  • 데이터베이스의 Auto Increment 기능을 사용하여 기본 키를 생성합니다.
  • 주로 MySQL, SQL Server 등에서 사용됩니다.
  • 주의점: 배치 삽입 시 성능 저하가 있을 수 있습니다. IDENTITY 전략은 삽입 후에 ID 값을 얻을 수 있기 때문에 한 번에 여러 엔티티를 삽입할 때 효율이 떨어질 수 있습니다.
  • @GeneratedValue(strategy = GenerationType.IDENTITY)

3. GenerationType.SEQUENCE

  • 데이터베이스의 시퀀스를 사용하여 기본 키를 생성합니다.
  • 주로 Oracle, PostgreSQL 등에서 사용됩니다.
  • 이 전략은 시퀀스 값을 미리 가져와서 ID로 사용하기 때문에, 대량 삽입 시 성능이 좋습니다.
  • 주의점: 시퀀스를 지원하지 않는 데이터베이스에서는 사용할 수 없습니다.
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "my_sequence")
@SequenceGenerator(name = "my_sequence", sequenceName = "MY_SEQUENCE", allocationSize = 1)

4. GenerationType.TABLE

  • 별도의 테이블을 만들어서 키 값을 관리합니다.
  • JPA가 관리하는 테이블에서 키 값을 생성하고, 이 값을 PK로 사용합니다. 데이터베이스에 종속적이지 않아서 어느 데이터베이스에서나 사용할 수 있습니다.
  • 특정한 데이터베이스에 종속되지 않는 키 생성 전략을 사용하고 싶을 때.
  • 주의점: 성능이 다른 전략들에 비해 다소 떨어질 수 있으며, 테이블을 추가로 관리해야 합니다.
@GeneratedValue(strategy = GenerationType.TABLE, generator = "my_table_generator")
@TableGenerator(name = "my_table_generator", table = "ID_GEN", pkColumnName = "GEN_NAME", valueColumnName = "GEN_VAL", allocationSize = 1)

요약

  • AUTO: 데이터베이스에 따라 자동으로 적절한 전략을 선택.
  • IDENTITY: 데이터베이스의 Auto Increment 기능을 사용하여 키를 생성.
  • SEQUENCE: 데이터베이스의 시퀀스를 사용하여 키를 생성.
  • TABLE: 별도의 테이블을 사용하여 키를 관리.