04장_엔티티매핑

04장_엔티티매핑

4장. 엔티티 매핑 #

JPA 에서 지원하는 매핑 어노테이션은 크게 4가지로 분류할 수 있다.

설명어노테이션
객체 / 테이블 매핑@Entity, @Table
Primary 키 매핑@Id
필드 / 컬럼 매핑@Column
연관관계 매핑@ManyToOne, @JoinColumn

@Entity #

테이블과 매핑할 클래스에 @Entity 어노테이션을 사용한다.

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

주의사항

  • 기본 생성자(Default Constructor, @NoArgsConstructor)는 필수
  • final, enum, interface, inner 클래스에는 사용할 수 없다.
  • 매핑할 필드(컬럼)에 final 값을 사용할 수 없다.

@Table #

엔티티와 매핑할 테이블을 지정한다. (생략 시 엔티티 이름을 사용한다.)


@Id #

@Id 적용 가능한 자바 타입은 다음과 같다.

  • primitive type
  • wrapper class type
  • String
  • java.util.Date
  • java.sql.Date
  • java.math.BigDecimal
  • java.math.BigInteger

* 개발자가 기본키를 직접 할당할 때에는 em.persist()로 엔티티를 저장하기 전에 (아래와 같이)애플리케이션에서 단에서 기본키를 직접 할당해야한다.

Board board = new Board();
board.setId(1);
em.persist(board);

@Column #

객체의 필드를 테이블의 컬럼에 매핑한다.

* @Column 속성 중 name, nullable 이 주로 사용된다. (나머지는 자주 사용되지는 않는다고 한다.)

속성기능기본값
name필드, 컬럼 매핑 시 사용되는 이름true
insertable
(거의사용되지않음)
false 일 경우, 이 필드는 저장하지 않는다.
읽기 전용일 때 사용하곤 한다.
true
updatable
(거의사용되지않음)
false 일 경우, 이 필드는 수정하지 않는다.
읽기 전용일 때 사용하곤 한다.
true
table
(거의사용되지않음)
하나의 엔티티를 두 개 이상의 테이블에 매핑할 때 사용한다. 지정한 필드를 다른 테이블에 매핑할 수 있다.현재 클래스가 매핑된 테이블
nullable(DDL)null 제약, false 일 경우 not null 제약true
unique(DDL)한 컬럼에 유니크 제약 조건 걸 수 있다.
columnDefinition(DDL)데이터베이스 컬럼 정보를 직접 줄 수 있다.
length(DDL)문자 길이 제약조건 (String 타입에만 적용 가능)255
precision, scale(DDL)BigDecimal(BigInteger)타입에서 사용할 수 있다. precision은 소수점을 포함한 전체 자릿수를, scale은 소수의 자릿수다.
double, float 타입에는 적용되지 않는다. 아주 큰 숫자, 정밀한 소수를 다룰 때 사용한다.
precision=19
scale=2

@Enumerated #

enum 타입 매핑할 때 사용한다.

  • ORDINAL
  • STRING

@Temporal #

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

  • TemporalType.DATE : 날짜, DB의 date 타입과 매핑된다. (e.g. 2013-10-11)
  • TemporalType.TIME : 시간, DB의 time 타입과 매핑된다. (e.g. 12:30:30)
  • TemporalType.TIMESTAMP: 날짜와 시간, DB의 timestamp 타입과 매핑된다. (e.g. 2013-10-11 12:30:30)

예시는 다음과 같다.

@Temporal(TemporalType.DATE)
private Date date;

@Temporal(TemporalType.TIME)
private Date time;

@Temporal(TemporalType.TIMESTAMP)
private Date timestamp;

@Lob #

BLOB, CLOB 타입과 매핑한다.

  • BLOB : byte[], java.sql.BLOB
  • CLOB : String, char[], java.sql.CLOB

@Transient #

매핑하지 않는다는 의미이다. DB에 저장하지 않고 조회하지 않는다. 객체에 임시로 어떤 값을 보관하고 싶을 때 사용한다.


@Access #

JPA가 엔티티 데이터에 접근하는 방식을 지정한다.

  • AccessType.FIELD : 필드 접근, 필드에 직접 접근한다. 필드 접근 권한이 private 여도 접근할 수 있다.
  • AccessType.PROPERTY : 접근자(Getter)를 사용한다.