Spring 에서 컨트롤러를 지정해주기 위한 어노테이션은 @Controller 와 @RestController 가 있습니다.
일반적인 Spring MVC의 컨트롤러인 @Controller 와 Restful 방식의 컨트롤러인 @RestController 의
주요한 차이점은 HTTP Response Body가 생성되는 방식이다.
@Controller 와 @RestController 는 용도의 차이라고 생각하면 된다.
옛날에는 jsp 나 html 과 같이 view에 데이터를 담아 전달했기 때문에 @Controller를 사용했다.
하지만 최근에는 백엔드와 프론트엔드를 분리하면서 백엔드쪽에선 Rest API를 통해 Json 데이터만 전달하고
프론트엔드는 백엔드에서 넘어온 Json 데이터를 화면에 보여주는 방식이기 때문에 @ResponseBody 어노테이션이
자동으로 붙는 @RestController 를 사용하게 됐다.
자세한 설명은 아래와 같다.
@Controller
1. @Controller 어노테이션 사용하여 View 전달
일반적인 Spring MVC의 컨트롤러인 @Controller 어노테이션은 주로 가공된 데이터와 함께 View를 전달하기 위해
사용한다. View 와 함께 데이터를 전달하기 위해선 Model 객체를 사용한다.
1. 사용자가 요청이 들어오고 Front Controller 인 Dispatcher Servlet이 모든 요청을 받는다.
2. 요청받은 Dispatcher Servlet은 적절한 Controller 에게 요청을 넘길 Handler Mapping 에게 요청을 넘긴다.
3. 요청받은 Handler Mapping 은 요청에 대한 적절한 Controller 에게 요청을 전달한다.
4. Controller 는 요청한 내용에 따라 적절한 Service 에게 요청을 넘긴다.
5. Service 는 비즈니스 로직을 수행한 후 가공된 데이터를 다시 Controller 에게 넘긴다.
6. Controller 는 View Name 과 함께 가공된 데이터를 담아 반환한다.
7,8,9. DispatcherServlet은 Controller 로부터 넘어온 View Name을 ViewResolver를 통해 해당하는 View를 사용자에게
반환한다.
@Controller
public class TestController {
@RequestMapping(value="/test/view")
public String returnView(Model model){
model.addAttribute("test_data", 123);
return "/test/viewTest";
}
}
위와 같이 Controller 는 데이터와 함께 View를 반환하기 위해 Model 객체를 사용했다.
2. @Controller 어노테이션을 사용하여 Json 데이터 반환하기
@Controller 어노테이션을 사용하면서 Json 데이터를 반환 해야할 때가 있다. 이때 사용하는게 @ResponseBody
어노테이션을 사용한다. @ResponseBody 어노테이션을 붙여줄 경우 View 를 반환하는게 아닌 Josn 형태로 데이터를
반환한다.
1. 사용자가 요청이 들어오고 Front Controller 인 Dispatcher Servlet이 모든 요청을 받는다.
2. 요청받은 Dispatcher Servlet은 적절한 Controller 에게 요청을 넘길 Handler Mapping 에게 요청을 넘긴다.
3. 요청받은 Handler Mapping 은 요청에 대한 적절한 Controller 에게 요청을 전달한다.
4. Controller 는 요청한 내용에 따라 적절한 Service 에게 요청을 넘긴다.
5. Service 는 비즈니스 로직을 수행한 후 가공된 데이터를 다시 Controller 에게 넘긴다.
6. Controller 는 가공된 데이터를 HTTP Body에 담아 반환한다.
7. 반환되는 데이터는 Json 형태의 데이터다.
@Controller
public class TestController {
@RequestMapping(value="/test/view")
@ResponseBody
public Map<String, Obect> returnView(){
Map<String, Object> map = new Map<String, Object>();
map.put("test_data", 123);
return map;
}
}
@RestController
1. @RestController 어노테이션을 사용하여 Json 데이터 반환하기
@RestController 는 @Controller 어노테이션에 @ResponseBody 가 추가된 것입니다.
위와같이 @ResponseBody 어노테이션이 자동으로 입력되기 때문에 반환되는 데이터는 Json 형태의 데이터입니다.
@RestController
public class TestController {
@RequestMapping(value="/test/view")
public Map<String, Obect> returnView(){
Map<String, Object> map = new Map<String, Object>();
map.put("test_data", 123);
return map;
}
}
위와 같이 RestController를 설정 해줄경우 @ResponseBody를 쓰지않아도 자동등록 되기 때문에 Json 형태로 데이터
반환이 가능합니다.
2. @RestController 어노테이션을 사용하면서 View 와 함께 데이터 넘기기
@RestController 어노테이션을 사용하면서 View 를 넘기고 싶을땐 ModelAndView 를 사용한다.
@RestController
public class TestController {
@RequestMapping(value="/test/view")
public ModelAndView returnView(){
ModelAndView mav = new ModelAndView();
mav.setViewName("/test/viewTest");
mav.addObject("test_data", 123);
return mav;
}
}
위와 같이 ModelAndView 를 통해 @RestController 어노테이션을 사용하면서 View 및 데이터를 넘길 수 있다.