세 줄 요약
- @RequestBody, @ResponseBody 해당 어노테이션들은 비동기 통신에 사용됨
- 클라이언트 → 서버 : @RequestBody, 서버 → 클라이언트 : @ResponseBody
- @RequestBody와 @ModelAttribute는 서로 비슷해 보일 수 있지만 분명한 차이점 존재
동기 / 비동기 통신
동기(Synchronous) 통신
- 단일 스레드로 한 번에 하나의 작업이나 프로그램만 실행
- 차단(blocking) 방식 : 요청에 대한 서버의 응답이 있을 때까지 기다림
- 코딩하기 쉬움
- 느리지만 체계적
비동기(Asynchronous) 통신
- 다중 스레드로 여러 작업이나 프로그램이 병렬로 실행
- 비 차단(non-blocking) 방식 : 서버에 여러 요청을 보낼 수 있음
- 코딩하기 어려움
- 여러 작업이 동시에 실행되므로 처리량이 늘어남
" 웹 상에서 화면전환(새로고침)없이 이루어지는 동작들은
대부분 비동기 통신으로 이루어진다. "
@RequestBody
* Body?
: 요청이나 응답의 데이터가 담기는 본문. 비동기 통신에서는 보통 JSON 및 XML 형식의 데이터가 담김.
@RequestBody 인터페이스 해석
" 메소드 매개변수를 나타내는 어노테이션으로 웹 요청(request)의 본문에 바인딩되어야 합니다.
요청 본문은 요청의 콘텐츠 유형에 따라 메서드 인수를 확인하기 위해 HttpMessageConverter를 통해 전달됩니다.
선택적으로 인수에 @Valid 어노테이션을 추가하여 자동 유효성 검사를 적용할 수 있습니다. "
정리
클라이언트 → 서버 측으로 보내는 데이터에 붙이는 어노테이션으로, 매핑시킬 컨트롤러 메소드의 매개변수에 붙임
HTTP 요청 본문(JSON, XML 등)을 HttpMessageConverter를 통해 타입에 맞는 Java 오브젝트로 변환
- 기본 문자 처리의 경우 : StringHttpMessageConverter
- 기본 객체 처리의 경우 : MappingJackson2HttpMessageConverter
JSON 타입의 데이터를 보내는 경우엔 반드시 @RequestBody로 받아야 함
@ResponseBody
@ResponseBody 인터페이스 해석
" 웹 응답(response) 본문에 바인딩되어야 하는 메소드 리턴 값을 나타내는 어노테이션입니다.
메소드에 붙여 사용하거나, 버전 4.0 부터는 메소드 레벨이 아닌 타입 레벨에 붙여 사용할 수 있습니다.
타입 레벨에 붙인 경우 해당 어노테이션은 상속됩니다. "
* 타입 레벨(ElementType.Type)?
: class, interface(@interface 포함), enum 혹은 record 레벨을 의미
정리
서버 → 클라이언트 측으로 보낼 때 사용하는 어노테이션으로, 매핑시킬 컨트롤러 메소드(혹은 클래스)에 붙임
해당 어노테이션을 사용하면 ViewResolver 대신 HttpMessageConverter가 동작
Java 오브젝트를 타입에 맞게 변환(JSON, XML 등) 후 HTTP 응답 본문에 전달
@RequestBody와 @ModelAttribute 차이?
공통점
클라이언트 측에서 보낸 데이터를 Java 오브젝트로 변환
차이점
@RequestBody : HttpMessageConverter를 통해 파싱된 HTTP 요청 본문이 Java 객체로 변환
@ModelAttribute : HTTP 파라미터 테이터를 Java 객체에 매핑 (단, 쿼리 String 및 Form 형식이 아닌 데이터는 처리 불가)
* refs
https://cheershennah.tistory.com/179
https://tjdwns4537.tistory.com/48
https://www.mendix.com/blog/asynchronous-vs-synchronous-programming/
https://tecoble.techcourse.co.kr/post/2021-05-11-requestbody-modelattribute/
https://stackoverflow.com/questions/73096757/what-is-type-level-annotation
'Spring-Java > Spring' 카테고리의 다른 글
@Valid, @Validated (0) | 2024.04.25 |
---|---|
@RequiredArgsConstructor (1) | 2023.12.21 |
@RequestParam (feat.@ResponseBody) (0) | 2023.12.15 |
Day55_HTTP 요청/응답 사이클 (1) | 2023.12.14 |
Day53_Spring Legacy Project 설정 (0) | 2023.12.14 |