Requirements

Functionalities

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

Demo

image.png

Modeling

Analysis Domain Model

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

Table Modeling

image.png

Reference

Java ORM Std: Entity Relationship Mapping

Entity Modeling (Data 중심)

image.png

⚠️ Issue : 데이터 중심 설계

객체 설계를 테이블 설계에 맞춘 방식은 테이블의 외래키를 객체에 그대로 가져온다. 그러면 객체 그래프 탐색이 불가능하고, 참조가 없으므로 UML 도 잘못된다.

가령, memberId 로 설정을 해두면, 또 그거 기반으로 em.find(memberId) 해서 member 를 정의해야 하는 상황이 발생하는데, 이걸 과연 OOP 를 준수한다고 할 수 있는가? 차라리 필드를 Member member 로 설정하는게 객체 그래프 탐색할 수 있는 구조 아닌가?

Entity Modeling (Object 중심)

image.png

Development

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