Rlog

Spring Request Body Binding 파헤쳐보기 본문

Web

Spring Request Body Binding 파헤쳐보기

dev_roach 2022. 1. 2. 10:11
728x90

스프링에서는 리퀘스트로 올리는 문자열을 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 를 이용한다는걸 깨달았다.

더 잘 사용하려면 아래 문서를 보고 좀 학습해보자.

 

http://tutorials.jenkov.com/java-json/jackson-objectmapper.html#how-jackson-objectmapper-matches-json-fields-to-java-fields

 

'Web' 카테고리의 다른 글

Postman 헤더로 세션 로그인하기  (0) 2021.12.28
OpenAPI 3.0  (0) 2021.11.12