워밍업 클럽 - 백엔드 4일차 과제
11개월 전
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! 강의 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;
}
}
현재 데이터
요청 결과
댓글을 작성해보세요.