반응형
준비
해당 포스팅의 제목이 이렇게 붙여진 이유는...
내가 그런 실수를 저질렀기 때문이다. ㅠㅠ
그래서 나의 바보짓을 공개적인 곳에 올리면서 제대로 기억할 겸 포스팅한다.
@RequestBody
애노테이션은 한마디로 HttpRequestBody를 Java객체로 매핑해주는 애노테이션이다.
덕분에 API 요청으로 전송받은 JSON 데이터를 (우리가 따로 조작하지 않고도) 객체로 변환해서 받을 수 있게 된다.
'@RequestBody'가 뭐지?
애노테이션 이름이 말해주는 그대로, 요청(Request)의 Body를 연결해주는 역할을 한다.
웹 요청의 body에는 json 형태로 데이터가 전달되는데,
컨트롤러 메서드의 매개변수 앞에 애노테이션 @RequestBody
를 붙이면 해당 객체가 웹 요청의 body와 매핑되도록 한다.
요청의 body 객체(HttpRequestBody)는 HttpMessageConverter
를 통해서 전달되고 요청의 body로 담겨오는 json 형태를 메서드 인자로 변환을 시켜주는 것이다.
추가적으로, @Valid
애노테이션을 함께 붙여서 해당 인자(argument)에 대해 자동으로 유효성 검증을 할 수 있다.
구현 모습
/*
Annotation indicating a method parameter should be bound to the body of the web request.
The body of the request is passed through an HttpMessageConverter to resolve the method argument
depending on the content type of the request. Optionally, automatic validation can be applied by
annotating the argument with @Valid.
Supported for annotated handler methods.
*/
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestBody {
/**
* Whether body content is required.
* <p>Default is {@code true}, leading to an exception thrown in case
* there is no body content. Switch this to {@code false} if you prefer
* {@code null} to be passed when the body content is {@code null}.
* @since 3.2
*/
boolean required() default true;
}
required 옵션은 디폴트가 true인데, body content가 없어도 되는 경우엔 false로 설정한다.
추가로 주의해야할 점
- 요청의 body로 전달된 json 형태의 content를 특정 엔티티로 변환시킬 때는 Getter 메서드를 통해 각 필드에 접근하고, Setter 메서드를 통해 필드들을 세팅하기 때문에 getter와 setter 모두 필요하다. 예) getUsername(), getPassword()
- Jackson 라이브러리의 정해진 규칙에 의해 g(s)etter 메서드명이 수정되므로 주의해야한다.
반응형
'백엔드 개발하며 작성한 > Spring' 카테고리의 다른 글
Spring Framework와 Spring Boot (0) | 2022.08.01 |
---|---|
@Component에 대해 (@Bean) (0) | 2022.07.26 |
Spring Boot에서 Connection Pool 이용하기 (HikariCP) (0) | 2022.04.10 |
Filter와 OncePerRequestFilter (0) | 2022.02.22 |
Spring MVC Request Lifecycle (0) | 2022.02.16 |