인프런 워밍업 클럽 0기 - 백엔드 코스 (과제 4)
문제 1. 새로운 과일 정보 생성 APImethod: POSTpath: /api/v1/fruitbody{ "name": "사과", "warehousingDate": "2024-02-21", "price": 1000 } 해결 방법Request Body DTO 생성public class FruitCreateRequest { private String name; private LocalDate warehousingDate; private Long price; public String getName() { return name; } public LocalDate getWarehousingDate() { return warehousingDate; } public long getPrice() { return price; } }Fruit 객체 생성public class Fruit { private Long id; private String name; private LocalDate warehousingDate; private long price; private boolean isSold; private static Long idCount = 1L; public Fruit(FruitCreateRequest request) { this.id = idCount++; this.name = request.getName(); this.warehousingDate = request.getWarehousingDate(); this.price = request.getPrice(); this.isSold = false; } public void sellFruit(Long id){ isSold=true; } public Long getId() { return id; } public String getName() { return name; } public LocalDate getWarehousingDate() { return warehousingDate; } public long getPrice() { return price; } public boolean isSold() { return isSold; } }request body를 통해 얻어온 정보를 저장할 수 있도록 했습니다.isSold 맴버 변수로 해당 상품이 팔렸는지 알 수 있도록 했습니다. API 구성 @PostMapping("/api/v1/fruit") public void createFruit(@RequestBody FruitCreateRequest request){ fruits.add(new Fruit(request)); }fruitsCreateRequest를 통해 얻어온 과일정보를 통해 새로운 과일을 생성합니다.fruits에 새롭게 생성된 과일을 넣어줍니다. 문제 2. 과일 팔기method: PUTpath: /api/v1/fruitbody{ "id": 1 } 해결 방법API 구성 @PutMapping("/api/v1/fruit") public void sellFruit(@RequestBody Map<String, Long> request){ fruits.stream().forEach(fruit -> { if(request.get("id")==fruit.getId()){ fruit.sellFruit(); } }); }fruits 리스트를 stream().forEach()를 통해 해당 id의 과일에 팔렸다는 표시를 해줍니다. 문제 3. 과일의 팔린 가격과 아직 팔리지 않은 가격 조회method: GETpath: /api/v1/fruit/statparam: ?name={String} 해결 방법response로 보낼 DTO FruitStatResponse 생성public class FruitStatResponse { private long salesAmount; private long notSalesAmount; public FruitStatResponse(List<Fruit> filteredFruits) { this.salesAmount = 0; this.notSalesAmount = 0; filteredFruits.stream().forEach((fruit -> { if(fruit.isSold()){ salesAmount+=fruit.getPrice(); } else { notSalesAmount+=fruit.getPrice(); } })); } public long getSalesAmount() { return salesAmount; } public long getNotSalesAmount() { return notSalesAmount; } }생성자의 매개변수를 해당 과일 명의 과일만 담긴 리스트를 가져옵니다.해당 과일 중 팔린 것과 팔리지 않은 것의 가격의 총합을 구해줍니다.API 구성 @GetMapping("/api/v1/fruit/stat") public FruitStatResponse getFruitStat(@RequestParam String name){ List<Fruit> filteredFruits = fruits.stream().filter(fruit -> fruit.getName().equals(name)).collect(Collectors.toList()); return new FruitStatResponse(filteredFruits); }stream().filter()를 통해 해당 과일 이름의 과일 리스트를 추려냅니다.FruitStatResponse의 생성자에 필터링된 과일 리스트를 넘겨 가격 총합을 반환합니다.