twocowsong

필드와 컬럼 매핑 : @Column 본문

IT/JPA

필드와 컬럼 매핑 : @Column

WsCode 2022. 5. 18. 22:17

깃허브 정리 URL : https://github.com/sWineTake/jpa.git

 

GitHub - sWineTake/jpa: 자바 ORM 표준 JPA 프로그래밍 - 김영한

자바 ORM 표준 JPA 프로그래밍 - 김영한. Contribute to sWineTake/jpa development by creating an account on GitHub.

github.com

 

JPA가 제공하는 필드와 컬럼 매핑용 어노테이션들을 정리하였습니다.

분류 매핑 어노테이션 설명
필드와 컬럼 매핑 @Column 컬럼을 매핑
@Enumerated 자바의 enum타입을 매핑
@Temporal 날짜 타입을 매핑
@Lob BLOB, CLOB 타입을 매핑
@Transient 특정 필드를 DB에 매핑하지 않음
기타 @Access JPA가 엔티티에 접근하는 방식 지정

 

@Column

@Column은 객체 필드를 테이블 컬럼에 매핑합니다. 가장 많이사용되고 기능도 많습니다.

속성중에 name, nullable이 주로 사용되고 나머지는 잘 사용되지 않는 편입니다.

insertable, updatable 속성은 DB에 저장되어 있는 정보를 읽기만 하고 실수로 변경하는것을 방지할 때 사용합니다.

(@Column속성을 정리하였으며 거의사용하지않는 내용은 포함하지않았습니다.)

속성 기능 기본값
name 필드와 매핑할 테이블 컬럼 이름 객체의 필드 이름
nullable(DDL) null 값의 허용 여부를 설정합니다. false로 설정하면 DDL 생성 시에 not null 제약조건이 붙습니다. true
unique(DDL) @Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용합니다. 만약 두 컬럼 이상을 사용해서 유니크 제약조건을 사용하면 클래스 레벨에서 @Table.uniqueConstraints를 사용해야 합니다.  
columnDefinition(DDL) 데이터베이스 컬럼 정보를 직접 줄 수 있습니다. 필드의 자바 타입과 방언 정보를 사용해서 적절한 컬럼 타입을 생성합니다.
length(DDL) 문자 길이 제약조건, String 타입에만 사용합니다. 255
percision, scale(DDL) BigDecimal 타입에서 사용합니다. percision은 소수점을 포함한 전체 자릿수를 scale은 소수의 자릿수입니다.  

 

DDL 생성 속성에 따라 어떤 DDL이 생성되는지 확인해봅시다.

- nullable(DDL 생성 기능)

@Column(nullable = false)
private String data;

// 생성된 DDL
data varchar(255) not null;

- unique(DDL 생성 기능)

@Column(unique = true)
private String username;

// 생성된 DDL
alert table Tablename
   add constraint UK_Xxx unique (username)

- columnDefinition

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

// 생성된 DDL
data varchar(100) default 'EMPTY'

- length

@Column(length = 400)
private String date;

// 생성된 DDL
data varchar(400)

- precision, scale

@Column(precision = 10, scale = 2)
private BigDecimal cal;

// 생성된 DDL
cal numeric(10, 2) // H2, PostgreSQL
cal number(10, 2)  // 오라클
cal decimal(10, 2) // MySQL

@Column 생략

@Column을 생략 시 대부분 @Column속성의 기본값이 적용되는데 기본타입일 때는 nullable 속성에 예외가 있습니다.

int data1; // @Column 생략, 자바 기본 타입
data1 integer not null // 생성된 DDL

Integer data2; // @Column 생략, 자바 기본 타입
data2 integer; // 생성된 DDL

@Column
int data3; // @Column 생략, 자바 기본 타입
data3 integer; // 생성된 DDL

int data1 같은 자바 기본 타입에는 null 값을 입력할 수 없습니다.

Integer data2처럼 객체 타입일 때만 null 값이 허용 됩니다.

따라서 자바 기본 타입인 int data1을 DDL을 생성 할 때는 not null 제약조건을 추가하는것이 안전합니다.

 

JPA에서는 data1에 자동으로 not null을 추가합니다.

반면에 객체 타입인 data2에는 not null을 자동으로 추가하지 않습니다.

data3처럼 @Column을 사용하면 기본값이 nullable=true 이므로 not null 제약조건을 추가하지않습니다.

따라서 자바 기본타입에 @Column을 사용하면 nullable=false로 지정하는것이 안전합니다.

'IT > JPA' 카테고리의 다른 글

@Temporal  (0) 2022.05.20
@Enumerated  (0) 2022.05.19
기본 키 매핑 정리  (0) 2022.05.16
AUTO 전략  (0) 2022.05.16
TABLE 전략  (0) 2022.05.15