250x250
반응형
Notice
Recent Posts
Recent Comments
Link
종식당
[매일메일 2025-02-17] JPA에서 ID 생성 전략에 대해 설명해주세요. 본문
728x90
반응형
👾 JPA
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
}
자동 생성 방식을 사용할 때 각 전략에 대해서 설명해 주세요. 🤔
- IDENTITY 전략
기본 키 생성을 DB에 위임하는 전략이다. 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용된다.
해당 전략을 사용하면 엔티티를 생성할 때 쓰기 지연이 적용되지 않는다. 왜냐하면 JPA에서 엔티티를 영속하기 위해선 식별자가 필요한데, IDENTITY전략에서는 이 식별자가 DB에 저장되어야 할당되기 때문이다.
따라서 엔티티를 생성할 때 즉시 INSERT쿼리가 실행되어야 한다. 이때, 하이버네이트를 사용하는 경우에는 INSERT 쿼리의 결과를 다시 조회하지 않기 위해서 내부적으로 Statement.getGeneratedKeys를 사용한다.
추가로 IDENTITY 전략을 사용하면 배치 인서트가 불가하다는 점을 주의해야 한다. - SEQUENCE 전략
시퀀스 키 생성 전략을 지원하는 DB에서 사용할 수 있다. 데이터베이스 시퀀스란, 유일한 값을 자동으로 생성하게 하는 객체이다. auto_increment와 달리 초기 값과 한 번에 증가할 크기를 설정할 수 있다. 해당 시퀀스를 키 생성 전략으로 갖는 DB에 대해 SEQUENCE 전략을 사용할 수 있다. 어떤 시퀀스를 사용할 것인지를 @SequenceGenerator로 설정할 수 있다.
SEQUENCE전략은 em.persist()를 호출하는 경우 먼저 데이터베이스 시퀀스를 이용하여 식별자를 조회한다.
이후 조회한 식별자를 엔티티에 할당한 후에 엔티티를 영속성 컨텍스트에 저장한다.
트랜잭션을 커밋하여 플러시가 일어나면 엔티티를 저장한다는 점에서 IDENTITY전략과 차이가 있다. - TABLE 전략
키 생성 전용 테이블을 만들어 시퀀스를 흉내내는 전략이다. 어떤 테이블을 사용할 것인지를 @TableGenerator로 설정할 수 있다. TABLE전략은 값을 조회하면서 SELECT쿼리를 사용하며 증가를 위해 UPDATE쿼리를 사용한다.
SEQUENCE전략보다 DB와 한번 더 통신한다는 점에서 성능이 안 좋다는 단점이 있지만, 모든 DB에 적용할 수 있다는 장점이 있다. - AUTO 전략
데이터베이스에 따라서 IDENTITY, SEQUENCE, TABLE중 하나를 자동으로 선택한다. 데이터베이스를 변경해도 코드를 수정할 필요가 없다는 장점이 있다.
728x90
반응형
'매일메일' 카테고리의 다른 글
[매일메일 2025-02-19] 동일성과 동등성에 대해서 설명해주세요. (1) | 2025.02.28 |
---|---|
[매일메일 2025-02-18] equals와 hashCode는 왜 함께 재정의해야 할까요? (0) | 2025.02.28 |
[매일메일 2025-02-14] 로그와 메트릭을 설명해주세요. (0) | 2025.02.16 |
[매일메일 2025-02-14] 인터넷 창에 www.google.com를 입력하면 무슨 일이 일어나는지 설명해주세요. (0) | 2025.02.15 |
[매일메일 2025-02-11] 데이터베이스 인덱스에 대해서 설명해주세요. (0) | 2025.02.14 |