개발자꿈나무

필드와 컬럼 매핑 본문

자바/JPA

필드와 컬럼 매핑

망재이 2023. 7. 25. 18:27

- 예를 들어 이런 요구사항 있다고 가정해보자

  1. 회원은 일반 관리자와 회원 관리자로 구분되어야 한다.
  2. 회원 가입은 수정일이 있어야 한다.
  3. 회원을 설명할 수 있는 필드가 있어야 하며, 이 필드의 길이 제한은 없다.

- 3가지 요구사항을 전부 포함하는 엔티티를 만들고 하나하나 세부사항을 살펴보자

 

 

★ @Column

name 필드와 매핑할 테이블의 컬럼 이름. 기본값은 객체의 필드 이름
insertable, updatable 등록, 변경 가능 여부. 기본값은 TRUE (절대 바꾸면 안되는 속성이 있을 경우 insertable = false 설정해주면 됨)
nullable(DDL) null 값의 허용 여부 설정. false로 설정하면 DDL 생성 시에 not null 제약조건 붙음
unique(DDL) 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용
columnDefinition(DDL) 데이터베이스 컬럼 정보를 직접 줄 수 있음. 
ex) varchar(100) default 'A'
length(DDL) 문자 길이 제약 조건, String 타입에만 사용. 기본값은 255
precision, scale(DDL) BigDemical, BigInteger 타입에서 사용. precision은 소수점 포함한전체 자릿수를, scale은 소수의 자릿수. double, float이 아닌 아주 큰 숫자나 정밀한 소수를 다룰 때 사용. 

 

* nullabe, length를 적용한 모습

* unique의 경우에는 unique 속성보다는 uniqueConstraints를 통해서 설정하는게 더 좋음

unique = true를 주고 DDL을 생성하면 유니크 제약조건이 생성되는데 이때 랜덤으로 복잡한 이름이 생성되게 됨. 이렇게 되면 적용하기 쉽지 않으므로 유니크 제약조건 이름을 지정해주는 방법을 쓰는게 더 깔끔함

이렇게 설정하면 유니크 제약조건 이름을 직접 설정해줄 수 있음 (뒤에서 더 자세히 다를 예정)

 

* columnDefinition을 사용했을 때 모습과 결과

 

 

★ @Enumerated

- 자바 enum 타입을 매핑할 때 사용

 

* 주의!

value EnumType.ORDINAL: enum 순서를 데이터베이스에 저장
EnumType.STRING: enum 이름을 데이터베이스에 저장
기본값은 ORDINAL

- Enumerated를 쓸때 ORDINAL이 기본으로 설정되어있는데 ORDINAL은 이름 그대로 enum 클래스의 필드 순서를 저장하는 것!

public enum RoleType {
    USER, ADMIN
}

Member클래스에서 EnumType.ORDINAL을 지정해주고 USER을 RoleType에 넣어주면 데이터베이스에는 USER(0), ADMIN(1)으로 0이 들어감. 하지만 이 방법이 위험한 이유는 GUEST라는 필드를 추가했을 때,

public enum RoleType {
    GUEST, USER, ADMIN
}

A는 USER, B는 GUEST임에도 같은 0이 들어가있음. 그렇기 때문에 ORDINAL이 아니라 STRING을 쓸 것!

 

 

★ @Temporal

- 날짜 타입을 매핑할 때 매핑할 때 사용

- java는 date 안에 날짜, 시간이 다 있지만 데이터베이스는 보통 날짜, 시간, 날짜+시간이 구분되어 있으므로 타입을 지정해주는 것

value Temporal.DATE: 날짜, 데이터베이스 date 타입과 매핑
Temporal.TIME: 시간, 데이터베이스 time 타입과 매핑
Temporal.TIMESTAMP: 날짜 + 시간, 데이터베이스 timestamp 타입과 매핑

- 그러나 요즘은 java의 LocalDate(날짜), LocalDateTime(날짜+시간)으로 나뉘어져 있기에 굳이 Temporal을 쓰지 않아도 알아서 매핑

LocalDate, LocalDateTime에 맞춰서 알아서 timestamp, date으로 DDL 생성

 

 

★ @Lob

- 매우 큰, 길이 제한이 따로 없는 속성을 설정할 때

- @Lob에는 따로 지정할 수 있는 속성이 없음

- 매핑하는 필드 타입이 문자면 CLOB, 나머지는 BLOB을 매핑해줌

 

 

★ @Transient

- 필드를 매핑하지 않겠다는 뜻

- 데이터베이스에 저장하지 않고 메모리에만 저장해서 쓰고싶은 필드가 있을 때 사용

@Transient
private Integer int;
728x90

'자바 > JPA' 카테고리의 다른 글

실전 예제 - 요구사항 분석 & 기본 매핑  (0) 2023.08.08
기본키 매핑  (0) 2023.08.07
데이터베이스 스키마 자동 생성  (0) 2023.07.25
객체와 테이블 매핑  (0) 2023.07.25
준영속  (0) 2023.07.23