inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

워밍업 클럽 - 백엔드 4일차 과제

Groot
0

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! 강의 4일차 과제입니다.

(강의 링크)

과일에 관한 과제였다.

공통

도메인

먼저 과일은 다음과 같이 구현했다.

public class Fruit {
    private String name;
    private LocalDate warehousingDate;
    private Long price;

    private final boolean isSold = false;

    public Fruit(String name, LocalDate warehousingDate, Long price) {
        this.name = name;
        this.warehousingDate = warehousingDate;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public LocalDate getWarehousingDate() {
        return warehousingDate;
    }

    public Long getPrice() {
        return price;
    }


    public boolean isSold() {
        return isSold;
    }
}

Fruit 객체는 이후에 팔았는지 여부를 알 수 있어야 해서 다음과 같이 만들었다.

스키마

DB 테이블은 다음과 같이 구성했다.

create table fruit
(
    id bigint auto_increment,
    name varchar(50),
    warehousing_date date,
    price bigint,
    is_sold boolean default false,
    primary key (id)
)

 

문제 

문제 1. 과일 정보 등록하기

첫번째 문제는 간단하게 jdbc로 구현했다.

중간에 Fruit로 변환이 필요하지 않아서 나중에 바꿔야 한닷..

@PostMapping("")
public FruitCreateResponse CreateFruit(@RequestBody FruitCreateRequest request) {
    String sql = "INSERT INTO fruit (name, warehousing_date, price) VALUES (?, ?, ?)";
    Fruit fruit = new Fruit(request.getName(), request.getWarehousingDate(), request.getPrice(), false);
    jdbcTemplate.update(sql, fruit.getName(), fruit.getWarehousingDate(), fruit.getPrice());
    return new FruitCreateResponse(fruit);
}
public class FruitCreateRequest {
    private String name;
    private LocalDate warehousingDate;
    private Long price;

    public String getName() {
        return name;
    }

    public LocalDate getWarehousingDate() {
        return warehousingDate;
    }

    public Long getPrice() {
        return price;
    }
}
public class FruitCreateResponse {
    private String name;
    private String warehousingDate;
    private Long price;

    public FruitCreateResponse(Fruit fruit) {
        this.name = fruit.getName();
        this.warehousingDate = fruit.getWarehousingDate().toString();
        this.price = fruit.getPrice();
    }

    public String getName() {
        return name;
    }

    public String getWarehousingDate() {
        return warehousingDate;
    }

    public Long getPrice() {
        return price;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setWarehousingDate(String warehousingDate) {
        this.warehousingDate = warehousingDate;
    }

    public void setPrice(Long price) {
        this.price = price;
    }
}

  

문제 2 - 과일 판매하기

과일 판매를 한 경우 is_sold를 true로 변경하도록 구현했다.

@PutMapping ("")
public FruitSellResponse SellFruit(@RequestBody FruitSellRequest request) {
    String sql = "UPDATE fruit SET is_sold = true WHERE id = ?";
    jdbcTemplate.update(sql, request.getId());
    return new FruitSellResponse(request.getId());
} 
public class FruitSellRequest {
    private Long id;

    public Long getId() {
        return id;
    }
}
public class FruitSellResponse {
    private Long id;

    public FruitSellResponse(Long id) {
        this.id = id;
    }

    public Long getId() {
        return id;
    }
}

문제 3 - 총 판매 금액, 미판매 금액 통계

총판매한 금액과 아직 판매하지 못한 금액을 모두 반환하도록 하는 문제이다.

@GetMapping("/stat")
public FruitStatResponse GetFruitStat(FruitStatRequest request) {
    String sql = "SELECT name, warehousing_date, price, is_sold FROM fruit WHERE name = ?";
    List<Fruit> fruits = jdbcTemplate.query(sql, (rs, rowNum) -> new Fruit(
            rs.getString("name"),
            rs.getDate("warehousing_date").toLocalDate(),
            rs.getLong("price"),
            rs.getBoolean("is_sold")
    ), request.getName());

    long totalAmount = fruits.stream().mapToLong(Fruit::getPrice).sum();
    long salesAmount = fruits.stream().filter(Fruit::isSold).mapToLong(Fruit::getPrice).sum();
    long notSalseAmount = totalAmount - salesAmount;
    return new FruitStatResponse(salesAmount, notSalseAmount);
}

Stream API로 전체 가격 구하고 총 판매/미판매 금액을 구했다.

public class FruitStatRequest {
    private String name;

    public FruitStatRequest(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
public class FruitStatResponse {
    private Long salesAmount;
    private Long notSalesAmount;

    public FruitStatResponse(Long salesAmount, Long notSalesAmount) {
        this.salesAmount = salesAmount;
        this.notSalesAmount = notSalesAmount;
    }

    public Long getSalesAmount() {
        return salesAmount;
    }

    public Long getNotSalesAmount() {
        return notSalesAmount;
    }
}

현재 데이터

image

요청 결과

image

답변 0