본문 바로가기

Computer Science/데이터베이스

[TIL] 기본키 자동 생성 전략 (GenerationType)

반응형
SMALL

최근 프로그래머스 데브코스에서 JPA를 배우고 있다. Entity 및 Column을 생성하는 과정에서 기본키(PK)를 자동 생성해주는 여러가지 전략이 있었다. 어떤 전략들이 있고, 각각 어떤 경우에 쓰는 지 궁금해져서 알아보고 기록을 남긴다 ^~^

 

 

IDENTITY

@Id
@GeneratedValue(value = GenerationType.IDENTITY)
private Long id;

기본키 생성을 데이터베이스에 위임한다. 즉, id 값을 넘겨주지 않아도(null) DB에서 자동으로 AUTO_INCREMENT 해준다.

entityManager.persistt() 시점에 즉시 INSERT SQL을 실행하고 DB에서 식별자를 조회한다. (보통 commit 시점에 INSERT 실행)

 

SEQUANCE

@Id
@GeneratedValue(value = GenerationType.SEQUANCE)
private Long id;

데이터베이스 Sequance Object를 사용한다. ( = 유일한 값을 순서대로 생성하는 DB Object) 즉, DB가 알아서 숫자를 generate 한다.

테이블 별로 Sequance Object를 생성할 수도 있다. (sequanceName 속성 사용)

IDENTITY와 비슷한 전략이라고 생각했다.

 

TABLE

@Id
@GeneratedValue(value = GenerationType.TABLE)
private Long id;

키 생성 전용 테이블을 하나 만들어서 DB SEQUANCE를 흉내내는 전략이다.

모든 DB에서 적용 가능하나, 최적화 되어있지 않은 테이블을 사용하기 때문에 성능 상 문제가 생길 수 있다. 또한 관례적으로 DB에서 사용하는 것이 있기 때문에 운영 상의 DB에서는 거의 사용하지 않는 전략이라고 한다.

 

AUTO

@Id
@GeneratedValue(value = GenerationType.AUTO)
private Long id;

기본 설정 값으로 방언에 따라 위 3가지 전략(IDENTITY, SEQUANCE, TABLE)을 자동으로 지정한다.

 

 

SUMMARY

(Long 타입) + (대체키) + (적절한 키 생성 전략) 방식으로 사용하는 것을 권장한다고 한다.

 

- int 및 Integer은 한계가 있으므로 (예를 들어 10억을 넘겼을 때) Long 타입이 적당하다고 한다.

- 랜덤 값과 같은 비즈니스와 관계없는 값을 사용해야 한다고 한다. (개인 정보 보호 상의 문제인 듯?)

- IDENTITY 또는 SEQUANCE 전략을 많이 사용하는 추세라고 한다.

 

 

 

Reference

https://gmlwjd9405.github.io/2019/08/12/primary-key-mapping.html

반응형
LIST