JPA : 엔티티 매핑

CO빈·2025년 6월 23일

백엔드

목록 보기
10/11

객체와 테이블 매핑

@Entity : 엔티티 이름

  • 기본 생성자 필수
  • final클래스, enum, interface, inner 클래스에는 사용할 수 없음
  • 저장할 필드에 final 사용하면 안됨

@Table : 엔티티와 매핑할 테이블 지정

기본 키 매핑

기본 키 직접 할당 전략

@Id로 매핑

em.persist()로 엔티티 저장 전 애플리케이션에서 기본 키를 직접 할당하는 방법

T t = new T();
t.setId("id1") // 기본키 직접 할당
em.persist(t)

Identity 전략

기본 키 생성을 데이터베이스에 위임하는 전략
@GeneratedValue(strategy = GenerationType.IDENTITY)

데이터를 데이터베이스에 Insert한 후 기본 키 조회

👉 엔티티가 영속 상태가 되려면 식별자가 반드시 필요하다. 그러나 이 전략은 엔티티를 데이터베이스에 저장해야 식별자를 구할 수 있으므로 em.persis()를 호출하는 즉시 Insert SQL이 데이터베이스에 전달된다. 따라서 이 전략은 트랜잭션을 지원하는 쓰기 지연이 동작하지 않는다.

Sequence 전략

유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트
@SequenceGenerator(name ="", sequenceName ="", initialValue ="", allocationSize ="")
👉 em.persist()를 호출할 때 먼저 데이터베이스 시퀀스를 사용해서 식별자를 조회한다. 그리고 조회한 식별자를 엔티티에 할당한 후에 엔티티 영속성 컨텍스트에 저장한다. 이후 트랜잭션 커밋해서 플러시가 일어나면 엔티티를 데이터베이스에 저장한다.

Table 전략

시퀀스 대신에 테이블을 사용한다는 것만 제외하면 내부 동작 방식이 같다.

AUTO 전략

@GeneratedValue

장점 : 데이터베이스를 변경해도 코드를 수정할 필요가 없다.


[실습] 요구사항 분석과 기본 매핑

  1. 요구사항 분석
  • 회원은 상품을 주문할 수 있다.
  • 주문 시 여러 종류의 상품을 선택할 수 있다.
package jpabook.model.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Member {
    @Id @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;
    
    private String name;
    
    private String city;
    private String street;
    private String zipcode;
    
    //getter, setter
    
}

Member 테이블 생성
@GeneratedValue는 H2데이터베이스를 사용하는데, Sequence를 사용한다.

package jpabook.model.entity;

import javax.persistence.*;
import java.util.Date;

@Entity
@Table(name = "ORDERS")
public class Order {

    @Id @GeneratedValue
    @Column(name ="ODER_ID")
    private Long id;

    @Column(name = "MEMBER_ID")
    private  Long memberId;

    @Temporal(TemporalType.TIMESTAMP)
    private Date oderDate;

    @Enumerated(EnumType.STRING)
    private OrderStatus status;

}


package jpabook.model.entity;

public enum OrderStatus {
    ODER, CANCEL
}

주문 엔티티와 주문 상태

package jpabook.model.entity;

import javax.persistence.*;

@Entity
@Table(name = "ORDER_ITEM")
public class OrderItem {

    @Id
    @GeneratedValue
    @Column(name = "ORDER_ITEM_ID")
    private Long id;

    @Column(name = "ITEM_ID")
    private Long itemId;
    @Column(name = "ORDER_ID")
    private Long orderId;

    private int orderPrice; //주문 가격
    private int count;      //주문 수량
}

package jpabook.model.entity;

import javax.persistence.*;

@Entity
public class Item {

    @Id @GeneratedValue
    @Column(name = "ITEM_ID")
    private Long id;

    private String name;        //이름
    private int price;          //가격
    private int stockQuantity;  //재고수량

}

주문 상품 엔티티와 상품 엔티티

테이블의 외래키를 객체에 그대로 가져온 부분이 문제
-> 객체는 참조해서 연관된 객체를 찾고 테이블은 외래 키를 사용해서 연관된 테이블을 찾으므로 둘 사이에는 큰 차이가 있다.

0개의 댓글