1. @Column
객체의 필드를 테이블 컬럼에 매핑한다. name, nullable 속성이 주로 사용된다.
이를 생략하면 기본값이 적용된다. 따라서 자바 기본 타입일 때 nullable 속성에 예외가 존재하게 된다.
int와 같은 기본 타입에는 null을 입력할 수 없다. 반면, Integer와 같은 wrapper 클래스 타입에는 null을 입력할 수 있다. 따라서 자바 기본 타입을 DDL로 생성할 때는 not null 제약 조건을 추가하는 것이 안전하다.
다행히 JPA는 이런 상황을 대비해 DDL 생성 기능을 사용할 때 자바 기본 타입에는 not null 제약 조건을 추가한다. @Column의 nullable 속성 값의 default는 true이므로 not null 제약 조건을 기본적으로 추가하지는 않는다. 따라서, 자바 기본 타입을 사용하며 @Column을 적용하는 경우에는 (nullable=false)를 지정하는 것을 권장한다.
2. @Enumerated
자바의 enum 타입을 매핑할 때 사용된다.
enum RoleType {
ADMIN, USER
}
// ------------------------------
@Enumerated // (EnumType.STRING), (EnumType.ORDINAL)
private RoleType roleType;
user.setRoleType(RoleType.ADMIN);
EnumType.STRING으로 설정하게 되면 DB에 사용자의 권한이 "ADMIN" 문자열로 저장된다. 반면 EnumType.ORDINAL로 설정한 경우, DB에 0과 같이 정수로 저장된다. 따라서 enum 타입에 필드가 추가된다면, ORDINAL의 경우 이전에 등록되어 있던 데이터들에 대해 수정이 필요할 수 있게 된다. 즉 순서가 변경되거나 추가되면 문제가 발생할 수 있다. 그렇기 때문에 EnumType.STRING을 권장한다.
3. @Temporal
Date, Calendar와 같은 날짜 타입을 매핑할 때 사용한다.
TemporalType.DATE | 날짜, 데이터베이스 DATE 타입과 매핑한다. (ex. 2021-06-16) |
TemporalType.TIME | 시간, 데이터베이스 TIME 타입과 매핑한다. (ex. 12:34:56) |
TemporalType.TIMESTAMP | 날짜와 시간, 데이터베이스 TIMESTAMP 타입과 매핑한다. (ex. 2021-06-16 12:34:56) |
이를 생략하면 자바의 DATE와 가장 유사한 TIMESTAMP로 정의된다. (MySQL의 경우 datetime)
4. @Access
JPA가 엔티티 데이터에 접근하는 방식을 지정한다.
* 필드 접근(AccessType.FIELD)
엔티티의 필드에 직접 접근하는 방식이다. 필드 접근 권한이 private이어도 접근할 수 있다.
* 프로퍼티 접근(AccessType.PROPERTY)
Getter를 사용해 필드에 접근하는 방식이다.
@Access를 설정하지 않으면 @Id의 위치를 기준으로 접근 방식이 결정된다.
@Id가 필드 멤버에 설정되어 있다면 @Access를 생략하면 @Access(AccessType.FIELD)로 설정된다. 반면 @Id가 Getter 함수에 붙어 있다면, @Access(AccessType.PROPERTY)로 설정된다.
이 둘을 함께 사용할 수도 있다. 필드 멤버에 @Id가 붙어 있고 Getter 메서드에 @Access(AccessType.PROPERTY)를 설정하게 되면 기본적으로는 필드 접근 방식을 사용하지만, @Access가 붙어있는 메서드만 프로퍼티 접근법을 사용한다.
참고 문헌: 자바 ORM 표준 JPA 프로그래밍 (김영한 지음)
'Web > JPA' 카테고리의 다른 글
4-2. Entity 매핑 (2) (0) | 2021.06.11 |
---|---|
4-1. Entity 매핑 (1) (0) | 2021.06.09 |
3-3. Flush와 준영속 (0) | 2021.06.07 |
3-2. 영속성 컨텍스트의 특징 (0) | 2021.05.31 |
3-1. 영속성 컨텍스트와 Entity 생명주기 (0) | 2021.05.26 |
댓글