JPA

<Spring JPA> 1.11 기본키 매핑

DeveloperRio 2020. 4. 21. 09:52

기본키를 매핑하는 방법으로 두가지 어노테이션을 언급할 수 있다.

@Id, @GeneratedValue

 

기본키로 지정하겠다는 표시는 @Id 로 충분하다. 다만 우리가 보통 키를 직접 넣어주기 보다는 자동증가하는 형태로 만들기 때문에 거의 대부분 @GeneratedValue 를 함께 하게 된다.

 

@Id 는 다른 방법이 없다. 그냥 달아주면 된다. 다른 설정도 없다.

@GeneratedValue 는 몇가지 설정이 있다. 따로 설정해주지 않는다면 AUTO 로 된다. AUTO 라고 해서 아 자동이구나 하고 넘어가면 안된다. 뭘 기준으로 자동으로 되는 지 알아야 한다. JPA 에서 @GeneratedValue 의 AUTO 는 데이터베이스의 방언에 따라 자동지정된다. AUTO 외에는 IDENTITY, SEQUENCE, TABLE 이 있다.

 

간단한 특징으로 IDENTITY 는 데이터베이스에 위임하는 것이다. MYSQL 과 같은 데이터베이스에서 쓰인다. 

SEQUENCE 는 데이터베이스의 시퀀스 오브젝트를 사용한다. ORACLE 과 같은 데이터베이스에서 쓰인다.

TABLE 은 키 생성용 테이블을 사용하는 방식이다. 이건 데이터베이스 종류를 타지 않는 방법이다.

 

IDENTITY 전략을 좀 더 상세히 설명하면, MYSQL, PostgreSQL, SQL Server, DB2 에서 사용된다. MYSQL 는 AUTO_INCREMENT 를 이용한다. JPA 같은 경우는 트랜잭션 커밋 시점에 Insert sql 을 실행한다. 하지만 생각해보면, 커밋이 안되면 기본키를 알 수 없는 상황이 펼쳐진다. 그렇기 때문에 Identity 전략이 있는 경우, persist 시점에 즉시 insert sql 을 실행한다. (앞서 jpa 장점을 신나게 나열해놓고 갑자기 이 때는 이건 안된다... 좀 어이가 없지만, 애초에 1차 캐쉬는 크게 효과가 없다고 했기 때문에 가볍게 패스)

 

SEQUENCE 전략은 데이터 베이스의 시퀀스를 담당하는 오브젝트를 생성하는 것이다. ORACLE, PostgreSQL, DB2, H2 데이터 베이스에서 사용된다. SEQUENCE 전략의 경우 설정값으로,name, sequenceName 등을 설정하고 추가로 initialValue, allocationSize 를 설정한다. 요게 조금 색다른데 기본값이 1 과 50이다. 그 이유는 그때그때마다 1씩 늘려서 가져오면 너무 성능부담이 크다. 그래서 한방에 50개를 가져온다. 그 다음 50개를 다 소진하면 그 다음 50개를 가져오는 방식이다. 

 

TABLE 전략은 모든 데이터베이스에 적용가능하다는 것이 장점이다. 하지만 성능이 문제다. 

 

기본키를 설정할 때는 null 이 될 수 없는 것, 유일해야 하고, 변하지 않는 것이어야 한다.

회원 업무를 하다보면 주민번호의 대체값인 CI 를 쓸 때가 있다. 주민번호와 비슷하기 때문에 CI 는 바뀌지 않는다고 보는 회사를 보았다. 그리고 그 CI 가 변경되면서 고생을 하는 경우를 보았다.

 

 

 

 

반응형