코딩항해기

[Spring] 비동기 Controller 구현 (ResponseBody, RequestBody, RestController) 본문

Spring

[Spring] 비동기 Controller 구현 (ResponseBody, RequestBody, RestController)

miniBcake 2024. 10. 14. 14:42

 

@ResponseBody 응답 본문

Spring에서는 경로를 return하면 ViewResolver가 개입해 해당 값을 완성시켜 이동하는 방식을 취하고 있다. 그러나 비동기 통신의 경우 페이지 이동이 없기 때문에 ViewResolver에게 해당 return은 페이지 이동이 아니라 값 전달을 위한 값 반환이라는 사실을 알려줄 필요가 있다. 

@RequestMapping("요청")
public @ResponseBody 리턴타입 메서드명(인자){
	return 전달할 데이터;
}

 

그 때 ResponseBody 어노테이션이 사용되며 접근제한자와 리턴타입 사이에 위치한다. 해당 어노테이션이 있는 메서드는 ViewResolver가 개입하지 않는다.

 

자바 객체를 HTTP 요청의 바디 내용으로 매핑해 전달하며 해당 어노테이션이 있다면 HTTP 요청의 미디어 타입과 파라미터 타입을 먼저 확인한다. dispatcher-servlet.xml의 annotation-drivien 태그 내에 선언하는 message-converter에서 확인할 수 있다.

 

https://cheershennah.tistory.com/179

메세지 변환기 중에서 해당 미디어 타입과 파라미터 타입을 처리할 수 있다면, HTTP 요청의 본문 부분을 변환해 지정된 메서드 파라미터로 전달한다. 즉, HTTP 요청을 자바 객체로 전달 받을 수 있다.

 

@ReqeustBody 요청 본문

일반적인 GET/POST 요청의 파라미터에서는 해당 태그를 사용할 일 없지만 JSON파일이나 xml이라면 RequestBody에 담긴 값을 자바객체로 변환시킬 필요가 있다. 즉, ajax로 받아오는 값이 json이어서 contentType이 application.json일 때 사용된다. 이 때 HttpMessageConverter을 사용해 HTTP 요청의 본문 body부분을 통으로 자바객체로 변환해 매핑된 파라미터로 전달한다. RequestMappingHandlerAdpter 에는 HttpMessageConverter 타입의 메세지 변환기가 여러 개 등록되어 있다.

@RequestMapping("요청")
public @ResponseBody 리턴타입 메서드명(@RequestBody 인자){
	return 전달할 데이터;
}

 

 

 

@RestController

SpringBoot에서 만들어진 어노테이션으로 @Controller와는 다르게 @RestController는 리턴값에 자동으로 @ResponseBody가 붙게되어 별도 어노테이션을 명시해주지 않아도 HTTP 응답데이터(body)에 자바 객체가 매핑되어 전달된다. 이 어노테이션을 가진 Controller의 메서드들은 전부 비동기 처리를 위한 메서드임을 안내하는 것이다.


@Controller인 경우에 바디를 자바객체로 받기 위해서는 @ResponseBody 어노테이션을 반드시 명시해야하며 두 어노테이션 모두 기입해도 오류가 발생하지 않는다.