본 내용은 유튜브 나무소리님의 강의 내용을 정리한 내용입니다.
JPA 3-5강 Entity Mapping(5)
@Temporal 어노테이션
- @Temporal 어노테이션은 영속 객체의 날짜 및 시간 필드에 적용합니다.
- 자바의 날짜 및 시간 정보는 년, 월, 일과 시, 분, 초를 하나의 필드로 표현할 수 있지만 데이터베이스에 따라 날짜, 시간, 날짜와 시간 컬럼의 타입이 다르기 때문에 이를 @Temporal 어노테이션으로 지정할 수 있습니다.
- Java 8 이후에는 java.time 패키지의 LocalDate, LocalTime, LocalDateTime을 사용할 경우 적용하지 않습니다.
@Entity
@Table(name = "USERS")
public class User {
@Id
@Column(name = "USER_ID", nullable = false)
private Long userId;
@Column(name = "CREATION_DATE", nullable = false)
@Temporal(TemporalType.DATE)
private Date creationDate;
...
}
@Temporal 옵션 | |
TemporalType.DATE | 날짜(년, 월, 일) |
TemporalType.TIME | 시간(시, 분, 초) |
TemporalType.TIMESTAMP | 날짜와 시간 |
@Lob 어노테이션
- RDBMS에서 대규모 데이터를 저장하기 위해 BLOB 또는 CLOB 데이터 유형을 지원합니다.
- BLOB은 Binary Large Object 약어로 기가 바이트 까지의 이미지, 파일, 기타유형의 데이터를 저장합니다.
- CLOB은 Character Large Object 약어로 기가바이트 까지의 긴 문자열을 저장합니다.
- @Lob 어노테이션이 선언된 객체의 필드 및 속성의 유형에 따라 BLOB, CLOB이 구분됩니다.
- 주로 @Basic 어노테이션과 함께 LAZY 로딩으로 선언해서 사용합니다.
@Entity
public class User {
@Id
private Long userId;
@Basic(fetch = FetchType.LAZY)
@Lob
@Column(name = "picture")
protected byte[] picture;
...
}
@Basic 어노테이션에서 LAZY 로딩으로 선언하는 경우 find()로 조회시 바로 대용량 데이터(picture)를 반환하는 것이 아니라 picture가 직접 사용이 될 때 해당 데이터를 가져오게 됩니다.
@Enumerated 어노테이션
- @Enumerated (열거형 데이터 매핑)은 열거형 유형을 정의합니다.
- Enum 유형으로 선언된 값은 배열과 동일하게 ordinal이라 부르는 인덱스 값에 연결됩니다.
- Enum 유형의 필드 또는 속성을 매핑하는 경우 기본값으로 EnumType.ORDINAL이 적용됩니다.
- @Enumerated에 명시적으로 EnumType.String을 선언해서 데이터베이스 필드에 문자열을 저장할 수 있습니다.
public enum UserType {
SELLER, // index = 0
BIDDER, // index = 1
SCR, // index = 2
ADMIN // index = 3
}
/* ================================ */
// UserType.SELLER의 경우 0이 저장됨
@Enumerated(EnumType.ORDINAL)
pivate UserType userType;
// UserType.SELLER의 경우 "SELLER"가 저장됨
@Enumerated(EnumType.String)
private UserType userType;
EnumType.ORDINAL은 프로그램상의 오류가 발생하게 하여 사용하지 않습니다.
예를 들어, 기존의 UserType에 SELLER 다음에 GUSET를 추가하는 경우 INDEX = 1이 BIDDER에서 GUEST로 변경되게 됩니다. 이러한 경우 기존에 BIDDER를 저장한 데이터가 모두 GUEST를 반환하게 됩니다.
// ex) GUEST를 추가하는 경우
public enum UserType {
SELLER, // index = 0
GUEST, // index = 1
BIDDER, // index = 2
SCR, // index = 3
ADMIN // index = 4
}
@Translent 어노테이션
- @Translent 어노테이션이 적용된 필드는 영속화 되지 않습니다.
- @Translent 어노테이션은 주로 실행 시점에 참조되는 필드 또는 계산되는 필드에 사용됩니다.
- 속성(property) 기반 접근일 경우 @Transient 어노테이션은 getter에 적용합니다.
- 자바에서 제공하는 transient 키워드와 @Transient 어노테이션의 사용목적은 거의 동일합니다.
@Entity
public class Category {
@Transient
protected Long activeUserCount;
transient public String generatedName;
...
public Category() { ... }
}
'JPA' 카테고리의 다른 글
JPA 기초 - @Embeddable (0) | 2024.01.17 |
---|---|
JPA 기초 - 연관관계의 방향성(ManyToOne, JoinColumn) (0) | 2024.01.16 |
JPA 기초 - 연관 관계의 이해 (0) | 2024.01.16 |
JPA 기초 - 기본키 매핑(Table), 필드와 컬럼 매핑(@Column) (0) | 2024.01.15 |
JPA 기초 - 기본키 생성 전략(Sequence) (0) | 2024.01.14 |