SpringBoot

@Controller와 @RestController 차이점

똑똑한망치 2024. 6. 25. 09:00
728x90
반응형
주요 차이점은
HTTP ResponseBody가 생성되는 방식이고,
@Controller + @ResponseBody 조합이
@RestController라고 말할 수 있다.

 

@Controller 이란

전통적인 Spring MVC의 컨트롤러 어노테이션인 @Controller는 주로 View(화면)를 반환하기 위해 사용한다.

@Controller
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;

    @GetMapping(value = "/users")
    @ResponseBody  // 차이점
    public ResponseEntity<User> findUser(@RequestParam String userName){
        return ResponseEntity.ok(userService.findUser(userName));
    }
    
    @GetMapping(value = "/users/detailView")
    public String detailView(Model model, @RequestParam String userName){
        User user = userService.findUser(userName);
        model.addAttribute("user", user);
        return "/users/detailView";
    }
}

 

아래 사진과 같은 과정을 통해 Spring MVC Container는 Client 요청으로부터 view 를 반환한다.

 

 

[과정]

  • Client는 URL 형식으로 요청을 보낸다.
  • Dispatcher Servlet이 요청을 위임할 Handler Mapping을 찾는다.
  • Handler Mapping을 통해 요청을 Controller로 위임한다.
  • Controller는 요청을 처리한 후 View Name을 Handler Adapter 에게 반환한다.
  • Handler Adapter는 이 View Name을 DispatcherServlet에게 반환한다.
  • DispatcherServlet은 View Resolver를 통해 View Name에 해당하는 View를 찾아서 Client에게 반환한다.

하지만 Spring MVC의 컨트롤러를 사용할 때 View가 아닌 Data를 반환해야 하는 경우도 있다.

컨트롤러에서 Data를 반환하기 위해 @ResponseBody 어노테이션을 활용해서 JSON 형태의 데이터를 반환할 수 있다.

 

[과정]

  • Client는 URL 형식으로 요청을 보낸다.
  • DispatcherServlet이 요청을 위임할 Handler를 Handler Mapping을 통해 Controller를 찾고 요청을 위임한다.
  • Controller는 요청을 처리한 후 객체를 반환한다.
  • 반환되는 객체는 JSON으로 직렬화(Serialize)되어 Client에게 반환된다.

컨트롤러를 통해 객체(데이터)를 반환할 때 일반적으로 ResponseEntity로 감싸서 반환한다.

그리고 객체를 반환하기 위해서는 View를 반환할 때 사용된 View Resolver 대신에 HttpMessageConverter가 동작한다.

HttpMessageConverter에는 여러 Converter가 등록되어 있고, 반환하는 데이터에 따라 사용되는 Converter이 달라진다.

 

 

@RestController 이란

@RestController 어노테이션은 RESTful Web Service에서 사용되는 컨트롤러 어노테이션이다.

@Controller + @ResponseBody가 합쳐진 형태로 주용도는 JSON 형태의 객체 데이터를 반환하는 것이다.

최근에 데이터를 응답으로 제공하는 REST API를 개발할 대 주로 사용하며 객체를 ResponseEntity로 감싸서 반환한다. 이는 @Controller에 @ResponseBody를 붙인 것과 완벽히 동일하다.

 

@RestController
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;

    @GetMapping(value = "/users")
    public ResponseEntity<User> findUserWithResponseEntity(@RequestParam String userName){
        return ResponseEntity.ok(userService.findUser(userName));
    }
}

 

반응형

'SpringBoot' 카테고리의 다른 글

JPA Entity에 @Setter를 지양하는 이유  (0) 2024.06.29
SpringSecurity Bcrypt 를 이용한 비밀번호 암호화  (0) 2024.06.26
RedirectAttributes  (0) 2024.05.02
웹 소켓 (WebSocket)  (0) 2024.04.27
SSE (Server-Sent Event) 구현  (0) 2024.04.10