@Controller와 @RestController 차이
스프링에는 컨트롤러를 지정해주기 위한 어노테이션으로 @Controller와 @RestController가 있다.
@RestController는 @Controller와 @RestponseBody의 조합이며, RESTful 웹서비스를 보다 쉽게 개발할 수 있도록 Spring 4.0에서 추가되었다.
주요한 차이점은 HTTP Response Body가 생성되는 방식이 다르다는 것이다.
@Controller의 역할은 Medel 객체를 만들어 데이터를 담고 View를 찾는 것이지만, @RestController는 단순히 객체만을 반환하고 객체 데이터를 JSON 또는 XML형식으로 HTTP응답에 담아서 전송한다.
@Controller와 @ResponseBody를 사용해서 만들 수 있지만 이러한 방식은 RESTful 웹서비스의 기본 동작이기 때문에 Spring은 @Controller와 @ResponseBody의 동작을 조합한 @RestController를 도입했다.
’일반적인 Spring MVC 처리과정
[Controller가 View반환]
- Client는 URI형식으로 웹 서비스에 요청 전송
- Mapping되는 Handler와 그 Type을 찾는 DispatcherServlet이 요청을 인터셉트
- Controller가 요청을 처리한 후 응답을 DispatcherServlet으로 반환하고 DispatcherServlet은 View를 사용자에게 반환.
@Controller가 View를 반환하기 위해서는 ViewResolver가 사용되고, ViewResolver설정에 맞게 View를 찾아 렌더링한다.
예시 코드
@Controller
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@GetMapping(value = "/infoView")
public String infoView(Model model, @RequestParam(value = "userName", required = true) String userName) {
User user = userService.retrieveUserInfo(userName);
model.addAttribute("user", user);
return "/user/userInfoView";
}
}
[Controller가 Data 반환]
Controller가 데이터를 반환해야하는 경우도 있다. 그럴 때는 @ResponseBody를 활용해서 Json형태로 데이터를 반환해준다. 이러한 형태로 사용하게 된다면 모든메서드에 @ResponseBody를 넣어줘야하는 번거로움 발생한다.
@ResponseBody : 자바 객체를 HTTP 요청의 body 내용으로 매핑하는 역할
- Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
- Mapping되는 Handler와 그 Type을 찾는 DispatcherServlet이 요청을 인터셉트한다.
- @ResponseBody를 사용하여 Client에게 Json 형태로 데이터를 반환한다.
예시 코드
@Controller
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@PostMapping(value = "/info")
public @ResponseBody
User info(@RequestBody User user) {
return userService.retrieveUserInfo(user);
}
}
@RestController
RestController는 Json형태로 객체 데이터를 반환하는 것이다. 최근에 데이터를 응답으로 제공하고 있는 Restful API를 개발할 때 주로 사용된다.
- Client는 URI형식으로 웹 서비스에 요청 전송
- Mapping되는 Handler와 그 Type을 찾는 DispatcherServlet이 요청을 인터셉트
- RestController는 해당 요청을 처리하고 데이터를 반환.
예시 코드
@RestController
@RequiredArgsConstructor
public class IndexController {
private final PostsService postsService;
@PostMapping("/post")
public Posts hello(@RequestBody Posts post) {
String id = post.getId();
return postsService.findById(id);
}
}