Get ,Post API

goose_bumps·2024년 5월 12일

API란 Client와 Server가 HTTP를 주고 받으며 기능을 동작하는데 정해진 규칙이라고 하였다. 이번에는 간단한 Get, Post API를 만들어보자

1. GET API 개발

아주 간단하게 2개의 정수를 덧셈해서 결과를 반환하는 API를 만들어보겠다.

1) 패키지 만들기

Intellij를 실행시켜 main -> Java -> com.group.libraryapp에 controller라는 패키지를 만들고 그 패키지 안에 calculator라는 패키지 -> CalculatorController 클래스를 작성한다

2) API Spec 정하기

Request 구조에 맞춰 API Spec을 정한다.
HTTP Method -> GET
HTTP Path -> add
Query -> int number1, number2

3) 코드 작성

  • API를 개발하려는 클래스에는 @RestController 에너테이션을 붙여줘야 함 -> API의 진입지점을 만들어줌
  • 이후, @GetMapping("/add") 에너테이션 -> HTTP Method / Path
    함수 작성
    ex) public addTwoNumbers(int number1, int number2){return number1 + number2;}
  • 이때 Query를 통해 넘어온 데이터를 받을 시 @RequestParam 에너테이션 사용해야함 ex) public int addTwoNumbers(@RequestParam int number1, @RequestParam int number2){return number1 + number2;}

이제, postman을 사용해서 API가 잘 작동되는지 확인해보자. 서버를 실행시키고 postman에 접속해서 URL을 http://localhost:8080/add 로 입력하여 key값은 number1,2로 value값을 임의의 값을 입력 후 send를 클릭한다.

정상적으로 작동하는 것을 볼 수 있다.

그런데, 만약 받아야 하는 매개변수가 많을 경우 일일히 @RequestParam을 추가해야 할까? 너무 소요가 많아 보인다.
이때 객체를 매개변수로 입력하는 방법을 사용할 수 있다.

com.group.library에 DTO라는 새로운 패키지를 만들어 매개변수를 저장하는 별도의 클래스를 작성해보자.

com.group.library에 새로운 패키지 작성 DTO(Data Transfer Object)라고 작성-> DTO안에 패키지 하나 더 작성 calculator.request -> CalculatorAddRequest 클래스 작성

package com.group.libraryapp.DTO.calculator.request;

public class CalculatorAddRequest {
    private final int number1;
    private final int number2;

    public CalculatorAddRequest(int number2, int number1) {
        this.number2 = number2;
        this.number1 = number1;
    }

    public int getNumber1() {
        return number1;
    }

    public int getNumber2() {
        return number2;
    }
}

Intellij에서는 Alt+insert를 누르면 Constructor, Getter 등을 자동으로 만들 수 있다.

이제 매개변수 대신 CalculatorAddRequest 클래스의 객채를 매개변수로 입력한다(이때 @RequestParam은 추가할 필요 없다)

@GetMapping("/add")
    public int addTwoNumbers(CalculatorAddRequest request){ 
        return request.getNumber1() + request.getNumber2();
    }

잘 작동되는 것을 볼 수 있다.

반드시 매개변수를 담는 클래스를 작성할 필요는 없다. @RequestParam을 사용할 경우에는 함수 인자 형태로 받으면 되고, 사용하지 않을거면 클래스를 작성해서 객채를 매개변수로 사용하면 된다.

2. POST API 개발

이번에는 2개의 정수를 곱하여 반환하는 POST API를 만들어보자.

1) 패키지 만들기

패키지는 위와 동일하게 구성하고 CalculatorController 클래스에 새로운 메서드를 추가한다.

public int multiplyTwoNumbers(){}

2) API Spec 정하기

Request 구조에 맞춰 API Spec을 정한다.
HTTP Method -> POST
HTTP Path -> multiply
Body -> { "number1" : 10, "number2" : 20 }

여기서 한 가지 알고가야 할 것이 있는데 Body에 데이터를 넘기게 되면 API에서는 JSON을 사용하여 정보를 가져온다. @RequestBody가 추가되어 있는 객체는 이 JSON을 인자로 받게 된다.
JSON이란? 객체 표기법으로 무언가를 표기하기 위한 형식을 말한다.
Key : Value 형식으로 표현하며 Java에 Map<Obj, Obj>와 비슷하다.
ex)
{
"name" : "KIm",

"age" : 99,

"dogs" : ["hound", "bulk"],

"house" : {"address" : "Seoul", "hasDoor" : "true"}
}

3) 코드 작성

GET API와 비슷하게 매개변수를 클래스의 객체로 입력하고 @RequestBody를 추가해준다. 이 에너테이션이 있어야 JSON에 담긴 정보가 인자로 입력되기 때문이다.(물론, POST API에서 사용되는 것)

그럼 Request 구조는 이렇게 구성된다.

POST/multiply
Host : http://localhost:8080/multiply
한 줄 띄기
{
"number1":10,
"number2":20
}

package com.group.libraryapp.DTO.calculator.request;

public class CalculatorMultiplyRequest {
    private int number1;
    private int number2;

    public int getNumber1() {
        return number1;
    }

    public int getNumber2() {
        return number2;
    }
}
//매개변수가 담긴 클래스 생성
@PostMapping("/multiply")
    public int multiplyTwoNumbers(@RequestBody CalculatorMultiplyRequest request){
        return request.getNumber1() * request.getNumber2();
    } // 두 정수를 곱하여 반환하는 메서드

여기서 의문인게 왜 POST API의 매개변수로 객체를 입력하게 되는 클래스에서는 필드값을 초기화 하는 생성자를 별도로 만들지 않을까?

내 생각으로는 JSON을 사용하여 데이터를 전달(여기서는 number1,2 값)하기 때문에 필요가 없는 것이다.
GET API의 경우 데이터를 전달하여 저장시키는 것이 아닌 데이터를 추출하는 것이기 때문에 생성자를 이용하여 필드값의 초기화가 있어야 하는 것이 맞다.

4) JSON을 이용하여 데이터 전달

POST 방식이기 때문에 Query를 사용하지 않아 Param이 아닌 Body를 설정해주어야 한다. raw -> JSON을 선택하여 Key : Value 형식으로 입력하고 Send를 클릭하면 데이터가 저장되고 그에 대한 반환값이 나온다.


간단하게 GET , POST API를 개발해보았다.
1개의 Controller에 여러 개의 API를 추가하는 것이 가능하기 때문에 이외에도 다른 API를 만들어볼 수 있다.

정리
1) GET API

  • @RequestParam을 인자에 추가하며, 사용하지 않을 경우 클래스를 이용해 객체를 인자로 사용한다
  • 데이터를 추출하는 것이기 때문에 인자 클래스에 필드를 초기화하는 생성자가 필요하다
  • Query를 사용한다

2) POST API

  • @RequestBody를 사용하며 GET API와 마찬가지로 인자 대신 클래스 객체로 사용 가능하다
  • 데이터를 JSON을 통해 저장하기 때문에 생성자를 통한 필드 초기화가 불필요하다
  • Body를 사용한다

0개의 댓글