자라선

[자바 ORM 표쥰 JPA 프로그래밍] 9일차 - 필드와 컬럼 매핑: 래퍼런스 본문

Develop/JPA

[자바 ORM 표쥰 JPA 프로그래밍] 9일차 - 필드와 컬럼 매핑: 래퍼런스

자라선 2021. 8. 18. 00:24

1. @Column

테이블 컬럼과 엔티티의 필드를 명시적으로 매핑하기 위한 어노테이션.

데이터베이스마다 데이터 타입 명이나 종류가 다다르기 때문에 JPA는 데이터베이스 방언에 맞춰 자동으로 생성해준다.

 

속성 

- name : 필드와 매핑할 컬럼 이름을 작성한다. @Column 어노테이션을 명시하지 않았을때는 필드명을 그대로 매핑하게된다.

 

- nullable : 테이블 초기화시 DDL에 제약조건이 붙는데 기본값은 true 로 null이 허용된다. false 로 하게 된다면 not null 제약조건이 추가된다.

 

- unique : 테이블 초기화시 DDL에 유니크 제약조건 추가 여부를 묻는다. 간단히 하나의 컬럼만 추가시 사용되며 2개 이상의 유니크 제약조건을 추가하려면 @Table.uniqueConstraints 어노테이션을 사용해야한다.

 

- length : 테이블 초기화시 문자 길이를 제한한다. String 에서만 사용이 가능하며 기본값은 255 이다.

 

 

※ 주의

@Column 를 생략하여 테이블 초기화시 필드명을 그대로 매핑을 하게 되지만 

자바의 원시 타입(int, char, double ...) 와 같은 타입의 경우 묵시적으로 사용시 DDL에 not null 제약조건이 붙여져 버린다.

그 이유는 자바는 원시 타입에 null 를 허용하지 않기 때문인데 이를 JPA가 알아서 not null로 처리하게된다.

원시 타입에 null 를 대입하면 에러뜬다..

 

하지만 @Column 어노테이션을 명시하게 된다면 not null 제약조건이 사라져 null 이 허용되게 되어버리는데 이때는 nullable 속성을 추가하여 false 로 하여 not null로 만들어주어야한다.

		// Entity VO
		private int notAnotation;

		@Column
		private int yesAnotation;

		-- DDL
		notAnotation integer not null,
		yesAnotation integer,

 

2. @Enumerated

자바의 Enum 열거형을 컬럼과 매핑할때 사용된다.

    @Enumerated(EnumType.ORDINAL)
    private RoleType roleType;

속성은 2가지가 있으며 기본값은 EnumType.ORDINAL 이다.

 

- EnumType.ORDINAL

DB에 INSERT 시 왼쪽부터 0, 1, 2 ... 순번대로 지정하여 입력된다.

public enum RoleType {
    ADMIN, USER // ADMIN: 0, USER: 1
}

 

- EnumType.STRING

DB에 INSERT 시 열거형 필드명 그대로 입력된다.

 

특별한 경우가 아니고서는 순번되로 입력되는 ORDINAL 보다는 되도록 STRING 을 선호한다.

public enum RoleType {
    ADMIN, USER // ADMIN: ADMIN, USER: USER
}

 

3. @Temporal

날짜 타입을 지정하는 어노테이션이며 이 어노테이션은 속성값을 필수로 지정해야한다.

 

- TemporalType.DATE

DB의 date 타입과 매핑하며 년 월 일타입으로 저장한다.

    @Temporal(value = TemporalType.DATE)    // DB의 date 타입과 매핑(2020-10-10)
    private Date date;

 

- TemporalType.TIME

DB의 time 타입과 매핑한다.

    @Temporal(value = TemporalType.TIME)    // DB의 time 타입과 매핑(13:08:50)
    private Date time;

 

- TemporalType.TIMESTAMP

DB의 timestamp 타입과 매핑하며 날짜 시간을 입력한다.

    @Temporal(value = TemporalType.TIMESTAMP)    // DB의 timestamp 타입과 매핑(2020-10-10 13:08:50)
    private Date timestamp;

 

4. @Lob

데이터베이스 상의 BLOB, CLOB 과 매핑을 해주는 어노테이션이며 자바의 엔티티 필드 타입에 맞춰 CLOB or BLOB으로 매핑해준다.

 

- CLOB: String, char[], java.sql.CLOB

- BLOB: bype[], java.sql.BLOB

    @Lob    // CLOB 타입과 매핑하게 된다.
    private String clob;

 

5. @Transient

이 어노테이션이 지정된 필드는 DB 컬럼과 매핑하지 않는다.

    @Transient
    private String notMapping;

 

 

Comments