블로그

인프런 워밍업 클럽 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의 생성자에 필터링된 과일 리스트를 넘겨 가격 총합을 반환합니다.

백엔드springdtorequestbodyrequestparam

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

문제 1. GET 방식의 API 만들기path : /api/v1/calc쿼리 파라미터 : num1, num2response{ "add": {덧셈결과}, "minus": {뺄셈결과}, "multiply": {곱셈결과} } 해결 방법@RequestParam 어노테이션 활용 방법 @GetMapping("/api/v1/calc") public CalculatorAllResponse calcByRequestParam(@RequestParam int num1, @RequestParam int num2){ return new CalculatorAllResponse(num1+num2,num1-num2,num1*num2); }dto 활용 방법@GetMapping("/api/v2/calc") public CalculatorAllResponse calcByDto(CalculatorAllRequest request){ return new CalculatorAllResponse(request.getNum1()+request.getNum2(),request.getNum1()-request.getNum2(),request.getNum1()*request.getNum2()); }결과 1결과 2  문제 2. 날짜를 입력하면 몇 요일인지 알려주는 GET API 만들기path : /api/v1/day-of-the-week쿼리 파라미터 : date(yyyy-mm-dd)response{ "dayOfTheWeek": "MON" } 해결 방법이 문제는 사실 모두 LocalDate 패키지를 활용하면 간편하게 해결 가능하다.@GetMapping("/api/v1/day-of-the-week") public Map<String,String> getDayOfTheWeek(@RequestParam String date){ LocalDate today = LocalDate.parse(date, DateTimeFormatter.ISO_DATE); Map<String,String> result = new HashMap<>(); result.put("dayOfTheWeek",today.getDayOfWeek().getDisplayName(TextStyle.SHORT, Locale.US)); return result; }쿼리 파라미터를 통해 받아온 오늘 날짜를 통해 today라는 LocalDate 인스턴스를 생성해준다.LocalDate.getDayOfWeek() 메서드를 통해 해당 날짜의 요일을 반환할 수 있다.실제로는 1~7 숫자가 반환되고 1 = Mon, 2 = TUE ... 등을 나타낸다.여기서 getDisplayName() 메서드를 통해 문제에서 요구한 String 형식으로 반환되도록 한다.  문제 3. 여러 수를 받아 총 합을 반환하는 POST API 만들기path : /api/v1/add-allbody{ "numbers": [1, 2, 3, 4, 5] }response: int    해결 방법@GetMapping("/api/v1/add-all") public int addAll(@RequestBody Map<String, List<Integer>> request){ return request.get("numbers").stream().mapToInt(Integer::intValue).sum(); }body의 데이터는 @RequestBody 어노테이션을 통해 얻어옵니다.stream()을 통해 리스트 안에 모든 값들을 더해줄 수 있도록 합니다. 

백엔드인프런_워밍업_클럽_0기api만들기apilocaldate@RequestParam@RequestBodydto

채널톡 아이콘