본문 바로가기
스터디공부/인프런 워밍업

인프런 워밍업 4일차 과제 제출

by 파덕 2024. 2. 22.

과제4일차

HTTP는 클라이언트와 서버가 인터넷 환경에서 통신하기 위한 규칙을 정의한것.

거기서 양측에서 데이터를 전송 및 조회하기 위해 약속을 정한 것을 API라고 한다.

  1. 과일 정보를 저장한다.

요청, 스타드 라인 METHOD, PATH , VERSION , QUERY
PATH /api/v1/fruit
요청에서 데이터를 서버에 전달하는 방법은 쿼리랑 바디

{
  "name":String,
  "warehousingDate": LocalDate,
  "price": long
}

예시 요청 바디

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

Code

package study_db2.week_1.itemservice_db.web;

import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDate;

@RestController
@RequiredArgsConstructor
public class FruitController {

    private final JdbcTemplate jdbcTemplate;

    @PostMapping("/api/v1/fruit")
    public ResponseEntity<Object> saveFruit(@RequestBody CreateFruitRequest request) {
        String sql = "INSERT INTO fruit (name,warehousing_date,price) VALUES (?,?,?)";
        jdbcTemplate.update(sql, request.getName(), request.getWarehousingDate(), request.getPrice());
        return ResponseEntity.ok().build();
    }

    public static class CreateFruitRequest {
        private String name;
        private LocalDate warehousingDate;
        private long price;

        public CreateFruitRequest() {
        }

        public String getName() {
            return name;
        }

        public LocalDate getWarehousingDate() {
            return warehousingDate;
        }

        public long getPrice() {
            return price;
        }
    }
}

추가 질문

위 API에서 int 대신에 long을 사용한 이유

  1. int는 21억까지 표현할 수 있는 반면에 long은 그 이상의 금액을 표현할 수 있습니다.
  2. 과일이라고 해도 21억까지 표현할 수 있는 것보다 그 이상의 금액을 표현할 수 있는 long을 사용한거라 생각이 됩니다.

문제 2번

@PutMapping("/api/v1/fruit")
public FruitSellResponse sellFruit(@RequestBody SellFruitRequest request) {
    String sql = "UPDATE fruit SET sell_status = 'SELLING' WHERE id = ?";
    jdbcTemplate.update(sql, request.getId());
    return new FruitSellResponse(request.getId());
}
public static class FruitSellResponse {
    private long id;

    public FruitSellResponse(final long id) {
        this.id = id;
    }

    public long getId() {
        return id;
    }
}

public static class SellFruitRequest {
    private long id;

    public long getId() {
        return id;
    }
}

문제 3

 @GetMapping("/api/v1/fruit/stat")
    public FruitSalesResponse getSalesInfo(@RequestParam("name") String fruitName) {
        String sql = "SELECT * FROM fruit WHERE name = ?";
        List<Fruit> result = jdbcTemplate.query(sql, new Object[]{fruitName}, (RowMapper<Fruit>) (rs, rowNum) -> {
            return new Fruit(rs.getString("name"), rs.getLong("price"), rs.getString("sell_status"));
        });
        long sellingPrice = 0L;
        long havingPrice = 0L;
        for (final Fruit fruit : result) {
            if (fruit.getStatus().equals("HAVING")) {
                havingPrice+= fruit.getPrice();
            } else if (fruit.getStatus().equals("SELLING")) {
                sellingPrice+= fruit.getPrice();
            }
        }
        return new FruitSalesResponse(sellingPrice, havingPrice);
    }

    public static class Fruit {
        private String name;
        private long price;
        private String status;

        public Fruit(final String name, final long price, final String status) {
            this.name = name;
            this.price = price;
            this.status = status;
        }

        public String getName() {
            return name;
        }

        public long getPrice() {
            return price;
        }

        public String getStatus() {
            return status;
        }
    }

    public static class FruitSalesResponse {
        private long salesAmount;
        private long notSalesAmount;

        public FruitSalesResponse(final long salesAmount, final long notSalesAmount) {
            this.salesAmount = salesAmount;
            this.notSalesAmount = notSalesAmount;
        }
        public long getSalesAmount() {
            return salesAmount;
        }

        public long getNotSalesAmount() {
            return notSalesAmount;
        }

    }

추가 질문

@GetMapping("/api/v1/fruit/stat2")
public FruitSalesResponse getSalesInfo2(@RequestParam("name") String fruitName) {
    String sql = "SELECT\n" +
            "    SUM( IF(sell_status = 'SELLING',price,0)) AS salesAmount,\n" +
            "    SUM( IF(sell_status = 'HAVING',price,0)) AS notSalesAmount\n" +
            "FROM fruit\n" +
            "WHERE name = ?\n" +
            "GROUP BY name;";
    List<FruitSalesResponse> result = jdbcTemplate.query(sql, new Object[]{fruitName}, (RowMapper<FruitSalesResponse>) (rs, rowNum) -> {
        return new FruitSalesResponse(rs.getLong("salesAmount"), rs.getLong("notSalesAmount"));
    });
    return result.get(0);
}