개발자꿈나무
필드와 컬럼 매핑 본문
- 예를 들어 이런 요구사항 있다고 가정해보자
- 회원은 일반 관리자와 회원 관리자로 구분되어야 한다.
- 회원 가입은 수정일이 있어야 한다.
- 회원을 설명할 수 있는 필드가 있어야 하며, 이 필드의 길이 제한은 없다.
- 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을 쓰지 않아도 알아서 매핑
★ @Lob
- 매우 큰, 길이 제한이 따로 없는 속성을 설정할 때
- @Lob에는 따로 지정할 수 있는 속성이 없음
- 매핑하는 필드 타입이 문자면 CLOB, 나머지는 BLOB을 매핑해줌
★ @Transient
- 필드를 매핑하지 않겠다는 뜻
- 데이터베이스에 저장하지 않고 메모리에만 저장해서 쓰고싶은 필드가 있을 때 사용
@Transient
private Integer int;
'자바 > JPA' 카테고리의 다른 글
실전 예제 - 요구사항 분석 & 기본 매핑 (0) | 2023.08.08 |
---|---|
기본키 매핑 (0) | 2023.08.07 |
데이터베이스 스키마 자동 생성 (0) | 2023.07.25 |
객체와 테이블 매핑 (0) | 2023.07.25 |
준영속 (0) | 2023.07.23 |