[JPA] DB Column, Class Field Mapping(@Column, @Enumerated, @Temporal, @Lob, @Transient, @Access)

2 분 소요

🙆‍♂️ import 🙇‍♂️

자바 ORM 표준 JPA 프로그래밍


JPA에서 @EntityTable을 매핑하는 Class의 Field과,

TableColumn Mapping에 사용되는 Annotation으로,

@Column, @Enumerated, @Temporal, @Lob, @Transient, @Access 가 있다.

아래는 해당 Annotation들의 설명이다.

@Column

@Column은 객체 Field를 Table Column과 Mapping해준다.

@Column에 대한 설명은 해당 글을 통해서 확인할 수 있다.

@Enumerated

Java의 enum Type과 Mapping할때 사용된다.

사용되는 속성은 아래 value인데, value로 지정되는 값들에 대한 설명은 아래와 같다.

설명
EnumType.ORDINAL 해당 enum의 순서 값인 숫자를 DB에 저장
EnumType.STRING 해당 enum의 이름을 DB에 저장

이 중 기본 값은 EnumType.ORDINAL인데,

EnumType.ORDINAL의 장점은 저장되는 크기가 작다는 장점뿐인데,

저장된 enum의 순서가 변경되면 굉장히 큰 혼란을 야기할 수 있다.

거의 필수적으로 EnumType.STRING으로 지정해주자.

아래는 사용 예시이다.

@Table(name = "TB_LICENSE")
@Entity
public class License {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "L_ID")
    private long id;

    @Enumerated(value = EnumType.STRING)
    @Column(name = "type")
    private LicenseType type;

}

@Temporal

날짜 Type(java.util.Date, java.util.Calendar) Mapping에 사용된다.

사용되는 속성은 value로 지정 값들에 대한 설명은 아래와 같다.

설명
TemporalType.DATE 날짜, DB date Type과 매핑(2021-07-18)
TemporalType.TIME 시간, DB time Type과 매핑(19:23:15)
TemporalType.TIMESTAMP 날짜와 시간, DB timestamp Type과 매핑(2021-07-18 19:23:15)

아래는 사용 예시이다.

@Getter
@MappedSuperclass
public class CommonEntity {
    
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "CREATED_DATE")
    private Date createdDate;
    
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "MODIFIED_DATE")
    private Date modifiedDate;
}

@Lob

DB CLOB, BLOB Type과 Mapping 하는데 사용한다.

@Lob Annotation은 지정 가능한 속성이 없고,

Mapping Field Type이 문자 형태면 CLOB과 Mapping 하고,

나머지 형태들은 모두 BLOB과 Mapping한다.

아래는 CLOB, BLOB과 Mapping 되는 Java Field Type들이다.

  • CLOB : String, char[], java.sql.CLOB
  • BLOB : byte[], java.sql.BLOB

아래는 Java에서 Field Type 별, DBMS에 Mapping되는 Column Type의 예시이다.

@Lob
private String clobField;

@Lob
private byte[] blobField;

// DB Type
// MySQL
clobField longtext
, blobField longblob

// Oracle

clobField clob
, blobField blob

// PostgreSQL
clobField text
, blobField old

@Transient

@Transient로 지정된 Field는 Mapping되지 않는다.

DB에 저장하지 않고 조회도 하지 않는다.

단지 Java 객체에 값을 보관할고 싶을 경우에 사용한다.

@Transient
private List<T> tempList;

@Access

@Access AnnotationEntity Class에 지정되어 JPA가 해당 Entity Data에 접근하는 방식을 지정 한다.

접근 방식은 AccessType.FIELDAccessType.PROPERTY 두 가지이다.

  • AccessType.FIELD : Field가 private로 설정되어도 Field에 직접 접근한다.
  • AccessType.PROPERTY : 접근자(Getter)를 통해 접근한다.
@Access(AccessType.FIELD)
@Entity
public class User {
    @Id
    private long id;
    
    private String name;
    
    public long getId() {
    	return id;
    }
    
    public String getName() {
    	return name;
    }
}

만약 @Access를 설정하지 않을 경우, @Id 위치를 기준으로 접근 방식을 설정한다.

@Id 위치 = Field

@Acess(AccessType.FIELD) 설정처럼 Field에 직접 접근한다.

@Entity
public class User {
    @Id
    private long id;
    
    private String name;
    
    public long getId() {
    	return id;
    }
    
    public String getName() {
    	return name;
    }
}

@Id 위치 = Property

@Acess(AccessType.PROPERTY) 설정처럼 접근자 Getter를 통해 접근한다.

@Entity
public class User {
    
    private long id;
    
    private String name;
    
    @Id
    public long getId() {
    	return id;
    }
    
    public String getName() {
    	return name;
    }
}

Field, Property 접근 방식 혼용

@Id를 Field에 두고 기본 Data 접근 방식을 Field로 설정하고,

특정 Field에 @Access(AccessType.PROPERTY)를 통해 ** 특정 Field만 접근자 Getter 방식으로 접근**할 수 있다.

@Entity
public class User {
    
    @Id
    private long id;
    
    @Transient
    private String name;
    
    private String loginId;
    
    public long getId() {
    	return id;
    }
    
    @Access(AccessType.PROPERTY)
    public String getLoginId() {
    	return name + "gillog";
    }
}

위 사용 예제는 다른 Field들은 @Id가 Field에 존재AccessType.FIELD로 접근하고,

getter@Access(AccessType.PROPERTY)가 설정된 loginId만 AccessType.PROPERTY로 접근한다.

name Field는 DB와 저장, 조회 되지 않고, @Transient 사용

loginId Column에는 name Field 값에 gillog가 붙은 값이 저장된다.

댓글남기기