JPA

[JPA] 앤티티 매핑

제리 . 2020. 11. 20. 17:29

객체와 테이블 매핑 : @Entity, @Table

기본 키 매핑 : @Id

필드와 컬럼 매핑 : @Column

연관 관계 매핑 : @ManyToOne, @JoinColumn

 

@Entity

테이블과 매핑할 클래스에 붙인다. @Entity가 붙은 클래스는 JPA가 관리하며 엔티티라 부른다.

@Entity(name = "")속성을 사용하여 엔티티의 이름을 지정할 수 있다. 기본 값은 클래스 이름이다.

 

@Entity를 적용 시 주의사항은 아래와 같다.

* 기본 생성자는 필수(파라미터가 없는 public, protected생성자)

* final 클래스, enum, interface, inner클래스는 사용불가

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

 

@Table

엔티티와 매핑할 테이블을 지정한다. 생략하면 매핑한 엔티티 이름을 테이블 이름으로 지정함.

 

name :  매핑할 테이블 이름 (기본 값으로 엔티티 이름을 사용)

catalog : catalog 기능이 있는 데이터베이스에서 catalog를 매핑

schema : schema 기능이 있는 데이터베이스에서 schema를 매핑

 

다양한 매핑

@Entity
@Table(name="MEMBER")
public class Member {
  @Id
  @Column(name = "ID")
  private String id;
  
  @Column(name = "NAME")
  private String name;
  
  private Integer age;
  
  @Enumerated(EnumType.String)
  private RoleType roleType;
  
  @Temporal(TemporalType.TIMESTAMP)
  private Date createdDate;
  
  @Temporal(TemporalType.TIMESTAMP)
  private Date lastModifiedDate;
  
  @Lob
  private String description;
  
  ...
  
}

public enum RoloType {
	ADMIN, USER
}

1. roleType: enum을 사용하고 싶다면 @Enumerated어노테이션으로 매핑한다.

2. createdDate, lastModifiedDate : 자바의 날짜 타입은 @Temporal을 사용해서 매핑한다.

3. description : 필드의 길이제한이 없이 만들고 싶다면 @Lob을 사용한다. CLOB, BLOB타입으로 매핑됨.

 

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

create : 기존 테이블을 삭제하고 새로 생성 drop + create

create-drop : create 속성에 추가로 drop한다. 애플리케이션이 종료될 때 DDL을 제거함

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

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

none : 자동 생성 기능을 사용하지 않으면 유효하지 않은 값을 주면 됨 (none은 유효하지 않은 옵션 값)

 

운영 서버에서 create, create-drop, update같은 DDL옵션을 주는 것을 주의하자.

 

개발 초기 - create, update

초기화 상태로 자동화된 테스트를 진행하는 개발자 환경, CI 서버 - create, create-drop

테스트 서버 - update, vaildate

운영 서버 - vaildate, none

 

DDL 생성 기능

컬럼에 추가적인 옵션을 부여할 수 있음

@Column(nullable = false, length = 10)
private username

nullable : null의 여부 기본 값은 true이다. 만약 객체 타입이 아닌 자바 기본 타입에서 컬럼어노테이션 없다면 nullable=false로 생성된다. 

 

length : 문자의 크기를 지정

 

테이블의 제약 조건

@Tabel(name = "MEMBER", uniqueConstraints = {@UniqueConstraint(
	name = "NAME_AGE_UNIQUE"m
    columnNames = {"NAME", "AGE"})})

uniqueConstraints로 유니크 제약조건을 지정할 수 있다. 

 

DDL은 테이블을 생성할 때 영향을 주고 JPA실행 로직에는 영향이 없다.

 

기본 키 매핑

기본 키 생성 전략은 직접 할당과 자동생성 방식이 있다. 자동 생성 방식은 벤더마다 지원하는 방식이 달라 여러가지가 있음. 자동 생성 전략은 @Id아래 @GeneratedValue어노테이션을 추가하고 원하는 전략을 선택하면 됨.

 

자동 생성 

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

-SEQUENCE :  데이터베이스 시퀀스를 사용해서 기본 키를 할당한다.

-TABLE : 키 생성 테이블을 사용한다.

 

@Transient

이 필드는 매핑하지 않는다. 데이터베이스에서 저장, 조회를 하지 않는다. 객체에 임시로 어떤 값을 보관하고 싶을 때 사용한다.