JPA

JPA시작(6)_기본키 매핑 (직접할당, 자동생성)

개발자 배찌 2021. 6. 7. 16:14
728x90

JPA가 제동하는 데이터베이스 기본키 생성 전략은 다음과 같다.

  • 직접할당 : 기본키를 애플리케이션에서 직접할당
  • 자동생성 : 대리키 사용방식 (IDENTITY, SEQUENCE, TABLE)

 

기본키 직접할당

em.persist()로 엔티티를 저장하기 전에 애플리케이션에서 기본키를 직접 할당하는 방법

 

Board board = new Board();
board.setId("id1") //기본키 직접 할당
em.persist(board);

 

 

 

기본키 자동생성 1) IDENTITY 전략

기본키 생성을 데이터베이스에 위임하는 전략..

CREATE TABLE BOARD (
    ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    DATA VARCHAR(255)
);

INSERT INTO BOARD(DATA) VALUES('A');
INSERT INTO BOARD(DATA) VALUES('B');

테이블을 생성할 때 기본키 컬럼인 ID에 AUTO_INCREMENT를 추가!!

데이터베이스에 값을 저장할 때 ID 컬럼을 비워두면 데이터베이스가 순서대로 값을 채워준다.

 

 

IDENTITY 매핑코드

@Entity
public class Board {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    ...
}

개발자가 엔티티에 직접 식별자를 할당하면 @Id 만 있으면 되지만

지금처럼 식별자가 생성되는 경우에는 @GeneratedValue 를 사용하여 식별자 생성 전략을 명시해야한다.

 

 

IDENTITY 사용코드

private static void logic (EntityManager em) {
    Board board = new Board();
    em.persist(board);
    System.out.println("board.id = " + board.getId());
}

 출력값

board.id = 1

 

 

 

 

기본키 자동생성 2) SEQUENCE 전략

 

데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트 이다.

 

먼저 시퀀스를 생성해야한다.

CREATE TABLE BOARD (
    ID BIGINT NOT NULL PRIMARY KEY,
    DATA VARCHAR(255)
)

//시퀀스 생성
CREATE SEQUENCE BOARD_SEQ START WITH 1 INCREMENT BY 1;

 

 

SEQUENCE 매핑코드

@Entity
@SequenceGenerator (
    name = "BOARD_SEQ_GENERATOR",
    sequenceName = "BOARD_SEQ", //매핑할 데이터베이스 시퀀스 이름
    initialValue = 1, allocationSize = 1)
public class Board {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE,
                            generator = "BOARD_SEQ_GENERATOR")
    private Long id;
    ....
}

SEQUENCE 사용코드

private static void logic (EntityManager em) {
    Board board = new Board();
    em.persist(board);
    System.out.println("board.id = " + board.getId());
}

 출력값

board.id = 1

 

기본키 자동생성 3) TABLE 전략

 

TABLE 전략은 키 생성 전용 테이블을 하나 만들고,

여기에 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀀스를 흉내내는 전략.

 

TABLE 전략 키 생성 DDL

create table MY_SEQUENCES (
    sequence_name varchar(255) not null,
    next_val bigint,
    primary key (sequence_name)
)

 

TABLE 매핑 코드

@Entity
@TableGenerator (
    name = "BOARD_SEQ_GENERATOR",
    table = "MY_SEQUENCES",
    pkColumnValue = "BOARD_SEQ", allocationSize = 1 )
public class Board {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE,
                            generator = "BOARD_SEQ_GENERATOR")
    private Long id;
    ....
}

TABLE사용코드

private static void logic (EntityManager em) {
    Board board = new Board();
    em.persist(board);
    System.out.println("board.id = " + board.getId());
}

 출력값

board.id = 1

 

기본키 자동생성 4) AUTO 전략

GenerationType.AUTO 는 선택한 데이터베이스 방언에 따라

IDENTITY, SEQUENCE, TABLE 전략중 하나를 자동으로 선택한다.

 

AUTO 매핑코드

@Entity
public class Board {
    @Id
    @GeneratedValue (strategy = GenerationType.AUTO)
    private Long id;
    ....
}

(strategy = GenerationType.AUTO) 이부분은 생략 가능

 

 


★기본키 매핑 정리★

  • 직접할당 : em.persist() 를 호출하기 전에 애플리케이션에서 직접 식별자 값을 할당해야 한다.
  • SEQUENCE : 데이터베이스 시퀀스에서 식별자 값을 획득한 후 영속성 컨텍스트에 저장
  • TABLE : 데이터베이스 시퀀스 생성용 테이블에서 식별자 값을 획득한 후 영속성 컨텍스트에 저장
  • IDENTITY : 데이터베이스에 엔티티를 저장해서 식별자 값을 획득 한 후 영속성 컨텍스트에 저장
                  ( IDENTITY 전략은 테이블에 데이터를 저장해야 식별자값을 획득할 수 있음)