Home 필드와 컬럼 캐핑
Post
Cancel

필드와 컬럼 캐핑

필드와 컬럼 매핑

@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 타입을 매핑할 때 사용한다.

속성기능기본값
valueEnumType.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)을 매핑할 때 사용한다.

속성기능기본값
valueTemporalType.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)를 사용하여 필드에 접근한다.

참고

This post is licensed under CC BY 4.0 by the author.

기본 키 매핑

단방향 연관관계

Comments powered by Disqus.