본문 바로가기
JPA/JPA원리

8 JPA 기본키 매핑

by 킹차니 2021. 7. 5.
김영한님의 인프런 강의와 PDF를 바탕으로 정리하였습니다.
https://www.inflearn.com/courses?s=%EA%B9%80%EC%98%81%ED%95%9C

 

 

기본키 매핑 어노테이션에는 @ID, @GerneratedValue 가 있습니다.

예를 들어 아래와 같이 사용합니다.

Member엔티티의 기본키로 사용되는 id

또한 기본키를 매핑하는 데에는 몇 가지 방법이 있습니다.

 

- 직접 할당: @Id만 사용
- 자동 생성(@GeneratedValue)

     1. IDENTITY: 데이터베이스에 위임, MYSQL
     2. SEQUENCE: 데이터베이스 시퀀스 오브젝트 사용, ORACLE @SequenceGenerator 필요
     3. TABLE: 키 생성용 테이블 사용, 모든 DB에서 사용 @TableGenerator 필요
     4. AUTO: 방언에 따라 자동 지정, 기본값

 

 

🔎 IDENTITY 전략

IDENTITY전략은 기본키 생성을 데이터베이스에 위임하는 것입니다.

기본키를 따로 입력하지 않으면 데이터베이스가 알아서 AUTO_INCREMENT(Mysql의 기본키 자동증가)를 해줍니다.

( MySql, PostgreSql, SQL Server, DB2에서 주로 사용)

 

중요한 특징이 있는데, 

보통 JPA는 commit시점에 쿼리를 날리지만, IDENTITY전략은 persist시점에 쿼리를 날린다는 것입니다.

이유는 id의 값을 DB에 위임했으므로, DB로 들어가 봐야 id값을 알 수 있습니다. 즉 DB에 들어가기 전에 거치는 영속성 컨텍스트(1차 캐시)에 들어갈 때는 id가 없으므로 1차 캐시에 저장해둘 수 없는 것입니다.(데이터 베이스에 insert쿼리를 실행한 후에 id값을 알 수 있음) 그리하여 어쩔 수 없이 바로 insert쿼리를 날리게 됩니다.

이로 인해 버퍼링과 같은 영속성 컨텍스트의 이점을 이용할 수 없다는 문제가 있습니다.

 

 

코드로 보겠습니다.

실행결과를 보면 insert쿼리가 ==== 안에서 실행(persist에서 실행)된 것을 볼 수 있습니다.

 

 

 

 

🔎 SEQUENCE 전략

시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트입니다.(오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용)

 

시퀀스 전략은 아래 표와 같이 다양한 속성이 있습니다.

 

먼저 코드를 보겠습니다.

실행결과:

결과를 보면 IDENTITY전략과 다르게 insert문을 commit시점에 수행한 것을 볼 수 있습니다.

그리하여 SEQUENCE전략은 버퍼링이 가능합니다. 하지만 "===="로 둘러쌓인 부분을 보면 persist마다 시퀀스 객체를 부르는 부분이 자주 호출되어 네트워크를 자주 타게 되고, 이는 성능 이슈를 일으킬 수 있습니다.

하지만 allocationSize를 늘리면 지정한 값만큼 한번에 가져오기 떄문에 이러한 문제를 해결할 수 있습니다.(allocationSize의 기본값은 50이다.)

 

 

기본값으로 수정
줄어든 시퀀스 call

 

 

 

 

참고자료: 김영한님 인프런 강의, PDF