본문 바로가기
Framework/🍃Spring

JPA - 기본키 매핑

by 발개발자 2022. 12. 13.
반응형

JPA에서는 기본키의 값을 설정하는데 다양한 옵션을 제공한다.

 

먼저 기본키 매핑부터 진행해보자.

  기본 키 매핑 방법

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

@Id와 @GeneratedValue라는 어노테이션을 통해 기본키 매핑을 해줄 수 있다.

만약 기본키 값을 직접 할당해줄 경우 @Id만 사용하면 된다.

반대로 자동 생성을 원할 경우 @GeneratedValue를 사용하면 된다.

 

@GeneratedValue을 사용할 경우 아래의 매핑전략을 활용할 수 있다.

 

IDENTITY : 데이터베이스에 위임. (MYSQL)

SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용. @SequenceGenerator 필요. (ORACLE)

TABLE : 키 생성용 테이블 사용. (모든 DB)

AUTO : 방언에 따라 자동 지정. (기본 값)

 

 

  기본 키 매핑 전략 별 특징

 

IDENTITY

  • 기본 키 생성을 데이터베이스에 위임.
  • MySQL, PostgreSQL, SQL Server, DB2에서 주 사용(ex : MySQL의 AUTO_INCREMENT)
  • JPA는 트랜잭션 커밋 시점에 INSERT SQL을 실행하지만 AUTO_INCREMENT로 설정할 경우 persist 점에서 INSERT SQL을 실행하여 Id값 조회 가능.

 

SEQUENCE

  • 데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 데이터베이스 오브젝트를 사용 (ex: 오라클 시퀀스)
  • 오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용.
  • 아래와 같이 @SequenceGenerator 어노테이션을 통해 설정을 해준 후 사용해 줘야 한다.
@Entity
@SequenceGenerator(
		name = "MEMBER_SEQ_GENERATOR",
        sequenceName = "MEMBER_SEQ",
        initalValue = 1, allocationSize = 1)
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE,
    	generator = "MEMBER_SEQ_GENERATOR")
    private Long id;
}

 

TABLE

  • 키 생성 전용 테이블을 만들어서 데이터베이스 시퀀스를 흉내내는 방식.
  • 모든 데이터베이스에 적용 가능하지만 크기가 늘어날수록 성능이슈가 발생.

@TableGenerator 속성

속성 설명 기본값
name 식별자 생성기 이름 필수
table 키생성 테이블명 hibernate_sequences
pkColumnName 시퀀스 컬럼명 sequence_name
valueColumnName 시퀀스 값 컬럼명 next_val
pkColumnValue 키로 사용할 값 이름 엔티티 이름
initialValue 초기 값, 마지막으로 생성된 값이 기준 0
allocationSize 시퀀스 한번 호출에 증가수(성능 최적화 목적) 50
catalog, schema 데이터베이스 catalog, schema 이름  
uniqueConstraints(DDL) 유니크 제약조건  

 

 

  권장하는 식별자 전략

 

기본 키 설정 조건

  • null값은 허용하지 않는다.
  • 유일해야 한다.
  • 변해선 안 된다.

 

과거에는 자연 키를 기본 키로 하는 것이 정석이었지만, 주민등록번호 DB 암호화 이슈로 최근에는 변할 가능성이 적은 대리 키 방식을 선호한다.

 

따라서 Long형 + 대체키 + 키 생성전략 사용 방식을 권장한다.

 

 

본 내용은 아래의 강의를 참고했습니다.

https://www.inflearn.com/course/ORM-JPA-Basic

반응형

댓글