필드와 컬럼 매핑
분류 | 매핑 어노테이션 | 설명 |
필드와 컬럼 매핑 | @Column | 컬럼을 매핑한다. |
@Enumerated | 자바의 enum 타입을 매핑한다. | |
@Temporal | 날짜 타입을 매핑한다. | |
@Lob | BLOB, CLOB 타입을 매핑한다. | |
@Transient | 특정 필드를 데이터베이스에 매핑하지 않는다. | |
기타 | @Access | JPA가 엔티티에 접근하는 방식을 지정한다. |
@Column
@Column은 객체 필드를 테이블 컬럼에 매핑한다. 가장 많이 사용되며 기능도 많다.
속성 | 기능 | 기본값 |
name | 필드와 매핑할 테이블의 칼럼 이름 | 객체의 필드 이름 |
insertable(거의 사용되지 않음) | 엔티티 저장 시 이 필드도 같이 저장한다. false 설정 시 이 필드는 데이터베이스에 저장하지 않는다. false 옵션을 읽기 전용 데이터일 때 사용된다. |
true |
updatable(거의 사용되지 않음) | 엔티티 수정 시 이 필드로 같이 수정한다. false 설정 시 데이터베이스에 수정하지 않는다. false 옵션 시 읽기 전용 데이터일 때 사용된다. |
true |
table(거의 사용되지 않음) | 하나의 엔티티를 두 개 이상의 테이블에 매핑할 때 사용한다. 지정한 필드를 다른 테이블에 매핑할 수 있다 | 현재 클래스가 매핑된 테이블 |
nullable(DDL) | null 값의 허용 여부를 설정한다. false로 설정하면 not null 제약 조건이 붙는다. | true |
unique(DDL) | @Table의 uniqueConstraints와 같으나 한 컬럼에 대한 간단한 유니크 제약조건을 걸 때 사용한다. | false |
columnDefinition(DDL) | 데이터베이스 컬럼 정보를 직접 줄 수 있다. | 필드의 자바 타입과 방언 정보를 사용해서 적절한 칼럼 타입을 생성한다. |
length(DDL) | 문자 길이 제약조건, String 타입에만 사용한다. | 255 |
precision, scale(DDL) | BigDecimal 타입(혹인 BigInteger)에서 사용한다. precision은 소수점을 포함한 전체 자리수를, scale은 소수의 자리수다. |
precision = 0, scale = 0 |
예시
name
@Column(name = "MEMBER_NAME")
private String name;

columnDefinition
@Column(columnDefinition = "varchar (100) default 'EMPTY'")
private String data;

nullable
false 설정 시 not null 제약조건이 붙는다.
@Column(nullable = false)
private String data;

unique
@Column(unique = true)
private String data;

주의할 점
@Column의 unique 속성을 사용 시 위와 같이 임의의 랜덤 한 이름으로 표기되는 것을 알 수 있다. 실무 프로젝트 진행 시 에는 제약조건에 따른 예외가 발생할 경우 이 이름 가지고 문제를 파악할 수 있어야 한다. 하지만 @Column에서는 이름을 따로 지정할 수 없다. 그리고 두 칼럼 이상의 제약조건도 만들 수가 없다.
따라서 @Column의 unique 속성보다는 @Table의 uniqueConstraints 속성을 사용하여, 제약조건의 이름을 걸어주는 방법을 사용하는 것을 권장한다.
@Entity(name = "Member")
@Table(name = "member", uniqueConstraints = {
@UniqueConstraint(name = "unique_data", columnNames = {"MEMBER_NAME"})
})
public class Member {
...
}
@Column 생략
@Column을 생략하게 되면, 대부분 @Column 속성의 기본값이 적용되는데, 자바 기본 타입일 때는 nullable 속성에 대한 예외가 있다.
int data; // @Column 생략시, 자바 기본 타입
data integer not null // not null이 기본값으로 설정
Integer data; // @Column 생략시, 객체 타입
data integer // 생성된 DDL
@Column
int data // @Column 사용, 자바 기본 타입
data integer // @Column의 기본값으로 설정
자바 기본 타입 int는 null을 허용하지 않고, 객체 타입은 null을 허용한다. JPA는 그 점을 고려해 @Column 생략 시 각 타입에 맞게 설정이 된다. 하지만 @Column을 사용한다면 @Column에 기본 속성을 따라가게 된다. 그러므로 int 같은 not null 타입에 대해선 @Column 속성 nullable = false을 지정하는 것이 안전하다.
@Enumerated
자바에서는 enum 타입 이용하여 상태 값이나 권한 등을 표기하는 경우가 많다. 그런 경우 객체 필드에 매핑할 필요가 있고 이 경우에 사용되는 어노테이션이다.
속성 | 설명 | 기본값 |
value | - EnumType.ORDINAL : enum 순서를 데이터베이스에 저장 - EnumType.STRING : enum 이름을 데이터베이스에 저장 |
EnumType.ORDINAL |
enum RoleType {
ADMIN, USER
}
-----
@Enumerated(EnumType.STRING)
private RoleType roleType;
다음과 같이 사용되면 기본 값을 ORIDINAL로써 enum에 정의된 순서로 값이 들어간다. ADMIN은 0, USER는 1로 데이터베이스로 저장된다.
속성을 STRING으로 변경하게 되면 enum 이름 그대로 ADMIN은 ADMIN, USER는 USER로 저장된다.
왜 기본값 대신 STRING 속성을 권장할까?
기본값은 ORIDINAL은 조심해서 사용해야된다. 만약 위 예시에서 ADMIN과 USER 사이 새로운 권한이 생긴다고 가정하자.
그럼 ADMIN(0), NEW(1), USER(2) 형태가 되어버린다. USER는 이제 2로 지정되어 값이 저장되지만 기존의 1로 저장된 값은 여전히 1로 남아있다. 따라서 이러한 문제가 발생하지 않도록 STRING 옵션 사용을 권장한다.
@Temporal
날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용한다. 하지만 자바 8 버전 이후부터는 LocalDate, LocalDateTime이 나와 사용되지는 않는다. (최신 하이버네이트 사용 시 자동 지정된다.)
속성 | 설명 | 기본값 |
value | - TemporalType.DATE : 날짜, 데이터베이스 date 타입과 매핑 (2013-10-13) - TemporalType.TIME : 시간, 데이터베이스 time 타입과 매핑 (11:11:11) - TemporalType.TIMESTAMP : 날짜와 시간, 데이터베이스 timestamp 타입과 매핑 (2013-10-13 11:11:11) |
예시
@Temporal(TemporalType.TIMESTAMP)
private Date timestamp;
@Temporal(TemporalType.TIME)
private Date time;
@Temporal(TemporalType.DATE)
private Date date;

@Lob
데이터베이스 BLOB, CLOB 타입과 매핑된다.
속성 정리
매핑하는 필드 타입이 문자면 CLOB으로 매핑하고 나머지는 BLOB으로 매핑한다.
- CLOB : String, char[], java.sql.CLOB
- BLOB : byte[], java.sql.BLOB
@Transient
이 어노테이션 설정 시 그 필드는 매핑되지 않는다. 따라서 데이터베이스에 저장하지 않고 조회하지도 않는다.
객체에 임시로 어떤 값을 보관하고 싶을 때 사용한다.
참조
'Framework > JPA' 카테고리의 다른 글
[연관관계 매핑 기초] 단방향 연관관계와 객체와 테이블의 차이 (0) | 2024.03.21 |
---|---|
[JPA] 엔티티 매핑 - 기본 키 매핑 (0) | 2024.03.15 |
[JPA] 엔티티 매핑 - 데이터베이스 스키마 자동 생성 (0) | 2024.03.14 |
[JPA] 엔티티 매핑 - 객체와 테이블 매핑 (0) | 2024.03.14 |
[JPA] 준영속 상태 (0) | 2024.03.13 |
필드와 컬럼 매핑
분류 | 매핑 어노테이션 | 설명 |
필드와 컬럼 매핑 | @Column | 컬럼을 매핑한다. |
@Enumerated | 자바의 enum 타입을 매핑한다. | |
@Temporal | 날짜 타입을 매핑한다. | |
@Lob | BLOB, CLOB 타입을 매핑한다. | |
@Transient | 특정 필드를 데이터베이스에 매핑하지 않는다. | |
기타 | @Access | JPA가 엔티티에 접근하는 방식을 지정한다. |
@Column
@Column은 객체 필드를 테이블 컬럼에 매핑한다. 가장 많이 사용되며 기능도 많다.
속성 | 기능 | 기본값 |
name | 필드와 매핑할 테이블의 칼럼 이름 | 객체의 필드 이름 |
insertable(거의 사용되지 않음) | 엔티티 저장 시 이 필드도 같이 저장한다. false 설정 시 이 필드는 데이터베이스에 저장하지 않는다. false 옵션을 읽기 전용 데이터일 때 사용된다. |
true |
updatable(거의 사용되지 않음) | 엔티티 수정 시 이 필드로 같이 수정한다. false 설정 시 데이터베이스에 수정하지 않는다. false 옵션 시 읽기 전용 데이터일 때 사용된다. |
true |
table(거의 사용되지 않음) | 하나의 엔티티를 두 개 이상의 테이블에 매핑할 때 사용한다. 지정한 필드를 다른 테이블에 매핑할 수 있다 | 현재 클래스가 매핑된 테이블 |
nullable(DDL) | null 값의 허용 여부를 설정한다. false로 설정하면 not null 제약 조건이 붙는다. | true |
unique(DDL) | @Table의 uniqueConstraints와 같으나 한 컬럼에 대한 간단한 유니크 제약조건을 걸 때 사용한다. | false |
columnDefinition(DDL) | 데이터베이스 컬럼 정보를 직접 줄 수 있다. | 필드의 자바 타입과 방언 정보를 사용해서 적절한 칼럼 타입을 생성한다. |
length(DDL) | 문자 길이 제약조건, String 타입에만 사용한다. | 255 |
precision, scale(DDL) | BigDecimal 타입(혹인 BigInteger)에서 사용한다. precision은 소수점을 포함한 전체 자리수를, scale은 소수의 자리수다. |
precision = 0, scale = 0 |
예시
name
@Column(name = "MEMBER_NAME")
private String name;

columnDefinition
@Column(columnDefinition = "varchar (100) default 'EMPTY'")
private String data;

nullable
false 설정 시 not null 제약조건이 붙는다.
@Column(nullable = false)
private String data;

unique
@Column(unique = true)
private String data;

주의할 점
@Column의 unique 속성을 사용 시 위와 같이 임의의 랜덤 한 이름으로 표기되는 것을 알 수 있다. 실무 프로젝트 진행 시 에는 제약조건에 따른 예외가 발생할 경우 이 이름 가지고 문제를 파악할 수 있어야 한다. 하지만 @Column에서는 이름을 따로 지정할 수 없다. 그리고 두 칼럼 이상의 제약조건도 만들 수가 없다.
따라서 @Column의 unique 속성보다는 @Table의 uniqueConstraints 속성을 사용하여, 제약조건의 이름을 걸어주는 방법을 사용하는 것을 권장한다.
@Entity(name = "Member")
@Table(name = "member", uniqueConstraints = {
@UniqueConstraint(name = "unique_data", columnNames = {"MEMBER_NAME"})
})
public class Member {
...
}
@Column 생략
@Column을 생략하게 되면, 대부분 @Column 속성의 기본값이 적용되는데, 자바 기본 타입일 때는 nullable 속성에 대한 예외가 있다.
int data; // @Column 생략시, 자바 기본 타입
data integer not null // not null이 기본값으로 설정
Integer data; // @Column 생략시, 객체 타입
data integer // 생성된 DDL
@Column
int data // @Column 사용, 자바 기본 타입
data integer // @Column의 기본값으로 설정
자바 기본 타입 int는 null을 허용하지 않고, 객체 타입은 null을 허용한다. JPA는 그 점을 고려해 @Column 생략 시 각 타입에 맞게 설정이 된다. 하지만 @Column을 사용한다면 @Column에 기본 속성을 따라가게 된다. 그러므로 int 같은 not null 타입에 대해선 @Column 속성 nullable = false을 지정하는 것이 안전하다.
@Enumerated
자바에서는 enum 타입 이용하여 상태 값이나 권한 등을 표기하는 경우가 많다. 그런 경우 객체 필드에 매핑할 필요가 있고 이 경우에 사용되는 어노테이션이다.
속성 | 설명 | 기본값 |
value | - EnumType.ORDINAL : enum 순서를 데이터베이스에 저장 - EnumType.STRING : enum 이름을 데이터베이스에 저장 |
EnumType.ORDINAL |
enum RoleType {
ADMIN, USER
}
-----
@Enumerated(EnumType.STRING)
private RoleType roleType;
다음과 같이 사용되면 기본 값을 ORIDINAL로써 enum에 정의된 순서로 값이 들어간다. ADMIN은 0, USER는 1로 데이터베이스로 저장된다.
속성을 STRING으로 변경하게 되면 enum 이름 그대로 ADMIN은 ADMIN, USER는 USER로 저장된다.
왜 기본값 대신 STRING 속성을 권장할까?
기본값은 ORIDINAL은 조심해서 사용해야된다. 만약 위 예시에서 ADMIN과 USER 사이 새로운 권한이 생긴다고 가정하자.
그럼 ADMIN(0), NEW(1), USER(2) 형태가 되어버린다. USER는 이제 2로 지정되어 값이 저장되지만 기존의 1로 저장된 값은 여전히 1로 남아있다. 따라서 이러한 문제가 발생하지 않도록 STRING 옵션 사용을 권장한다.
@Temporal
날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용한다. 하지만 자바 8 버전 이후부터는 LocalDate, LocalDateTime이 나와 사용되지는 않는다. (최신 하이버네이트 사용 시 자동 지정된다.)
속성 | 설명 | 기본값 |
value | - TemporalType.DATE : 날짜, 데이터베이스 date 타입과 매핑 (2013-10-13) - TemporalType.TIME : 시간, 데이터베이스 time 타입과 매핑 (11:11:11) - TemporalType.TIMESTAMP : 날짜와 시간, 데이터베이스 timestamp 타입과 매핑 (2013-10-13 11:11:11) |
예시
@Temporal(TemporalType.TIMESTAMP)
private Date timestamp;
@Temporal(TemporalType.TIME)
private Date time;
@Temporal(TemporalType.DATE)
private Date date;

@Lob
데이터베이스 BLOB, CLOB 타입과 매핑된다.
속성 정리
매핑하는 필드 타입이 문자면 CLOB으로 매핑하고 나머지는 BLOB으로 매핑한다.
- CLOB : String, char[], java.sql.CLOB
- BLOB : byte[], java.sql.BLOB
@Transient
이 어노테이션 설정 시 그 필드는 매핑되지 않는다. 따라서 데이터베이스에 저장하지 않고 조회하지도 않는다.
객체에 임시로 어떤 값을 보관하고 싶을 때 사용한다.
참조
'Framework > JPA' 카테고리의 다른 글
[연관관계 매핑 기초] 단방향 연관관계와 객체와 테이블의 차이 (0) | 2024.03.21 |
---|---|
[JPA] 엔티티 매핑 - 기본 키 매핑 (0) | 2024.03.15 |
[JPA] 엔티티 매핑 - 데이터베이스 스키마 자동 생성 (0) | 2024.03.14 |
[JPA] 엔티티 매핑 - 객체와 테이블 매핑 (0) | 2024.03.14 |
[JPA] 준영속 상태 (0) | 2024.03.13 |