필드와 컬럼 맵핑
@Column
객체 필드를 테이블 컬럼에 맵핑한다.
속성
- name : 필드와 매핑할 테이블의 컬럼 이름
- insertable : 엔티티 저장 시 이 필드도 같이 저장한다. false로 지정하면 DB에 저장하지 않는다. (false는 읽기 전용)
- updateable : 엔티티 수정 시 이 필드도 같이 수정한다. false로 지정하면 DB에 수정하지 않는다. (false는 읽기 전용)
- table : 하나의 엔티티를 두 개 이상의 테이블에 맵핑할 때 사용한다. 지정한 필드를 다른 테이블에 매핑할 수 있다. (거의 사용하지 않는 다.)
- nullable(DDL) : null 값의 허용 여부를 설정한다. false로 설정하면 DDL 생성 시에 not null 제약조건이 붙는다.
- unique(DDL) : @Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용한다.
- columnDefinition(DDL) : 데이터베이스 컬럼 정보를 직접 줄 수 있다.
- length(DDL) : 문자길이 제약조건, String 타입에만 사용한다.
- precision, scale(DDL) : BigDecimal, BigInteger 타입에서 사용한다. precision은 소수점을 포함한 전체 자릿수, scale은 소수의 자릿수이다. float과 double에는 적용되지 않는다.
@Enumerated
자바의 enum 타입을 맵핑한다.
속성
value :
EnumType.ORDINAL : enum 순서를 데이터베이스에 저장
장점 : DB에 저장되는 데이터의 크기가 작다.
단점 : 이미 저장된 enum의 순서를 변경할 수 없다.
EnumType.STRING : enum 이름을 데이터베이스에 저장
장점 : 저장된 enum의 순서가 바뀌거나 enum이 추가되어도 안전하다.
단점 : ORDINAL보다 DB에 저장되는 데이터의 크기가 크다.
위와 같은 장, 단점으로 인해서 STRING이 권장된다.
@Temporal
날짜 타입을 맵핑한다.
속성
value :
TemporalType.DATE : 날짜, 데이터베이스 date 타입과 매핑 (2024-10-01)
TemporalType.TIME : 시간, 데이터베이스 time 타입과 매핑 (14:52:33)
TemporalType.TIMESTAMP : 날짜와 시간, 데이터베이스 timestamp 타입과 매핑 (2024-10-01 14:52:33)
자바에는 년월일 시분초가 있다. DB에는 date(날짜), time(시간), timestamp(날짜와 시간)로 세 가지 타입이 존재한다.
@Lob
BLOB, CLOB 타입을 맵핑한다.
문자면 CLOB, 나머지는 BLOB으로 매핑
@Transient
특정 필드를 데이터베이스에 맵핑하지 않는다.
조회 또한 하지 않는다. 객체에 어떤 값을 임시로 보관하고 싶을 때 사용한다.
@Access
JPA가 엔티티 데이터에 접근하는 방식을 지정한다.
- 필드 접근 : AccessType.FIELD로 지정한다. 필드에 직접 접근한다. 필드 접근 권한이 private이어도 접근할 수 있다.
- 프로퍼티 접근 : AccessType.PROPERTY로 지정한다. 접근자를 사용한다.
@Access를 설정하지 않으면 @Id의 위치를 기준으로 접근 방식을 설정
@Entity
@Access(AccessType.FIELD)
public class Member {
@Id
private String id;
private String data1;
private String data2;
}
이 경우는 @Id가 필드에 있음으로 따로 @Access를 지정 안해도 된다.
@Entity
@Access(AccessType.PROPERTY)
public class Member {
private String id;
private String data1;
private String data2;
@Id
public String getId() {
return id;
}
@Column
public String getData1() {
return data1;
}
public String getData2() {
return data2;
}
}
@Id가 프로퍼티에 있어서 @Access(AccessType.PROPERTY)로 설정한 것과 같다. 그래서 @Access는 생략해도 된다.
필드 접근 방식과 프로퍼티 접근 방식을 함께 사용할 수도 있다.
@Entity
public class Member {
@Id
private String id;
@Transient
private String firstName;
@Transient
private String lastName;
@Access(AccessType.PROPERTY)
public String getFullName() {
return firstName + lastName;
}
}
@Id가 필드에 있으니 기본은 필드 접근 방식을 사용한다. getFullName()만 프로퍼티 접근 방식을 사용한다. 회원 엔티티를 저장하면 회원 테이블의 FULLNAME 컬럼에 firstName + lastName의 결과가 저장된다.