2일차 GET API와 POST API 만들기

nakyeonko3·2024년 2월 20일
0

우리는 GET API와 POST API를 만드는 방법을 배웠습니다. 👍 추가적인 API 들을 만들어 보며 API 개발에 익숙해져 봅시다!

문제1

소스 코드

CalculatorController.java

@RestController()
@RequestMapping("/api/v1")
public class CalculatorController {

    @GetMapping("/calc")
    public CalculatorResult DoCalculate(CalculatorCreateRequest request) {
        Integer add = request.getNum1() + request.getNum2();
        Integer minus = request.getNum1() - request.getNum2();
        Integer multiply = request.getNum1()  / request.getNum2();
        return new CalculatorResult(add, minus, multiply);
    }
}

CalculatorResult.java

package com.group.libraryapp.domain;

public class CalculatorResult {
    final private Integer add;
    final private Integer minus;
    final private Integer multiply;

    public CalculatorResult(Integer addedResult, Integer minusedResult, Integer multipliedResult) {
        this.add = addedResult;
        this.minus = minusedResult;
        this.multiply = multipliedResult;
    }

    public Integer getAdd() {
        return add;
    }

    public Integer getMinus() {
        return minus;
    }

    public Integer getMultiply() {
        return multiply;
    }
}

CalculatorCreateRequest.java

public class CalculatorCreateRequest {
    final private Integer num1;
    final private Integer num2;

    public CalculatorCreateRequest(Integer num1, Integer num2) {
        this.num1 = num1;
        this.num2 = num2;
    }

    public Integer getNum1() {
        return num1;
    }

    public Integer getNum2() {
        return num2;
    }
}

실행결과

문제2

소스코드

CalculatorController.java

@RestController()
@RequestMapping("/api/v1")
public class CalculatorController {


    @GetMapping("/calc")
    public CalculatorResult DoCalculate(CalculatorCreateRequest request) {
        Integer add = request.getNum1() + request.getNum2();
        Integer minus = request.getNum1() - request.getNum2();
        Integer multiply = request.getNum1() * request.getNum2();
        return new CalculatorResult(add, minus, multiply);
    }

    @GetMapping("/day-of-the-week")
    public UserDayOfWeek getDayofweek(@RequestParam String date){
        return new UserDayOfWeek(date);
    }

문제2에서도 같은 "/api/v1" path를 가져서 기존 코드에 getDayofweek메서드를 추가해줬다.
DTO대신에@RequestParam String date을 통해 매개변수를 받도록했다. 사용했다.
필요한 url 쿼리 매개변수가 하나라서 DTO를 굳이 사용할 필요가 없다고 생각했다.

UserDayOfWeek.java

public class UserDayOfWeek {
    final private DayOfWeek dayOfTheWeek;

    public UserDayOfWeek(String date) {
        this.dayOfTheWeek = LocalDate.parse(date).getDayOfWeek();
    }

    public DayOfWeek getDayOfTheWeek() {
        return dayOfTheWeek;
    }
}

실행결과

문제3

소스코드

CalculatorController.java

@RestController()
@RequestMapping("/api/v1")
public class CalculatorController {

    @GetMapping("/calc")
    public CalculatorResult DoCalculate(CalculatorCreateRequest request) {
        Integer add = request.getNum1() + request.getNum2();
        Integer minus = request.getNum1() - request.getNum2();
        Integer multiply = request.getNum1() * request.getNum2();
        return new CalculatorResult(add, minus, multiply);
    }

    @GetMapping("/day-of-the-week")
    public UserDayOfWeek getDayofweek(@RequestParam String date){
        return new UserDayOfWeek(date);
    }

    @PostMapping("/sum")
    public Integer sum(@RequestBody NumbersSumRequest request){
        return request.getNumbers().stream().reduce((a,b)->a+b).get();
    }
}

NumbersSumRequest.java

import java.util.List;

public class NumbersSumRequest {
    List<Integer> numbers;

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

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

실행결과

접했던 에러와 느낀점

1. 솔직히 왜 정확히 왜 DTO를 써야 되는지 모르겠다.

DTO없이도 @RequestParam으로 거의다 처리 할 수 있는데 이렇게 하는게 맞나? 라는 생각이든다.

2. 람다식이 정확히 무엇인가?

reduce 메서드를 이용해서 합계를 계산했는데 이게 정확히 무슨 뜻인지 모른다.
스트림과 람다식에 대한 공부가 필요하다,

3. 실제 프로젝트에서는 어떻게 코드를 짤 것인가?

실제 프로젝트에서는 이런식으로 코드를 짤 것 같지 않은데
하지만 실제 프로젝트를 해보지 않아 잘 모른다.

대신에 다른 사람의 코드를 보고 참고해서 코드를 개선할 수 있다.
spring-mvc-calculator/src/main/java/cs545/mum/controller/CalculatorController.java at master · krishnabhat81/spring-mvc-calculator · GitHub
과제2를 시간이 남으면 이 코드로 개선을 해보자.
시간이 없었기에 코드를 개선하지 못했다.

4. 정적 메서드가 아닌 메서드에서는 정적 메서드를 참조 할 수 없다.

import java.lang.reflect.Method;
import java.time.DayOfWeek;
import java.time.LocalDate;

public class TestClass {
    public DayOfWeek getDayOfWeekbyDate(String date) {
        LocalDate localDate = LocalDate.parse(date);
        return localDate.getDayOfWeek();
    }

    public static void main(String[] args) {
        System.out.println(getDayOfWeekbyDate("2023-01-02")); // error!: Cannot make a static reference to the non-static method getDayOfWeekbyDate(String) from the type TestClass
    }
}

정적 메서드가 아닌 메서드에서는 정적 메서드를 참조 할 수 없다.
당연한 거지만 나는 잘 몰랐다. 정적 메서드는 런타임 시작시 바로 메모리에 적제가 되니까 어디에서든 참조가 될수 있는거 아닌가? 라는 생각을 했었는데, 아닌가보다...


Annotation that indicates a method return value should be bound to the web response body. Supported for annotated handler methods.
As of version 4.0 this annotation can also be added on the type level in which case it is inherited and does not need to be added on the method level.

6. status code 500

{"timestamp":"2024-02-20T14:23:18.101+00:00","status":500,"error":"Internal Server Error","path":"/api/v1/sum"}
status code 500은 서버 문제(주로 디비, 시스템 자원 초과로 인한 서버 문제로 인해) 에러가 생겼다는 뜻이다.

잘못된 요청에 의한 에러도 아니고 오직 서버 문제로 api 응답 오류가 걸렸다는 뜻이다.

오늘 과제를 하면서 500 코드를 10번 넘게 봤다.
주 원인은 자바 문법 오류가 많았다.

5. get()이 뭐지?


아직 정확히 모르겠다. 스트림에 대해 더 공부해보자

profile
웹개발자를 지망하고 있는 대학생, 진순파

0개의 댓글