이번 과제는 좀 힘들었다
내가 아직 db에 익숙치가않아서 구글링의 힘을빌려 과제를 해결했다..
빨리 db와 jdbc를 익혀야할것같다.
첫번째 과제부터 알아보자
@PostMapping("/api/v1/fruit")
public FruitResultResponse fruit(@RequestBody FruitRequest fruitRequest){
String sql = "insert into fruit (name, warehousingDate, price) values (?, ?, ?)";
jdbcTemplate.update(sql,fruitRequest.getName(),fruitRequest.getWarehousingDate(),fruitRequest.getPrice());
FruitResultResponse responseFruit = new FruitResultResponse(fruitRequest.getName(), fruitRequest.getWarehousingDate(), fruitRequest.getPrice());
return responseFruit;
}
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class FruitRequest {
String name;
LocalDate warehousingDate;
long price;
boolean checkId;
long id;
public FruitRequest(String name, LocalDate warehousingDate, long price) {
this.name = name;
this.warehousingDate = warehousingDate;
this.price = price;
}
}
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class FruitResultResponse {
private String name;
private LocalDate warehousingDate;
private long price;
}
먼저 fruit객체를 db에 저장 하기때문에 Post방식을 사용했다.
@RequestBody로 FruitRequest의 데이터를 받아오고
sql 변수에 fruit객체를 저장하는 쿼리를 작성하였다.
jdbcTemplate.update()로 데이터를 저장하고
FruitResultResponse 를 사용한 이유는 응답할때 원하는 데이터만 받아오고싶어서 사용하였다.
long은 int보다 월등히 더 넓은 범위의 값을 제공한다. 이는 대규모 데이터를 처리하거나 시간이 지남에 따라 증가할 수 있는 경우를 대비 할 수 있다.
@PutMapping("/api/v1/fruit")
public Long sellFruit(@RequestBody IdCheckRequest request) {
String sql = "SELECT * FROM fruit WHERE id = ?";
boolean checkId = jdbcTemplate.query(sql, (rs, rowNum) -> 0, request.getId()).isEmpty();
if (checkId) {
throw new IllegalArgumentException();
}
String sql2 = "UPDATE fruit SET check_id = 1 WHERE id = ?";
jdbcTemplate.update(sql2, request.getId());
Long id = request.getId();
return id;
}
코드 풀이:
이 문제는 과일이 팔리지 않았다면 check_id를 0으로
팔리면 check_id를 1로 업데이트 해주는 문제이다.
먼저 해당 id가있는지 검증해주는 sql문을 작성해준다.
if문을 통과했다면 id가 있다는 것이므로
본격적으로 id로 요청이오면 해당 id에있는 check_id를 1로 변경해준다.
이러면 해당 과일은 팔렸다는 것이다.
@GetMapping("/api/v1/fruit/stat")
public FruitSumResponse fruitSumResponses(@RequestParam String name){
String SalesSql = "select sum(price) from fruit where name = ? and check_id = 1";
String NotSalesSql = "select sum(price) from fruit where name = ? and check_id = 0";
Long SalesResult = jdbcTemplate.queryForObject(SalesSql, new Object[]{name}, Long.class);
Long NotSalesResult = jdbcTemplate.queryForObject(NotSalesSql, new Object[]{name}, Long.class);
return new FruitSumResponse(NotSalesResult,SalesResult);
}
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class FruitSumResponse {
private Long NotSalesAmount;
private Long SalesAmount;
}
코드 풀이:
이 문제부터 좀 어려웠다.. 어떻게 판매된 과일을 기준으로 과일가격의 합을 작성해야할지 막막했다. 구글링을 통해 알아내보았다.
sum(price)를 sql에 작성하면 price컬럼들이 합해진다고한다.
(구글링 최고!)
그래서 나는 바로 sql을 작성하였다.
where절을 통해서 name과 check_id(판매된 과일)을 기준으로 조회를하면
판매된 과일과 팔리지않은 과일의 가격들을 알 수 있다.
그리고 jdbcTemplate을 통해 name의 ?에 값을 대입해줘야하는데
queryForObject()를 사용하면 단건문을 조회 할 수 있다고한다.
그래서 판매된 과일과 판매x 과일을 jdbcTemplate.queryForObject을 통해서 쿼리문을 조회하였다.
마지막으로 FruitSumResponse생성자에 값을 넣어서 json으로 응답해주면
200ok가 나올것이다.
강의없이 혼자 RestApi를 만들다보니 진땀이빠졌다..
db를 잘 배워야겠다는 생각이 문뜩 들었다