[인프런 BE 0기] API 개발

HeeYeon Kim·2024년 2월 20일
0

STUDY

목록 보기
8/15
post-thumbnail

인프런 워밍업 클럽 스터디 0기
BE 2일차



SpringBoot가 JSON 데이터를 가져오는 방법

ObjectMapper

ObjectMapper는 객체를 json형태로 직렬화 또는 역직렬화해주는 라이브러리이다.
dependency로 spring-boot-starter-web을 추가하면 다운로드되는 jackson이라는 라이브러리에 속해있다.

동작 과정

우리가 @RequestBody를 붙여줬을 때 SpringBoot는 ObjectMapper을 이용해 데이터를 직렬화/역직렬화 한다.

ObjectMapper의 기본 설정은 public 필드 또는 public 형태의 getter만 접근 가능하다.

Json -> Object(역직렬화)

  • ObjectMapper는 getter을 이용해 데이터를 파싱하므로 getter가 없으면 JSON을 Object 형태로 변경하지 못한다.

Object -> JSON(직렬화)

  • Default 생성자가 있어야 한다.
    • 인텔리제이를 사용할 경우 컴파일 옵션에 따라 다르다. 만약 Gradle이 아닌 인텔리제이 자체 빌드 툴을 사용한다면 빈 생성자가 없을 경우 동작하지 않을 수 있다.
    • 그 외의 경우엔 jackson-module-parameter-names라는 라이브러리가 추가되어 있기 때문에 빈 생성자가 없어도 된다.
  • 객체명에 get을 붙이는 경우 ObjectMapper는 getter로 인식하기 때문에 사용에 유의해야한다.



문제 1 API 명세

  • HTTP Method : GET
  • Path : /api/v1/calc
  • 쿼리 파라미터 : num1,num2
  • 반환 형태
    {
       "add" : 덧셈결과,
       "minus" : 뺄셈결과,
       "multiply" : 곱셈결과
     }  


CalculatorRequestDto

public class CalculatorRequest {

    private int num1;
    private int num2;

    public CalculatorRequest(int num1, int num2) {
        this.num1 = num1;
        this.num2 = num2;
    }

    public int getNum1() {
        return num1;
    }

    public int getNum2() {
        return num2;
    }
}



CalculatorResponseDto

public class CalculatorResponse {

    private int add;
    private int minus;
    private int multiply;

    public CalculatorResponse(CalculatorRequest request) {
        this.add = request.getNum1()+ request.getNum2();
        this.minus = request.getNum1()-request.getNum2();
        this.multiply = request.getNum1()* request.getNum2();
    }

    public int getAdd() {
        return add;
    }

    public int getMinus() {
        return minus;
    }

    public int getMultiply() {
        return multiply;
    }
}



Controller

@GetMapping("/api/v1/calc")
public CalculatorResponse calculator(CalculatorRequest request){
        return new CalculatorResponse(request);
}



결과





문제 2 API 명세

  • HTTP Method : GET
  • Path : /api/v1/day-of-the-week
  • 쿼리 파라미터 : date
  • 반환 형태
    {
       "dayOfTheWeek" : "MON"
     }  



DayRequestDto

import java.time.LocalDate;

public class DayRequest {

   LocalDate date;

   public DayRequest(LocalDate date) {
       this.date = date;
   }

   public LocalDate getDate() {
       return date;
   }
}



DayResponseDto

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Year;
import java.time.format.TextStyle;
import java.util.Locale;

public class DayResponse {

   private String dayOfTheWeek;

   public DayResponse(DayRequest request) {
       LocalDate today = request.getDate();
       this.dayOfTheWeek = today.getDayOfWeek()
                                .getDisplayName(TextStyle.SHORT, Locale.US)
                                .toUpperCase();
   }

   public String getDayOfTheWeek() {
       return dayOfTheWeek;
   }
}



Controller

@GetMapping("/api/v1/day-of-the-week")
public DayResponse dayOfTheWeek(DayRequest request){
       return new DayResponse(request);
}



결과





문제 3 API 명세

  • HTTP Method : POST

  • Path : /api/v1/sum

  • HTTP Body Message

    {
       "numbers" : [1,2,3,4,5]
    }
  • 반환 결과 : String or Int형





SumRequest

import java.util.List;

public class SumRequest {

    private List<Integer> numbers;

    public SumRequest(){}

    public SumRequest(List<Integer> numbers) {
        this.numbers = numbers;
    }

    public List<Integer> getNumbers() {
        return numbers;
    }
}

Controller

@PostMapping("/api/v1/sum")
public int listSum(@RequestBody SumRequest request){
        int sum = request.getNumbers().stream().mapToInt(Integer::intValue).sum();
        return sum;
    }



결과

문제 발생 & 해결

api를 호출했을 때 500 error가 발생했다.
SumRequest 클래스에 기본 생성자가 없어서 오류가 발생했다.
생성자에 인자가 1개일 경우엔 기본 생성자가 있어야한다.
기본 생성자를 추가하니 해결되었다.

이외에 생성자 위에 @JsonCreator를 붙여줘도 해결된다.










참고
https://bjp5319.tistory.com/53
https://mangkyu.tistory.com/223


강의

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

0개의 댓글