Super Kawaii Cute Cat Kaoani [Spring boot] @RestController와 @Controller

[Spring boot] @RestController와 @Controller

2024. 1. 22. 01:15
728x90
SMALL

📌 @Controller

⚡ View 반환

  • 전통적인 Spring MVC의 컨트롤러
  • 주로 View를 반환하기 위해 사용

  1. Client는 URI 형식으로 웹 서비스에 요청을 보냄
  2. DispatcherServlet이 요청을 처리할 대상을 찾음
  3. HandlerAdapter을 통해 Controller로 위임
  4. Controller는 요청을 처리한 후에 ViewName을 반환
  5. DispatcherServlet은 ViewResolver를 통해 ViewName에 해당하는 View를 찾아 사용자에게 반환함

➡ Controller가 반환한 뷰의 이름으로부터 View를 렌더링하기 위해서는 ViewResolver가 사용되며, ViewResolver 설정에 맞게 View를 찾아 렌더링 된다.

 

 

⚡ Data 반환

  • @ResponseBody 어노테이션 사용
  • Controller가 JSON 형태로 데이터 반환

  1. Client는 URI 형식으로 웹 서비스에 요청을 보냄
  2. DispatcherServlet이 요청을 처리할 대상을 찾음
  3. HandlerAdapter을 통해 요청을 Controller로 위임
  4. Controller는 요청을 처리한 후에 객체 반환
  5. 반환되는 객체는 Json으로 Serialize되어 사용자에게 반환
  • Controller로 객체를 반환할 때는ResponseEntity로 감싸서 반환
  • viewResolver 대신 HttpMessageConverter가 동작함
    • HttpMessageConverter에는 여러 Converter가 등록되어 있고, 반환해야 하는 데이터에 따라 사용되는 Converter가 달라짐
    • 단순 문자열 : StringHttpMessageConverter
    • 객체 : MappingJackson2HttpMessageConverter

 

예시

@Controller
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;

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

    @GetMapping("/users/detailView")
    public String detailView(Model model, @RequestParam("userName") String userName){
        User user = userService.findUser(userName);
        model.addAttribute("user", user);
        return "/users/detailView";
    }
}
반응형

 

 

📌  @RestController

  • @Controller@ResponseBody가 추가된 것
  • JSON 형태로 객체 데이터를 반환
  • REST API를 개발할 때 주로 사용
  • 객체를 ResponseEntity로 감싸서 반환

  1. Client는 URI 형식으로 웹 서비스에 요청을 보냄
  2. DispatcherServlet이 요청을 위임할 HandlerMapping을 찾음
  3. HandlerMapping을 통해 요청을 Controller로 위임함
  4. Controller는 요청을 처리한 후에 객체를 반환함
  5. 반환되는 객체는 Json으로 Serialize되어 사용자에게 반환됨

 

예시

@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;

    @GetMapping("/users")
    public User findUser(@RequestParam("userName") String userName){
        return userService.findUser(user);
    }

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

 

 

⚡ @Controller와 @RestController의 차이점

  • @Controller
    • 클래스를 Spring MVC 컨트롤러로 표시하는데 사용됨
    • Spring이 주석을 지원기 시작한 이후에 존재하며 공식적으로 Spring 2.5 버전에서 추가됨
    • 뷰의 이름을 리턴하기도 함
    •  @Component가 달려있음
  • @RestController
    •  RESTful 웹 서비스에서 사용되는 특수 컨트롤러
    • @Controller + @ResponseBody와 동일
    • Spring 4.0에서 추가됨
    • @Controller @ResponseBody 주석이 달린 컨트롤러임
    •  모든 메소드가 뷰 대신 객체로 작성됨

 

 

 


Reference

 

[Spring Boot] @RestController와 @Controller의 특징과 차이점

Spring에서 컨트롤러를 지정하기 위한 어노테이션은 @Controller와 @RestController가 있다. 언뜻보면 비슷하게 보이는 두 어노테이션의 특징과 차이점은 무엇인지 이 포스트에서 알아볼 예정이다.전통

velog.io

 

728x90
LIST

BELATED ARTICLES

more