12. 필드와 컬럼 매핑

김성수·2023년 4월 5일
0

⚡ 생각대로 살지 않으면 사는대로 생각한다.

⚡ 나는 어차피 잘 될 놈이다. 이미 잘 되고 있고, 계속해서 잘 되고 있다.


매핑 어노테이션 정리

hibernate.hbm2ddl.auto

어노테이션설명
@Column컬럼 매핑
Temporal날짜 타입 매핑
@Eumberatedenum 타입 매핑
기본적으로 DB에는 enum타입이 없다.
그래서 자바의 enum타입과 매핑해주기 위해서 사용.
DB의 varchar와 매핑된다.
@LobBLOB, CLOB 매핑
@Transient특정 필드를 컬럼에 매핑하지 않음(매핑 무시)

@Column

속성설명기본값
name필드와 매핑할 테이블의 컬럼 이름객체의 필드 이름
insertable등록 가능 여부TRUE
updatable변경 가능 여부TRUE
nullable(DDL)null 값의 허용 여부를 설정한다. false로 설정하면 DDL 생성 시에 not null 제약조건이 붙는다.
unique(DDL)@Table(클래스레벨에 주는 애너테이션)의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용한다.
잘 사용하지 않는다. (아래 사진 참고)
columnDefinition(DDL)데이터베이스 컬럼 정보를 직접 줄 수 있다.
ex) varchar(100) default 'EMPTY'
필드의 자바 타입과 방언 정보를 사용
아래 사진 참고
length(DDL)문자 길이 제약조건, String 타입에만 사용한다255
precision, scale(DDL)BigDecimal 타입에서 사용한다(Biginteger도 사용할 수 있다). precision은 소수점을 포함한 전체 자릿수를, scale은 소수의 자릿수다. 참고로 double, float타입에는 적용되지 않는다. 아주 큰 숫자나 정밀한 소수를 다루어야할 때만 사용한다.precision = 19,
scale=2

unique(DDL)을 잘 사용하지 않는 이유


unique를 true로 주게 되면, 실행시 나오는 것처럼 이름으로 구분하기 어렵다. 그래서 영한좌는 컬럼보다는 클래스레벨에서 **@Table(uniqueConstraints = 제약조건)** 이런 식으로 사용하라고 권한다.

columnDefinition(DDL) : 컬럼 정보 직접 주기


이처럼 컬럼 정보를 직접 준 내용을 SQL로그를 통해서 확인할 수 있다.

@Enumerated

❗자바 enum 타입을 매핑할 때 사용
주의❗ ORDINAL 사용 X

속성설명기본값
valueEnumType.ORDINAL: enum 순서를 데이터베이스에 저장
EnumType.STRING: enum 이름을 데이터베이스에 저장
ORDINAL로 값을 주면 안됨. 위험하다.(아래 사진 참고)
EnumType.ORDINAL

@Enumertated에 ORDINAL(기본값)을 주면 안 되는 이유

권한 타입의 Enum으로 USER, ADMIN이 있는 상태에서 두 Member 인스턴스를 생성하고, 각각에 USER, ADMIN을 주었다.

위와 같은 코드가 있고, H2에서 확인한 결과

이 상태에서 RoleType의 enum에 GUEST를 추가하고, 새로운 멤버에 GUEST 권한을 주었다.


GUSET와 USER로 등록한 RoleType이 다 0으로 되있는 걸 볼 수 있다.
순서가 지금 바꼈다... 운영상에서는 치명적이라고 하는데, 이처럼 enum타입에 ORDINAL을 사용하면 굉장히 위험하다.
그래서 그냥.. STRING을 필수적으로 사용해주면 된다.

STRING으로 한 결과



STRING으로 하자!!

@Temporal

옛날에 쓰신 분들이 필요...지금은 잘 안 씀..;;

  • 날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용
  • 참고: LocalDate, LocalDateTime을 사용할 때는 생략 가능(최신 하이버네이트 지원)
    • 최신 버전 사용하면, 그냥 LocalDate(년월), LocalDateTime(년월일) 이 두개 중 하나 쓰면 됨.
    • 어차피 Hibernate가 타입을 알아서 매핑해줌.
속성설명기본값
valueTemporalType.DATE : 날짜, 데이터베이스 date 타입과 매핑(예: 2013-10-11)
TemporalType.TIME : 시간, 데이터베이스 time 타입과 매핑(예: 11:11:11)
TemporalType.TIMESTAMP: 날짜와 시간, 데이터베이스 timestamp 타입과 매핑(예: 2013-10-11 11:11:11)

@Lob

데이터베이스 BLOB, CLOB 타입과 매핑

  • DB에서 varchar의 크기를 넘어서는 데이터
  • @Lob에는 지정할 수 있는 속성이 없다.
  • 매핑하는 필드 타입이 문자면 CLOB 매핑, 나머지는 BLOB 매핑
    • CLOB : String, char[], java.sql.CLOB
    • BLOB : byte[], java.sql.BLOB

@Transient

매핑하기 싫을 때..

  • 필드 매핑 X
  • 데이터베이스에 저장X, 조회X
  • 주로 메모리상에서만 임시로 어떤 값을 보관하고 싶을 때 사용
@Transient
private Integer temp;

-끝-

profile
쌩수 Git >> https://github.com/SsangSoo?tab=repositories

0개의 댓글