본문 바로가기

공부 기록/Java

[JPA] 4장 - 엔티티 매핑(1)

@Entity

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

- @Entity 적용 시 주의사항

   - 기본 생성자는 필수다.(파라미터가 없는 public 또는 protected 생성자)

   - final 클래스, enum, interface, inner 클래스에는 사용할 수 없다.

   - 저장할 필드에 final을 사용하면 안 된다.


@Table

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


다양한 매핑 사용

- @Enumerated : enum 매핑 시 사용하는 어노테이션

- @Temporal : 날짜 타입 매핑 시 사용하는 어노테이션

- @Lob : CLOB, BLOB 타입 매핑 시 사용하는 어노테이션


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

spring:
  jpa:
    hibernate:
      ddl-auto: create

- create : 데이터베이스 테이블을 자동으로 생성한다.(기존 테이블 삭제)(DROP + CREATE)

- create-drop : 애플리케이션 종료 시 생성한 DDL을 제거한다.(DROP + CREATE + DROP)

- update : 데이터베이스 테이블과 엔티티 매핑 정보를 비교해서 변경 사항만 수정한다.

- validate : 데이터베이스 테이블과 엔티티 매핑 정보를 비교해서 차이가 있으면 경고를 남기고 애플리케이션을 실행하지 않는다. DDL을 수정하지 않는다.

- none : 자동 생성 기능을 사용하지 않는다.(유효하지 않은 옵션 값)

===> 운영 서버에서 DDL을 수정하는 옵션인 create, create-drop, update를 사용하면 절대 안 된다.


DDL 생성 기능

- 제약 조건 추가

@Entity
@Table(name="MEMBER", uniqueConstraints = {@UniqueConstraint(
    name = "NAME_AGE_UNIQUE",
    columnNames = {"NAME", "AGE"} )}) // 추가
public class Member {
    
    @Id
    @Column(name = "ID")
    private String id;
    
    @Column(name = "NAME", nullable = false, length = 10) // 추가
    private String username;
    
    ...
    
}

- 이러한 기능들은 JPA의 실행 로직에는 영향을 주지 않는다. 따라서 직접 DDL을 만든다면 사용할 이유가 없다. 그래도 애플리케이션 개발자가 엔티티만 보고도 손쉽게 다양한 제약 조건을 파악할 수 있는 장점이 있다.


기본 키 매핑

- JPA가 제공하는 데이터베이스 기본 키 생성 전략

   - 직접 할당 : 기본 키를 애플리케이션에서 직접 할당한다. => @Id 를 이용한 매핑

   - 자동 생성 : 대리 키 사용 방식

      - IDENTITY : 기본 키 생성을 데이터베이스에 위임한다.

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

 

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

 

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

 

      - AUTO : 선택한 데이터베이스 방언에 따라 위의 전략 중 하나를 자동으로 선택한다.

@Entity
public class Board {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO) // 괄호 안의 내용 생략 가능
    private Long id;
    
    ...
    
}

권장하는 식별자 선택 전략

- 데이터베이스 기본 키는 다음 3가지 조건을 모두 만족해야 한다.

   - null 값은 허용하지 않는다.

   - 유일해야 한다.

   - 변해선 안 된다.

- 테이블의 기본 키를 선택하는 전략은 크게 2가지가 있다.

   - 자연 키(natural key) : 비즈니스에 의미가 있는 키

   - 대리 키(surrogate key, 대체 키) : 비즈니스와 관련 없는 임의로 만들어진 키

  • 자연 키보다는 대리 키를 권장한다.
  • 비즈니스 환경은 언젠가 변한다.
  • JPA는 모든 엔티티에 일관된 방식으로 대리 키 사용을 권장한다.