Spring Projcect/[갠플] Online-mall

[8일차] Order 엔티티 매핑

계란💕 2022. 10. 3. 01:19

 

1. 주문 ORDERS

  • Orders - Member : 다대일 관계
    • 데이터베이스의 키워드로 order가 있으니까 구분하기 위해 orders를 넣는다 
    • order 테이블에 여러 개의 order가 모두 보여야한다.
    • 컬렉션이라서 중간 테이블이 생성된다.
@OneToMany
private List<Order> orderList = new ArrayList<>();

 

@ManyToOne(cascade = CascadeType.ALL)    // order, member 중에서 order를 연관관계의 주인으로 만들려면?
private Member member;

 

  • OrderDetail -  Product : 일대다 관계 
    • 컬렉션이라서 중간 테이블이 생성된다.
    • Datail 테이블에서는 상품 정보가 필요하지만 상품 테이블에서는 주문 상세 정보가 필요없다.
@ManyToOne      // Product 테이블에는 orderDetail 필드가 필요없다.(?)
private Product product;    // 상품명

 

 

  Ex) 주문 test

  • Test
<hide/>
Product product1 = productRepository.findById(1L).get();
Product product2 = productRepository.findById(2L).get();
List<OrderDetail> orderDetailList = new ArrayList<>();

OrderDetail orderDetail1 =  OrderDetail.builder()
    .product(product1)
    .quantity(13)
    .recipientName("우영우")
    .recipientPhone("0109993333")
    .recipientAddr("서울시")
    .recipientAddrDetail("마포구")
    .recipientZipcode("2090-333")
    .build();

OrderDetail orderDetail2 =  OrderDetail.builder()
    .product(product2)
    .quantity(50)
    .recipientName("김고은")
    .recipientPhone("0101029382")
    .recipientAddr("경기도")
    .recipientAddrDetail("안양시")
    .recipientZipcode("209-333")
    .build();

orderDetailList.add(orderDetail1);
orderDetailList.add(orderDetail2);

Order order  = Order.builder()
    .member(member)
    .orderDate(LocalDateTime.now())
    .orderDetailList(orderDetailList)
    .build();

orderDetailRepository.save(orderDetail1);
orderDetailRepository.save(orderDetail2);
orderRepository.save(order);
memberRepository.save(member);

 

  Note) 실행 결과

 

  • Member
    • 멤버 안에는 List<Order> orderList 가 멤버로 있다 .
    • 컬렉션 형태이기 때문에 멤버 테이블에는 null이고 중간테이블인 "member_order_list"라는 테이블이 새로 생성된다. 

MEMBER
MEMBER&nbsp;테이블의 order_id는 비어있다. (컬렉션이기 떄문이다.)

 

  • Order
    •  57번 회원이 7번 주문

 

  • OrdersOrderDetailList
    • 7번 Order에 1번 OrderDetail, 2번 OrderDetail이 있다. 두 개의 상품을 주문
    •  Order 엔티티에 List<OrderDatail> 컬렉션을 넣었다.
    • 따라서, 중간 테이블인 Orders_ordere_detail_list 이라는 새로운 테이블이 생성된다.

  • OrderDetail
    • 위에  있는 7번 주문의 디테일 1번, 2번에 대한 상품의 주문 정보와 상품 번호를 조회 가능하다.

 

  • MemberOrderList
    • 아무 데이터도 들어가지 않는다.

 

 

현재 ERD

 

 

 

  오류)

<hide/>
Hibernate: select member0_.id as id1_3_, member0_.addr as addr2_3_, member0_.addr_detail as addr_det3_3_, member0_.admin_yn as admin_yn4_3_, member0_.cart_id as cart_id20_3_, member0_.email_auth_dt as email_au5_3_, member0_.email_auth_key as email_au6_3_, member0_.email_auth_yn as email_au7_3_, member0_.last_login_time as last_log8_3_, member0_.password as password9_3_, member0_.phone as phone10_3_, member0_.point as point11_3_, member0_.reg_dt as reg_dt12_3_, member0_.reset_password_key as reset_p13_3_, member0_.reset_password_limit_dt as reset_p14_3_, member0_.user_grade as user_gr15_3_, member0_.user_id as user_id16_3_, member0_.user_name as user_na17_3_, member0_.user_status as user_st18_3_, member0_.zipcode as zipcode19_3_ from member member0_ where member0_.user_id=?
Authentication failed; nested exception is javax.mail.AuthenticationFailedException: 535-5.7.8 Username and Password not accepted. Learn more at
535 5.7.8  https://support.google.com/mail/?p=BadCredentials h13-20020a17090a470d00b0020a1f091a0asm4229206pjg.55 - gsmtp
  • 오류: AuthenticationFailedException
  • 원인: yml 파일에 이메일 주소를 잘못 적어서 생긴 오류, 그리고 yml 파일은 들여쓰기도 조심해야한다.

 

 

 

 

점검사항

  • 수령인 상세 정보는 상세 정보가 아닌 주문 정보에 넣는다.
  • 주문 테이블의  PK는 order_id 보다 id로 하는게 나을 것 같다.
  • 주문에 결제 관련 정보, 쿠폰 정보를 넣어야한다.
  • 지금까지 양방향으로 매핑했는데 단방향 매핑도 고려해봐야겠다.