[인프런 워밍업 클럽 BE 0기] 4일차 과제
9개월 전
문제1
우리는 작은 과일 과게를 운영하고 있습니다. 과일 가게에 입고된 "과일 정보"를 저장하는 API를 만드는 스펙은 다음과 같습니다.
HTTP method:
POST
HTTP path:
/api/v1/fruit
HTTP 요청 Body
{
"name": String,
"warehousingDate": LocalDate,
"price": long
}
HTTP요청 Body 예시
{
"name": "사과",
"warehousingDate": "2024-02-01",
"price": 5000
}
풀이
Controller 생성
@PostMapping("/api/v1/fruit")
public void fruitStore(@RequestBody fruitStoreRequest requset) {
String sql = "INSERT INTO fruit(name, warehousingDate, price) VALUES(?,?,?)";
jdbcTemplate.update(sql, requset.getName(), requset.getWarehousingDate(), requset.getPrice());
}
DB 테이블 만들기
create table fruit (
id bigint auto_increment,
name varchar(25),
price int,
sales long, //문제 3에서 사용
warehousingDate date,
primary key(id)
);
DTO 작성
public class fruitStoreRequest {
private String name;
private LocalDate warehousingDate;
private long price;
public String getName() {
return name;
}
public LocalDate getWarehousingDate() {
return warehousingDate;
}
public long getPrice() {
return price;
}
}
문제2
과일이 팔리게 되면, 우리 시스템에 팔린 과일 정보를 기록해야 합니다. 스펙은 다음과 같습니다.
HTTP method:
PUT
HTTP path:
/api/v1/fruit
HTTP 요청 Body
{
"id": long
}
HTTP 요청 Body 예시
{
"id": 3
}
풀이
Controller 생성
@PutMapping("/api/v1/fruit")
public void updatefruitStore(@RequestBody fruitUpdateReqest request) {
String readSql = "SELECT * FROM fruit WHERE id = ?";
boolean isFruitNotExist = jdbcTemplate.query(readSql, (rs, rowNum) ->0, request.getId()).isEmpty();
if(isFruitNotExist) {
throw new IllegalArgumentException();
}
String sql = "UPDATE fruit SET name = ? WHERE id = ?";
jdbcTemplate.update(sql, request.getId(), request.getName());
}
DTO 작성
public class fruitUpdateReqest {
private long id;
private String name;
public String getName() {
return name;
}
public long getId() {
return id;
}
}
id에 3넣었을 때 -> id:3이 없어서 에러 뜸
문제3
우리는 특정 과일을 기준으로 팔린 금액, 팔리지 않은 금액을 조회하고 싶습니다.
예를 들어
(1, 사과, 3000원, 판매 O)
(2, 사과, 4000원, 판매 X)
(3, 사과, 3000원, 판매 O)
와 같은 세 데이터가 있다면 우리의 API는 판매된 금액: 6000원, 판매되지 않은 금액 : 4000원 이라고 응답해야 합니다.
HTTP method:
GET
HTTP path:
/api/v1/fruit/stat
HTTP query
name: 과일 이름
예시
GET /api/v1/fruit/stat?name=사과
HTTP 응답 Body
{
"salesAmount": long,
"notSalesAmount": long
}
HTTP 응답 Body 예시
{
"salesAmount": 6000,
"notSalesAmount": 4000
}
풀이
Controller 생성
@GetMapping("/api/v1/fruit/stat")
public sellFruitStore sellFruit(@RequestParam String name) {
String sales = "select price from fruit where name = ? and sales = 1";
List<Long> price1 = jdbcTemplate.query(sales, (rs, rowNum) -> rs.getLong("price"), name);
String notSales = "select price from fruit where name = ? and sales = 0";
List<Long> price2 = jdbcTemplate.query(notSales, (rs, rowNum) -> rs.getLong("price"), name);
return new sellFruitStore(price1.stream().mapToLong(i -> i).sum(),
price2.stream().mapToLong(i -> i).sum());
}
DTO 작성
public class sellFruitStore {
private long salesAmount;
private long notSalesAmount;
public sellFruitStore(long salesAmount, long notSalesAmount) {
this.salesAmount = salesAmount;
this.notSalesAmount = notSalesAmount;
}
public long getSalesAmount() {
return salesAmount;
}
public long getNotSalesAmount() {
return notSalesAmount;
}
}
댓글을 작성해보세요.