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
- 즉, id 값을 null로 하면 DB가 알아서 AUTO_INCREMENT 해줌.
'Back > JPA' 카테고리의 다른 글
[JPA] 연관관계 매핑, @OneToMany @ManyToOne @OneToOne @ManyToMany (0) | 2021.12.15 |
---|---|
[JPA] 연관관계 매핑, 연관관계 주인 (0) | 2021.12.15 |
[JPA] 영속성 컨텍스트 (0) | 2021.12.15 |
[JPA] JPA 데이터 베이스 스키마 자동생성 (0) | 2021.12.14 |
[JPA] JPA 엔티티 매핑 기본 @Entity, @Id, @Table, @Column (0) | 2021.12.14 |
댓글