개인 프로젝트를 하다보니 문뜩 궁금한 점이 생겨 정리하게 되었다
그동안 강의를 들어보지 않고 스스로 공부하며 개발하다 우연히 김영한의 유튜브에서 jpa영상을 보게되었다. 평소에 @Entity의 PK를 지정해줄때 @ID와 @GeneratedValue어노테이션을 함께 사용하고, strategy로는 주로 AUTO를 선택하였는데, 당연하다는 듯이 IDENTITY를 선택하는 것을 보고 대체 어느 것을 기준으로 전략을 선택하는지 궁금하여 글을 남긴다.

TABLE, SEQUENCE, IDENTITY, UUID, AUTO로 총 5가지의 종류가 존재한다.

strategy를 따라가 보았는데, 기본으로는 AUTO타입을 할당해주는 것을 확인하였다.
그리고 아래의 글을 참고해보니 기본 전략으로는 AUTO를 제외한 전략이 있고, AUTO는 persistence provider(hibernate, EclipseLink, OpenJPA)의 전략에 따라 결정된다고 한다.
링크텍스트
데이터베이스의 AutoIncrement 기능을 사용하여 PK값을 생성한다.
-> 기본 키 생성을 데이터베이스에 위임하는 전략이다. 따라서 PK는 데이터베이스에 삽입된 이후 반환된 객체를 통해 할 수 있다.
사용적인 부분에서는 매우 쉽게 사용할 수 있지만, 성능적으로 가장 좋지는 않다.
그러나 대부분의 데이터베이스에서는 효율적이다.
DB Sequence Object를 사용하여 PK값을 생성한다.
주로 ORACLE의 PK생성 전략으로 사용된다.
시퀀스에 대한 데이터를 @SequenceGenerator 어노테이션을 사용하여 지정해주어야 한다.
@SequenceGenerator에 포함된 속성은
name, sequenceName, initialValue(iv), allocationSize, catalog, schema가 있다.
자세한 내용은 다음에 기회가 되면 다뤄야겠다.
데이터베이스의 키 생성 전용 테이블을 만들어 PK의 생성에 사용하는 전략이다.
키 생성용 테이블을 따로 만들기 때문에 데이터베이스나 버전에 상관없이 이식성 높게 사용 가능하다.
다만, 데이터베이스의 성능에 영향을 미칠 수 있으며, 데이터베이스에서 키 생성용 테이블을 관리하기에 트랜잭션 충돌이 발생할 수 있다.
UUID를 사용하여 기본 키를 생성하는 전략.
숫자 기반의 PK생성 방법과 달리, 문자열 기반(UUID)으로 생성하기에, 데이터베이스에서 별도의 시퀀스나 테이블을 생성할 필요가 없음.
128비트의 숫자로 구성되며, 중복될 확률이 매우 낮다. UUID를 생성할때에는 데이터베이스에 종속하지 않고 생성할수 있으므로 종속성이 없고, 분산 시스템에 적합하다.
하지만 PK를 문자열로 구분하기에 숫자 기반 전략만큼 정렬이 쉽지 않다.