[4일차] 인프런 워밍업 스터디 클럽 0기- BE

오늘도 API 문제였습니다. 저는 사실 API 문제가 재미있습니다 :)

문제 1 localhost:8080/api/v2/fruit을 POST 방식으로 요청하면 200이 나오게 하라

아래와 같이 보내면 "정상 처리 되었습니다."가 나오도록 만들었습니다.

{
    "name":"사과",
    "warehousingDate":"2024-02-01",
    "price":4000
}

코드는 아래와 같고 저는 메모리에 저장하였습니다~

@RequestMapping("/api/v1")
@RestController
public class FruitController {

    private List<Fruit> fruits = new ArrayList<>();
    private long makeId= 0L;

    @PostMapping("/fruit")
    public ResponseEntity<String> fruitCreate(@RequestBody FruitRequest request) {
        fruits.add(new Fruit(makeId++, request.getName(), request.getWarehousingDate(), request.getPrice(), false));
        return ResponseEntity.ok("정상 처리 되었습니다.");
    }

메모리에 저장하는 과정에서 저는 Fruit을 아래와 같이 설정하였습니다.

왜냐하면 판매 프라이머리키 값과 판매여부도 필요했기 때문입니다. 판매 여부는 간단하게 saleYn으로 하였습니다.

그리고 id값은 제가 만든 서비스가 대박이 나서 int가 커버할 수 있는 범위를 넘어 섰을 경우를 대비해서 long으로 잡았습니다 :)


@Getter
public class Fruit {
    private final long id;
    private final String name;
    private final LocalDate warehousingDate;
    private final long price;
    private final Boolean saleYn;

    public Fruit(long id, String name, LocalDate warehousingDate, long price, Boolean saleYn) {
        this.id = id;
        this.name = name;
        this.warehousingDate = warehousingDate;
        this.price = price;
        this.saleYn = saleYn;
    }
}

이제 데이터가 잘 들어 갔는지 확인을 하기 위해 API를 하나 더 만들었습니다. 저는 실제 DB를 아직 사용하지 않았기 때문에 API로 확인하기로 하였습니다. 코드는 아주 간단합니다.

@GetMapping("/fruits")
public List<Fruit> fruits() {
    return fruits;
}

GET 방식으로 localhost:8080/api/v1/fruits 호출하면 아래와 같이 출력 됩니다. 잘 들어 갔습니다 🙂

[
    {
        "id": 0,
        "name": "사과",
        "warehousingDate": "2024-02-01",
        "price": 4000,
        "saleYn": false
    },
    {
        "id": 1,
        "name": "귤",
        "warehousingDate": "2024-02-02",
        "price": 2000,
        "saleYn": false
    }
]

 

그럼 2번 문제로 넘어 가겠습니다.

PUT 으로 localhost:8080/api/v1/fruit 아래 body를 보내면 팔린 정보를 기록하기로 하였습니다. 여기서 saleYn을 사용합니다.

{
    "id":1
}

코드는 아래와 같습니다.

이번 코드는 좀 복잡합니다. PUT으로 넘겨준 아이디와 현재 가지고 있는 아이디가 같으면 현재의 정보를 temp데이터로 담았다가 List를 지우고 다시 같은 값으로 담도록 처리하였습니다. 이 부분을 좀 더 깔끔하게 처리 하고 싶은데 더 이상 생각이 나지 않습니다ㅠ

@PutMapping("/fruit")
public ResponseEntity<String> fruitDelete(@RequestBody FruitRequest request){
    for (int i = 0; i < fruits.size(); i++) {
        long fruitId = fruits.get(i).getId();
        if (fruitId == request.getId()) {
            String tempName = fruits.get(i).getName();
            LocalDate tempDate = fruits.get(i).getWarehousingDate();
            long tempPrice = fruits.get(i).getPrice();
            fruits.remove(i);
            fruits.add(new Fruit(fruitId,tempName, tempDate, tempPrice, true));
            return ResponseEntity.ok("정상 처리 되었습니다.");
        }
    }
    return ResponseEntity.notFound().build();
}

위 API를 보내면 아래와 같이 변경된 리스트를 볼 수 있습니다. id 1번의 saleYn이 true로 변경되었고 저는 이 값은 판매되었다고 사용합니다.

[
    {
        "id": 0,
        "name": "사과",
        "warehousingDate": "2024-02-01",
        "price": 4000,
        "saleYn": false
    },
    {
        "id": 1,
        "name": "사과",
        "warehousingDate": "2024-02-01",
        "price": 4000,
        "saleYn": true
    }
]

 

드디어 문제 3번입니다!!!

GET으로 localhost:8080/api/v1/fruit/stat 보내면 아래와 같이 출력되도록 하는 API 입니다.

{
    "salesAmount": 2000,
    "notSalesAmount": 4000
}

아래는 코드입니다. 저는 stream으로 처리해 보았습니다 😀

@GetMapping("/fruit/stat")
public FruitSalesResponse sales() {
    long salesAmount = fruits.stream().filter(fruit-> fruit.getSaleYn().equals(true)).mapToLong(Fruit::getPrice).sum();
    long notSalesAmount = fruits.stream().filter(fruit-> fruit.getSaleYn().equals(false)).mapToLong(Fruit::getPrice).sum();
    return new FruitSalesResponse(salesAmount,notSalesAmount);
}

상세 코드는 깃헙을 참고해 주세요 ~

 

더 좋은 코드가 있다면 공유 부탁드립니다!!!!

 

댓글을 작성해보세요.