본문 바로가기
Back/JPA

[JPA] JPA 엔티티 매핑 (다양한 타입, 기본키 매핑)

by 은z 2021. 12. 15.

2021.12.14 - [SKILLS/JPA] - [JPA] JPA 엔티티 매핑 기본 @Entity, @Id, @Table, @Column

위의 저번 포스팅에 이어서 다양한 타입을 매핑하는 경우와 기본키 매핑 전략에 대해 알아보자.

 

1. 다양한 타입의 필드와 컬럼 매핑

package hellojpa;
import javax.persistence.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;

@Entity
@Table (name="MBR")          //DB에 매핑할 이름
public class Member {
@Id
private Long id;

@Column(name = "name")       //DB에 표시되는 이름
private String username;

private Integer age;         //알아서 디비 타입과 매핑

@Enumerated(EnumType.STRING) //DB에 ENUM타입 매핑 시
private RoleType roleType;

@Temporal(TemporalType.TIMESTAMP) //DB에 날짜관련 매핑 시
private Date createdDate;

@Transient                   //DB에 넣지 않는 데이터
private int count;

@Lob                         //varchar보다 큰 타입을 넣고 싶은 경우
private String description;  //문자면 CLOB, 나머지는 BLOB으로 매핑
//Getter, Setter…
}

1) Enum 타입을 매핑할 때 주의점(String 으로 저장할 것)

  • enum 순서를 숫자로 저장하면 항목이 변경, 추가 되면서 숫자가 꼬여버림.
  • -> 그렇기 때문에 꼭 String으로 저장!
    // EnumType.ORDINAL: enum 순서를 숫자로 데이터베이스에 저장
    // EnumType.STRING: enum 이름을 데이터베이스에 저장
    
    @Enumerated(EnumType.STRING) //DB에 ENUM타입 매핑 시
    private RoleType roleType;​

2) 날짜 타입

// 최신 버전
private LocalDate createdAt;

//구 버전
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;

TemporalType.DATE: 날짜 (예시 2021-11-12, date)
TemporalType.TIME : 시간 (예시 11:11:11, time)
TemporalType.TIMESTAMP : 날짜, 시간 (예시 2021-11-12 11:11:11)

 

 

2. 기본키 매핑 전략

결론적으로 말하면

Long + 대체키 + 키 생성 전략을 사용하는 것이 좋다.

 

1) Long

  • 아이디는 데이터 범위가 넓은 Long 추천
    Integer(10억 제한) 썼다가 나중에 타입 바꾸는 게 더 불편하고, 요즘은 둘의 성능 차이가 크지 않기 때문에!
  • Primitive(long)가 아닌 Wrapper(Long) 타입을 쓰는 이유는?
    Wrapper타입은 nullable 하기에 값이 없으면 null, 0은 키값 0을 의미
    Primitive타입은 기본이 0이기에, 값이 없어서 0인지 키값이 0인지 구분 힘듦.

2) 대체키

  • 예를 들어 주민번호를 PK로 쓸 경우 불편함이 따를 수도!
  • -> 따라서 비즈니스 로직과 관련있는 값 말고 그냥 랜덤키값(UUID 같은..) 을 권장.

3 ) 키 생성 전략

@GeneratedValue ( ) : 자동 생성

  • (strategy = GeneraionType.AUTO) :
    • DB 방언에 맞는 SQL 나옴 (오라클, h2, MySQL등 각각에 맞게) 
    • 방언에 따라 아래의 세 가지 전략을 자동으로 지정한다.
  • (strategy = GeneraionType.SEQUENCE) : 그 다음 순서대로 자동 생성
    ⇒ ORACLE, @SequenceGenerator 필요
  • (strategy = GeneraionType.TABLE) : 키 생성 전용 테이블을 따로 만듦, 데이터베이스 시퀀스를 따라함 → 운영에서는 딱히 쓰지 않음
    ⇒ 모든 DB에서 가능, @TableGenerator 필요
  • (strategy = GeneraionType.IDENTITY) : 기본 키 생성을 DB한테 시킴
    • 즉, id 값을 null로 하면 DB가 알아서 AUTO_INCREMENT 해줌.
      ⇒ MySQL

댓글