@Column은 컬럼 매핑에서 가장 많이 사용되는 어노테이션으로 엔티티의 필드를 테이블의 컬럼과 매핑할 때 사용합니다.
@Column
private String name;
@Column에서 사용되는 속성 값들은 다음과 같습니다.
| 속성 | 설명 |
|---|---|
| name | 필드와 매핑할 컬럼 이름. 기본 값으로 필드명을 사용 |
| nullable | NOT NULL의 사용 여부. false 시 NOT NULL |
| unique | 컬럼에 유니크 제약 조건을 걸 때 사용 |
| length | String 타입의 문자 길이 제약 조건 설정 |
| insertable | 엔티티 저장 시 해당 필드를 저장. 기본적으로 true이며 false 시 엔티티 저장 시에 해당 필드를 저장하지 않음 |
| updatable | 엔티티 수정 시 해당 필드도 수정 |
| table | 하나의 엔티티를 두 개 이상의 테이블에 매핑할 때 사용 |
| columnDefinition | 컬럼 정보 직접 생성 ex) "VARCHAR(255) NOT NULL DEFUALT 'a' " |
| precision, scale | BigDecimal, BigInteger 타입 사용 시 큰 수나 정밀한 소수 저장을 위해 사용 |
nullable은 기본 값으로true입니다. 그런데 자바 언어 특성상 기본 타입(int 등)에는 null 값이 올 수 없기 때문에 기본 타입을 생성하는 경우 명시적으로nullable = false를 걸어주는 것이 좋습니다.
@Enumerated는 자바의 Enum 타입을 매핑할 때 사용합니다.
| 속성 | 설명 |
|---|---|
| value | EnumType에 따라 데이터베이스 저장 형식 변경 |
EnumType에는 EnumType.ORDINAL, EnumType.STRING이 존재합니다.
public enum UserType {
ADMIN,
USER
}
위와 같은 Enum이 있다면 EnumType.ORDINAL에서는 ADMIN을 0, USER를 1로 저장하고 EnumType.STRING에서는 'ADMIN', 'USER'로 저장합니다.
EnumType.ORDINAL에서는 Enum의 순서를 변경하기가 어렵습니다. 만약 다음과 같이 Enum을 변경했을 때를 가정합니다.public enum UserType { ADMIN, TESTER, USER }ADMIN은 0, TESTER는 1, USER는 2로 저장되게 됩니다. 이때 이전에 저장된 USER는 여전히 1 값을 저장해놓고 있기 때문에 불일치 문제가 발생하게 됩니다.
따라서EnumType.STRING의 사용을 권장합니다.
@Temporal은 Date, Calendar와 같은 날짜 타입 매핑에 사용됩니다.
| 속성 | 설명 |
|---|---|
| value | TemporalType에 따라 데이터베이스 타입 매핑 변경. 필수로 지정해야 함 |
TemporalType은 다음 세 가지가 존재합니다.
날짜 타입에서 @Temporal을 생략하면 TIMESTAMP(OracleDB, PostgreSQL 등), DATETIME(MySQL)과 자동으로 매핑됩니다.
@Lob은 데이터베이스의 BLOB, CLOB 타입 매핑에 사용됩니다.
참조) MySQL의 BLOB 타입
@Lob은 속성이 따로 없습니다.
매핑 시 문자, 문자열인 경우에는 CLOB, 그 외 타입에 대해서는 BLOB을 매핑합니다.
@Transient는 아무것도 매핑하지 않는 필드에 사용합니다. 단순히 객체에 어떤 값을 잠깐 저장하고자 할 때 사용합니다.
@Access는 JPA가 엔티티 데이터에 접근하는 방식을 지정합니다.
AccessType에 따라 접근 방식이 변경되며 다음과 같은 두 가지 접근 방식을 제공합니다.
필드 접근. 필드에 직접 접근합니다. 필드의 접근 제어자가 private로 선언되어 있어도 접근합니다.프로퍼티 접근. getter를 통해 접근합니다.@Access는 @Id가 설정되어 있다면 따로 명시하지 않아도 자동으로 접근 방식을 결정합니다.
@Entity
@Access(AccessType.FILED) //생략 가능
public class User1 {
@Id //@Id가 필드 레벨에 작성되었으므로 자동으로 AccessType.FILED 지정
private int id;
}
@Entity
@Access(AccessType.PROPERTY) //생략 가능
public class User2 {
private int id;
@Id //@Id가 프로퍼티 레벨에 작성되었으므로 자동으로 AccessType.PROPERTY 지정
public int getId() {
return this.id;
}
}