기본 키 매핑 어노테이션
- @Id
- 기본키를 직접 할당하는 방법 ⇒ @Id만 사용하면 된다.
- @GeneratedValue
- 기본키 자동생성 기능을 위해서 사용한다.
- 기본키 자동생성 기능을 위해서 사용한다.
IDENTITY 전략
- 기본 키 생성을 DB에 위임한다.
- MySQL(AUTO_ INCREMENT), PostgreSQL, SQL Server, DB2에서 사용한다.
- 보통 JPA는 커밋 직전에 INSERT 쿼리를 실행하지만, IDENTITY 전략은 entityManager.persist() 시점에 즉시 INSERT쿼리를 실행하고 DB에서 식별자를 조회한다. 그 이유는 아래와 같다.
- PK값을 DB에 들어간 뒤에 알 수 있다.
- JPA 입장에서는 @Id(DB PK)를 알 수가 없으니 원래라면 1차캐시 안에 값을 넣을 수가 없다.
- 그래서 commit하는 시점 이전에, persist() 를 실행하면 INSERT 쿼리를 실행한다.
- 그래야만 PK값을 알고, 저장할 수 있기 때문이다.
- 따라서 버퍼링을 사용할 수 없다.
SEQUENCE 전략
- 오라클, PostgreSQL, DB2, H2 DB에서 사용한다.
- 유일한 값을 순서대로 생성하는 DB 오브젝트이다. (ex: 오라클 시퀀스)
- 실습을 위해 방언을 오라클로 설정한다.
- SEQUENCE 속성
- name : 식별자 생성기의 이름을 정한다. 필수.
- sequenceName : DB에 등록되어 있는 시퀀스의 이름. 기본값은 hibernate_sequence
- initialValue : DDL 생성 시에만 사용된다. 시퀀스 DDL을 생성할 때 1로 시작하는 수를 지정한다. 기본값은 1
- allocationSize : 시퀀스 한 번 호출에 증가하는 수를 지정한다. (성능 최적화를 위해) DB 시퀀스 값이 하나씩 증가하도록 설정되어있으면 이 값을 반드시 1로 설정해야 한다. 기본값은 50.
- catalog, schema : DB, 카탈로그, 스키마의 이름을 정한다.
- SEQUENCE 속성을 사용한 예시는 다음과 같다. 식별자 생성기의 이름을 member_seq_generator로 설정하고 DB에 등록되어있는 시퀀스의 이름을 member_sequence로 설정한다.
- 영속성 컨텍스트에 저장하기 위해 PK를 필요로 할 때, 시퀀스에서 PK를 받아오는 작업을 선행한다.
- 영속성 컨텍스트 (1차캐시)에 쌓여있고, 이후 트랜잭션 커밋하는 시점에 INSERT 쿼리를 실행한다.
- 이 때 성능 개선을 위해 allocationSize를 사용한다.
- 예를 들어 디폴트인 50으로 지정되어있다고 해보자.
- DB 시퀀스에서 50개의 @Id(PK)값을 미리 할당하여 메모리 상에 캐시로 유지한다.
- 이후 50번째를 넘어가게 되면 새로운 50 만큼의 @Id를 할당한다.
- call next value 는 1, 51, 101…. 마다 실행된다.
- 하지만 allocationSize가 크게 설정되어 있을수록 캐싱된 ID 값이 낭비될 가능성이 커지기 때문에 크기를 신중히 결정해야 한다.
- 여러 웹 서버가 있어도 동시성 이슈가 없다.
TABLE 전략
- 키 생성 전용 테이블을 만들어서 DB 시퀀스를 흉내내는 전략이다.
- 모든 DB에 적용 가능하다는 장점이 있다.
- 다만, 테이블을 직접 사용하므로 성능 이슈가 생긴다는 단점이 있다. 최적화가 안된다.
- MY_SEQUENCES 라는 이름의 테이블과 관련 시퀀스들이 생성된다.
- DB를 확인하면 해당 테이블에 값이 들어가있는 것을 확인 할 수 있다. 계속 입력하면 NEXT_VAL의 값이 증가한다.
- TABLE 속성
AUTO 전략
- 기본값. 방언에 따라 자동지정된다.
권장하는 식별자 전략
- 기본 키 제약 조건
- null이 아니다.
- 유일하다.
- 변하면 안된다. → 이 부분이 어렵다.
- 주민번호조차 이 조건을 자연키에 해당되지 않는다.
- Long 타입 + 대체키 + 키 생성전략을 사용하는 것을 권장한다.
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
'Spring > JPA 프로그래밍 - 기본편' 카테고리의 다른 글
필드와 컬럼 매핑 (0) | 2023.04.13 |
---|---|
데이터베이스 스키마 자동 생성 (0) | 2023.04.12 |
객체와 테이블 매핑 (0) | 2023.04.11 |
준영속 상태 (0) | 2023.04.10 |
플러시 (0) | 2023.04.09 |