본문 바로가기

Tech/Spring | SpringBoot

[Spring] @Controller vs @RestController

반응형

Spring 에서 컨트롤러를 지정해주는 어노테이션으로 @Controller 와 @RestController 가 있다.

@Controller 는 Spring MVC 에서 Controller 의 역할을 하는 클래스를 지정하는 것으로 요청에 대한 응답을 Spring MVC 에서 View 에 결과 객체를 담아서 반환한다.

반면에 @RestController 는 Restful 한 웹 서비스를 구현할 때 사용하는 어노테이션으로 @RestController 로 지정된 클래스는 결과 값을 View 가 아닌 객체 그 자체로 JSON 이나 XML 형태로 반환한다. 해당 결과들은 Http Response 의 Body 에 담겨져서 Client 로 전달된다.

1. @Controller

@Controller 는 Client 의 요청을 처리하는 Spring 컴포넌트로 @Component 어노테이션을 포함하고 있어서 Spring 실행 시에 bean 으로 자동 등록된다.

 

@Controller 아래에서 @RequestMapping 을 사용할 수 있는데, 이를 통해서 사용자의 요청과 연결되는 엔드포인트로 지정할 수 있다.

 

@Controller 
@RequestMapping("/") 
public class HelloController { 
  
    @GetMapping("home") 
    public String getHome() { 
        return "index.html"; 
    } 
  
    @GetMapping("hello") 
    public ResponseEntity<String> getHello() { 
        return ResponseEntity.ok("hello"); 
    } 
}

 

- Spring MVC Controller 요청 처리 과정

https://www.facebook.com/photo/?fbid=1873079892846068&set=gm.3389524044492534

1. Client 가 URI 형식으로 웹 서비스에 요청을 보낸다. 
2. DispatcherServlet 은 HandlerMapping 을 통해 요청을 처리할 메서드 (Controller) 를 찾는다. 
3. HandlerAdapter 를 통해 HandlerMapping 에서 찾은 Controller 에게 처리를 요청한다. 
4. Contoller 는 요청을 처리하여 Model 객체에 적용하고 HandlerAdapter 에게 view 이름을 결과로 반환한다. 
5. HandlerAdapter 가 Model 객체와 view 이름을 통해 ModelAndView 객체로 DispatcherServlet 에게 전달한다. 
6. DispatcherServlet 은 전달받은 값을 가지고 ViewResolver 에 해당 값에 매핑되는 view 가 있는지 확인한다. 
7. ViewResolver 의 처리 결과가 포함된 view 를 DispatcherServlet 에 전달한다. 
8. DispatcherServlet 에서 최종 응답 결과를 Client 에게 전달한다. 

 

2. @RestController

@RestController 는 전통적인 MVC 와 달리 결과를 view 로 전달하는 것이 아니라 데이터 객체로 전달한다.

@RestController 는 @Controller 와 @ResponseBody 를 더한 어노테이션이다. @Controller 와 같이 매핑된 요청에 응답하는데, 응답하는 값이 ResponseBody 에 포함되는 데이터 객체의 형태로 전달된다.

 

@RestController 
@RequestMapping("/rest") 
public class RestHelloController { 
  
    @GetMapping("home") 
    public String getHome() { 
        return "index.html"; 
    } 
  
    @GetMapping("hello") 
    public ResponseEntity<String> getHello() { 
        return ResponseEntity.ok("hello"); 
    } 
  
    @GetMapping("test") 
    public Map<Object, Object> getTest() { 
        Map<Object, Object> map = new HashMap<>(); 
        map.put("content", "hello"); 
        return  map; 
    } 
}

 

- RestController 요청 처리 과정

1. Client 가 URI 형식으로 웹 서비스에 요청을 보낸다.
2. DispatcherServlet 은 HandlerMapping 을 통해 요청을 처리할 메서드 (Controller) 를 찾는다.
3. HandlerAdapter 를 통해 HandlerMapping 에서 찾은 Controller 에게 처리를 요청한다.
4. Contoller 는 요청을 처리한 후에 HandlerAdapter 에게 결과를 반환한다. 이때 @Controller 처럼 view 이름을 반환하지 않고 결과 객체를 ResponseEntity 로 감싸서 전달한다.
5. HandlerAdapter 는 ViewResolver 를 거치지 않고 HttpMessageConverter 를 통하여 ResponseEntity 를 Http Response 의 Body 에 추가하여 결과를 변환한다. 
6. HandlerAdapter 가 변환된 Http Response 를 DispatcherServlet 에게 전달한다. 
7. DispatcherServlet 은 전달받은 값을 HTTP Response 로 Client 에게 전달한다. 

 

※ @ResponseBody

@ResponseBody 는 결과값을 view 가 아닌 데이터로 전달하는 경우에 사용하는 어노테이션이다.
해당 어노테이션을 붙인 함수는 결과값을 JSON 형태로 Response Body 에 포함시켜서 반환한다.

 

[Reference] 
- https://dev-coco.tistory.com/84

 

[Spring] @Controller와 @RestController의 차이점 알아보기

@Controller 와 @RestController Spring에서 컨트롤러를 지정해주기 위한 어노테이션은 @Controller와 @RestController가 있습니다. 전통적인 Spring MVC 컨트롤러인 @Controller와 RESTful 웹 서비스의 컨트롤러..

dev-coco.tistory.com

- https://mangkyu.tistory.com/49

 

[Spring] @Controller와 @RestController 차이

Spring에서 컨트롤러를 지정해주기 위한 어노테이션은 @Controller와 @RestController가 있습니다. 전통적인 Spring MVC의 컨트롤러인 @Controller와 Restuful 웹서비스의 컨트롤러인 @RestController의 주요한 차..

mangkyu.tistory.com

- https://jaimemin.tistory.com/1823

 

HttpMessageConverter 간단 정리

1. HttpMessageConverter 용도 HTTP API처럼 JSON 데이터를 HTTP 메시지 바디 내 직접 읽거나 쓰는 경우 사용 @ResponseBody 어노테이션을 사용할 때 HTTP Body 내 문자 내용을 직접 반환하므로 HttpMessageConver..

jaimemin.tistory.com

- https://www.geeksforgeeks.org/difference-between-controller-and-restcontroller-annotation-in-spring/

 

Difference Between @Controller and @RestController Annotation in Spring - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

반응형