웹 개발

[Spring] @Controller와 @RestController 차이

노루아부지 2021. 7. 31. 20:39

Spring Web Project 개발 시 반드시 Controller가 필요합니다.

일반적으로 Spring 책으로 공부를 하다 보면 Controller에는 @Controller 애노테이션을 사용하는데요

 

@Controller

 

전통적인 Spring MVC의 컨트롤러인 @Controller는 주로 View를 반환하기 위해 사용합니다.

@Controller가 View를 반환하기 위해서는 ViewResolver가 사용되며, ViewResolver 설정에 맞게 View을 찾아 렌더링 합니다.

Spring MVC Container는 아래와 같은 과정을 통해 Client 요청으로부터 View를 반환합니다.

 

  1. Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
  2. Mapping 되는 Handler와 그 Type을 찾는 DispatcherServlet이 요청을 인터셉트한다.
  3. Controller가 요청을 처리한 후에 응답을 DispatcherServlet으로 반환하고, DispatcherServlet은 View를 반환한다.
@Controller
@RequestMapping("/test")
public class AgentLoginLogController {
  @RequestMapping(value = "/home", method = RequestMethod.POST)
  public String home(Locale locale, Model model, HttpServletRequest request) {
    return "test/home";
  }
}

 

한편, Spring MVC 컨트롤러에서도 Data를 반환해야 하는 경우도 있습니다. 이때 @ResponseBody 애노테이션을 사용해야 합니다.

 

@Controller
@RequestMapping("/test")
public class TestController {
  @RequestMapping(value="/selectList")
  public @ResponseBody String selectList(Map<String, Object> model, HttpServletRequest request) {
    return "111";
  }
}

 

@Controller가 Data를 반환하기 위해서는 viewResolver 대신에 HttpMessageConverter가 동작합니다. HttpMessageConverter에는 여러 Converter가 등록되어 있고, 반환해야 하는 데이터에 따라 사용되는 Converter가 달라집니다.

단순 문자열인 경우에는 StringHttpMessageConverter가 사용되고,

객체인 경우에는 MappingJackson2HttpMessageConverter가 사용됩니다.

 

 

@RestController(Spring Restful Controller)

 

@RestController는 Spring MVC Controller에 @ResponseBody가 추가된 것입니다.

즉, RestController의 주된 목적은 Json 형태로 객체 데이터를 반환하는 것입니다.

 

@RestController
@RequestMapping("/test")
@RequiredArgsConstructor
public class TestController extends AbstractController {
  private final UserService service;

  @PostMapping(value="/selectInfo")
  public ResponseEntity<UserVO> selectInfo(Map<String, Object> model, HttpServletRequest request) {
    UserVO user = service.selectInfo(model);
		
    if(user == null) {
      return ResponseEntity.noContent().build();
    }
	
    return ResponseEntity.ok(user);
  }
}

 

ResponseEntity를 사용하지 않고 직접 UserVO를 반환해도 되지만, ResponseEntity를 함께 리턴해 주는 것이 좋습니다.

728x90

'웹 개발' 카테고리의 다른 글

Get the Current Working Directory in Java  (0) 2021.08.01
Copying a HashMap  (0) 2021.07.31
spring boot utf8 설정  (0) 2021.07.25
[JPA] Entity to DTO, ModelMapper  (0) 2021.07.18
Get Spring Security Principal in JSP EL expression  (0) 2021.07.11
loading