1. @ResponseBody
스프링환경에서 개발을 진행하다보면 컨트롤러에서 @ResponseBody
를 사용하는일이 많습니다. @ResponseBody
를 사용하는것과 사용하지 않는것은 어떤차이점이 있을까요?
기본적으로 Spring은 MVC
환경에서 동작을 합니다. 이때 MVC의 동작을 간략하게 말씀드리겠습니다.
만약 사용자가 웹브라우저상에서 서버에게 localhost:8080/mvc
라는 경로로 요청을 진행한다고 가정하겠습니다.
이때 Spring 내부의 내장 톰캣 서버
가 해당 요청을 받아 들여 스프링 컨테이너는 해당 요청을 가지고 있는 @Controller
어노테이션이 붙여진 컨트롤러를 찾아주게됩니다.
@Controller
1 | /* |
@Component
1 | /* |
해당 컨트롤러를 타고 들어가면 다음과 같은 구조를 볼 수 있습니다. 자세히 살펴보시면 @Component
어노테이션을 살펴보실 수 있습니다. 과연 이것의 어노테이션의 역할은 무엇일까요?
즉, 기존의 Spring에서는 @Bean
을 붙여 빈을 등록하던 것처럼 빈 클래스에 @Component
애노테이션을 붙여 빈을 등록할 수 있습니다. 따라서 @Controller
어노테이션 내부에는 해당 컨트롤러를 @Bean
으로 등록하는 역할도 하고 있다는 뜻입니다.
@Component를 붙여 빈을 등록하면 클래스 이름의 첫 문자를 소문자로 바꾼 것이 빈의 이름(id)이 됩니다. 그리고 빈 객체가 생성되는 시점은 ApplicationContext 객체가 생성되는 시점이며 기본적으로 singleton scope 입니다.
localhost:8080/mvc
의 요청경로에 맞는 컨트롤러를 @Bean 컴포넌트 스캔을 통하여 해당 경로를 가지고 있는 컨트롤러를 찾아주게 됩니다. 만약 @ResponseBody
가 붙여져 있지 않다면 해당 모델에 값을 넘겨줄 수도 있고, String을 반환하게 되면 데이터를 넘겨주는것이 아니라 해당 View의 Path값에 맞게 모델값과 함께 반환시켜주게 됩니다.
간단한 예제로는
1 |
|
형식을 들 수 있습니다. 모델값을 가져와 거기에 <Key,value>
형식으로 값을 넣어주고 반환값을 String으로 한 'root' View Path
를 반환시켜주게 됩니다. 즉, 컨트롤러에서 리턴 값으로 문자를 반환하면 뷰 리졸버( viewResolver )
가 화면을 찾아서 처리를 진행합니다.
@ResponseBody를 붙여주면 무슨일이 발생할까요?
@ResponseBody
의 역할은 HTTP BODY
문자내용을 반환하는 api
라고 할 수 있습니다. 즉, 기존에 @ResponseBody
가 없는 경우에 viewResolver
대신에 httpMessageConverter
가 동작하여 문자일 경우에는 StringHttpMessageConverter
객체일 경우에는 MappingJackson2HttpMessageConverter
로 이루어져있습니다. 클라이언트의 HTTP Accept헤더와 서버 컨트롤러의 반환 타입 정보 둘을 조합해서 HttpMessageConverter가 동작되게 됩니다. 기본으로 동작되는 데이터반환형식은 Default JSON형식으로 동작되게 됩니다.
1 |
|