인프런 워밍업 클럽 0기 - 백엔드 코스 (과제 4)
9개월 전
문제 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
의 생성자에 필터링된 과일 리스트를 넘겨 가격 총합을 반환합니다.
댓글을 작성해보세요.