[JPA] 엔티티 매핑 어노테이션과 속성 값 정리

객체와 테이블 매핑

@Entity

@Entity가 붙은 클래스를 엔티티라고 하고 JPA가 관리 한다.

JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수이다.

 

속성 값
속성 설명 기본값
name JPA에서 사용할 엔티티 이름을 지정한다 클래스 이름을 그대로 사용

 

주의할점
  • 기본 생성자 필수이다. (파라미터가 없는 public 또는 protected 생성자)
  • final, enum, interface, inner 클래스에서는 사용할 수 없다.
  • 저장할 필드의 변수에 final을 사용할 수 없다.

@Table

엔티티와 매핑할 테이블 지정한다.

 

속성 값
속성 설명 기본값
name 매핑할 테이블 이름을 지정한다 엔티티 이름 사용
catalog catalog 기능이 있는 DB에서 catalog를 매핑한다.  
schema schema 기능이 있는 DB에서 schema를 매핑한다.  
uniqueContraints DDL 생성시 유니크 제약조건을 생성한다.
2개 이상의 복합 유니크 제약조건도 만들 수 있다.
(스키마 자동 생성 기능 ddl-auto를 사용해서 DDL을 만들 때만 사용)

 
 

[JPA] 데이터베이스 초기화 전략 (ddl auto 옵션)

spring.jpa.hibernate.ddl-auto 데이터베이스 ddl 자동 생성 옵션으로 Entity 설정을 참고하여 애플리케이션 실행시점에 Hibernate에서 자동으로 DDL을 생성하여, 필요한 Database의 Table 설정들을 자동으로 수행

hstory0208.tistory.com


필드와 컬럼 매핑

@Colum

DB의 컬럼과 엔티티 클래스의 필드를 매핑할 때 사용한다.

 

속성 값
속성 설명 기본값
name 필드와 매핑할 테이블의 컬럼 이름 객체의 필드 이름
insertable 엔티티 저장시 해당 필드도 같이 저장한다.
false로 설정 시 DB에 저장하지 않는다.
TRUE
updatable 엔티티 수정시 해당 필드도 같이 수정한다.
false로 설정 시 DB에 업데이트 하지 않는다.
TRUE
nullable(DDL) null 값의 허용 여부를 설정한다.
false로 설정하면 DDL 생성 시에 not null 제약조건이 붙는다.
TRUE
unique(DDL) 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용.
보통은 유니크 명이 랜덤으로 나와서 식별하기 어렵기 때문에
Table의 @UniqueConstraint 어노테이션을 대신 쓴다.
 
columnDefinition (DDL) DB의 컬럼 정보를 직접설정 한다.
ex) varchar(100) default 'EMPTY'
필드의 자바 타입과 방언 정보를 사용
length(DDL) 문자 길이 제약조건, String 타입에만 사용 255
precision, scale(DDL) BigDecimal 타입이나 BigInteger에서 사용.
precision = 소수점을 포함한 전체 자릿수
scale = 소수의 자릿수
( double, float 타입에는 적용되지 않는다.  )

정밀한 소수를 다루어야 할 때만 사용한다.
precision=19, scale=2

 


@Enumerated

자바의 enum 타입을 매핑할 때 사용한다.

 

속성 값
속성 설명 기본값
value EnumType.ORDINAL: enum에 정의된 순서대로 0부터 DB에 숫자를 저장
EnumType.STRING: enum의 타입을 문자열로 DB에 저장
EnumType.ORDINAL

 

EnumType.STRING을 사용하는것을 권장

EnumType.ORDINAL은 중간에 enum 타입이 추가되면 순서 변경의 위험이 있다.

반면에, EnumType.STRING은 ORDINAL에 비해 중간에 순서가 변경되거나 추가되도 안전하다.


@Lob

DB의 BLOB, CLOB 타입과 매핑한다.

 

@Lob에는 지정할 수 있는 속성이 따로 없다.

대신 매핑하는 필드 타입이 문자면 CLOB이고, 나머지는 BLOB으로 매핑된다.

 

  • CLOB : 문자 대형 객체.
  • BLOB : 이진 대형 객체. 이미지, 동영상, MP3 등... 

@Transient

특정 필드를 컬럼에 매핑하지 않는다. (매핑 무시)

매핑하지 않으므로 데이터베이스에 저장하지 않고, 조회 또한 할 수 없다.

 

주로 메모리상에서만 임시로 값을 보관하고 싶을 때 사용한다.


@Temporal

자바 8부터 LocalDate, LocalDateTime을 사용할 수 있게 되면서 

@Temporal을 생략하여도 필드의 타입LocalDate, LocalDateTime일 때 알아서 시간정보를 매핑해준다.