스프링

@Controller와 @RestController 차이

단짠단짠감자 2022. 3. 23. 23:23

스프링에는 컨트롤러를 지정해주기 위한 어노테이션으로 @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반환]

https://dncjf64.tistory.com/288

  1. Client는 URI형식으로 웹 서비스에 요청 전송
  2. Mapping되는 Handler와 그 Type을 찾는 DispatcherServlet이 요청을 인터셉트
  3. 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 내용으로 매핑하는 역할

https://mangkyu.tistory.com /49

 

  1. Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
  2. Mapping되는 Handler와 그 Type을 찾는 DispatcherServlet이 요청을 인터셉트한다.
  3. @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를 개발할 때 주로 사용된다.

https://mangkyu.tistory.com /49

  1. Client는 URI형식으로 웹 서비스에 요청 전송
  2. Mapping되는 Handler와 그 Type을 찾는 DispatcherServlet이 요청을 인터셉트
  3. 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);
    }
}