Programming/Spring

[Spring] POST API 사용하기

코끼리 개발자 2022. 12. 6. 15:38
728x90
SMALL

Post API는 CURD 중 C(Create)의 역할을 수행하게 된다.

즉, 리소스의 생성 및 추가를 위해 사용하는 것이다. 

또한 DataBody에 데이터를 담아서 보내고, 생성 된 데이터를 전달받기 때문에 QueryParameter를 사용할 수는 있지만

보통은 사용하지 않는다.

 

[POST와 PUT의 차이]

Post는 매번 생성하고, Put은 없으면 생성하고 있으면 업데이트를 한다는 점에서 차이를 드러낸다.

이러한 역할의 차이 때문에 Post는 멱등성이 없고, Put은 멱등성을 가지고 있다. 

 

Post API를 사용하기에 앞서,

주로 web에서 데이터를 주고 받을 때 xml이나 Json 형태로 주고 받는데,

거의 대부분은 Json를 사용한다.

Json의 형태는 다음과 같다.

{
     "key" : "value",
     "account" : {
     "email" : "elephant@gamil.com",
     "name": "elephant"
     }
}

 

Json에서 받는 데이터 형태는 다음과 같다.

string : value

number : value

boolean: value 

object: value -> { }의 형태로 나타냄

array: value -> [ ]의 형태로 나타냄, 같은 값의 반복일 때 사용함

array ex) 

{
	"user_list" : [
		{
			"email" : "elephant@gamil.com",
			"name": "elephant"
		},
		{
			"email" : "dog@gamil.com",
			"name": "dog"
		}
	]
}

 

 

@PostMapping("path") 

: 이 Annotation은 @RequestMapping(path = " ", method = RequestMethod.POST)와 동일한 기능을 한다.

리소스를 생성하기 위한 Post 작업의 Path를 이 Annotation에 매핑해주면 된다.

데이터를 보낼 때 파라미터를 @RequestBody Annotation을 사용하여 작성 해야 한다.

파라미터를 두 가지 형식으로 지정하여 RequestBody를 사용 해 보았다.

 

1. Map을 이용하여 임의대로 파라미터를 받아 처리하는 경우.

: 데이터를 전달 받을 때 Json 형태로 전달되는 key value값을 Map으로 받아 파싱할 수 있다.

@RequestBody Annotation을 사용하여 Map 파라미터를 지정해 주면 된다.

<예시>

    @PostMapping("/post-api")
    public void postApi(@RequestBody Map<String, Object> requestData){
        requestData.forEach((key, value) -> {
            System.out.println("key : " + key);
            System.out.println("value : " + value);
        });
    }

 

2.Class로 지정된 key값으로 파라미터를 받아 처리하는 경우.

:데이터를 전달 받을 때 Json 형태로 전달되는 key값을 class에 선언 된 변수와 매칭시켜 파싱이 가능하다.

Json의 키 값은 보통 snake case라고 해서 단어와 단어 사이를 _로 잇는 형태를 많이 사용하는데,

Java에서는 단어와 단어사이를 대문자로 구분하는 camel case를 많이 사용한다. 이러한 경우에 데이터 파싱이 가능하도록

@JasonProperty("name") Annotation을 사용할 수 있다.

<PostRequestUser class 코드>

import com.fasterxml.jackson.annotation.JsonProperty;

public class PostRequestUser {
    private String account;
    private String address;
    private String password;

    @JsonProperty("phone_number")
    private String phoneNumber;

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "PostRequestUser{" +
                "account='" + account + '\'' +
                ", address='" + address + '\'' +
                ", password='" + password + '\'' +
                ", phoneNumber='" + phoneNumber + '\'' +
                '}';
    }
}

<PostRequestUser Class를 이용한 Post예시>

  @PostMapping("/request")
    public void request(@RequestBody PostRequestUser requestData){
        System.out.println(requestData);
    }

 

 

Post API를 만들고 실행 테스트는

Talend API를 이용하여 할 수 있다.

 

 

 

<전체 실습 코드>

import com.example.erpsystem.dto.PostRequestUser;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.awt.*;
import java.util.Map;

@RestController
@RequestMapping("/post")
public class PostApiController {

    @PostMapping("/post-api")
    public void postApi(@RequestBody Map<String, Object> requestData){
        requestData.forEach((key, value) -> {
            System.out.println("key : " + key);
            System.out.println("value : " + value);
        });
    }

    @PostMapping("/request")
    public void request(@RequestBody PostRequestUser requestData){
        System.out.println(requestData);
    }
}
728x90
LIST