JPA에서 Entity를 생성하기 위해서는 기본키(PK)로 사용할 @Id 어노테이션을 사용한다.
이때 뒤에 PK를 어떻게 생성할 것인지, 정의할 수 있는 옵션이 존재하는데 @GeneratedValue이다.

이 방법은 크게 5가지가 존재한다.

  1. 직접할당
  2. AUTO
  3. SEQUENCE
  4. IDENTITY
  5. TABLE

1) 직접할당

 

어플리케이션 내에서 직접 값을 생성하여, 할당하는 방법이다.

 

2) AUTO

 

사용하는 DB에 따라 다르게 동작하며, 가장 적절한 생성방식을 골라준다.

 

3) SEQUENCE

 

SQL:2003에 정의된 Sequnce Generator를 따른다면 사용할 수 있는 방식이라고 한다.
기본적으로 값 생성 및 처리가 빨라, 우선적으로 고려해봐야할 옵션이지만, Oracle, SQL Server2012, PostgreSQL, DB2, HSQLDB에서만 지원한다고 한다.
만일 지원하지 않는 DB라면, TABLE 생성으로 변경한다.
(SEQUENCE 지원 DB목록 정리)

 

4) IDENTITY

 

데이터베이스의 auto_increment를 사용해서 기본 값을 생성하는 방식이다.
편하게 쓸 수 있지만, 단점들로는 영속성 컨텍스트에 있는 객체들의 PK를 구할 수 없다는 점, JPA의 Batch Insert가 비활성화 된다는 점이있다. 참고

 

5) TABLE

테이블을 별도로 생성해서, 엔티티 생성시마다 기본 값을 갱신하는 방식이다.
제약사항이 없어서, 대부분의 DBMS에서 사용이 가능하지만 다른 방식들에 비해 성능이 최악이다.

 


처음 JPA를 사용한 프로젝트에서 아무것도 모르고 단순히 IDENTITY 옵션을 사용하다가, 영속 컨텍스트에서 PK를 못 구해서 많이 해맸던 기억이 있다.
아예 모르는 상황이다 보니, 궁여지책으로 UUID를 대체키로 넣어서, 매번 객체 생성시마다 직접 할당을 해줬었다....

(떠올리면 너무 부끄럽다 ㅠㅠ)

 

나중에 이런 구조가 잘못된 걸 알고 다시 고치려고 하니, 작업량도 만만치 않고, 다른 사람들과의 팀프로젝트라 무슨 문제가 발생할지 몰라 그대로 방치해버리게 되었다.

다른 사람들도 이런 마음 아픈 일을 겪지 않고, 스스로도 기억하기 위해 글을 써본다.


참고자료

+ Recent posts