728x90
https://yestruly.tistory.com/87?category=11504854
4번째 과제가 2번째 과제에서 이어지는 과제라서 궁금하시다면 요 링크로,,
🔑문제 1
🔑코드
- 데이터베이스
create table fruit(
id bigint auto_increment,
name varchar(20),
warehousingDate date,
price bigint,
isSell boolean default false,
primary key (id)
);
우선 문제를 풀기 위해 사용할 테이블을 만들어줬다.
- Controller
package com.group.libraryapp.controller.fruit;
import com.group.libraryapp.dto.fruit.request.FruitInfoRequest;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/v1/fruit")
public class FruitController {
private final JdbcTemplate jdbcTemplate;
public FruitController(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@PostMapping("")
public void registerFruit(@RequestBody FruitInfoRequest request){
String sql = "INSERT INTO fruit(name, warehousingDate, price) VALUES (?,?,?)";
jdbcTemplate.update(sql, request.getName(),request.getWarehousingDate(),request.getPrice());
}
}
@RequestMapping 어노테이션으로 문제에서 사용되는 공통된 api 부분을 한 번에 묶어 작성해줬다.
sql문을 작성해 JdbcTemplate을 이용해 데이터베이스 테이블에 저장해주었다.
- 요청 DTO
package com.group.libraryapp.dto.fruit.request;
import java.time.LocalDate;
public class FruitInfoRequest {
String name;
public String getName() {
return name;
}
public LocalDate getWarehousingDate() {
return warehousingDate;
}
public long getPrice() {
return price;
}
LocalDate warehousingDate;
long price;
}
- PostMan 테스트 결과와 데이터 베이스 저장 결과
결과가 잘 나온 걸 확인할 수 있다!
- 가격을 long으로 설정해준 이유는 무엇일까?
- 자바의 정수형은 대표적으로 int와 long이 있다.
- int는 32bit로 -2147483648 ~ 2147483647의 범위를 갖는다
- long은 64bit로 -9223372036854775808 ~ 9223372036854775807의 범위를 갖는다.
- int에 비해 long이 더 범위가 크기 때문에 가격을 long 형태로 설정해준 것이다.
🔑문제 2
🔑코드
- Controller
@PutMapping("")
public void updateFruit(@RequestBody FruitUpdateRequest request){
String sql = "SELECT * FROM fruit WHERE id = ?";
boolean isFruitNotExist
= jdbcTemplate.query(sql, (rs, rowNum) ->
0, request.getId()).isEmpty();
if(isFruitNotExist){
throw new IllegalArgumentException();
}
String updateSql = "UPDATE fruit SET isSell = ? WHERE id = ?";
jdbcTemplate.update(updateSql, true,request.getId());
}
- 요청 DTO
package com.group.libraryapp.dto.fruit.request;
public class FruitUpdateRequest {
long id;
public long getId() {
return id;
}
}
- PostMan 테스트 결과와 데이터 베이스 저장 결과
id가 5인 것만 isSell이 1로 변한 걸 확인할 수 있다.
🔑문제 3
🔑코드
- Controller
@GetMapping("/stat")
public FruitPriceResponse getFruitSellPrice(@RequestParam String name) {
String sql = "SELECT "
+ "SUM(CASE WHEN isSell = true THEN price ELSE 0 END) AS salesAmount, \n"
+ "SUM(CASE WHEN isSell = false THEN price ELSE 0 END) AS notSalesAmount \n"
+ "FROM fruit \n"
+ "WHERE name = ?";
return jdbcTemplate.queryForObject(sql, (rs, rowNum) -> {
long salesAmount = rs.getLong("salesAmount");
long notSalesAmount = rs.getLong("notSalesAmount");
return new FruitPriceResponse(salesAmount, notSalesAmount);
}, name);
}
- 응답 DTO
package com.group.libraryapp.dto.fruit.response;
public class FruitPriceResponse {
private final long salesAmount;
private final long notSalesAmount;
public FruitPriceResponse(long salesAmount, long notSalesAmount) {
this.salesAmount = salesAmount;
this.notSalesAmount = notSalesAmount;
}
public long getSalesAmount() {
return salesAmount;
}
public long getNotSalesAmount() {
return notSalesAmount;
}
}
- PostMan 테스트 결과
문제 2에서 id가 5인 사과만 판매된 것으로 변경해줬는데, 판매된 사과랑 안 된 사과의 금액 합이 결과로 잘 반환된 것을 확인할 수 있다.
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지] 강의 - 인프런 (inflearn.com)
728x90
'Spring' 카테고리의 다른 글
[인프런 워밍업 클럽] BE - 1주차 회고록 (0) | 2024.02.25 |
---|---|
[인프런 워밍업 클럽] BE 5번째 과제 - 클린 코드 (0) | 2024.02.23 |
[인프런 워밍업 클럽] BE 3번째 과제 - 람다식 (0) | 2024.02.21 |
[인프런 워밍업 클럽] BE 2번째 과제 - GET, POST API 만들기 (0) | 2024.02.20 |
어노테이션과 커스텀 어노테이션 만들기 (0) | 2024.02.19 |