[JPA] Entity 매핑 - 기본키 매핑

PURPLE·2022년 3월 21일
2

JPA

목록 보기
6/8
post-thumbnail

JPA를 사용하는 데 가장 중요한 일은 엔티티와 테이블을 정확히 매핑하는 것이다.
그러려면 JPA의 매핑 어노테이션을 잘 사용해야한다.
JPA가 지원하는 어노테이션은 크게 4가지로 분류할 수 있다.


@Id / @GeneratedValue

@Id 만 사용하면, 기본키 값을 직접 할당해야 한다.
하지만 @GeneratedValue 를 함께 사용하면 ORACLEsequence 혹은 MySQLauto_increament 처럼 데이터베이스가 생성해 주는 값을 사용할 수도 있다.
이런 자동 생성 전략을 사용하려면 🔗persistence.xml 에 다음 속성을 추가해야 한다.

 <property name="hibernate.id.new_generator_mappings" value="true" />

IDENTITY 전략

IDENTITY 는 기본키 생성을 데이터베이스에 위임하는 전략이다.
주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용한다.

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

IDENTITY 전략은 MySQLauto_increament 의 작동 방식과 유사하여,
데이터베이스에 값을 저장하고 나서야 기본키 값을 구할 수 있다.

🔍   영속성 컨텍스트에서 관리 되기 위해선, 기본키 값을 갖고 있어야 하는데,
IDENTITY 전략을 사용하면 em.persist(Entity); 라인에서 영속성 컨텍스트에 저장 할 수 없다.
때문에 @GeneratedValue(strategy = GenerationType.IDENTITY) 를 사용할 때만 예외적으로 em.persist(Entity); 라인에서 commit 을 날린다.

// ...

Board board = new Board();
board.title("title");
em.persist(board); // insert 쿼리는 이 시점에 바로 commit 된다.

// ...

transaction.commit(); // insert 쿼리 이외 SQL문은 이 때 commit

SEQUENCE 전략

SEQUENCE 전략은 ORACLEsequence 처럼 유일한 값을 순서대로 생성한다.
이 전략은 sequence 를 지원하는 ORACLE, PostgreSQL, DB2, H2 데이터베이스에서 사용할 수 있다.

@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;
    ...
}

💡 allocationSize : 시퀀스 한 번 호출에 증가하는 수 (성능 최적화), 기본값은 50 이다.
💡 @SequenceGenerator@GeneratedValue 옆에 위치해 사용해도 된다.

@Entity
public class Board {
    @Id
    @GeneratedValue(...)
    @SequenceGenerator(...)
    private Long id;
    ...
}

@SequenceGenerator 를 사용해서 board_seq_generator 라는 시퀀스 생성기를 등록했다.
JPA는 sequenceName 속성의 값인 board_seq 를 실제 데이터베이스의 board_seq 시퀀스와 매핑한다.

SEQUENCE 전략에서는 @GeneratedValuegernerator 속성이 추가 된다.
이 값으로는 @SequenceGeneratorname 속성 값과 같은 값을 할당 한다.

Board board = new Board();
em.persist(board); // 이 때, 데이터베이스 시퀀스를 사용해 식별자를 조회한다.

transaction.commit();

em.persisit(board) 호출 시, 시퀀스를 통해 식별자를 조회하고, 그 값을 board 에 할당 후 영속성 컨텍스트에 저장한다.

AUTO 전략

AUTO 전략은 선택한 데이터베이스의 방언에 따라 적절한 기본키 생성 전략을 자동으로 선택해준다.
위의 IDENTITY 전략과 SEQUENCE 전략 중 무엇을 써야할지 매번 고민하지 않아도 되는 것이다.

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

AUTO 전략의 장점은 데이터베이스를 변경해도 코드를 수정할 필요가 없다는 것이다.

💡 AUTO 전략을 사용할 때 SEQUENCE 전략이 선택되면 시퀀스를 미리 만들어 두어야 한다. 만약 스키마 자동 생성 기능을 사용한다면, 하이버네이트가 기본값을 사용해 적절한 시퀀스를 만들어 줄 것이다.


기본키 생성 전략 중, 기본키를 관리하는 테이블을 생성하여 기본키를 할당하는 TABLE 전략도 있는데, 실무에서는 IDENTITY, SEQEUNCE 그리고 AUTO를 가장 많이 사용 할 것 같아 기록에서 제외하였다.


참고

강의_자바 ORM 표준 JPA 프로그래밍 - 기본편
교재_자바 ORM 표준 JPA 프로그래밍(김영한)

다정한 피드백 환영해요 🤗

profile
방향과 방법을 찾아가는 여정

0개의 댓글