본문 바로가기
기록해보기

POST API를 개발하고 테스트하기

by titlejjk 2023. 5. 28.

전에는  쿼리를 이용해서 데이터를 받았엇는데 POST API 같은 경우에는 쿼리를 사용하는게 아니라 HTTP Body를 이용한다. 이 Body에 데이터를 넘기게 되면 API에서는 Body에 있는 데이터를 열어서 정보를 가져오게 되는데 이 때 사용되는 문법이 있다.

그것은 JavaScriptObjectNotation, JSON이다.

 

JSON 이란 객체 표기법으로 무언가를 표현하기 위한 형식이다.

한 사람이 있다는 가정하에 설명해보자면

사람 {

        "name" : "누구누구", 👉 ,쉼표로 다음 데이터를 넣을수 있게끔해주고 누구누구라는 문자열을 감싸기 위해 " "를 사용해주어야한다.

        "age" : 50, 👉숫자는 " "는 사용을 안한다.

        "friend" : ["친구1", "친구2"] 👉JSON의 value 에는 List가 들어올 수도 있다.

        "house" : {                           👉JSON의 value 에는 다른 JSON이 올 수도 있다.

             "address" : "서울"

             "hasDoor" : true

         }

       }

Java로 비유해보자면, Map<Object, Object>랑 비슷하다.

 

"key" : value 으로 표시해주고 문자열에는 " "를 써주어야 한다.

JSON표기는 중괄호가 양 끝에 있다.

 

이번에는 곱셈 기능을 POST API로 만들어 보겠다.

 

HTTP Method 👉 POST

 

HTTP Path 👉 /multiply

 

HTTP Body(JSON) 👉 JSON으로 사용 {"number1" : 숫자, "number2" : 숫자}

 

API의 반환 결과 👉 숫자(곱셈 결과)

 

먼저 POST API로 만들기 때문에 어노테이션으로 @PostMapping을 만들어준 후에 메소드를 만든다.

@PostMapping("/multiply") //POST /multiply
    public int multiplyTwoNumbers(){
        
    }

그 후 데이터를 데이터를 전달할 객체 DTO class를 만들어 준다.

그런 다음 새로 만든 DTO로 number1 과 number2를 전달하는 객체로 사용할 것 이기 때문에 두개를 만들어 주고

package com.group.libraryapp.dto.calcuator.request;

public class CalcuatorMultiplyRequest {

    private int number1;
    private int number2;
    
    public int getNumber1() {
        return number1;
    }

    public int getNumber2() {
        return number2;
    }
}

위처럼 곱셈값을 받기 위한 DTO class를 만들어 준 후에 곱셈을 하기 위한 메소드를 완성해주면 된다.

@PostMapping("/multiply") //POST /multiply
    public int multiplyTwoNumbers(CalcuatorMultiplyRequest request){
        return request.getNumber1() * request.getNumber2();
    }

여기서 끝이 아니라 Post API에서는 한가지 작업을 더 해주어야 하는데 

mutiplyTwoNumbers라는 메소드에 DTO(CalculatorMultiplyRequest)역할을 맡고 있는 객체 즉 HTTP Body에 있는 JSON을 파싱해서 이 객체로 만들어줄 때 DTO 앞에 어노테이션을 하나 붙여주어야 하는데 여기에서는 @RequestBody라고 붙여 주어야 한다.

이 어노테이션이 있어야 Post API에서 정상적으로 HTTP Body 안에 담김 JSON을 이 객체로 변환시킬 수 있다.

@PostMapping("/multiply") //POST /multiply
    public int multiplyTwoNumbers(CalcuatorMultiplyRequest request){
        return request.getNumber1() * request.getNumber2();
    }

이렇게 다 만들어 주었으니 PostMan으로 테스트해보겠다.

새롭게 POST를 하나 만들어 준후에 http://localhost:8080/multiply를 적어주었다.

그리고 Body를 쓰기위해 Body를 눌러준 후에 raw를 눌러준후에 JSON을 눌러준다.

JSON 문법으로 key와 value 값을 넣어주고
200이라는 값이 나왔다.

 

package com.group.libraryapp.controller.calculator;

import com.group.libraryapp.dto.calcuator.request.CalcuatorMultiplyRequest;
import com.group.libraryapp.dto.calcuator.request.CalculatorAddRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class CalculatorController {

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

    @PostMapping("/multiply") //POST /multiply
    public int multiplyTwoNumbers(@RequestBody CalcuatorMultiplyRequest request) {
        return request.getNumber1() * request.getNumber2();
    }
}

위에 코드처럼 덧셈과 곱셈을 할수있는 Controller Class 처럼 여러 API를 추가할 수 있으며, @PostMapping("/multiply")은 

@GetMapping과 비슷하게 이 어노테이션아래에 오는 함수를 HTTP Method가 POST이고 Path가 /multiply인 API로 만든다.

 

@RequestBody는 HTTP Body로 들어오는 JSON을 CalculatorMultiplyRequest로 바꾸어준다.

🫵🫵🫵이 때 필드 이름과 PostMan에 들어갈 key값은 무조건 같아야 한다.

 

🧑‍💻GET CalculatorAddRequest에서는 생성자와 getter를 사용하고 지금만든 POST API에서는 getter만을 만들었는데

왜 GET API CalculatorAddRequest에서 number1 과 number2필드에 final키워드를 사용하였는가?

 

👉딱히 필요하지는 않지만 final 키워드를 필드에 붙이면 변경이 불가능하고, DTO는 최초 객체 생성 이후 필드가 변경될 일이 없기에 붙여주면 좋다.

 

🧑‍💻GET API CalculatorAddRequest에서 생성자를 없애면 값이 0으로 바인딩이 되는데 왜 그런가?

 

👉GET API에서 사용되는 DTO의 경우, POST와 달리 생성자를 통해 값이 바인딩 되기 때문인데, 만약 생성자가 없다면 API를 통해 들어온 쿼리가 바인딩 되는게 아니라, 기본값인 0이 필드에 들어가게 된다.

 

🧑‍💻POST API CalculatroMultiplyRequest에서는 왜 생성자가 없어도 값이 바인딩 되는것인가?

 

👉@RequestBody어노테이션 때문인데 POST API에서 사용되는 DTO의 경우, getter를 통해 값이 바인딩 되기 때문에 생성자가 없더라도 필드게 값을 넣을 수 있는데 @RequsetBody를 붙이게 되면 바인딩되는 로직이 GET API와는 달라지기 때문이다.

생성자가 있더라도 값이 바인딩되기는 한다.

 

 

'기록해보기' 카테고리의 다른 글

유저 조회 API 개발과 테스트  (0) 2023.06.02
유저 생성 API 개발  (0) 2023.06.01
GET API 개발하고 테스트  (0) 2023.05.28
네트워크란 무엇인가?  (0) 2023.05.28
@SpringBootApplication 과 서버  (0) 2023.05.27

댓글