Home 자바 ORM 표준 JPA 프로그래밍 - 엔티티 매핑
Post
Cancel

자바 ORM 표준 JPA 프로그래밍 - 엔티티 매핑

Table of Contents

  1. @Entity
  2. @Table
  3. 데이터베이스 스키마 자동 생성
  4. DDL 생성 기능
  5. 기본 키 매핑
    1. 기본 키 직접 할당 전략
    2. IDENTITY 전략
    3. SEQUENCE 전략
    4. TABLE 전략
    5. AUTO 전략
  6. 필드와 컬럼 매핑
    1. @Access

@Entity

JPA를 사용해서 테이블과 매핑할 클래스는 @Entity를 필수로 붙여야 한다. 이는 JPA가 관리하는 것으로 엔티티라 부른다.

  • 기본 생성자는 필수 : JPA가 엔티티 객체를 생성할 때 기본 생성자를 사용
  • final 클래스, enum, interface, inner 클래스에는 사용할 수 없다.
  • 저장할 필드에 final을 사용하면 안 된다.

@Table

@Table은 엔티티와 매핑할 테이블을 지정한다. 생략하면 매핑한 엔티티 이름을 테이블 이름으로 사용

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

다음 속성을 persistence.xml에 추가하자

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

해당 속성은 애플리케이션 실행 시점에 데이터베이스 테이블을 자동으로 생성한다 스키마 자동 생성 기능을 사용하면 애플리케이션 실행 시점에 데이터베이스 테이블이 자동으로 생성되므로 개발자가 테이블을 직접 생성하는 수고를 덜 수 있다.

DDL 생성 기능

1
2
    @Column(name = "NAME", nullable = false, length = 10)
    private String username;

@Column 매핑 정보의 nullable 속성 값을 false로 지정하면 자동 생성되는 DDL에 not null 제약조건을 추가할 수 있다. length 속성 값을 사용하면 자동 생성되는 DDL에 문자의 크기를 지정할 수 있다.

다음은 uniqueConstraints 속성을 추가한 것이다.

1
    @Table(name="MEMBER", uniqueConstraints = {@UniqueConstraints(name = "NAME_AGE_UNIQUE", columnNames = {"NAME", "AGE"})})

이런 기능들은 단지 DDL을 자동 생성할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않는다. 따라서 스키마 자동 생성 기능을 사용하지 않고 직접 DDL을 만든다면 사용할 이유가 없다.

기본 키 매핑

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

기본 키 직접 할당 전략

@Id로 매핑하면 된다.

적용 가능한 자바 타입은 다음과 같다.

  • 자바 기본형
  • 자바 래퍼
  • String
  • java.util.Date
  • java.sql.Date
  • java.math.BigDecimal
  • java.math.BigInteger

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

IDENTITY 전략

기본 키 생성을 데이터베이스에 위임하는 전략 데이터베이스에 값을 저장할 때 ID 컬럼을 비워두면 데이터베이스가 순서대로 값을 채워준다.

사용법은 아래와 같다.

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

엔티티가 영속 상태가 되려면 식별자가 반드시 필요하다. IDENTITY 식별자 생성 전략은 엔티티를 데이터베이스에 저장해야 식별자를 구할 수 있으므로 em.persist()를 호출하는 즉시 INSERT SQL이 데이터베이스에 전달된다. 따라서 이 전략은 트랜잭션을 지원하는 쓰기 지연이 동작하지 않는다.

SEQUENCE 전략

사용법은 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
    @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 전략은 em.persist()를 호출할 때 먼저 데이터베이스 시퀸스를 사용해서 식별자를 조회한다. 그리고 조회한 식별자를 엔티티에 할당한 후에 엔티티를 영속성 컨텍스트에 저장한다. 이후 트랜잭션을 커밋해서 플러시가 일어나면 엔티티를 데이터베이스에 저장한다.

TABLE 전략

키 생성 전용 테이블을 하나 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀸스를 흉내내는 전략

사용법은 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
    @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 전략은 시퀸스 대신에 테이블을 사용한다는 것만 제외하면 SEQUENCE 전략과 내부 동작방식이 같다

AUTO 전략

GenerationType.AUTO는 선택한 데이터베이스 방언에 따라 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 자동으로 선택

SEQUENCE나 TABLE 전략이 선택되면 시퀸스나 키 생성용 테이블을 미리 만들어 두어야 한다. 만약 스키마 자동 생성 기능을 사용한다면 하이버네이트가 기본값을 사용해서 만들어 줄 것이다.

필드와 컬럼 매핑

분류매핑 어노테이션설명
필드 컬럼 매핑@Column컬럼을 매핑
 @Enumeratedenum 타입을 매핑
 @Temporal날짜 타입을 매핑
 @LobBLOB, CLOB 타입을 매핑
 @Transient특별 필드를 데이터베이스에 매핑하지 않는다.
기타@AccessJPA가 엔티티에 접근하는 방식을 지정

@Access

  • 필드 접근: AccessType.FIELD, 필드에 직접 접근, private이라도 접근 가능
  • 프로퍼티 접근: AccessType.PROPERTY, 접근자를 사용한다.
This post is licensed under CC BY 4.0 by the author.

자바 ORM 표준 JPA 프로그래밍 - 영속성 관리

자바 ORM 표준 JPA 프로그래밍 - 연관관계 매핑 기초