Spring/스프링 이론

[Spring] @Controller와 @RestController의 차이

블로그 주인장 2023. 10. 15.

Controller Annotation

Controller Annotation의 종류인 @Controller와 @RestController의 대한 특징과 차이점에 대해 알아보겠습니다.

 

Controller Component

  • Client의 요청을 직접적으로 받는 Component
  • Client가 url을 통한 요청을 보내면, 해당 url에 매칭되는 controller가 해당 요청을 핸들링한다.
  • @Controller와 @RestController는 모두 Spring에서 Controller를 지정해주기 위한 어노테이션이다.
  • 기본적인 Spring MVC의 Controller인 @Controller와 RESTful 웹 서비스의 Controller @RestController의 주요한 차이점은 @ResponseBody의 생성 유/무 이다.

 

@Controller

  • @Controller 어노테이션을 달고 있다.
  • @Controller 어노테이션을 통해 Ioc 컨테이너에 Bean을 등록한 것이다.
  • @Controller의 역할 : Model 객체를 만들어 데이터를 담고 View를 변환하는 것이다.

  • Controller로 View를 변환하는 경우

  1. Client에서 보낸 요청은 DispatcherServlet을 거쳐 HandlerMapping을 통해 controller를 찾고 요청을 수행
  2. controller는 받은 요청을 처리한 뒤 viewName을 반환
  3. DispatcherServlet은 ViewResolver를 통해 ViewName에 해당하는 View를 찾아 사용자에게 반환

  • Controller를 Data로 반환하는 경우

  1. 데이터로 반환하기 위해 ResponseEntity(HttpStatus + HttpHeaders + HttpBody 형태의 응답 메시지)의 Body(ResponseBody)를 사용해야한다.
  2. 이 때 @ResponseBody 어노테이션을 사용하면 된다.
  3. 이로 인해 controller도 view 뿐만 아닌 JSON 형태의 데이터도 반환이 가능하다.

  • 코드 구문
@Slf4j
@Controller
public class SampleController {

    @PostMapping("/order")
    public String createOrder() {
        log.info("create Order");
        return "order created -> orderId:1, orderAmount:1000";
    }
    
    @DeleteMapping("/order/{orderId}")
    public String deleteOrder(@RequestParam("orderId") String id) {
        log.info("Delete Some Order : " + id);
        return "Delete orderId:" + id;
    }
}
  1. @Controller는 보통 View를 반환하긴 하지만, @ResponseBody 어노테이션을 활용하면 객체로 반환이 가능하다.
  2. @RequestParam : Request Header 안의 파라미터를 Mapping 해주는 어노테이션이다.

@RestController

  • @RestController : 단순히 객체만 반환하고, 객체 데이터는 JSON 또는 XML 형식으로 HTTP 응답에 담아 전송한다.
  • @RestController는 @Controller + @ResponseBody 의 동작을 하나로 결합한 컨트롤러
  • REST API를 개발할 때 주로 사용하며 ResponseEntity로 감싸서 주로 반환한다.

  • 코드 구문
@Slf4j
@RestController
public class SampleController {

    @GetMapping("/order/{orderId}")
    public ResponseEntity<StatusResponse> OkOrder(@RequestParam("orderId") String id) {
        log.info("OkOrder" + id);
        return  ResponseEntity.ok(new StatusResponse(StatusCode.STATUS_OK));
    }

    @GetMapping("/order/{orderId}")
    public ResponseEntity<StatusResponse> NGOrder(@RequestParam("orderId") String id) {
        log.info("NGOrder" + id);
        return  ResponseEntity.ok(new StatusResponse(StatusCode.STATUS_NG));
    }
}
  1. ResponseEntity를 지네릭스(Generics)를 이용하여 객체를 생성해주고 객체를 설정해주고, 해당 객체가 아닌 경우 예외처리를 진행할 수 있다.
  2.  
  3. @RestController를 사용하면 MVC RESTfaul 웹 서비스를 쉽고 간단하게 구현이 가능하다.
반응형

댓글