본문 바로가기
Spring-Java/Spring

@RequestBody, @ResponseBody (feat.@ModelAttribute)

by 현대타운301 2023. 12. 18.

 

세 줄 요약

- @RequestBody, @ResponseBody 해당 어노테이션들은 비동기 통신에 사용됨

- 클라이언트 → 서버 : @RequestBody, 서버 → 클라이언트 : @ResponseBody

- @RequestBody와 @ModelAttribute는 서로 비슷해 보일 수 있지만 분명한 차이점 존재

 


 

동기 / 비동기 통신

 

출처:https://www.mendix.com/blog/asynchronous-vs-synchronous-programming/

 

 

동기(Synchronous) 통신

- 단일 스레드로 한 번에 하나의 작업이나 프로그램만 실행

- 차단(blocking) 방식 : 요청에 대한 서버의 응답이 있을 때까지 기다림

- 코딩하기 쉬움

- 느리지만 체계적

 

 

비동기(Asynchronous) 통신

- 다중 스레드로 여러 작업이나 프로그램이 병렬로 실행

- 비 차단(non-blocking) 방식 : 서버에 여러 요청을 보낼 수 있음

- 코딩하기 어려움

- 여러 작업이 동시에 실행되므로 처리량이 늘어남

 

 

" 웹 상에서 화면전환(새로고침)없이 이루어지는 동작들은

대부분 비동기 통신으로 이루어진다. "

 


 

@RequestBody

 

* Body?

: 요청이나 응답의 데이터가 담기는 본문. 비동기 통신에서는 보통 JSON 및 XML 형식의 데이터가 담김.

 

@RequestBody 인터페이스 해석

@RequestBody 인터페이스에 실린 설명
타겟이 파라미터인 것을 알 수 있음

 

메소드 매개변수를 나타내는 어노테이션으로 웹 요청(request)의 본문에 바인딩되어야 합니다.

요청 본문은 요청의 콘텐츠 유형에 따라 메서드 인수를 확인하기 위해 HttpMessageConverter를 통해 전달됩니다.

선택적으로 인수에 @Valid 어노테이션을 추가하여 자동 유효성 검사를 적용할 수 있습니다. "

 

 

정리 

클라이언트 → 서버 측으로 보내는 데이터에 붙이는 어노테이션으로, 매핑시킬 컨트롤러 메소드의 매개변수에 붙임

HTTP 요청 본문(JSON, XML 등)을 HttpMessageConverter를 통해 타입에 맞는 Java 오브젝트로 변환

     - 기본 문자 처리의 경우 : StringHttpMessageConverter

     - 기본 객체 처리의 경우 : MappingJackson2HttpMessageConverter

JSON 타입의 데이터를 보내는 경우엔 반드시 @RequestBody로 받아야 함

 


 

@ResponseBody

 

@ResponseBody 인터페이스 해석

@ResponseBody 인터페이스에 실린 설명
타겟이 타입 혹은 메소드임을 알 수 있음

 

" 웹 응답(response) 본문에 바인딩되어야 하는 메소드 리턴 값을 나타내는 어노테이션입니다.

메소드에 붙여 사용하거나, 버전 4.0 부터는 메소드 레벨이 아닌 타입 레벨에 붙여 사용할 수 있습니다.

타입 레벨에 붙인 경우 해당 어노테이션은 상속됩니다. "

 

 

* 타입 레벨(ElementType.Type)?

: class, interface(@interface 포함), enum 혹은 record 레벨을 의미

출처:https://stackoverflow.com/questions/73096757/what-is-type-level-annotation

 

 

정리

서버 → 클라이언트 측으로 보낼 때 사용하는 어노테이션으로, 매핑시킬 컨트롤러 메소드(혹은 클래스)에 붙임 

해당 어노테이션을 사용하면 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