필드와 칼럼 매핑 관련 Reference
개요
- 본 게시글은 JPA가 제공하는 필드와 칼럼 매핑용 애너테이션들을 레퍼런스 형식으로 정리한 것이다.
- 간단히 훑어만 보고, 필요한 매핑을 사용할 일이 있을 때 찾아서 자세히 읽어보자.
@Column
애너테이션
@Column
은 객체 필드를 테이블 칼럼에 매핑한다.- 가장 많이 사용되고 기능도 많다.
- 주요 속성
- name
- 필드와 매핑할 테이블의 컬럼 이름을 지정한다.
- 기본값 = 객체의 필드 이름
- nullable
- DDL 관련 속성
- null 값의 허용 여부를 설정한다.
- false로 설정하면 DDL 생성시에 not null 제약조건이 붙는다.
//적용 예시 @Column(nullable = false) private String data; //결과: 생성된 DDL data VARCHAR(255) NOT NULL
- unique
- DDL 관련 속성
- 한 칼럼에 간단히 유니크 제약조건을 걸 때 사용한다.
- 두 컬럼 이상을 사용해서 유니크 제약조건을 사용하려면 클래스 레벨에서
@Table.uniqueConstraints
를 사용해야 한다.
//적용 예시 @Column(UNIQUE = TRUE) private String data; //결과: 생성된 DDL ALTER TABLE tablename ADD CONSTRAINT uk_xxx UNIQUE (data)
- columnDefinition
- DDL 관련 속성
- DB 칼럼 정보를 직접 줄 수 있다.
//적용 예시 @Column(columnDefinition = "varchar(100) default 'Empty'") private String data; //결과: 생성된 DDL data VARCHAR(100) DEFAULT 'Empty'
- length
- DDL 관련 속성
- 문자 길이 제약조건
- String 타입에만 사용한다.
//적용 예시 @Column(length = 400) private String data; //결과: 생성된 DDL data VARCHAR(400)
- precision, scale
- DDL 관련 속성
- BigDecimal 타입에서 사용한다.
- precision: 소수점을 포함한 전체 자릿수
- scale: 소수의 자릿수
- 아주 큰 숫자나 정밀한 소수를 다뤄야할 때만 사용
//적용 예시 @Column(precision = 10, scale = 2) private BigDecimal cal; //결과: 생성된 DDL cal NUMERIC(10,2) //H2 cal NUMBER(10,2) //오라클 cal DECIMAL(10,2) //MySQL
- name
@Column
생략시 주의사항
@Column
생략시 주의해야하는 사항이 있다.- 자바 기본 타입에서
@Column
생략시- DDL에서 not null 제약조건이 자동으로 추가된다.
- 왜냐하면, 기본 타입에 null이 들어올 수 없기 때문이다.
- 객체 타입에서
@Column
생략시- DDL에서 not null 제약조건이 추가되지 않는다.
@Enumerated
애너테이션
-
@Enumerated
애너테이션은 자바의 enum 타입을 매핑할 때 사용한다. - 주요 속성
- value
EnumType.ORDINAL
: enum 순서를 DB에 저장한다. (기본값)EnumType.STRING
: enum 이름을 DB에 저장한다.
- value
-
사용 예시
enum RoleType { ADMIN, USER }
@Enumerated(EnumType.STRING) // enum 이름을 DB에 저장 pritvate RoleType roleType1; @Enumerated // enum 순서를 DB에 저장 (EnumType.ORDINAL 은 기본값이므로 생략가능) pritvate RoleType roleType2;
EnumType.STRING
- enum 이름 그대로 ‘ADMIN’이나 ‘USER’라는 문자를 그대로 DB에 저장한다.
- 장점: enum의 순서가 바뀌거나 enum이 추가되어도 안전하다.
- 단점:
EnumType.ORDINAL
보다는 데이터 크기가 크다.
EnumType.ORDINAL
- enum에 정의된 순서대로
ADMIN
은 0,USER
는 1 값이 DB에 저장된다. - 장점: DB에 저장되는 데이터 크기가 작다.
- 단점: enum의 순서가 바뀌거나 enum이 추가되면 DB의 데이터가 잘못된 값을 의미하게 된다.
- enum에 정의된 순서대로
@Temporal
애너테이션
- 이 애너테이션은 날짜 타입을 매핑할 때 사용한다.
- 매핑되는 타입
java.util.Date
java.util.Calendar
- 주요 속성
- value
TemporalType.DATE
: 날짜, DB date 타입과 매핑 (예: 2021-10-11)TemporalType.TIME
: 시간, DB time 타입과 매핑 (예: 10:30:57)TemporalType.TIMESTAMP
: 날짜와 시간, DB timestamp 타입과 매핑 (예: 2021-10-11 10:30:57)
- value
-
사용 예시
@Temporal(TemporalType.DATE) private Date date; //날짜 @Temporal(TemporalType.TIME) private Date time; //시간 @Temporal(TemporalType.TIMESTAMP) private Date timestamp; //날짜와 시간 //==생성된 DDL==// date DATE, time TIME, timestamp TIMESTAMP
@Temporal
생략시 DDL에서 timestamp로 정의된다.
@Lob
애너테이션
- DB의 BLOB, CLOB 타입과 매핑된다.
- 속성이 없다.
- 매핑하는 필드 타입이 문자일때 ⇒ CLOB 으로 매핑
- String, char[], java.sql.CLOB
- 나머지 ⇒ BLOB 으로 매핑
- byte[], java.sql.BLOB
-
사용 예시
@Lob private String lobString; @Lob private Byte[] lobByte;
@Transient
애너테이션
- 해당 애너테이션이 적용된 필드는 매핑하지 않는다.
- 객체에 임시로 어떤 값을 보관하고 싶을 때 사용한다.
-
사용 예시
@Transient private String temp;
@Access
애너테이션
- 해당 애너테이션은 JPA가 엔티티 데이터에 접근하는 방식을 지정한다.
- 접근 방식 종류
- 필드 접근
AccessType.FIELD
로 지정한다.- 필드에 직접 접근한다.
- 필드 접근 권한이 private이어도 접근할 수 있다.
- “엔티티.필드명”으로 접근
- 프로퍼티 접근
AccessType.PROPERTY
로 지정한다.- 접근자를 사용한다.
- “엔티티.get필드명()”으로 접근
- 필드 접근
@Id
위치에 따른 접근 방식 결정
@Access
를 설정하지 않으면@Id
의 위치를 기준으로 접근 방식이 설정된다.-
필드 접근
@Entity public class Member { @Id private String id; //... }
@Access(AccessType.FIELD)
를 클래스 레벨에 적용한 것과 동일하다.
-
프로퍼티 접근
@Entity public class Member { private String id; @Id public String getId() { return id; } }
@Access(AccessType.PROPERETY)
를 클래스 레벨에 적용한 것과 동일하다.
- 김영한, 『자바 ORM 표준 JPA 프로그래밍』, 에이콘