Spring Web Project 개발 시 반드시 Controller가 필요합니다.
일반적으로 Spring 책으로 공부를 하다 보면 Controller에는 @Controller 애노테이션을 사용하는데요
@Controller
전통적인 Spring MVC의 컨트롤러인 @Controller는 주로 View를 반환하기 위해 사용합니다.
@Controller가 View를 반환하기 위해서는 ViewResolver가 사용되며, ViewResolver 설정에 맞게 View을 찾아 렌더링 합니다.
Spring MVC Container는 아래와 같은 과정을 통해 Client 요청으로부터 View를 반환합니다.
- Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
- Mapping 되는 Handler와 그 Type을 찾는 DispatcherServlet이 요청을 인터셉트한다.
- 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를 함께 리턴해 주는 것이 좋습니다.
'웹 개발' 카테고리의 다른 글
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 |