JPA 기본키 매핑

jyKim·2023년 5월 29일
0

JPA

목록 보기
6/7

기본키 매핑 어노테이션

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

@Id

  • 기본키 직접 할당

@GeneratedValue

  • 기본키 자동 할당
  • IDENTITY
    • 기본키 생성을 DB에 위임
    • Ex) Auto Increment
    • JPA는 일반적으로 커밋 시점에 INSERT SQL 실행(JPQL의 경우 즉시 실행됨)
    • AUTO_INCREMENT는 SQL 실행 한 이후 ID를 알 수 있다.
    • 해당 전략만 예외적으로 em.persist() 시점에 즉시 INSERT SQL이 실행되고 DB에서 식별자를 조회하여 영속성 컨텍스트에 저장한다. -> 커밋 전까지 ID값을 알 수 없기 때문
  • TABLE
    • 키 생성 전용 테이블을 하나 만들어서 시퀀스를 흉내내는 전략
    • 모든 데이터베이스에 적용 가능
    • 성능이 떨어지는 이슈가 존재
      속성설명기본값
      name식별자 생성자 명필수
      table키생성 테이블명hibernate_sequences
      pkColumnName시퀀스 컬럼명sequence_name
      valueColumnNa시퀀스 값 컬럼명next_val
      pkColumnValue키로 사용할 값 이름엔티티명
      allocationSize시퀀스 한 번 호출 시 증가하는 수(성능 최적화 시 사용)
      데이터베이스 시퀀스 값이 1씩 증가호도록 설정되어 있다면 1로 설정해야 함
      50
      catalog, schema데이터베이스 catalog, schema 이름
      uniqueConstraint(DDL)유니크 제약 조건 지정
  • SEQUENCE
    • 주로 ORACLE DB에서 많이 사용
    • 시퀀스 오브젝트를 생성 한 뒤, 해당 시퀀스를 사용하여 값을 설정
    • Ex) SEQUENCE.NEXTVAL
    • @SequenceGenerator를 통해 테이블마다 설정 가능
      // Example
      @Entity
      @SequenceGenerator(
      name = “MEMBER_SEQ_GENERATOR",
      sequenceName = “MEMBER_SEQ", //매핑할 시퀀스 이름
      initialValue = 1, allocationSize = 1)
      public class Member {
      @Id
      @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MEMBER_SEQ_GENERATOR")
      private Long id;
      속성설명기본값
      name식별자 생성자 명필수
      sequenceName데이터베이스에 등록되어 있는 시퀀스 명TRUE
      initialValueDDL 생성 시에만 사용되며, 시퀀스 DDL을 생성할 때 처음 시작하는 수를 지정1
      allocationSize시퀀스 한 번 호출 시 증가하는 수(성능 최적화 시 사용)
      데이터베이스 시퀀스 값이 1씩 증가호도록 설정되어 있다면 1로 설정해야 함
      50
      catalog, schema데이터베이스 catalog, schema 이름
  • AUTO
    • IDENTITY, TABLE, SEQUENCE 중 JPA가 적절히 선택
  • allocationSize
    • 메모리에 한번에 올릴 size

권장하는 식별자 전략

  • 기본키 제약조건 : not null, 유일 값, 불변
  • 미래까지 불변하는 자연키는 찾기 어려움 -> 대체키를 사용
  • 권장 : Long타입 + 대체키 + 키 생성전략 사용(auto increment, sequence, uuid 등)
  • 비지니스 로직을 pk로 가져오는 것은 권장하지 않는다.
profile
백엔드애옹

0개의 댓글