inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

7마리상어
0

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)
);
@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());
    }
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


 

id가 존재하지 않거나 이미 팔린 경우에는 예외 처리

public class FruitSoldRequest {
    private long id;

    public long getId() {
        return id;
    }
}

image


image


@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 절처럼 조건을 부여하여 일치하는 값에 대해서만 그룹화 가능

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형에 비해 표현할 수 있는 범위가 훨씬 넓기 때문에 추후 대규모 데이터 또는 계속 늘어나는 데이터를 대비할 수 있기 때문

 

 

백엔드 인프런워밍업클럽

답변 0