BE전문가 프로젝트

기본 키 매핑 본문

JPA

기본 키 매핑

원호보고서 2022. 10. 8. 18:19

기본키 매핑과 관련된 Annotation은 @Id, @GeneratedValue 두가지가 있다

 

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

 

자동할당

IDENTITY 전략 - 특징

  • 기본 키 생성을 데이터베이스에 위임
  • 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용(예: MyySQL의 AUTO_INCREMENT)
  • JPA는 보통 트랜잭션 커밋 시점에 INSERT SQL 실행
  • AUTO_INCREMENT는 데이터베이스에 INSERT SQL을 실행한 이후에 ID 값을 알 수 있음
  • IDENTITY 전략은 em.persist() 시점에 즉시 INSERT_SQL 실행하고 DB에서 식별자 조회(원래는 commit 시점에 insert 됨)
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

 

SEQUENCE전략 

  • 데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트(ORACLE 시퀀스)
  • ORACLE, PostgreSQL, DB2, H2 데이터베이스에서 사용
@Entity
@NoArgsConstructor
@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;
    
}

 

- 이름을 주지 않았기 때문에 기본 시퀀스인 hibernate_sequence를 사용한다.

- 보통 테이블 마다 시퀀스를 따로 사용하기 때문에 SequenceGenerator를 통해서 매핑을 하면 된다.

- 실행하면 MEMBER_SEQ가 생성되는 것을 확인할 수 있다.

- 실행할 때마다 시퀀스를 가져오게 되면 DB를 한번 더 타게 되기 때문에 성능에 문제가 생길 수 있다. 이를 해결하기 위해서 allocationSize 속성이 있는데 50으로 설정하면 DB에 미리 50개를 올리고 필요할 때마다  메모리 상에 올려져 있는것을 꺼내서 사용한다.

속성 설명 기본값
name 식별자 생성기 이름 필수
sequenceName 데이터베이스에 등록되어 있는 시퀀스 이름 hibernate_sequence
initialValue DDL 생성 시에만 사용됨, 시퀀스 DDL을 생성할 때 처음 1 시작하는 수를 지정한다 1
allocationSize 시퀀스 한 번 호출에 증가하는 수(성능 최적화에 사용됨 
데이터베이스 시퀀스 값이 하나씩 증가하도록 설정되어 있으면 이 값을 반드시 1로 설정해야 한다
50
catalog, schema 데이터베이스 catalog, schema 이름  

 

 

TABLE전략

  • 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략
  • 장점: 모든 데이터베이스에 적용 가능
  • 단점: 성능
@Entity
@NoArgsConstructor
@TableGenerator(
        name = "MEMBER_SEQ_GENERATOR",
        table = "MY_SEQUENCES",
        pkColumnName = "MEMBER_SEQ",allocationSize = 1)
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE,
            generator = "MEMBER_SEQ_GENERATOR")
    private Long id;   
}

 

 

권장하는 식별자 전략

  • 기본 키 제약 조건: null아님, 유일, 변하면 안됨
  • 미래까지 이 조건을 만족하는 자연키는 찾기 어려움. 대리키(대체키)를 사용하자
  • 예를 들어 주민등록번호도 기본키로 적절하지 않음
  • 권장: Long형 + 대체키 + 키 생성전략 사용 

'JPA' 카테고리의 다른 글

연관관계 매핑 기초  (0) 2022.10.09
쇼핑몰 만들기 1. 요구사항 분석과 기본 매핑  (0) 2022.10.09
필드와 컬럼 매핑  (0) 2022.10.05
데이터베이스 스키마 자동 생성  (0) 2022.10.03
객체와 테이블 매핑  (0) 2022.10.03
Comments