<aside> 👉 GET, POST API 만들기

</aside>

1. 두 수 입력 후 덧셈, 뺄셈, 곱 결과 리턴하는 GET API

// CalculateResponse.java

package com.inflearn.Inflearn.Study.week02.solution1;

import lombok.Getter;

@Getter
public class CalculateResponse {
    private int add;
    private int minus;
    private int multiply;

    public CalculateResponse(int add, int minus, int multiply) {
        this.add = add;
        this.minus = minus;
        this.multiply = multiply;
    }
}
// CalculateController.java

package com.inflearn.Inflearn.Study.week02.solution1;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class CalculateController {

    @GetMapping("/api/v1/calc")
    public CalculateResponse calculate(@RequestParam int num1, @RequestParam int num2) {
        int addResult = num1 + num2;
        int minusResult = num1 - num2;
        int multiplyResult = num1 * num2;
        CalculateResponse response = new CalculateResponse(addResult, minusResult, multiplyResult);
        return response;
    }

}

2. 날짜 입력 후 요일 알려주는 GET API

// DateResponse.java

package com.inflearn.Inflearn.Study.week02.solution2;

import lombok.Getter;

import java.time.DayOfWeek;

@Getter
public class DateResponse {
    private DayOfWeek dayOfTheWeek;

    public DateResponse(DayOfWeek dayOfTheWeek) {
        this.dayOfTheWeek = dayOfTheWeek;
    }
}
// DateController.java

package com.inflearn.Inflearn.Study.week02.solution2;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.time.DayOfWeek;
import java.time.LocalDate;

@RestController
public class DateController {

    @GetMapping("/api/v1/day-of-the-week")
    public DateResponse getDate(@RequestParam LocalDate date) {
        DayOfWeek day = date.getDayOfWeek();
        DateResponse response = new DateResponse(day);
        return response;
    }
}

3. 여러 수 받아서 총합 리턴하는 POST API

// NumbersRequest.java

package com.inflearn.Inflearn.Study.week02.solution3;

import lombok.Getter;

import java.util.List;

@Getter
public class NumbersRequest {
    private List<Integer> numbers;

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

		/*기본 생성자 필요 */
		public NumbersRequest() {
		}
}
// NumbersController.java

package com.inflearn.Inflearn.Study.week02.solution3;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class NumbersController {

    @PostMapping("/api/v1/numbers")
    public Integer addNumbers(@RequestBody NumbersRequest request) {
        int sum = 0;
        for(Integer num : request.getNumbers()) {
            sum += num;
        }
        return sum;
    }
}

4. 고민의 흔적

  1. Entity가 필요한가?
    1. DB에 데이터를 저장할 필요가 없다 → Entity 필요 없다.
  2. Request / Response Dto의 필요성
    1. 1,2번 문제는 controller에서 @RequestParam을 사용해서 url에 parameter로 넣어준다. → Request Dto는 필요없다.
    2. 1,2번 문제는 JSON 타입으로 반환한다. → Response Dto를 만들어서 반환해주자!(생성자 사용)
    3. 3번 문제는 문제 조건이 “String 이나 Integer로 반환하는 것”이다. 즉 controller에서 바로 Integer 타입으로 반환해주면 된다. → Response Dto 필요 없다.
    4. 3번 문제는 배열로 값을 받아서 처리하는데 url에서 받는 것이 아니다. → Request Dto를 사용해서 @RequestBody사용하여 request 값을 Java 객체로 변환해주자
  3. 로직은 어느 layer에서 처리할까?
    1. 보통 로직은 domain 영역이나 service 영역에서 처리해서 DI를 통해 주입해준다.
    2. 하지만 이번 미션은 매우 간단한 계산 이므로 controller에서 처리해서 리턴해주기로 결정했다.