본문 바로가기
프로그래밍/Back-end

JPA 키 매핑 종류와 전략에 대해서!

by @GodWin 2024. 10. 14.

-




-
안녕하세요? 오늘은 JPA 에서의 키 매핑의 방법과, 키 매핑 전략에 대해서, 알아보도록 하겠습니다.
 

※ JPA의 중요 매핑 어노테이션에 대해서는, 아래 포스팅을 참조 바라겠습니다.
https://logger-debug.tistory.com/entry/JPA-%EC%A3%BC%EC%9A%94-%EB%A7%A4%ED%95%91-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C

 

JPA 주요 매핑 어노테이션에 대해서!

- -안녕하세요? 오늘은, JPA에서의 중요 매핑 어노테이션에 대해서 알아보도록 하겠습니다.-JPA의 중요 매핑 어노테이션의 종류는,@Entity @Table @ID @Column @Enumerated @Temporal @Lob  @Transient 등등이 존재

logger-debug.tistory.com

 

자 그럼, JPA에서의 키 매핑에 대해서 알아보도록 하겠습니다.

 

-

JPA에서 키 매핑의 방법에는, @ID @GeneratedValue 가 존재합니다.

 

그럼 샘플코드를 이용해서, 사용방법을 알아보도록 하겠습니다.

 

// case1). IDENTITY 매핑 전략
@Entity
public class 엔티티명 {
  
  @ID
  @GeneratedValue(strategy = IDENTITY)
  private String id;
  
  ...
  
}


// case2). SEQUENCE 매핑 전략
@Entity
@SequenceGenerator(  // 미기재시 하이버네이트 시퀀스 사용
        name = "엔티티테이블_SEQ_GENERATOR",
        sequenceName = "엔티티테이블_SEQ", // 매핑할 DB 시원스 이름
        initialValue = 1,
        allocationSize = 1)
public class 엔티티명 {

  @ID
  @GeneratedValue( strategy = GenerationType.SEQUENCE,
                   generator = "엔티티테이블_SEQ_GENERATOR") // 미기재시 하이버네이트 시퀀스 사용
  private Long id;

}


// case3). TABLE 매핑 전략
@Entity
@TableGenerator(
      name = "엔티티테이블_SEQ_GENERATOR",
      table = "MY_SEQUENCES",
      pkColumnValue = "엔티티테이블_SEQ",
      allocationSize = 1)
public class 엔티티명 {

  @ID
  @GeneratedValue( strategy = GenerationType.TABLE,
                   generator = "엔티티테이블_SEQ"GENERATOR")
  private Long id;

}

// 시퀀스나 테이블 매핑 전략을 위해서는, 시퀀스 관련 테이블 생성 필요
create table MY_SEQUENCES (
  sequence_name varchar(255) not null,
  next_val bigint,
  primary key ( sequence_name )
)

 


-
@ID

 

: 직접 ID 할당




-
@GeneratedValue

 

: 자동 생성
: IDENTITY / SEQUENCE / TABLE / AUTO 가 존재



 

-
* IDENTITY 전략의 특징

 

: MySQL에서 데이터베이스에 위임
: 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용 (예: MySQL의 AUTO_INCREMENT )
: JPA는 보통 트랜잭션 커밋 시점에 INSERT SQL 실행 하지만, AUTO_INCREMENT는 DB에 INSERT SQL을 실행한 이후에 ID값을 알 수 있음.
그래서,  IDENTITY 전략은  persist 시점에 즉시 INSERT SQL을 실행하고, DB에서 식별자를 조회
> 해당 전략만 예외적으로 persist 시점에 DB에 데이터 등록 후, 생성한 값을 1차캐시에 적재해서 영속성을 부여
> 키값의 미존재로 인해, 다중건 등록이 불가

 




* SEQUENCE 전략의 특징

 

: ORACLE에서 시퀀스 오브젝트 사용
: JPA에서 영속성을 부여하기 위해,
DB에서 시퀀스 값을 가지고 오게 된다. (call next value for XXX_SEQ)
> DB에서 등록을 위한 키값을 미리 가지고 오기 때문에,
IDENTITY와는 다르게, 다중건 등록이 가능
(allocationSize으로 미리 등록을 위한 시퀀스의 수를 확보해서 메모리에 적재해서 사용 가능)
: @SequenceGenerator 필요




++ @SequenceGenerator 속성

name sequenceName initialValue allocationSize catalog schema 속성 존재

이름 설명 기본값
name : 식별자 생성기 이름
: 필수 지정
 
sequenceName : DB에 등록되어있는 시퀀스 이름 hibernate_sequence
initialValue : DDL 생성시에만 사용
: 시퀀스 DDL을 생성할 때 처음 시작하는 수 지정
1
allocationSize : 시퀀스 한 번 호출에 증가하는 수
기본값은 50으로, 반드시 1로 설정
50
catalog : 데이터베이스 catalog 이름  
schema : 데이터베이스 schema 이름  




* TABLE 전략의 특징

 

 

: 모든 DB 사용
: @TableGenerator 필요
: SEQUENCE 전략과 동일하게, 
등록을 위한 시퀀스의 수를 확보해서 메모리에 적재해서 사용 가능
: 키 생성 전용 테이블을 하나 만들어서,
DB 시퀀스를 흉내내는 전략

장점 : 모든 DB 적용 가능
단점 : 성능의 하락
> 비권장

 


++ @TableGenerator


name table pkColumnName valueColumnNa pkColumnValue initialValue allocationSize catalog schema uniqueConstraints(DDL) 속성 존재

이름 설명 기본값
name : 식별자 생성기 이름
: 필수 지정
 
table : 키생성 테이블명 hibernate_sequence
pkColumnName : 시퀀스 컬럼명 hibernate_name
valueColumnNa : 시퀀스 값 컬럼명 next_val
pkColumnValue : 키로 사용할 값 이름 엔티티 명
initialValue : 초기 값, 마지막으로 생성된 값이 기준 0
allocationSize : 시퀀스 한 번 호출에 증가하는 수
: 기본값은 50으로, 반드시 1로 설정
50
catalog DB catalog이름  
schema DB schema 이름  
uniqueConstraints 유니크 제약 조건 지정 가능  




* AUTO 전략의 특징

: 기본값, 자동으로 지정



* 권장하는 식별자 전략


: 기본 키 제약 조건
> Not Null, Unique, Not change★★★
: 미래까지 현 조건을 만족하는 자연키는 찾기가 어렵다
> 대리키(대체키)를 사용

 

그렇다면? Long형 + 대체키 + 키 생성전략 사용 을 권장

오늘은 JPA 에서의 키 매핑의 방법과, 키 매핑 전략에 대해서, 알아보았습니다.

그럼 오늘도 즐거운 하루 되시길 바라겠습니다.