JPA/JPA 기본

14. 예제

sdafdq 2023. 10. 22. 16:09

요구사항

회원은 상품 주문 가능

주문 시 여러 종류 상품 선택 가능.

 

프론트엔드

체크하고 개수 입력 후

 

주문버튼 누르면 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