티스토리 뷰

Spring으로 Rest Api를 개발할때 클라이언트와 데이터를 JSON으로 주고받고 하는데 이때 사용되는 어노테이션중 하나가 @RequestBody이다. 클라이언트측에서 요청데이터를 body에 담고 content-type을 application/json으로 설정

해줘야 동작된다. 이제 그 방식을 알아보자

Request DTO 생성 및 스크립트 파일작성

클라이언트에서 POST 방식으로 요청데이터를 JSON으로 직렬화 한 후 content-Type을 application/json지정하여 요청한다. 서버에서는 해당 데이터를 받아드릴 RequestDTO 객체를 생성한다.

Controller 작성

Post요청을 받는 메서드를 작성한뒤 매개변수에 RequestDTO 객체를 인자로 받는다. 이때 @RequestBody를 선언한다.

동작방식

HandlerMethodArgumentResolver 인터페이스의 구현체중

HandlerMethodArgumentResolverComposite 클래스에서 resolveArgment() 메서드를 호출하고 내부에서  getArgumentResolver() 메서드를 호출하여  RequestResponseBodyMethodProcessor 타입의 인스턴스를 반환한다.

 

HandlerMethodArgumentResolver 인터페이스를 구현한 모든 클래스들의 갯수만큼 순회하여 supportsParameter() 메서드를 호출한다

 

메서드 파라미터에 @RequestBody 어노테이션이 선언되있는지 체크 하여 선언이 된 MethodProcessor를 반환하는데 여기서는 RequestResponseBodyMethodProcessor의 인스턴스가 반환된다.

 

RequestResponseBodyMethodProcessor 인스턴스의 resolveArgument() 메서드를 호출한다.

 

resolveArgument() 메서드 호출시 부모클래스인 AbstractMessageConverterMethodArgumentResolver 클래스의 readWithMessageConverters() 메서드가 호출된다.

 

body를 읽어드릴 Converter를 지정해주는데 해당 Student 타입의 클래스를  MappingJackson2HttpMessageConverter 클래스 가 읽어드리도록 설정해준다.



여기서 MappingJackson2HttpMessageConverter.read() 메서드를 호출후 AbstractJackson2HttpMessageConverter의 read() 메서드가 호출된다.



그리고 MappingJackson2HttpMessageConverter 클래스는 application/json요청이 들어올때 동작하도록 설계되있다.

 

read() 메서드는 readJavaType() 메서드를 호출하는데 내부적으로 ObjectMapper의 readValue() 메서드를 통해

body의 내용을 읽어드려 json key값들을 해당타입의 필드에 바인딩을 시켜준다.

 

그리고 body를 리턴한다.


참고

Stduent 클래스를 확인해보면 @Getter만 선언이 되있는데 @Setter가 필요없는 이유는 아래사진과 같다.

 

요약하자면 getter 또는 setter 메서드의 'get', 'set' 부분을 때어내고 앞의 영문을 소문자로 바꿔서 body에 들어온
key와 같을때 매핑한다고 한다.
참고자료

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함