[스프링] 5. API를 작성하는 다양한 방법(POST)

PYOUNANI·2023년 10월 30일
0

Spring

목록 보기
6/31
post-thumbnail
📢 장정우님이 지음, 
[스프링부트 핵심가이드 : 스프링 부트를 활용한 애플리케이션 개발 실무] 책을 읽고 정리한 글입니다.

POST API 만들기

POST API는 웹 애플리케이션을 통해 데이터베이스 등의 저장소에 리소스를 저장할 때 사용되는 API이다. 앞에서 살펴본 GET API에서는 URL의 경로나 파라미터에 변수를 넣어 요청을 보냈지만 POST API에서는 저장하고자 하는 리소스나 값을 HTTP 바디(body)에 담아 서버에 전달한다. 그래서 URI가 GET API에 비해 간단하다.

POST API를 만들기 위해 우선 아래와 같이 PostController라는 이름의 컨트롤러 클래스를 생성하고 @RequestMapping 어노테이션을 이용해 공통 URL을 설정한다.

package com.example.corner.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/v1/post-api")
public class PostController {
}

@RequestMapping으로 구현하기

POST API에서 @RequestMapping을 사용하는 방법은 GET API 와 크게 다르지 않다. 요청 처리 메서드를 정의할 때 아래처럼 method 요소를 RequestMethod.POST로 설정하는 부분을 제외하면 GET API와 동일하다.

 @RequestMapping(value = "/domain", method = RequestMethod.POST)
    public String postExample(){
        return "Hello Post API";
    }

@RequestBody를 활용한 POST 메서드 구현

위 에서는 별도의 리소스를 받지 않고 단지 POST 요청만 받는 메서드를 구현했다. 일반적으로 POST 형식의 요청은 클라이언트가 서버에 리소스를 저장하는 데 사용한다. 그러므로 클라이언트의 요청 트래픽에 값이 포함돼 있다. 즉, POST 요청에서는 리소스를 담기 위해 HTTP Body에 값을 넣어 전송한다.

Body 영역에 작성되는 값은 일정한 형태를 취한다. 일반적으로 JSON(JavaScript Object Notation) 형식으로 전송되며, 이 책에서도 가장 대중적으로 사용되는 JSON 형식으로 값을 주고받을 계정이다. 이렇게 서버에 들어온 요청은 아래와 같이 처리할 수 있다.

//http://localhost:8080/api/v1/post-api/member
    @PostMapping(value = "/member")
    public String postMember(@RequestBody Map<String, Object> postData){
        StringBuilder sb = new StringBuilder();

        postData.entrySet().forEach(map -> {
            sb.append(map.getKey() + " : " + map.getValue() + "\n");
        });
        return sb.toString();
    }
    

@RequestMapping 대신 @PostMapping을 사용했다. 이 어노테이션을 사용하며 method 요소를 정의하지 않아도 된다.
그리고 @RequestBody라는 어노테이션을 사용했는데 ,@RequestBody는 HTTP의 Body 내용을 해당 어노테이션이 지정된 객체에 매핑하는 역할을 한다.

Map 객체는 요청을 통해 어떤 값이 들어오게 될지 특정하기 어려울 때 주로 사용한다. 요청 메시지에 들어갈 값이 정해져 있다면 아래와 같이 DTO 객체를 매개변수로 삼아 작성할 수 있다.

// http://localhost:8080/api/v1/post-api/member2
    @PostMapping(value = "/member2")
    public String postMemberDto(@RequestBody MemberDto memberDto){
        return memberDto.toString();
    }

0개의 댓글