인프런 워밍업 클럽 0기 - 백엔드 코스 (과제 4)

문제 1. 새로운 과일 정보 생성 API

  • method: POST

  • path: /api/v1/fruit

  • body

{
    "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: PUT

  • path: /api/v1/fruit

  • body

{
    "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: GET

  • path: /api/v1/fruit/stat

  • param: ?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의 생성자에 필터링된 과일 리스트를 넘겨 가격 총합을 반환합니다.

댓글을 작성해보세요.