[인프런 워밍업 클럽 BE 0기] 4일차 과제
9개월 전
요청 받은 과일 정보를 저장하기 위한 테이블 생성
CREATE TABLE fruit
(
id bigint AUTO_INCREMENT,
name varchar(20) NOT NULL,
warehousingDate date NOT NULL,
price int NOT NULL,
is_sold boolean default false,
primary key (id)
);
Controller code
@PostMapping("/api/v1/fruit")
public void addFruit(@RequestBody FruitInfRequest request){
String sql = "INSERT INTO fruit(name, warehousingDate, price) VALUES(?, ?, ?)";
jdbcTemplate.update(sql, request.getName(), request.getWarehousingDate(), request.getPrice());
}
HTTP 요청을 받을 Dto code
public class FruitInfRequest {
private String name;
private LocalDate warehousingDate;
private long price;
public String getName() {
return name;
}
public LocalDate getWarehousingDate() {
return warehousingDate;
}
public long getPrice() {
return price;
}
}
결과
Controller code
@PutMapping("/api/v1/fruit") public void isSoldFruit(@RequestBody FruitSoldRequest request){ String readSql = "SELECT * FROM fruit WHERE id = ? and is_sold = false"; boolean isFruitNotExist = jdbcTemplate.query(readSql, (rs, rowNum) -> 0, request.getId()).isEmpty(); if (isFruitNotExist){ throw new IllegalArgumentException(); } String sql = "UPDATE fruit SET is_sold = true WHERE id = ?"; jdbcTemplate.update(sql, request.getId()); }
id가 존재하지 않거나 이미 팔린 경우에는 예외 처리
Dto code
public class FruitSoldRequest {
private long id;
public long getId() {
return id;
}
}
결과
Controller code
@GetMapping("/api/v1/fruit/stat")
public FruitAmountResponse checkSalesAmount(@RequestParam String name) {
String readSql = "SELECT * FROM fruit WHERE name = ?";
boolean isFruitNotExist = jdbcTemplate.query(readSql, (rs, rowNum) -> 0, name).isEmpty();
if (isFruitNotExist) {
throw new IllegalArgumentException();
}
String soldSql = "SELECT sum(price) FROM fruit WHERE is_sold = true GROUP BY name having name = ?";
String notSoldSql = "SELECT sum(price) FROM fruit WHERE is_sold = false GROUP BY name having name = ?";
long salesAmount = jdbcTemplate.queryForObject(soldSql, long.class, name);
long notSalesAmount = jdbcTemplate.queryForObject(notSoldSql, long.class, name);
return new FruitAmountResponse(salesAmount, notSalesAmount);
}
jdbcTemplate.queryForObject(쿼리문, 반환할 클래스, ?에 전달할 인자)
: 결과 집합인 'ResultSet'을 반환하는 query와 다르게 queryForObject는 단일 행 결과를 나타내는 객체를 반환, 위와 같이 단일 결과 행을 가져와야 할 때 주로 사용
GROUP BY column
: column을 기준으로 집계 함수를 사용하여 COUNT, SUM, AVG 등 집계성 데이터를 추출할 때 사용
GROUP BY 절에서는 HAVING 절을 통해 WHERE 절처럼 조건을 부여하여 일치하는 값에 대해서만 그룹화 가능
Dto code
package com.group.libraryapp.assignment.dto.q456;
public class FruitAmountResponse {
private long salesAmount;
private long notSalesAmount;
public FruitAmountResponse(long salesAmount, long notSalesAmount) {
this.salesAmount = salesAmount;
this.notSalesAmount = notSalesAmount;
}
public long getSalesAmount() {
return salesAmount;
}
public long getNotSalesAmount() {
return notSalesAmount;
}
}
결과
API에서 long를 사용한 이유는 long형이 int형에 비해 표현할 수 있는 범위가 훨씬 넓기 때문에 추후 대규모 데이터 또는 계속 늘어나는 데이터를 대비할 수 있기 때문
댓글을 작성해보세요.