김영한님의 인프런 강의와 PDF를 바탕으로 정리하였습니다.
https://www.inflearn.com/courses?s=%EA%B9%80%EC%98%81%ED%95%9C
기본키 매핑 어노테이션에는 @ID, @GerneratedValue 가 있습니다.
예를 들어 아래와 같이 사용합니다.
또한 기본키를 매핑하는 데에는 몇 가지 방법이 있습니다.
- 직접 할당: @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이다.)
참고자료: 김영한님 인프런 강의, PDF
'JPA > JPA원리' 카테고리의 다른 글
10 JPA 단방향 연결관계 (객체적 설계도입) (0) | 2021.07.05 |
---|---|
9 JPA 요구사항 추가(관계형 DB의존적 설계) (0) | 2021.07.05 |
7 JPA 필드와 칼럼 매핑 (0) | 2021.07.04 |
6 JPA 객체와 테이블 매핑, 데이터베이스 스키마 자동 생성 (0) | 2021.07.04 |
5 JPA 준영속 상태 (0) | 2021.07.03 |