병아리의 코딩 일기

[JPA] 엔티티 매핑 (3) 요구사항에 대한 필드와 컬럼 매핑 본문

카테고리 없음

[JPA] 엔티티 매핑 (3) 요구사항에 대한 필드와 컬럼 매핑

oilater 2023. 2. 15. 15:44

이번엔 요구사항의 예시를 들어 필드와 컬럼을 실제로 매핑해보자!

 

요구사항 추가

  1. 회원은 일반 회원과 관리자로 구분해야 한다.
  2. 회원 가입일과 수정일이 있어야 한다.
  3. 회원을 설명할 수 있는 필드가 있어야 한다. 이 필드는 길이 제한이 없다.

 

요구사항을 반영한 Entity 클래스 생성

package hellojpa;

import javax.persistence.*;
import java.util.Date;

@Entity //꼭 넣기 그래야 jpa가 인식!
public class Member {

    @Id
    private Long id;

    @Column(name = "name") //객체에는 username 이라고 쓰고 DB에는 name 이라고 쓰고 싶을 떄!
    private String username;

    private Integer age;

    @Enumerated(EnumType.STRING) //db에는 enum 타입이 없어서 @Enumerated 어노테이션을 쓰면 된다.
    private RoleType roleType;

    @Temporal(TemporalType.TIMESTAMP) //Date = 날짜타입, @Temporal 에는 date, time, timestamp 세 가지 타입이 있다. db는 보통 세가지 구분해서 씀 
    private Date createdDate;

    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;

    @Lob //varchar을 넘어서는 큰 컨텐츠를 넣고 싶을 때 Lob을 씀
    private String description;

    public Member(){

    }
}

실행 결과: enum 은 varchar 랑 매핑이 되었다.

 

매핑 어노테이션 정리

@Column : 컬럼 매핑

@Temporal : 날짜 타입 매핑 -> Java 8부터는 LocalDate, LocalDateTime 이 들어와서 이걸로 쓰자! 어노테이션도 굳이 안붙여도 됨.

@Enumerated : enum 타입 매핑

@Lob : BLOB, CLOB 매핑 -> 매핑하는 필드 타입이 문자면 CLOB 매핑, 나머지는 BLOB 매핑

@Transient : 특정 필드를 컬럼에 매핑하고 싶지 않을 때

@Transient
private int temp;

@Transient는 DB와 관계없이 메모리에서만 쓰고 싶을 때 사용한다.

 


@Column 속성

  • insertable, updatable : 등록, 변경 가능 여부 (기본값 : TRUE)
  • nullable : false로 설정하면 not null 제약 조건이 붙는다.
  • unique : 잘 안씀. 이름이 못알아보게 나오기 때문이다.
  • length: length = 10 으로 하면 varchar(10)으로 설정된다.
  • columnDefinition : 컬럼 정보를 직접 줄 수 있다. ex) varchar(100) default 'EMPTY'
  • precision, scale(DDL) : BigDecimal 타입에서 사용한다. 아주 큰 숫자나 소숫점 쓸 때 사용한다.

 

enum 을 매핑할 때 주의 사항

 

EnumType.ORDINAL, EnumType.STRING  두 가지가 있다. 이중 ORDINAL이 기본 값인데, ORDINAL 사용 X

해결할 수 없는 오류로 이어지기에 굉장히 위험함!

ORDINAL : Enum 의 순서를 DB에 저장 - Integer 타입으로 들어간다. ex) 0, 1 ...

STRING : Enum 의 이름을 그대로 DB에 저장

 

728x90
반응형
LIST