기본 키 매핑

기본 키 매핑 어노테이션

  • @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

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

'Spring > JPA 프로그래밍 - 기본편' 카테고리의 다른 글

필드와 컬럼 매핑  (0) 2023.04.13
데이터베이스 스키마 자동 생성  (0) 2023.04.12
객체와 테이블 매핑  (0) 2023.04.11
준영속 상태  (0) 2023.04.10
플러시  (0) 2023.04.09