본문 바로가기
Back-End

JPA ID 생성 전략

by 코젼 2025. 3. 12.
728x90
반응형

JPA에서 ID를 생성하기 위해서는 직접 할당과 자동 할당을 사용할 수 있다.

  • 직접 할당: @Id어노테이션만을 사용하여 Id값을 직접 할당하는 방식
  • 자동 할당: @Id와 @GeneratedValue를 함께 사용해서 원하는 키 생성 전략선택하는 방식 @GeneratedValue의 strategy 옵션을 통해 생성 전략을 설정할 수 있는데, 여기에 올 수 있는 값인 GenerationType는 다음과 같다.
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface GeneratedValue {
    GenerationType strategy() default GenerationType.AUTO;

    String generator() default "";
}

public enum GenerationType {
	AUTO,
	IDENTITY,
	SEQUENCE,
	TABLE
}

@GeneratedValue 의 strategy 전략

IDENTITY

  • 기본 키 생성을 DB위임하는 전략이다.
  • 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용한다.
  • 해당 전략을 사용하면 엔티티를 생성할 때 쓰기 지연이 적용되지 않는다.
    • 왜냐하면 JPA에서 엔티티영속하기 위해선 식별자가 필요한데, IDENTITY 전략에서는 이 식별자가 DB저장되어야 할당되기 때문이다.
    • 따라서 엔티티생성할 때 즉시 INSERT 쿼리실행되어야 한다.
  • 하이버네이트를 사용하는 경우에는 INSERT 쿼리의 결과다시 조회하지 않기 위해서 내부적으로 Statement.getGeneratedKeys를 사용한다.
  • 배치 인서트불가하다는 점을 주의해야합니다.

배치 인서트 (Batch Insert)

insert rows 여러 개 연결해서 한 번에 입력하는 것을 Batch Insert 라고 한다. 하나의 트랜잭션으로 묶인다.

-- 개별 Insert 쿼리
INSERT INTO table1 (col1, col2) VALUES (val11, val12);
INSERT INTO table1 (col1, col2) VALUES (val21, val22);
INSERT INTO table1 (col1, col2) VALUES (val31, val32);

-- Batch Insert 쿼리
INSERT INTO table (col1, col2) VALUES
(val1, val11),
(val2, val22),
(val3, val33);

SEQUENCE

  • 시퀀스 키 생성 전략을 지원하는 DB에서 사용할 수 있다.
  • 어떤 시퀀스사용할 것인지를 @SequenceGenerator 로 설정할 수 있다.
  • em.persist() 를 호출하는 경우 먼저 데이터베이스 시퀀스이용하여 식별자조회한다.
  • 이후 조회한 식별자엔티티할당한 후에 엔티티를 영속성 컨텍스트저장한다.
  • IDENTITY 전략과의 차이: 트랜잭션커밋하여 플러시가 일어나면 엔티티를 저장한다.

데이터베이스 시퀀스

  • 유일한 값자동으로 생성하게 하는 객체다.
  • auto_increment와 달리 초기 값한번에 증가할 크기설정할 수 있다.

TABLE

  • 키 생성 전용 테이블을 만들어 시퀀스흉내내는 전략이다.
  • 어떤 테이블을 사용할 것인지를 @TableGenerator로 설정할 수 있다.
  • TABLE 전략은 값을 조회하면서 SELECT 쿼리를 사용하며, 증가를 위해 UPDATE 쿼리를 사용한다.
  • SEQUENCE 전략보다 DB한번 더 통신한다는 점에서 성능이 안좋다단점이 있지만, 모든 DB적용할 수 있다는 장점이 있다.

AUTO

  • 데이터베이스 방언에 따라서 IDENTITY, SEQUENCE, TABLE 중 하나를 자동으로 선택한다.
  • 데이터베이스변경해도 코드수정할 필요가 없다장점이 있다.
728x90
반응형

'Back-End' 카테고리의 다른 글

동일성과 동등성의 차이  (2) 2025.03.14
equals와 hashCode를 함께 재정의 해야하는 이유  (0) 2025.03.13
로그와 메트릭  (0) 2025.03.11
일급 컬렉션  (0) 2025.03.07
엔티티 매니저  (0) 2025.03.04

댓글