Spring

[인프런 워밍업 클럽] BE 4번째 과제 - POST, GET, PUT API 만들기

yes_truly 2024. 2. 22. 23:05
728x90

https://yestruly.tistory.com/87?category=1150485

 

[인프런 워밍업 클럽] BE 2번째 과제 - GET, POST API 만들기

🔑문제 1 🔑코드 Controller package com.group.libraryapp.controller.calculator; import com.group.libraryapp.dto.caclulator.request.CalculatorRequest; import com.group.libraryapp.dto.caclulator.response.CalculatorResponse; import org.springframework.

yestruly.tistory.com

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)

 

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인

Java와 Spring Boot, JPA, MySQL, AWS를 이용해 서버를 개발하고 배포합니다. 웹 애플리케이션을 개발하며 서버 개발에 필요한 배경지식과 이론, 다양한 기술들을 모두 학습할 뿐 아니라, 다양한 옵션들

www.inflearn.com

 

728x90