꾸준히하자아자

카카오 쇼핑하기 클론프로젝트 #2 본문

프로젝트/카카오 쇼핑하기 web

카카오 쇼핑하기 클론프로젝트 #2

성장하고픈개발자 2023. 7. 7. 13:11
728x90
728x90

#1 전체 API 주소 설계

API 주소를 설계하여 README에 내용을 작성하시오.

  URL 요청 방식
전체 상품 목록 조회  /products GET
개별 상품 상세 조회  /products/{id} GET
     
회원가입  /join POST
로그인  /login POST
이메일 중복 체크  /check POST
     
장바구니 조회  /carts GET
장바구니 담기  /carts/add POST
주문하기 (장바구니 수정)  /carts/update POST
     
결제하기 (주문 인서트)  /orders/save POST
주문 결과 확인  /orders/{id} GET

 

#2 Mock API Controller 구현

이 4개의 요청들에 대한 DTO 와 컨트롤러를 구현해야한다.

  • POST /carts/add
  • POST /carts/update
  • POST /orders/save
  • GET /orders/{id}

Order 폴더의 각 DTO들과 Controller 디렉토리 구조

수행한 과제에 대해 Order을 예로 들어서 설명하겠다.

OrderItem 은 Entity인데 아직 DB에 연결하지 않았기 때문에 작성하지 않았다.

 

주어진 API 문서를 보면

Local URL : http://localhost:8080/orders/1GET 요청이 들어오면

Response Body에 이러한 내용이 담기는 것을 확인할 수 있다.

{
    "success": true,
    "response": {
        "id": 1,
        "products": [
            {
                "productName": "기본에 슬라이딩 지퍼백 크리스마스/플라워에디션 에디션 외 주방용품 특가전",
                "items": [
                    {
                        "id": 4,
                        "optionName": "01. 슬라이딩 지퍼백 크리스마스에디션 4종",
                        "quantity": 10,
                        "price": 100000
                    },
                    {
                        "id": 5,
                        "optionName": "02. 슬라이딩 지퍼백 플라워에디션 5종",
                        "quantity": 10,
                        "price": 109000
                    }
                ]
            }
        ],
        "totalPrice": 209000
    },
    "error": null
}

 

DTO가 총 3개가 필요하고 각 DTO들의 코드는 다음과 같다.

OrderRespFindByIdDTO

package com.example.kakaoshop.order.response;


import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

import java.util.List;

@Getter @Setter
public class OrderRespFindByIdDTO {

    private int id;
    private List<ProductDTO> products;
    private int totalPrice;

    @Builder
    public OrderRespFindByIdDTO(int id, List<ProductDTO> products, int totalPrice){
        this.id= id;
        this.products= products;
        this.totalPrice= totalPrice;
    }

}

ProductDTO

package com.example.kakaoshop.order.response;


import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

import java.util.List;

@Getter @Setter
public class ProductDTO {

    private String productName;
    private List<OrderItemDTO> items;

    @Builder
    public ProductDTO(String productName, List<OrderItemDTO> items){
        this.productName=productName;
        this.items=items;
    }
}

OrderItemDTO

package com.example.kakaoshop.order.response;


import com.example.kakaoshop.cart.response.ProductDTO;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

import java.util.List;

@Getter @Setter
public class OrderItemDTO {

    private int id;
    private String optionName;
    private int quantity;
    private int price;

    @Builder
    public OrderItemDTO(int id, String optionName, int quantity, int price){
        this.id=id;
        this.optionName=optionName;
        this.price=price;
        this.quantity=quantity;
    }

}

대응되는 Mock API Controller 코드는 다음과 같다.

package com.example.kakaoshop.order;

import com.example.kakaoshop._core.utils.ApiUtils;
import com.example.kakaoshop.order.response.OrderItemDTO;
import com.example.kakaoshop.order.response.OrderRespFindByIdDTO;
import com.example.kakaoshop.order.response.ProductDTO;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
public class OrderRestController {

    @GetMapping("/orders/{id}")
    public ResponseEntity<?> findById(@PathVariable int id){


        if(id == 1){
            List<OrderItemDTO> orderItemDTOList = new ArrayList<>();

            OrderItemDTO orderItemDTO1 = OrderItemDTO.builder()
                    .id(4)
                    .optionName("01. 슬라이딩 지퍼백 크리스마스에디션 4종")
                    .quantity(10)
                    .price(100000)
                    .build();

            orderItemDTOList.add(orderItemDTO1);

            OrderItemDTO orderItemDTO2 = OrderItemDTO.builder()
                    .id(5)
                    .optionName("02. 슬라이딩 지퍼백 플라워에디션 5종")
                    .quantity(10)
                    .price(109000)
                    .build();

            orderItemDTOList.add(orderItemDTO2);

            List<ProductDTO> productDTOList = new ArrayList<>();

            productDTOList.add(
                    ProductDTO.builder()
                            .productName("기본에 슬라이딩 지퍼백 크리스마스/플라워에디션 에디션 외 주방용품 특가전")
                            .items(orderItemDTOList)
                            .build()
            );

            OrderRespFindByIdDTO responseDTO = new OrderRespFindByIdDTO(id, productDTOList, 209000);
            return ResponseEntity.ok(ApiUtils.success(responseDTO));
        }

        else{
            return ResponseEntity.badRequest().body(ApiUtils.error("해당 주문을 찾을 수 없습니다 : "+id, HttpStatus.BAD_REQUEST));
        }

    }

    @PostMapping("/orders/save")
    public ResponseEntity<?> save(){

        List<OrderItemDTO> orderItemDTOList = new ArrayList<>();

        OrderItemDTO orderItemDTO1 = OrderItemDTO.builder()
                .id(4)
                .optionName("01. 슬라이딩 지퍼백 크리스마스에디션 4종")
                .quantity(10)
                .price(100000)
                .build();

        orderItemDTOList.add(orderItemDTO1);

        OrderItemDTO orderItemDTO2 = OrderItemDTO.builder()
                .id(5)
                .optionName("02. 슬라이딩 지퍼백 플라워에디션 5종")
                .quantity(10)
                .price(109000)
                .build();

        orderItemDTOList.add(orderItemDTO2);

        List<ProductDTO> productDTOList = new ArrayList<>();

        productDTOList.add(
                ProductDTO.builder()
                        .productName("기본에 슬라이딩 지퍼백 크리스마스/플라워에디션 에디션 외 주방용품 특가전")
                        .items(orderItemDTOList)
                        .build()
        );

        OrderRespFindByIdDTO responseDTO = new OrderRespFindByIdDTO(2, productDTOList, 209000);

        return ResponseEntity.ok(ApiUtils.success(responseDTO));
    }

}

나중에 DTO 설계에 대해 디테일하게 공부를 해볼 예정

728x90
728x90