본문 바로가기
Back-End/Database

[JPA] 엔티티 매핑

by 달의 조각 2022. 9. 4.
이 글은 김영한 님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 강의를 수강하며 정리한 글입니다.

 

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

 


 

객체와 테이블 매핑

 

🌝 @Entity

@Entity
@Table(name = "MBR")
public class Member {
    @Id
    private Long id;
    private String name;
    ...
}
  • 기본 생성자가 필수이다. (public 또는 protected)
  • final 클래스, enum, interface, inner 클래스는 사용할 수 없다.
  • DB에 저장할 필드에 final을 사용할 수 없다.

 


 

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

 

  이 기능을 사용하면 애플리케이션 실행(Run) 시점에 테이블을 생성해 준다. (개발 단계에서 사용하기)

// persistence.xml
<property name="hibernate.hbm2ddl.auto" value="create" />
  • create: 기존 테이블을 삭제한 후 생성한다. (DROP + CREATE)
  • create-drop: create와 같으나 종료 시점에 DROP 한다. (테스트 케이스 날릴 때 주로 사용)
  • update: 추가하는 변경분만 반영된다. 필드 삭제는 반영되지 않는다. (운영 DB에서는 사용 X)
  • validate: 엔티티와 테이블이 정상 매핑되었는지만 확인한다. (비정상 매핑 시 에러를 통해 확인)
  • none
  • 운영 장비에서는 create, create-drop, update를 사용하면 안 된다.
  • 개발 초기 단계: create 또는 update
  • 테스트 서버(여러 개발자가 공용 사용): update, validate
  • 스테이징과 운영 서버: validate 또는 none
  • 로컬 서버에서만 사용할 것을 권장한다!

 

🌝 DDL 생성 기능

  DDL(CREATE, ALTER, DROP, TRUNCATE)을 자동 생성할 때만 영향을 주고 JPA의 실행 로직에는 영향을 주지 않는다.

//제약 조건
@Column(nullable = false, length = 10, unique = true)
private String name;

 


 

필드와 컬럼 매핑

 

어노테이션 설명
@Column 컬럼 매핑
@Temporal Date 날짜 타입 매핑
LocalData, LocalDataTime 타입 사용 시 생략 가능
@Enumerated enum 타입 매핑
@Lob BLOB, CLOB(문자) 매핑 (큰 데이터)
@Transient 필드를 컬럼에 매핑하지 않음(매핑 무시)
주로 메모리상에서만 임시로 값을 보관하고 싶을 때

 

🌝 @Enumerated 사용 시 주의

@Enumerated(EnumType.STRING)
private RoleType roleType;
  • EnumType.ORDINAL: (기본값) enum 순서를 데이터베이스에 저장한다. 만약 새로운 enum 타입이 추가되면 문제가 된다!
  • EnumType.STRING: enum 이름을 데이터베이스에 저장한다.

 


 

기본 키 매핑

 

  기본키 권장 조건은 null이 아니고, 유일하며, 변하면 안 된다는 것이다. 미래까지 이 조건을 만족하는 자연키를 찾기 어려우므로 대리키(대체키)를 사용하자. (주민등록번호도 적절하지 않다.)

권장: Long형 + 대체키 + 키 생성 전략 사용

🌝 직접 할당: @Id

@Id
private String id;

 

🌝 자동 생성: @GeneratedValue

@GeneratedValue(strategy = GenerationType.IDENTITY)
  • IDENTITY: 기본키 생성을 DB에 위임한다. (MySQL: AUTO_INCREMENT)
  • SEQUENCE: DB 시퀀스[각주:1] 오브젝트 사용
  • TABLE: 키 생성용 테이블 사용한다. 모든 DB에서 시퀀스를 흉내낼 수 있다. 성능은 좋지 않다.
  • AUTO: (기본값) DB 종류에 따라 위의 세 가지 방법 중 하나를 선택한다.

  IDENTITY의 기본키 생성 과정(AUTO_INCREMENT)은 DB에 기본키에 해당하는 값이 Null로 INSERT 쿼리가 날아오면 이때 값을 세팅한다. 따라서 기본키의 값을 알 수 있는 시점은 DB에 값이 들어갈 때이다.

문제는 JPA는 영속성 컨텍스트에서 관리되려면(persist) 무조건 PK 값이 존재해야 한다는 것이다. 따라서 JPA는 보통 트랜잭션 커밋 시점에 INSERT SQL를 실행하지만, IDENTITY 전략은 em.persist() 시점에 즉시 INSERT SQL을 실행하고, DB에서 식별자를 조회한다.

SEQUENCE의 경우에는 persist 시점에 INSERT 쿼리를 실행하지 않고, call next value for MEMBER_SEQ 쿼리를 통해 식별자 값을 가져온다. INSERT 쿼리는 커밋 시점에 날아가므로 버퍼링이 가능하다. 성능 최적화를 위해서 시퀀스를 한 번 호출할 때 증가하는 수를 allocationSize 속성으로 설정할 수 있다.

 


📚  Reference

 

  1. 유일(UNIQUE)한 값을 생성해 주는 오라클 객체 [본문으로]

댓글