4일차 과제

조태진·2024년 2월 22일
0

이번 과제는 좀 힘들었다
내가 아직 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 를 사용한 이유는 응답할때 원하는 데이터만 받아오고싶어서 사용하였다.


결과

http 요청


http 응답 결과


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로 변경해준다.
이러면 해당 과일은 팔렸다는 것이다.


결과

없는 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가 나올것이다.


결과

요청url:

응답 결과


후기:

강의없이 혼자 RestApi를 만들다보니 진땀이빠졌다..
db를 잘 배워야겠다는 생각이 문뜩 들었다

0개의 댓글