Spring/Spring 입문

4. POST API

개발자잡 2022. 6. 29. 23:37

WEB에서는 json이나 xml 형태로 주고 받는다. 최근에는 json을 많이 쓴다.

 

JSon 데이터 종류

String : value

number : value

boolean : value { }

object : value

array : value [ ]

 

phone_number => 이런식으로 단어를 연결 할 때  _ 붙이는 것을 스네이크 케이스

phoneNumber => 이런식으로 단어를 하는 것은 카멜 케이스(낙타봉 형태)

 

Post일때 @RequestBody를 꼭 붙여주자

 

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

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

    }
}

정상 작동 한다.

 

값을 받아 줄 수 있도록 DTO 작성해보자.

 

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

    @PostMapping("/post")
    public void post(@RequestBody PostRequestDto requestData) {
        System.out.println(requestData);
        
    }
}
public class PostRequestDto {

    private String account;
    private String email;
    private String address;
    private String password;

    public String getAccount() {
        return account;
    }

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

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    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 "PostRequestDto{" +
                "account='" + account + '\'' +
                ", email='" + email + '\'' +
                ", address='" + address + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

 

PostRequestDto{account='user01', email='steve@gmail.com', address='Seoul', password='abcd'}

정상 작동 된다.

 

자바에서는 카멜 케이스로 작성했는데 보내는 쪽에서는 스네이크 케이스로 작성될 때 오류가 날 수 있다.

EX)

private String phoneNumber; // phone_number

PostRequestDto{account='user01', email='steve@gmail.com', address='Seoul', password='abcd', phoneNumber='null'}

 

null이 들어간다.

text data가 object로 바뀌어서 전송되기 때문에 따로 이름을 지정해주지 않으면 스네이크 케이스를 찾아가기 때문에 못찾는다.

 

해결하기 위한 여러가지 방법이 있다.

1. @JsonProperty

@JsonProperty("phone_number")
private String phoneNumber; // phone_number

변수에 일일히 달아줘야 하는 불편함이 있지만 값을 받게 해준다.

PostRequestDto{account='user01', email='steve@gmail.com', address='Seoul', password='abcd', phoneNumber='010-1234-1234'}

phoneNumber가 제대로 입력된다.

 

실제 개발하다보면 이도저도 아닌 케이스가 있다

ex) OTP

카멜케이스도 아니고 스네이크도 케이스도 아닐 때는 @JsonProperty라는 어노테이션을 붙여줘 매칭을 해주는것이 좋다.

 

정리) 

@RequestBody 라는 어노테이션으로 Json body를 파싱할 수 있고 반드시 객체를 하나 정의해서 기본은 카멜 케이스로 하고 @JsonProperty로 스네이크 케이스를 파싱해 준다. 

두 케이스 다 아닐때에도 @JsonProperty로 파싱해준다.