Spring

필드와 컬럼 맵핑

potatoo 2024. 10. 3. 15:01
728x90

@Column

객체 필드를 테이블 컬럼에 맵핑한다.

속성

- name : 필드와 매핑할 테이블의 컬럼 이름

- insertable : 엔티티 저장 시 이 필드도 같이 저장한다. false로 지정하면 DB에 저장하지 않는다. (false는 읽기 전용)

- updateable : 엔티티 수정 시 이 필드도 같이 수정한다. false로 지정하면 DB에 수정하지 않는다. (false는 읽기 전용)

- table : 하나의 엔티티를 두 개 이상의 테이블에 맵핑할 때 사용한다. 지정한 필드를 다른 테이블에 매핑할 수 있다. (거의 사용하지 않는                   다.)

- nullable(DDL) : null 값의 허용 여부를 설정한다. false로 설정하면 DDL 생성 시에 not null 제약조건이 붙는다.

- unique(DDL) : @Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용한다.

- columnDefinition(DDL) : 데이터베이스 컬럼 정보를 직접 줄 수 있다.

- length(DDL) : 문자길이 제약조건, String 타입에만 사용한다.

- precision, scale(DDL) : BigDecimal, BigInteger 타입에서 사용한다. precision은 소수점을 포함한 전체 자릿수, scale은 소수의 자릿수이다. float과 double에는 적용되지 않는다.

@Enumerated

자바의 enum 타입을 맵핑한다.

속성

value :

    EnumType.ORDINAL : enum 순서를 데이터베이스에 저장

                                          장점 : DB에 저장되는 데이터의 크기가 작다. 

                                          단점 : 이미 저장된 enum의 순서를 변경할 수 없다.

    EnumType.STRING : enum 이름을 데이터베이스에 저장

                                        장점 : 저장된 enum의 순서가 바뀌거나 enum이 추가되어도 안전하다.

                                        단점 : ORDINAL보다 DB에 저장되는 데이터의 크기가 크다.

위와 같은 장, 단점으로 인해서 STRING이 권장된다.

@Temporal

날짜 타입을 맵핑한다.

속성

value : 

     TemporalType.DATE : 날짜, 데이터베이스 date 타입과 매핑 (2024-10-01)

     TemporalType.TIME : 시간, 데이터베이스 time 타입과 매핑 (14:52:33)

     TemporalType.TIMESTAMP : 날짜와 시간, 데이터베이스 timestamp 타입과 매핑 (2024-10-01 14:52:33)

자바에는 년월일 시분초가 있다. DB에는 date(날짜), time(시간), timestamp(날짜와 시간)로 세 가지 타입이 존재한다.

@Lob

BLOB, CLOB 타입을 맵핑한다.

문자면 CLOB, 나머지는 BLOB으로 매핑

@Transient

특정 필드를 데이터베이스에 맵핑하지 않는다.

조회 또한 하지 않는다. 객체에 어떤 값을 임시로 보관하고 싶을 때 사용한다.

@Access

JPA가 엔티티 데이터에 접근하는 방식을 지정한다.

- 필드 접근 : AccessType.FIELD로 지정한다. 필드에 직접 접근한다. 필드 접근 권한이 private이어도 접근할 수 있다.

- 프로퍼티 접근 : AccessType.PROPERTY로 지정한다. 접근자를 사용한다.

 

@Access를 설정하지 않으면 @Id의 위치를 기준으로 접근 방식을 설정

 

@Entity
@Access(AccessType.FIELD)
public class Member {
    @Id
    private String id;
    
    private String data1;
    private String data2;
}

이 경우는 @Id가 필드에 있음으로 따로 @Access를 지정 안해도 된다.

@Entity
@Access(AccessType.PROPERTY)
public class Member {

    private String id;
    
    private String data1;
    private String data2;
    
    @Id
    public String getId() {
    	return id;
    }
    
    @Column
    public String getData1() {
    	return data1;
    }
    
    public String getData2() {
    	return data2;
    }
}

@Id가 프로퍼티에 있어서 @Access(AccessType.PROPERTY)로 설정한 것과 같다. 그래서 @Access는 생략해도 된다.

 

필드 접근 방식과 프로퍼티 접근 방식을 함께 사용할 수도 있다.

@Entity
public class Member {

    @Id
    private String id;
    
    @Transient
    private String firstName;
    
    @Transient
    private String lastName;
    
    @Access(AccessType.PROPERTY)
    public String getFullName() {
    	return firstName + lastName;
    }
}

@Id가 필드에 있으니 기본은 필드 접근 방식을 사용한다. getFullName()만 프로퍼티 접근 방식을 사용한다. 회원 엔티티를 저장하면 회원 테이블의 FULLNAME 컬럼에 firstName + lastName의 결과가 저장된다.

 

728x90