기본 키 매핑 어노테이션

  • @Id

  • @GeneratedValue

@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

기본키 매핑 방법

  • 직접 할당 : @Id만 사용
  • 자동 생성(@GeneragedValue)
    • IDENTITY : 데이터베이스에 위임, MYSQL
    • SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용, ORACLE
      • @SequenceGenerator필요
    • TABLE : 키 생성용 테이블 사용, 모든 DB에서 사용
      • @TableGenerator 필요
    • AUTO : 방언에 따라 자동 지정, 기본값


IDENTITY 전략



@Entity
public class Member {

 @Id
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 private Long id; 


  • 기본 키 생성을 데이터베이스에 위임
  • 주로 MYSQL, PostgreSQL, SQL Server, DB2에서 사용( MYSQL의 AUTO_INCREMENT )
  • JPA는 보통 트랜잭션 커밋 시점에 INSERT SQL 실행
  • AUTO_INCREMENT는 데이터베이스에 INSERT SQL을 실행 한 이후에 ID값을 알 수 있음
  • IDENTITY 전략은 em.persist() 시점에 즉시 INSERT SQL 실행하고 DB에서 식별자를 조회한다.
  • 원래, 영속성 컨텍스트에서 commit 하는 시점에 db에 값이 들어가는데 IDENTITY 전략만 예외로 em.persist() 시점에 데이터베이스에 들어간다. 영속 컨텍스트에서 관리하려면 PK가 있어야하는데 디비에 들어가봐야 그 값을안다.
  • Identity는 디비에 넣기전까지 pk가 없어서 setMemberId(“sss”); 같은걸 못넣기 때문에 em.persist() 시점에 데이터베이스에 값이 들어간다.


SEQUENCE 전략


시퀀스매핑전략


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


SEQUENCT - @SequenceGenerator

  • name : 식별자 생성기 이름 (필수)
  • sequenceName : 데이터베이스에 등록되어 있는 시퀀스 이름
  • initialValue : DDL 생성 시에만 사용됨, 시퀀스 DDL을 생성할 때 처음 1 시작하는 수를 지정한다.(default : 1)
  • allocationSize : 시퀀스 한 번 호출에 증가하는 수 (성능 최적화에 사용됨) 데이터베이스 시퀀스 값이 하나씩 증가하도록 설정되어 있으면 이 값을 반드시 1로 설정해야한다. (default : 50)
  • 한번에 db에서 50까지 땡겨서 올려놓고 사용하는 개념으로 성능 최적화에 사용되는것
  • catalog, schema : 데이터베이스 catalog, schema 이름


TABLE 전략


테이블매핑전략


  • 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략
  • 모든 데이터베이스에 적용이 가능하다는 장점이 있지만 테이블을 직접사용하니깐 락도 걸릴수있고 성능에 이슈가있다.

TableGenerator - 속성

  • name : 식별자 생성기 이름 / 필수
  • table : 키생성 테이블 명
  • pkColumnName : 시퀀스 컬럼명
  • valueColumnNa : 시퀀스 값 컬럼명
  • pkColumnValue : 키로 사용할 값 이름 / 기본값 : 엔티티 이름
  • initialValue : 초기 값, 마지막으로 생성된 값이 기준이다.
  • allocationSize : 시퀀스 한 번 호출에 증가하는 수 / 기본값 : 50
  • catalog, schema : 데이터베이스 catalog, schema 이름
  • uniqueConstraints : 유니크 제약조건을 지정할 수 있다.


권장하는 식별자 전략

  • 기본 키 제약조건 에 대해서 생각해봐야함 : NULL 아님, 유일, 변하면안된다.
  • 변하면 안된다는 조건을 추후 운영하고 몇십년뒤까지 만족해서 개발하기가 어렵다.
  • 대리키(대체키)를 사용하자 !
  • 예를 들어, 주민등록번호도 기본 키로 적절하지 않다. 정책이 바뀔수도 있으니
  • 권장 : Long형 + 대체키 + 키 생성전략 사용

😄 참고 : 인프런 김영한님의 JPA 기본 강의 및 교재


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

개인메모

태그:

카테고리:

업데이트: