[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);
}
상세 코드는 깃헙을 참고해 주세요 ~
더 좋은 코드가 있다면 공유 부탁드립니다!!!!
댓글을 작성해보세요.