일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- PS
- C++
- 그리디
- 딥러닝
- 백준
- REST API
- 알고리즘
- 신경망기초
- Spring Data JPA
- withmockuser
- testing
- web
- 스택
- 로지스틱회귀
- Backend
- 에라토스테네스의체
- RequestBody
- DP
- 코딩
- python3
- FNN
- BOJ
- Spring
- WebMvcTest
- SpringBoot
- 책리뷰
- 쉬운딥러닝
- Andrew Ng
- responsebody
- 정렬
Archives
- Today
- Total
꾸준히하자아자
카카오 쇼핑하기 클론프로젝트 #2 본문
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을 예로 들어서 설명하겠다.
OrderItem 은 Entity인데 아직 DB에 연결하지 않았기 때문에 작성하지 않았다.
주어진 API 문서를 보면
Local URL : http://localhost:8080/orders/1 로 GET 요청이 들어오면
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
'프로젝트 > 카카오 쇼핑하기 web' 카테고리의 다른 글
카카오 쇼핑하기 클론프로젝트 #4 (0) | 2023.08.22 |
---|---|
카카오 쇼핑하기 클론프로젝트 #3 (0) | 2023.08.09 |
카카오 쇼핑하기 클론프로젝트 #1 (0) | 2023.07.02 |