computer_study

[JPA] 04. 엔티티 매핑 본문

스터디/자바 ORM표준 JPA 프로그래밍

[JPA] 04. 엔티티 매핑

knowable 2022. 7. 11. 08:51

1. @Entity

테이블과 매핑할 클래스에 필수로 붙여야 한다.

 

적용 시 주의사항

  • 기본 생성자가 필수(파라미터가 없는 public 또는 protected 생성자)
  • final 클래스, enum, interface, inner 클래스에는 사용할 수 없다.
  • 저장할 필드에 final을 사용해서는 안된다.

2. @Table

엔티티와 매핑할 테이블을 지정한다.(생략시 매핑한 엔티티 이름을 테이블 이름으로 사용)

속성 기능 기본값
name 매핑할 테이블 이름 엔티티 이름 사용
catalog catalog 기능이 있는 DB에서 catalog 매핑  
schema schema 기능이 있는 DB에서 schema 매핑  
uniqueConstraints
(DDL)
- DDL 생성 시에 유니크 제약조건을 만든다.
- 2개 이상의 복합 유니크 제약조건도 만들 수 있다.
- 스키마 자동 생성 기능을 사용해서 DDL만들 때만 사용된다
 

 

3. 다양한 매핑 사용

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

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

(매핑정보와 DB 방언을 사용해서 스키마를 생성한다.)

 

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

위와 같이 persistence.xml에 등록하면, 애플리케이션 실행 시 자동으로 DB테이블을 생성한다.

하지만 자동 생성 기능이 만든 DDL은 운영 환경에서 사용할 만큼 완벽하진 않기에 개발 환경에서 사용하거나 매핑을 어떻게 할지 참고하는 용으로 사용하여야 한다.

5. DDL 생성 기능

자동으로 생성되는 DDL에 제약조건을 추가할 수 있다

// 회원 이름을 필수로 입력해야 하고, 10자를 초과하면 안된다
@Column(name="NAME", nullable=false, length = 10)
private String username;

// 유니크 제약조건 만들기
// @Table의 uniqueConstraints속성 사용
@Entity(name="Member")
@Table(name="MEMBER", uniqueConstraints = {@UniqueConstraint(
  name = "NAME_AGE_UNIQUE",
  columnNames = {"NAME", "AGE"} )})
public class Member{
  ...
}

이들은 DDL자동 생성때만 사용되고 JPA실행 로직에는 영향을 주지 않는다.

개발자가 엔티티만 보고 쉽게 다양한 제약조건을 파악할 수 있다는 장점이 있기에 사용된다.

 

6. 기본 키 매핑

직접 할당

기본 키를 애플리케이션에 직접 할당한다

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

// em.persist()로 엔티티를 저장하기 전에 기본 키를 직접 할당
Board board = new Board();
board.setId("id1");
em.persist(board);

 

자동 생성

DB가 생성해주는 값을 사용하여 기본키를 사용한다.

@Id 애노테이션 뿐만 아니라 @GeneratedValue 애노테이션도 사용해야 한다.

  • IDENTITY 전략
    • 기본 키 생성을 DB에 위임하는 전략
    • ex) MySQL의 AUTO_INCREMENT 기능 (DB가 자동으로 기본키를 순서대로 생성)
    • DB에 저장하고 나서 기본키를 구할 수 있을 때 사용
    • @GeneratedValue(strategy = GenerationType.IDENTITY)
  • SEQUENCE 전략
    • 유일한 값을 순서대로 생성하여 기본 키를 생성
    • CREATE SEQUENCE BOARD_SEQ START WITH 1 INCREMENT BY 1 과 같이 우선 시퀀스를 생성해야 한다.
    • @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "BOARD_SEQ_GENERATOR")
    • 다음과 같이 사용 할 시퀀스 매핑 가능
  • TABLE 전략
    • 키 생성 전용 테이블을 하나 만들고, 이름과 값으로 사용할 컬럼을 만들어 DB 시퀀스를 흉내내는 전략
// TABLE 우선 생성
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;
    ...
}
  • AUTO 전략
    • 선택한 DB나 방언에 따라 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 자동으로 선택한다.
    • (오라클을 선택하면 SEQUENCE, MySQL을 선택하면 IDENTITY를 사용)
    • @GeneratedValue(strategy = GenerationType.AUTO) 혹은 @GeneratedValue (기본값이 AUTO)

 

7. 필드와 컬럼 매핑: 레퍼런스

필요할 때 마다 찾아서 읽는 것을 권장.

  • @Column
    • 객체 필드를 테이블 컬럼에 매핑 
    • name
      • 필드와 매핑할 테이블의 컬럼 이름
    • insertable
      • 거의 사용하지 않음
      • 엔티티 저장 시 이 필드도 같이 저장하도록
    • updatable
      • 거의 사용하지 않음
      • 엔티티 수정 시 이 필드도 같이 수정하도록.
    • table
      • 거의 사용하지 않음
    • nullable(DDL)
      • null값 허용 여부 설정
    • unique(DDL)
      • 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용
    • columnDefinition(DDL)
      • 데이터베이스 컬럼 정보를 직접 준다.
    • length(DDL)
      • 문자 길이 제약조건, String 타입에만 사용
    • precision, scale(DDL)
      • BigDecimal타입에 사용
      • precision -> 소수점 포함한 전체 자릿수
      • scale -> 소스의 자릿수
  • @Enumerated
    • 자바의 enum타입을 매핑할 때 사용 
    • value
      • EnumType.ORDINAL
        • 순서를 DB에 저장
      • EnumType.STRING
        • 이름을 DB에 저장
  • @Temporal
    • 날짜 타입을 매핑할 때 사용. 
    • value
      • TemporalType.DATE
        • 날짜, DB date 타입과 매핑
      • TemporalType.TIME
        • 시간, DB time 타입과 매핑
      • TemporalType.TIMESTAMP
        • 날짜와 시간, DB timestamp 타입과 매핑
  • @Lob
    • DB의 BLOB, CLOB 타입과 매핑
    • BLOB
      • Binary Large Object, 이미지, 사운드, 비디오와 같은 멀티미디어 데이터를 다룰 때 사용
    • CLOB
      • Character Large Obejct, 문자형 대용량 객체를 다룰 때 사용(가변도 가능, 최대 4gb)
  • @Transient
    • 객체에 임시로 어떤 값을 보관하고 싶을 때 사용
    • 해당 필드는 매핑하지않고, 저장 조회도 하지 않는다.
  • @Access
    • JPA가 엔티티 데이터에 접근하는 방식을 지정
    • 필드 접근
      • AccessType.FIELD로 지정. 필드에 직접 접근
      • private에도 접근 가능
    • 프로퍼티 접근
      • AccesType.PROPERTY로 지정. 접근자(Getter)사용
    • @Access설정이 없다면 @Id를 기준으로 접근 방식이 설정된다.

 

 

 

 

'스터디 > 자바 ORM표준 JPA 프로그래밍' 카테고리의 다른 글

[JPA] 06. 다양한 연관관계 매핑  (0) 2022.07.31
[JPA] 05. 연관관계 매핑 기초  (0) 2022.07.25
[JPA] 03. 영속성 관리  (0) 2022.06.29
[JPA] 02. JPA 시작  (0) 2022.06.29
[JPA] 01. JPA 소개  (0) 2022.06.18
Comments