필드와 컬럼 매핑
@Column
엔티티 클래스의 필드와 데이터베이스의 컬럼을 매핑하기 위해 JPA에서는 @Column
어노테이션을 지원한다. @Column
어노테이션은 가장 많이 사용되고 기능도 많지만 name
, nullable
이 주로 사용되고 나머지는 잘 사용되지 않는 편이다.
속성 | 기능 | 기본값 |
---|---|---|
name | 필드와 매핑할 테이블의 컬럼 이름 | 객체의 필드 이름 |
insertable (거의 사용하지 않음) | 엔티티 저장 시 이 필드도 같이 저장한다. false로 설정하면 이 필드는 데이터베이스에 저장하지 않는다. false 옵션은 읽기 전용일 때 사용한다. | true |
updatable (거의 사용하지 않음) | 엔티티 수정 시 이필드도 같이 수정한다. false로 설정하면 데이터베이스에 수정하지 않는다. false 옵션은 읽기 전용일 때 사용한다. | true |
table (거의 사용하지 않음) | 하나의 엔티티를 두 개 이상의 테이블에 매핑할 때 사용한다. 지정한 필드를 다른 테이블에 매핑할 수 있다. | 현재 클래스가 매핑된 테이블 |
nullable(DDL) | null 값의 허용 여부를 설정한다. false로 설정하면 DDL 생성 시 not null 제약조건이 붙는다. | ture |
unique(DDL) | @Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용한다. 만약 두 컬럼 이상을 사용해서 유니크 제약조건을 사용하려면 클래스 레벨에서 @Table.uniqueConstrainsts를 사용해야 한다. | |
columnDefinition(DDL) | 데이터베이스 컬럼 정보를 직접 줄 수 있다. | 필드의 자바 타입과 방언 정보를 사용하여 적절한 컬럼 타입을 생성한다. |
length(DDL) | 문자 길이 제약조건, String 타입에만 사용한다. | 255 |
precision, scale(DDL) | BigDecimal 타입에서 사용한다(BigInteger도 사용할 수 있다). precision은 소수점을 포함한 전체 자릿수를, scale은 소수의 자릿수이다. 참고로 double, float 타입에는 적용되지 않는다. 아주 큰 숫자나 정밀한 소수를 다루어야 할 때만 사용한다. | precision=19, scale=2 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Entity
@Table(name = "tb_member")
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(precision = 19, name = "member_id")
private Long id;
@Column(name = "member_nm", length = 100, nullable = false)
private String memberNm;
@Column(insertable = true, updatable = false)
private LocalDateTime createdAt;
@Column(insertable = true, updatable = true)
private LocalDateTime updatedAt;
private Integer age;
}
@Column 속성 생략 시
위 예제의 age
필드와 같이 @Column
속성을 생략하게 되면 어떻게 될까? 대부분 @Column
속성의 기본값이 적용되는데, 자바 기본 타입일 때는 nullable 속성에 예외가 있다.
1
2
int data1; // @Column 생략, 자바 기본 타입
data1 integer not null // 생성된 DDL
자바의 기본 타입에는 null을 입력할 수 없다. 그로 인해 not null 제약조건이 추가되었다.
1
2
Integer data2; // @Column 생략, 객체 타입
data2 integer // 생성된 DDL
Integer의 경우는 객체 타입이므로 null 값이 허용된다. 그로인해 not null 제약조건이 추가되지 않았다.
1
2
3
@Column
int data3; // @Column 사용, 자바 기본 타입
data3 integer // 생성된 DDL
이 경우는 int가 기본 타입이지만 @Column
어노테이션의 nullable 속성의 기본 값이 ture이기 때문에 not null 제약조건이 추가되지 않았다. 이 경우 nullable = false
를 지정하는 것이 안전하다.
@Enumerated
자바의 enum 타입을 매핑할 때 사용한다.
속성 | 기능 | 기본값 |
---|---|---|
value | EnumType.ORDINAL: enum 순서를 데이터베이스에 저장 EnumType.STRING: enum 이름을 데이터베이스에 저장 | EnumType.ORDINAL |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Entity
@Table(name = "tb_member")
public class Member {
...
@Enumerated(EnumType.STRING)
private Role role = Role.ADMIN; // 데이터베이스에 문자 ADMIN으로 저장
@Enumerated(EnumType.ORDINAL)
private Role role = Role.USER; // 데이터베이스에 enum 순서인 1이 저장된다. (ADMIN:0, USER:1)
}
enum Role {
ADMIN, USER
}
EnumType.ORDINAL
- 장점: 데이터베이스에 저장되는 데이터 크기가 작다.
- 단점: 이미 저장된 enum의 순서를 변경할 수 없다.
EnumType.STRING
- 장점: 저장된 enum의 순서가 바뀌거나 enum이 추가되어도 안전하다.
- 단점: 데이터베이스에 저장되는 데이터 크기가 ORDINAL에 비해서 크다.
@Temporal
날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용한다.
속성 | 기능 | 기본값 |
---|---|---|
value | TemporalType.DATE: 날짜, 데이터베이스 date 타입과 매핑(예: 2022-08-04) TemporalType.TIME: 시간, 데이터베이스 time 타입과 매핑(예: 11:11:11) TemporalType.TIMESTAMP: 날짜와 시간,데이터베이스 timestamp 타입과 매핑(예: 2022-08-04: 11:11:11) | EnumType.ORDINAL |
@Lob
데이터베이스 BLOB, CLOB 타입과 매핑하고 지정할 수 있는 속성이 없다. 매핑하는 필드 타입이 문자면 CLOB으로 매핑하고 나머지는 BLOB으로 매핑한다.
- CLOB: String, char[], java.sql.CLOB
- BLOB: byte[], java.sql.BLOB
@Transient
엔티티의 필드를 컬럼과 매핑하고 싶지 않을 때 사용하는 어노테이션이다. 따라서 데이터베이스에 해당 필드를 저장하지도 조회하지도 않는다. 객체에 임시로 어떤 값을 보관하고 싶을 때 사용한다.
@Access
JPA가 엔티티 데이터에 접근하는 방식을 지정한다.
- 필드 접근(AccessType.FIELD): 필드에 직접 접근한다. 이 경우 필드가 private으로 지정되어 접근할 수 있다.
- 프로퍼티 접근(AccessType.PROPERTY): 접근자(Getter)를 사용하여 필드에 접근한다.
Comments powered by Disqus.