요구사항
회원은 상품 주문 가능
주문 시 여러 종류 상품 선택 가능.
프론트엔드
체크하고 개수 입력 후
주문버튼 누르면 post 방식으로 전송
백엔드는 이런 느낌이려나..?
1 : N, N : N 이런 관계를 중요시 보는 듯.
한 회원은 여러번 주문 가능 (1 : N)
한 주문에 여러 상품 선택 가능 (1 : N)
한 상품은 여러 번 주문될 수 있음(N : 1)
테이블 설계
Member는 그냥 member고,
orders는 주문이 있다는 어떤 식별자 같은 거 겠고, 주문의 상태 등도 나타낼 수 있는.
여러 order_item이 하나의 orders를 가리킬 수 있고,
order_item과 item이 1:1 관계가 아닌 게 조금 의아했다.
그냥 order_item에서 count로 숫자로 나타내면 되는 거 아닌가?
이렇게 보는 게 아닌가?
일단 도메인 코드
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="MEMBER_ID")
private Long id;
private String name;
private String city;
private String street;
private String zipcode;
}
전략 Auto니 알아서 될 것이다.
Column이름을 테이블의 열 이름과 맞춰주고
@Entity
@Table(name="ORDERS")
public class Order {
@Id
@GeneratedValue
@Column(name="ORDER_ID")
private Long id;
@Column(name="MEMBER_ID")
private Long memberId;
private LocalDateTime orderDate;
@Enumerated(EnumType.STRING)
private OrderStatus status;
}
order가 SQL문 중에 order by 이런 게 있어서 되는 DB도 있고 안되는 DB도 있기에, 보통 order라는 테이블 이름을 쓰고 싶은 경우 orders라고 하는 게 관례인가 보다.
그래서 테이블 이름이랑 맞춰 주고,
컬럼도 테이블명을 명시해 줘서 JPA가 저걸로 SQL문을 작성하고 받아오게끔 하고.
Enum은 @Enumerated 해서 명시해 준다.
EnumType은 STRING으로. 기본값이 ORDERNAL이라 명시를 해 줘야 함.
public enum OrderStatus {
ORDER, CANCEL
}
@Entity
public class OrderItem {
@Id
@GeneratedValue
@Column(name="ORDER_ITEM_ID")
private Long id;
@Column(name="ITEM_ID")
private Long itemId;
private int orderPrice;
private int count;
}
이것도 뭐 똑같다.
@Entity
public class Item {
@Id
@GeneratedValue
@Column(name="ITEM_ID")
private Long id;
private String name;
private int price;
private int stockQuantity;
}
근데 좀 문제점이 있다.
객체가 객체개념으로 설계되어 있지 않다.
그러니까, 테이블 설계 방식에 맞춘 방식이다.
원래 객체였으면 예를 들어 Order의 Member면 memberId 해서 저렇게 테이블의 Foreign Key 방식처럼 하는 게 아니라 그냥 Order 안에 Member 객체 자체가 있어야 한다.
이렇기 때문에 객체 그래프 탐색이 불가능 하다.
객체입장에서는 사실 참조가 다 끊기는 것 이다.
UML도 사실 끊긴 것이다.
'JPA > JPA 기본' 카테고리의 다른 글
16. 양방향 연관관계와 연관관계의 주인 1 (0) | 2023.10.22 |
---|---|
15. 연관관계 매핑 (0) | 2023.10.22 |
13. 기본 키 매핑 (0) | 2023.10.21 |
12. 필드와 컬럼 매핑 (0) | 2023.10.21 |
11. DB 스키마 자동 생성 (0) | 2023.10.21 |