꿈꾸는 새벽하늘

04장. 엔티티 매핑 본문

🌿 Spring & Spring Boot/📗 자바 ORM 표준 JPA 프로그래밍

04장. 엔티티 매핑

rovemin 2023. 6. 3. 03:30

1. @Entity

JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 필수로 붙여주어야 한다.

@Entity 적용 시 주의사항

  • 기본 생성자 필수 (파라미터가 없는 public 또는 protected 생성자)
  • final 클래스, enum, interface, inner 클래스에 사용 불가
  • 저장할 필드에 final 사용하면 안 됨

2. @Table

@Table은 엔티티와 매핑할 테이블을 지정한다.

3. 데이터베이스 스키마 자동 생성

JPA는 데이터베이스 스키마를 자동으로 생성하는 기능을 지원한다.

 

persistence.xml에 아래 속성을 추가하면 애플리케이션 실행 시점에 데이터베이스 테이블을 자동으로 생성한다.

<property name="hibernate.hbm2ddl.auto" value="create" />

4. 기본 키 매핑

JPA는 데이터베이스 기본 키 생성 전략을 두 가지 제공한다.

  • 직접 할당: 기본 키를 애플리케이션에서 직접 할당
  • 자동 생성: 대리 키 사용 방식
    • IDENTITY: 기본 키 생성을 데이터베이스에 위임
    • SEQUENCE: 데이터베이스 시퀀스를 사용해서 기본 키 할당
    • TABLE: 키 생성 테이블 사용

데이터베이스 벤더마다 지원하는 방식이 다르므로 자동 생성 방식은 다양하다.

1) 기본 키 직접 할당 전략

기본 키 직접 할당은 @Id로 매핑하는 방식이다.

@Id
@Column (name = "id")
private String id;

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

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

2) IDENTITY 전략

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

IDENTITY 전략은 @GeneratedValue의 strategy 속성 값을 GenerationType.IDENTITY로 지정하여 사용할 수 있다.

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

3) SEQUENCE 전략

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

4) TABLE 전략

TABLE 전략은 키 생성 전용 테이블을 하나 만든 뒤, 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀀스를 흉내내는 전략이다.

// TABLE 전략 키 생성 DDL
create table MY_SEQUENCES (
    sequence_name varchar(255) not null,
    next_val bigint,
    primary key ( sequence_name )
)
@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;
    ...
}

5) AUTO 전략

AUTO 전략은 데이터베이스를 변경해도 코드를 수정하지 않아도 된다는 장점이 있다.

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

5. 기본 키 매핑 정리

식별자 할당 전략별로 em.persist() 호출 직후에 발생하는 일을 정리하면 다음과 같다.

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

'🌿 Spring & Spring Boot > 📗 자바 ORM 표준 JPA 프로그래밍' 카테고리의 다른 글

06장. 다양한 연관관계 매핑  (0) 2023.07.03
05장. 연관관계 매핑 기초  (0) 2023.06.26
03장. 영속성 관리  (0) 2023.05.29
02장. JPA 시작  (0) 2023.05.22
01장. JPA 소개  (0) 2023.05.22