@RequestBody vs @RequestParam
@PostMapping("/post")
public void post(@RequestBody Map<String, Object> requestData) {
requestData.forEach((key, value) -> {
System.out.println("key = " + key);
System.out.println("value = " + value);
});
}
@PostMapping("/post2")
public void post2(@RequestBody PostRequestDto requestData) {
System.out.println(requestData);
}
post api는 get api와는 다르게 @RequestBody 어노테이션을 사용하여 body로 보내진 JSON 데이터를 읽습니다.
@RequestBody 어노테이션은 dto로 받은 파라미터뿐만 아니라 다른 데이터 타입에도 기술해야합니다.
cf) get api는 @RequestParam 어노테이션을 사용합니다.
@PathVariable
get api의 @Pathvariable과 마찬가지로 동일한 방식으로 사용하면 됩니다.
가변 변수를 사용하고 싶은 경우 URI에 가변 변수명을 선언하고 api 메소드 인자에서 @Pathvariable 어노테이션을 붙여서 사용하면됩니다.
자세한 내용은 get api의 @Pathvariable 참조
https://getthismoment.tistory.com/64
@JsonProperty
// PostRequestDto.java
public class PostRequestDto {
private String account;
private String email;
private String address;
private String password;
@JsonProperty("phone_number")
private String phoneNumber;
...
}
스프링부트는 디폴트로 카멜 케이스로 파라미터를 읽습니다.
phone_number와 같이 스네이크 케이스로 파라미터를 보낼 경우 null로 인식됩니다.
카멜 케이스 이외의 형식으로 파라미터를 보내고 싶거나 특정 문자로 파라미터를 읽고 싶은 경우에 @JsonProperty 어노테이션을 사용하면 됩니다.
@JsonNaming
@JsonProperty 어노테이션처럼 속성에 하나하나 파라미터를 어떻게 받을지를 지정할 수 있지만,
DTO클래스 전체어 어떤 파라미터를 받을지 지정할 수 있습니다.
// PostRequestDto.java
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class PostRequestDto {
private String account;
private String email;
private String address;
private String password;
private String phoneNumber;
...
}
DTO클래스 위에 @JsonNaming 에노테이션을 기술하고 name 속성을 지정하면 됩니다.
value = PropertyNamingStrategy.SnakeCaseStrategy.class는 모든 속성에 스네이크 케이스를 허용하겠다는 설정입니다.
@JsonProperty 어노테이션과 비교하면, @JsonProperty은 특수한 목적으로 특정 속성만 파라미터를 어떻게 받을 것인지 설정할 수 있습니다.
반면 @JsonNaming 에노테이션은 클래스 안에 있는 속성 전부가 어떤 파라미터를 받을 것인지 설정할 수 있습니다.
'Java' 카테고리의 다른 글
java - ObjectMapper (0) | 2021.08.29 |
---|---|
java - PUT API (0) | 2021.08.26 |
java - GET API (0) | 2021.08.26 |
java - api 프로젝트 만들기 (0) | 2021.08.25 |
java - 전략 패턴(행위 패턴) (0) | 2021.08.24 |
댓글