| 회원 기능 | 상품 기능 | 주문 기능 |
|---|---|---|
| 회원 등록 | 상품 등록 | 상품 주문 |
| 회원 조회 | 상품 수정 | 주문내역 조회 |
| 상품 조회 | 주문 취소 |

1:NM:N💡 M:N → Bridge 두고 1:N, M:1 로 설정


객체 설계를 테이블 설계에 맞춘 방식은 테이블의 외래키를 객체에 그대로 가져온다. 그러면 객체 그래프 탐색이 불가능하고, 참조가 없으므로 UML 도 잘못된다.
가령, memberId 로 설정을 해두면, 또 그거 기반으로 em.find(memberId) 해서 member 를 정의해야 하는 상황이 발생하는데, 이걸 과연 OOP 를 준수한다고 할 수 있는가? 차라리 필드를 Member member 로 설정하는게 객체 그래프 탐색할 수 있는 구조 아닌가?

1️⃣. Member Entity
@Entity
@Getter @Setter
@Table(name="member")
public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="member_id")
private Long id;
private String name;
private String city;
private String street;
private String zipcode;
@OneToMany(mappedBy="member")
private List<Order> orders = new ArrayList<>();
// for Bidirectional Association Mapping
public void addOrder(Order order){
order.setMember(this);
this.orders.add(order);
}
}
2️⃣. Order Entity
@Entity
@Getter @Setter
@Table(name="order")
public class Order {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="order_id")
private Long id;
@ManyToOne
@JoinColumn(name="member_id") // FK
private Member member;
@OneToMany(mappedBy="order") // orderItem 대상으론 Order가 Master
private List<OrderItem> orderItems = new ArrayList<>();
private LocalDate orderDate;
@Enumerated(EnumType.STRING)
private OrderStatus status;
public enum OrderStatus {
NONE, PENDING, COMPLETE
}
// for Bidirectional Association Mapping
public void addOrderItems(OrderItem orderItem){
orderItem.setOrder(this);
this.orderItems.add(orderItem);
}
}
3️⃣. OrderItem Entity
@Entity
@Getter @Setter
@Table(name="order_item")
public class OrderItem {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="order_item_id")
private Long id;
@ManyToOne
@JoinColumn(name="order_id")
private Order order;
@ManyToOne
@JoinColumn(name="item_id")
private Item item;
private Integer orderPrice;
private Integer count;
}
4️⃣. Item