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 |
|