Spring MVC(Spring Data JPA 실습)

Rina's·2023년 6월 21일

코드스테이츠

목록 보기
50/96

OrderCoffee 클래스 구현 실습

🦆Order와 Coffee의 연관 관계 매핑 구현

오더와 커피의 연관관계는 N:N이다
오더한 커피에 대한 정보를 가진 OrderCoffee 엔티티 클래스를 추가로 만들어 N:1를 통한 연관관계 매핑을 구현하자,
Order객체를 통해 OrderCoffee정보를 조회할 수 있어야 한다


엔티티 클래스를 만들기 위해 기본적으로 @Entity@Id를 설정하고 매핑을 위해 @Getter와 @Setter를 설정한다
Id는 오더커피 추가 시 마다 순서가 자동 등록되도록 IDENTITY타입을 설정한다
연관관계를 가질 클래스 Order와 Coffee 객체를 @ManyToOne 으로 N:1 단방향 연결 시키고 직접적으로 연결되는 컬럼을 @JoinComlumn으로 각각 "ORDERS_ID"와 "COFFEE_ID"로 설정한다


주문을 통해 주문한 커피 정보를 확인해야 하니 양방향으로 추가 연결을 시켜준다
@OneToMany를 설정하고 mappedBy를 연결된 외래키 변수명인 order로 등록한다.
OrderCoffee는 Order 객체가 생성될 때 마다 필수적으로 가지고 있어야할 필드값이 됨으로 cascade를 PERSIST로 설정 해 준다
mappedBy 값이 아닌 어노테이션이 붙은 객체에 적용되는 설정임을 햇갈리지 말자
커피 정보를 통해 주문한 커피 정보를 호출할 필요는 없어 Coffee쪽에는 양방향 연결을 추가로 하진 않았다

🦆Member와 Stamp의 연관 관계 매핑 구현

회원이 주문하는 커피 한잔 당 찍히는 도장(quantity마다 stampCount증가)을 구현하기 위해 스템프 엔티티를 만든다

동일하게 @Entity@Id를 설정하고 매핑을 위해 @Getter와 @Setter를 설정한다.
이번에는 Member 클래스 쪽에 @OneToOne을 연결할 대상 클래스를 설정하고
@JoinComlumn로 구체적인 연결 필드를 설정했다

이후 양방향 연결을 위해 Stamp쪽에 @OneToOne(mappedBy = 연결된 외래키 변수명)를 설정하였다

간단히 할꺼면 Member 필드값으로 stampCount 를 설정하는게 좀더 직관적이고 좋지 않았나 하지만 조건기 Stamp라는 클래스를 따로 만드는 것이였고
그렇게 관리할꺼면 repository도 따로 만들어 관리하는게 좋을 것 같아 Stamp repository를 만들었다

🦆주문 요청 기능 구현

요청 값으로 MemberId와 CoffeeId, quantity를 받아 OrderCoffee객체를 가진 Order를 생성한다
대충 요약하자면 메서드 흐름은 아래와 같다

컨트롤러 postOrder()
mapper.orderPostDtoToOrder()

  • Order
    OrderCoffees, OrderStatus, Member

mapper.orderCoffeesDtoToOrderCoffees()

  • orderCoffees
    Quantity, CoffeeId, Coffee

createOrder() ->

서비스 createOrder()
memberService.findVerifiedMember() -> order.setMember()
coffeeService.findVerifiedCoffee() -> orderCoffee.setCoffee()
order.setOrderCoffees()

findOrCreateStamp()
addStampCount()
orderRepository.save() 레포지토리

컨트롤러 postOrder()
UriCreator.createUri(getOrderId)
ResponseEntity.created(location).build()

🦆주문 조회기능 구현

OrderId를 통해 주문을 내역을 호출하여 세부 내역을 확인하자
주문 내역은 data 명칭되어 있으며
orderId, memberId, orderStatus, orderCoffees, createdAt를 포함하며
orderCoffees는 coffeeId, quantity, korName, engName, price을 포함한다
마지막으로 전체 주문내역 호출시 페이지네이션을 추가로 구현한다

컨트롤러 getOrder
orderService.findOrder() ->

서비스 findOrder
findVerifiedOrder()
orderRepository.findById() 레포지토리

컨트롤러 getOrder
mapper.orderToOrderResponseDto()

  • orderResponseDto
    orderId, memberId, orderStatus, orderCoffees, createdAt

mapper.orderCoffeesToOrderCoffeeResponseDto()

  • OrderCoffeeResponseDto
    coffeeId, quantity, korName, engName, price

SingleResponseDto()/MultiResponseDto() - pageInfo을 포함한다
ResponseEntity()

OrderController

OrderService

🦜요청 결과

커피 등록 post요청 : 201 ok

맴버 등록 post요청 : 201 ok

주문 등록 post요청 : 201 ok

주문 ID를 통한 get요청 : 200 ok

전체 주문 get요청 : 200 ok

🦜H2 DB확인

오더와 멤버 테이블이 잘 연결 되었다 오더커피와 오더, 커피 테이블이 잘 연결 되었다 멤버와 스템프 테이블이 잘 연결 되었다. 첫번째 맴버는 오더 요청을 한 적이 없어 STAMP_ID가 Null인 상태다 mappedby되는 쪽 테이블은 연결테이블이 안나오는 모양이다

STAMP_ID에 Null값이 없는편이 좋을것 같다.
1:1 연결의 종속의 방향을 바꾼 후 cascade = PERSIST 값을 줘야 겠다

수정 결과

개인적으로 연결관계 매핑보단 Stream을 통한 직렬화 역직렬화 Dto매핑 작업이 더 까다롭게 느껴졌다
객체를 생성하는 것과 상관 없이 @GeneratedValue가 적용된 ID값 생성은 
DB저장 시점이란걸 기억해야겠다



profile
갭린이 리나

0개의 댓글