Backend/JPA

[JPA] 4.엔티티 매핑

호_두씨 2021. 8. 25. 00:02

들어가기 전에)

JPA는 다양한 매핑 어노테이션을 지원하는데 크게 4가지로 분류

-객체와 테이블 매핑: @Entity, @Table

-기본 키 매핑 : @Id

-필드와 컬럼 매핑:@Column

-연관관계 매핑:@ManyToOne, @JoinColumn

 

먼저 객체와 테이블 매핑 어노테이션부터 알아보자.

 

4.1 @Entity

@Entity가 붙은 클래스는 JPA가 관리하는 것으로, 엔티티라 부른다.

 

-@Entity 속성 정리

속성 기능 기본값
name JPA에서 사용할 엔티티 이름을 지정한다. 보통 기본값인 클래스 이름을 사용한다. 만약 다른 패키지에 이름이 같은 엔티티 클래스가 있다면 이름을 지정해서 충돌하지 않도록 해야 한다. 설정하지 않으면 클래스 이름을 그대로 사용(예: Member)

 

-주의사항

  • 기본 생성자는 필수다(파라미터가 없는 public 또는 protected 생성자)
  • final 클래스,enum,interface,inner 클래스에는 사용할 수 없다.
  • 저장할 필드에 final을 사용하면 안 된다.

 

4.2 @Table

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

생략하면 매핑한 엔티티 이름을 테이블 이름으로 사용한다.

 

-속성 정리

속성 기능 기본값
name 매핑할 테이블 이름 엔티티 이름을 사용한다.
catalog catalog 기능이 있는 데이터베이스에서 catalog를 매핑한다.  
schema schema 기능이 있는 데이터베이스에서 schema를 매핑한다.  
uniqueConstraints DDL 생성 시에 유니크 제약조건을 만든다. 2개 이상의 복합 유니크 제약조건도 만들 수 있다. 참고로 이 기능은 스키마 자동 생성 기능을 사용해서 DDL을 만들 때만 사용된다.  

 

4.7 필드와 컬럼 매핑: 레퍼런스

-필드와 컬럼 매핑 분류

분류 매핑 어노테이션 설명
필드와 컬럼 매핑 @Column 컬럼을 매핑한다.
@Enumerated 자바의 enum 타입을 매핑한다.
@Temporal 날짜 타입을 매핑한다.
@Lob BLOB,CLOB 타입을 매핑한다.
@Transient 특정 필드를 데이터베이스에 매핑하지 않는다.
기타 @Access JPA가 엔티티에 접근하는 방식을 지정한다.

 

4.7.1 @Column

@Column은 객체 필드를 테이블 컬럼에 매핑한다. 속성 중에 name, nullable이 주로 사용되고 나머지는 잘 사용되지 않는 편이다.

 

-속성 정리

속성 기능 기본값
name 필드와 매핑할 테이블의 컬럼 이름 객체의 필드 이름
insertable
(거의 사용하지 않음)
엔티티 저장 시 이 필드도 같이 저장한다. false로 설정하면 이 필드는 데이터베이스에 저장하지 않는다. false옵션은 읽기 전용일 때 사용한다. true
updatable
(거의 사용하지 않음)
엔티티 수정 시 이 필드도 같이 수정한다. false로 설정하면 데이터베이스에 수정하지 않는다. false옵션은 읽기 전용일 때 사용한다. true
nullable(DDL) null 값의 허용 여부를 설정한다. false로 설정하면 DDL 생성 시에 not null 제약조건이 붙은다. true
unique(DDL) @Table의 uniqueConstraintes와 같이만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용한다. 만약 두 컬럼 이상을 사용해서 유니크 제약조건을 사용하려면 클래스 레벨에서 @Table.uniqueConstraints를 사용해야 한다.  
columnDefinition(DDL) 데이터베이스 컬럼 정보를 직접 줄 수 있다. 필드의 자바 타입과 방언 정보를 사용해서 적절한 컬럼 타입을 생성한다.
length(DDL) 문자 길이 제약조건, Sting 타입에만 사용한다. 255

 

4.7.2 @Enumerated

 

-속성 정리

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

 

-사용 예

//enum 클래스
enum RoleType{
	ADMIN, USER
}

//enum 이름으로 매핑
@Enumerated(EnumType.STRING)
private RoleType roleType;

//사용
member.setRoleType(RoleType.ADMIN); 	//DB에 문자 ADMIN으로 저장됨
  • EnumType.ORDINAL은 enum에 정의된 순서대로 ADMIN은 0, USER는 1 값이 데이터베이스에 저장된다.

       -장점 : 데이터베이스에 저장되는 데이터 크기가 작다.

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

 

  • EnumType.STRING은 enum 이름 그대로 ADMIN은 'ADMIN', USER는 'USER'라는 문자로 데이터베이스에 저장된다.

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

      -단점 : 데이터베이스에 저장되는 데이터크기가 ORDINAL에 비해서 크다

 

->EnumType.STRING을 권장한다.

 

 

4.7.3 @Temporal

날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용한다.

 

-속성 정리

속성 기능 기본값
value TemporalType.DATE : 날짜, 데이터베이스 date 타입과 매핑 (예: 2013-10-11)

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

TemporalType.TIMESTAMP : 날짜와 시간,데이터베이스 timestamp 타입과 매핑 (예 : 2013-10-11 11:11:11)
TemporalType은 필수로 지정해야 한다.

 

@Temporal을 생략하면 자바의 Date와 가장 유사한 timestamp로 정의된다.

데이터베이스 방언에 따라 생성되는 DDL은 다음과 같다

datetime : MYSQL

timestamp : H2, 오라클, PostgreSQL