나만의 프로젝트 배포하기 5일차

박세건·2023년 9월 13일
0

개인 프로젝트

목록 보기
5/15
post-thumbnail

내가 만들고자 하는 프로젝트에는 운동기구와 운동장비를 사고 팔 수 있는 쇼핑 기능이 들어있기때문에 본격적으로 쇼핑 기능에 대해서 설계해보자

먼저 Entity부터 구성해보자

쇼핑몰 기능을 위한 Entity 설정

Entity의 종류에는

  • 상품(item)
  • 주문(item)
  • 주문에 어떤 상품이있는지 알려주기위한 상품(orderItem)
  • 장바구니(cart)
  • 장바구니에 어떤 상품이 있는지 알려주기위한 상품(cartItem)

진행중 느낀점

처음에는 굳이 orderItem과 cartItem이 따로 분리할 필요없이 Order에 모든 정보를 넣었었다.
그렇게 진행하던 도중에 Order 엔티티란 어떤한 주문을 의미하고 누가 주문했고 어떤 상품을 주문했는지에 대한 정보가 들어있어야된다고 생각했고 아이템을 넣어주고 아이템이 있다면 몇개를 샀는지 또한 중요한 정보이기때문에 count라는 필드를 추가하려고했지만, count필드를 넣어주기에는 다른 물건들 또한 여러개를 살 수 있기때문에 Order라는 Entity에 count 필드는 알맞지 않아보였다. 그렇다면 Item Entity에 count 필드를 넣어주기에는 상품이라는 Entity의 역할과 맞지 않는 필드인거 같아서 따로 Entity를 하나 더 만들어주는 것이 유지보수에도 좋고 관리하기에도 좋을 거같아서 분리시켰다.
너무 많은 역할을 한곳에 집중하게 되는 것은 좋지 않다고 생각하게되었다.

또한,
연관관계를 설정할때도 양방향으로 진행할지 단방향으로 진행할지가 고민이였는데
알아보니 양방향연관관계를 사용할때는 편리하지만 그 연결이 매우 복잡해서
기본적으로 단방향으로 연관관계를 설정하고 양방향 탐색이 필요하다고 느낀다면 그때 양방향으로 수정하는 것을 추천한다고한다.

  • 코드 부분

Cart

package com.qkrtprjs.happyexercise.entitiy.cart;

import com.qkrtprjs.happyexercise.entitiy.BaseTimeEntity;
import com.qkrtprjs.happyexercise.entitiy.member.Member;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Getter
@NoArgsConstructor
@Entity
public class Cart extends BaseTimeEntity {
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "memberId")
    private Member member;
}

CartItem

package com.qkrtprjs.happyexercise.entitiy.cart;

import com.qkrtprjs.happyexercise.entitiy.BaseTimeEntity;
import com.qkrtprjs.happyexercise.entitiy.item.Item;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Getter
@NoArgsConstructor
@Entity
public class CartItem extends BaseTimeEntity {
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    private Long id;

    private int count;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "cartId")
    private Cart cart;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "itemId")
    private Item item;
}

Item

package com.qkrtprjs.happyexercise.entitiy.item;

import com.qkrtprjs.happyexercise.entitiy.BaseTimeEntity;
import com.qkrtprjs.happyexercise.entitiy.member.Member;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Getter
@NoArgsConstructor
@Entity
public class Item extends BaseTimeEntity {
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    private Long id;

    private String detail;

    private String name;

    private int price;

    private int stock;   //재고

    private String status;

    private String img;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "memberId")
    private Member member;
}

Order

package com.qkrtprjs.happyexercise.entitiy.order;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.qkrtprjs.happyexercise.entitiy.BaseTimeEntity;
import com.qkrtprjs.happyexercise.entitiy.item.Item;
import com.qkrtprjs.happyexercise.entitiy.member.Member;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;
import java.time.LocalDateTime;

@Getter

@NoArgsConstructor
@Entity
@Table(name = "orders")
public class Order extends BaseTimeEntity {
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    private Long id;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime date;

    private String status;

    private int price;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "memberId")
    private Member member;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "itemId")
    private Item item;
}

OrderItem

package com.qkrtprjs.happyexercise.entitiy.order;

import com.qkrtprjs.happyexercise.entitiy.BaseTimeEntity;
import com.qkrtprjs.happyexercise.entitiy.item.Item;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Getter
@NoArgsConstructor
@Entity
public class OrderItem extends BaseTimeEntity {
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    private Long id;

    private int count;

    private int price;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "orderId")
    private Order order;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "itemId")
    private Item item;
}

ERD(객체-관계 모델)을 살펴보면
(테이블간의 관계를 설명해주는 다이어그램)


이런식의 구조를 갖게된다!

다음에는 본격적으로 기능 API에 대해 구현해보자!

profile
멋있는 사람 - 일단 하자

0개의 댓글