본문 바로가기

JPA

JPA 엔티티 매핑: DB 스키마 자동 생성, 필드와 칼럼 매핑, 기본키 매핑

엔티티 매핑

엔티티 매핑

  • 객체와 테이블 매핑: @Entity, @Table
  • 필드와 칼럼 매핑: @Column
  • 기본키 매핑: @Id
  • 연관관계 매핑: @ManyToOne, @JoinColumn

@Entity(name="text")

  • JPA에서 사용할 엔티티 이름을 지정한다.
  • 기본값으로 Class 이름을 사용한다.

@Table

  • 엔티티와 매핑할 테이블을 지정한다.
속성  기능 기본값 
name  매핑할 테이블 이름  엔티티 이름을 사용
catalog  데이터베이스 catalog 매핑  
schema  데이터베이스 schema 매핑  
uniqueConstraints(DDL) DDL 생성 시 유니크 제약 조건 생성  
@Entity
@Table(name = "BOX") // 테이블이 BOX로 만들어 진다.
public class Item{}

데이터베이스 스키마 자동 생성

  • 개발 초기단계에는 create, update, create-drop을 사용한다.
  • 테스트 서버에는 update, validate를 사용한다.
  • 운영 서버에는 validate, none을 사용한다.
옵션 설명
create 기존 테이블 삭제 후 다시 생성(DROP and CREATE)
create-drop 종료 시점에 테이블 DROP
update 변경분만 반영된다.
validate 엔티티와 테이블이 정상 매핑 되었는지 확인한다.
none 아무 효과 없음

DDL 생성 기능

  • 제약 조건을 추가하여 DDL 생성 시 조건을 넣을 수 있다.
  • DDL 생성 시에만 영향을 미치고 JPA 실행 로직에는 영향이 없다.
@Column(nullable = false, length = 10)
private String name;

필드와 칼럼 매핑

Annotation 설명
@Column 칼럼 매핑
@Temporal 날짜 타입 매핑
@Enumerated enum 타입 매핑
@Lob BLOB, CLOB 매핑
@Transient 특정 필드를 컬럼에 매핑하지 않는다. 매핑 무시

@Enumerated

속성 설명 기본값
ORDINAL enum 순서를 DB에 저장 ORDINAL
STRING enum 이름을 DB에 저장 ORDINAL
  • ORDINAL을 사용하게 되면 DB에 숫자가 들어가 매우 혼란이 생긴다.
  • 그리고 enum의 위치가 바뀌면 문제가 발생하므로 항상 STRING을 사용한다.

@Teamporal

  • 날짜 타입을 매핑할 때 사용된다.
  • LocalDate, LocalDateTime은 생략이 가능하다.
private LocalDate localDate;

private LocalDateTime localDateTime;

@Temporal(TemporalType.TIMESTAMP) // DATE, TIME 속성도 있다.
private Date createDate;

@Lob

  • 따로 지정할 수 있는 속성 없음
  • 매핑이 필드 타입이 문자면 CLOB 매핑, 나머진 BLOB 매핑

@Transient

  • 필드 매핑, DB 저장 조회를 하지 않는다.

기본키 매핑

기본키 매핑 방법

  • 직접 할당: @Id 만 사용
  • 자동 생성: @GeneratedValue
속성 설명
IDENTITY DB에 위임
SEQUENCE DB 시퀀스 오브젝트 사용 @SequenceGenerator 필요
TABLE 키 생성용 테이블 사용하여 모든 DB에서 사용한다. @TableGenerator 필요
AUTO 방언에 따라 자동 지정한다. 기본값

IDENTITY

  • 기본 키 생성을 DB에 위임한다.
  • AUTO_INCREMENT는 JPA는 보통 트랜잭션 커밋 시점에 INSERT SQL을 실행하므로 그 이후에 ID값을 알 수 있다.
  • 하나 IDENTITY는 em.persist() 시점에 INSERT SQL을 실행하고 DB에서 식별자를 조회한다.
  • PK 값이 DB에 들어가기 전까지 null이 되는데 persist로 영속성 콘텍스트에 넣은 값의 id가 null이 되기 때문에 persist 호출 시 DB에 값이 날아가서 ID값을 가져오게 된다.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

참고도서