🔥새해맞이 특별 라이브 선착순 신청🔥

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

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

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! 강의 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

댓글을 작성해보세요.

채널톡 아이콘