인프런 워밍업 클럽

인프런 워밍업 클럽/ BE 2일차 과제 : API

킹갓홍 2024. 4. 30. 15:39

 

문제1

Controller

@GetMapping("/api/v1/calc")
public CalculatorResponseDTO getCalc(@RequestParam int num1, int num2){
    return new CalculatorResponseDTO(num1, num2);
}

@GetMapping을 사용해서 API 주소를 설정해준다.

쿼리파라미터를 받아주기 위해 @RequestParam을 사용해서 num1과 num2를 받아준다.

 

🚨주의 : 쿼리스트링으로 들어오는 변수이름과 @RequestParam으로 설정한 변수이름이 같아야 한다.

더보기

EX) /api/v1/calc?num1=2&num2=3  이라면 @RequestParam으로 받는 변수 이름도 num1과 num2로 정해야한다.

만약 다른 이름으로 받고 싶다면  아래와 같이 @RequsetParam("num1") int [원하는 변수이름] 으로 써주면 된다.

@GetMapping("/api/v1/calc")
public CalculatorResponseDTO getCalc(@RequestParam("num1") int A, @RequestParam("num2")int B){
    return new CalculatorResponseDTO(A, B);
}

 

위에서 보이는 결과값이 JSON 형태이기 때문에 ResponseDTO객체를 만들어서 반환해준다.

 

ResponseDTO

public class CalculatorResponseDTO {
    private int add;
    private int minus;
    private int multiply;

    public CalculatorResponseDTO(int num1, int num2){
        this.add = num1 + num2;
        this.minus = num1 - num2;
        this.multiply = num1 * num2;
    }

    public int getAdd() {
        return add;
    }

    public int getMinus() {
        return minus;
    }

    public int getMultiply() {
        return multiply;
    }
}

🚨주의 : Getter가 없으면 Spring MVC는 DTO객체를 반환할 수는 있지만, JSON 응답에는 프로퍼티(add, minus, multiply)가 포함되지 않는다.

Spring MVC는 객체를 JSON으로 변환할 때 기본적으로 Jackson 라이브러리를 사용하는데, Jackson은 기본적으로 getter/setter 메서드 또는 public 필드를 통해 객체의 프로퍼티에 접근한다.

만약에 위에서 private를 설정하지 않았다면 Getter가 없어도 JSON응답에 프로퍼티들이 포함되겠지만, DTO의 경우 중간에 값이 바뀌면 안되고, 데이터 은닉 원칙에 위배가 되기 때문에 private로 설정하고 Getter를 만들어주는게 좋다.

 

결과값

 


문제2

 

Controller

@GetMapping("/api/v1/day-of-the-week")
public DateResponseDTO getDate(@RequestParam String date) {
    DateResponseDTO dateResponseDTO = new DateResponseDTO(date);
    return dateResponseDTO ;
}

@Getmapping으로 API주소를 설정해준다.

쿼리스트링으로 date값이 들어오기 때문에 @RequestParam을 써서 date값을 받아준다.

날짜 입력시 요일로 바꿔주는 로직을 ResponseDTO에서 처리하도록 했다.

 

ResponseDTO

package com.group.libraryapp.dto.homework.response;

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

public class DateResponseDTO {
    private String dayOfTheWeek;

    public DateResponseDTO(String date) {
        LocalDate localDate = LocalDate.parse(date);
        DayOfWeek dayOfWeek = localDate.getDayOfWeek();
        this.dayOfTheWeek = dayOfWeek.getDisplayName(TextStyle.SHORT, Locale.ENGLISH).toUpperCase();
    }

    public String getDayOfTheWeek() {
        return dayOfTheWeek;
    }
}

위에서 설명한대로 JSON형태로 프로퍼티를 넘겨주기 위해 Getter를 설정해준다.

결과값


문제 3

Controller

@PostMapping("/api/v1/addNums")
public int addNums(@RequestBody CalculatorAddNumsRequest request) {
    int sum = Arrays.stream(request.getNumbers()).sum();
    return sum;
}

문제에서 제시한대로 PostMapping을 사용해서 API의 주소를 설정해준다.

Request에서 넘겨주는 값이 쿼리스트링이 아니라 JSON을 통해서 주기 때문에 @RequestBody를 사용해서 받아준다.

JSON형태로 넘어오는 데이터를 받아주기 위해 RequestDTO를 만들어서 JSON형태에 맞는 변수를 설정해준다.

반환값은 JSON으로 넘겨주는게 아닌 정수로 넘겨준다.

 

RequestDTO

public class CalculatorAddNumsRequest {
    int[] numbers;

    public int[] getNumbers() {
        return numbers;
    }
}

넘어오는 값이 배열이기 때문에 배열변수를 설정해야 받아줄 수 있다.

 

결과값

JSON형태가 아닌 정수로 반환 된 것을 볼 수 있다.