JPA - 도메인 생성

김재민·2022년 4월 12일
0

도메인 모델 생성과 엔티티 생성

도메인 코드

package hello.hellospring.domain;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
@Getter @Setter
public class Member {

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

    @Column(name="name")
    private String name;

    @Embedded
    private Address address;

    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();

}

어노테이션

@Entity : 객체를 도메인 엔티티로 인식하게함
@Column : 객체 필드와 DB 테이블 컬럼을 매핑
-> (name = "") 속성 : 맵핑할 테이블의 컬럼 이름을 지정

Member 테이블

import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
@Getter @Setter
public class Member {

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

    @Column(name="name")
    private String name;

    @Embedded
    private Address address;

    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();
    
}

어노테이션

@Embedded : 밸류 클래스라 칭함, 밸류 클래스란 int, double 처럼 하나의 값을 나타내는 클래스를 말합니다. 보통 주소(address)라는 값을 저장하기 위해서는 아래와 같이 String 변수에 저장하여 관리

@OneToMany() : 회원 1명은 여러개의 주문을 가질 수 있는 1 : N 관계이다. 이것을 JPA상의 어노테이션으로 표현하면 OneToMany()이다.
-> mappedBy속성 : 양방향 관계 설정시 주체가 되는 쪽에서 정의. 보통 상단 fk에 해당하는 컬럼에다 부여(좀 더 주체성이 있는)

package hello.hellospring.domain;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;

@Entity
@Getter @Setter
public class OrderItem {

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

    private Item item;

    @ManyToOne
    @JoinColumn(name = "order_id") //order_id는 Order테이블의 pk임
    private Order order;


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

}

어노테이션

@JoinColumn : DB 관점으로 보았을 때, 본인이 외래 키를 관리하며 상대 Table의 PK(Join할 때)를 명시해주는 역할을 함

@GeneratedValue : pk의 값을 위한 자동 생성 전략을 명시하는데 사용함. 선택적 속성으로 generator와 strategy가 있다. strategy는 persistence provider가 엔티티의 주키를 생성할 때 사용해야 하는 pk생성 전략을 의미한다. default 값은 AUTO
generator는 SequenceGenerator나 TableGenerator 어노테이션에서 명시된 pk 생성자를 재사용할 때 쓰임. default값은 공백문자("")이다.

pk 생성 전략으로 JPA가 지원하는 것

  1. AUTO : (persistence provider) 특정 DB에 맞게 자동 선택
  2. IDENTITY : DB의 identity 컬럼을 이용
  3. SEQUENCE : DB의 시퀀스 컬럼을 이용
  4. TABLE : 유일성이 보장된 데이터베이스 테이블을 이용
package hello.hellospring.domain;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Entity
@Table(name = "orders")
@Getter @Setter
public class Order {

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

    @ManyToOne
    @JoinColumn(name = "member_id")
    private Member member;

    @OneToMany(mappedBy = "order")	// 연관관계의 주인
    private List<OrderItem> orderItems = new ArrayList<>();

    @OneToOne
    @JoinColumn(name= "delivery_id")
    private Delivery delivery;

    private LocalDateTime orderDate;  //주문시간

    @Enumerated(EnumType.STRING)
    private OrderStatus status; // 주문상태 [ORDER, CANCEL]


}

@mappedBy

mappedBy 또한 특정 관계와의 연관관계를 나타낼 때 사용하는데, @ManyToOne과는 달리 연관관계의 주인이 아닌 쪽의 Class내에서 사용

보통 양방향 연관관계에서 사용

이해하는 법) 저는 상대 클래스와 연관된 클래스입니다. 관련은 있는데 저에 대한 외래키는 저 친구가 갖고 있어요.
그러므로 저는 연관관계의 주인이 아니랍니다. mappedBy붙은 저 친구가 연관관계 주인이에요

@Enumerated

자바의 enum 타입을 매핑할 때 사용

예시

enum RoleType {
	ADMIN, USER
}
@Enumberated(EnumType.STRING)
private RoleType roleType;

EnumType.ORDINAL

enum에 정의된 순서대로, ADMIN은 0, USER는 1 값이 DB에 저장됨

장점 : 데이터의 크기가 작음
단점 : 이미 저장된 enum의 순서를 변경할 수 없음

EnumType.STRING

enum 이름 그대로 ADMIN은 'ADMIN'으로 저장됨

장점 : 저장된 enum의 순서가 바뀌거나, enum이 추가되어도 안전함
단점 : DB에 저장되는 데이터 크기가 ORDINAL에 비해서 큼

EnumType.ORDINAL은 순서가 바뀌면 인식할 시 문제가 생길 수 있으므로 실질적으로 EnumType.STRING을 사용하는 것을 권장

profile
어제의 나보다 나은 오늘의 내가 되자!🧗‍♂️

0개의 댓글

관련 채용 정보