스프링에서는 리퀘스트로 올리는 문자열을 Enum 으로 바꾸는 등 자동으로 값을 변환해주는 기능을 가지고 있다.
예를 들면 @RequestBody 라던가 @RequestParam 처럼 문자열 값을 가져와서 우리가 지정한 타입으로 바꿔준다.
코드로 보면 설명이 더욱 명확하다.
data class User(
val name: String,
val password: String,
val role: Role
)
@PostMapping("/test")
fun test(@RequestBody user: User): String {
log.info(user.toString());
return "Hello"
}
간단하게 테스트를 하기위해 작성된 코드임을 알수 있다.
일단 Server 에 아래 JSON 을 한번 전달해보자.
{
"name" : "roach",
"password": "pwd",
"role": "ADMIN"
}
일단 우리가 @RequestBody 든 @RequestParam 을 썼던, 이 어노테이션을 처리하기 위한 핸들러가 존재한다.
Argument Resolver
위와 같이 HandlerMethodArgumentResolverComposite 타입의 Resolver 들이 여러개가 존재하는데
이녀석들은 그냥 간단하게
이 중 우리가 궁금한 것은 RequestBody 를 처리해주는 녀석이다.
이 RequestBody 를 처리해주는 녀석을 찾기 위해서는 계속해서 디버깅을 해서 들어가다보면 아래와 같은 코드를 맞이한다.
쉽게 보면 내 Parameter 를 Resolve 해줄수 있는 녀석을 get 하자 라는 것으로 보인다.
그래서 result 로 나온것을 보면 RequestResponseBodyMethodProcessor 가 나오는 걸 확인할 수 있다.
그래서 결국 이 Resolver 들의 resolveArgument 메소드를 통해서 Parameter 를 해석한다.
결국 AbstractJackson2HttpMessageConvetor 에서 objectMapper 의 readValue Method 를 통해서 javaType 으로 치환해주는 모습을 볼 수 있다.
결국 RequestBody 값을 읽어오는 방식은 ObjectMapper 를 이용한다는걸 깨달았다.
더 잘 사용하려면 아래 문서를 보고 좀 학습해보자.
'Web' 카테고리의 다른 글
Postman 헤더로 세션 로그인하기 (0) | 2021.12.28 |
---|---|
OpenAPI 3.0 (0) | 2021.11.12 |