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

GilLog·2021년 7월 18일
0

JPA

목록 보기
5/8

🙆‍♂️ 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가 붙은 값이 저장된다.

profile
🚀 기록보단 길록을 20.10 ~ 22.02 ⭐ Move To : https://gil-log.github.io/

0개의 댓글