[인프런 워밍업 클럽 BE 0기] 4일차 과제

[인프런 워밍업 클럽 BE 0기] 4일차 과제

image


  • 요청 받은 과일 정보를 저장하기 위한 테이블 생성

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;
    }
}
  • 결과

image


image


 

  • 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;
    }
}
  • 결과

     

image


image


  • 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;
    }
}
  • 결과

image


image

API에서 long를 사용한 이유는 long형이 int형에 비해 표현할 수 있는 범위가 훨씬 넓기 때문에 추후 대규모 데이터 또는 계속 늘어나는 데이터를 대비할 수 있기 때문

 

 

댓글을 작성해보세요.

채널톡 아이콘