스프링 부트와 JPA 활용1 - 도메인 분석 설계 3 (1)

JOY·2022년 3월 15일
0
post-thumbnail

📌 스프링 부트와 JPA 활용1 - 도메인 분석 설계 3 (1)

인프런 - 스프링 부트와 JPA 활용1 by 김영한 을 기반으로 작성된 글입니다.
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발


도메인 분석 설계 목차

1. 요구사항 분석

2. 도메인 모델과 테이블 설계

3. 엔티티 클래스 개발1

4. 엔티티 클래스 개발2

5. 엔티티 설계시 주의점


도메인 분석 설계

3. 엔티티 클래스 개발2 (1)

1) 상품 엔티티 (Item.java)

💻 코드 (이전 게시물 코드에 이어서 추가)

package jpabook.jpashop.domain.item;

(생략) 

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="dtype")
@Getter @Setter
public abstract class Item {

	/*(생략)*/
    
	@ManyToMany(mappedBy = "items")
    private List<Category> categories = new ArrayList<>();
}

2) 카테고리 엔티티 (Category.java)

💻 코드

package jpabook.jpashop.domain;

import jpabook.jpashop.domain.item.Item;
import lombok.Getter;
import lombok.Setter;

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

@Entity
@Getter @Setter
public class Category {
    @Id @GeneratedValue
    @Column(name="category_id")
    private Long id;

    private String name;

    @ManyToMany
    /*설명*/
    @JoinTable(name="category_item",
            joinColumns = @JoinColumn(name="category_id"),
            inverseJoinColumns = @JoinColumn(name="item_id") )
    private List<Item> items = new ArrayList<>();


//  같은 엔티티 내에서 parent와 child 양방향 연관관계 설정
    @ManyToOne
    @JoinColumn(name="parent_id")
    private Category parent;

    @OneToMany(mappedBy = "parent")
    private List<Category> child = new ArrayList<>();

}

👉 설명

다대다 연관관계(N:N)

@ManyToMany

  • 객체는 컬렉션을 통해 다대다 관계 가능

  • 관계형DB 에서 정규화된 테이블 2개로는 다대다 관계 불가능
    💡 Join 테이블을 통해 일대다, 다대일 관계로 풀어내야 가능

  1. 다대다 단방향 - @ManyToMany, @JoinTable
    @JoinTable : 연관관계 주인 테이블에서 연결 테이블 지정
    joinColumns : 현재 컬럼과 매핑할 조인 컬럼 지정
    inverseJoinColumns : 반대쪽 컬럼과 매핑할 조인 컬럼 지정

  2. 다대다 양방향 - @ManyToMany, mappedBy
    mappedBy : 연관관계 주인이 아니면 속성 값으로 연관관계 주인 지정
    (주인은 mappedBy 속성 사용 ❌)

실무에서는 많은 정보를 다루기 때문에 중간 테이블에 다른 정보를 넣을 수 없어서 사용 ❌


실행 1 👉 에러 ❗
JpashopApplication 실행 했음에도 테이블 생성이 되지않음..

[jpabook.jpashop.domain.Delivery.status] was annotated as enumerated, but its java type is not an enum [jpabook.jpashop.domain.DeliveryStatus]

DeliveryStatus.java

public class DeliveryStatus {
//READY(배송 준비), COMP(배송)
}

DeliveryStatus를 enum으로 생성했어야 하는데 Java로 만들었다. 수정하자.

💡 해결

public enum DeliveryStatus {
//READY(배송 준비), COMP(배송)
}

코드 수정


실행 2 👉 성공

위와 같은 각 테이블을 생성해주는 sql문이 뜨면서

h2 데이터베이스에 테이블이 제대로 생성된 것을 확인!!
profile
Just Do IT ------- 🏃‍♀️

0개의 댓글