본문 바로가기
Back-end/Spring

[Spring] @Controller와 @ResponseBody

by 사장님나빠여 2022. 3. 19.

@Controller

@Controller는 주로 View를 반환하기 위해 사용

Client -> Dispatcher Servlet -> Handler Mapper -> Controller -> View Resolver -> View -> Client의 구조를 가진다.

 

@Controller와 @ResponseBody

※이번에는 컨트롤러에서 @Controller가 아닌 @RestController를 사용

-기존에 사용하는 @Controller는주로 View를 반환(String, ModelAndView 등을 통해)하기 위해 사용

1. Client : URI형식으로 웹 서비스 요청

2. DispatcherServlet이 요청을 intercept -> Handler Mapping을 통해 요청에 맞는 controller호출

3. 요청을 처리한 Controller가 응답을 DispatcherServlet에 반환 -> DispatcherServlet은 응답에 해당하는 View를 Client에 반환(@Controller에서 View를 반환하기 위해서는 ViewResolver가 사용되며, ViewResolver에서 설정에 맞는 View를 찾아 렌더링)

@Controller
public class IndexController {

    @GetMapping("/posts/save")
    public String postsSave() {
        return "posts-save";
    }
}

 

-MVC의 컨트롤러에서 Data를 반환해야 하는 경우 @ResponseBody 어노테이션을 활용함. Json형태로 반환 가능

-@ResponseBody : 자바 객체를 HTTP요청의 body 내용으로 매핑하는 역할

1. Client는 URI 형식으로 웹 서비스에 요청을 보낸다.

2. Mapping되는 Handler와 그 Type을 찾는 DispatcherServlet이 요청을 인터셉트한다

3. @ResponseBody를 사용하여 Clioent에게 Json형식으로 데이터를 반환한다.

@Controller
@RequiredArgsConstructor
public class IndexController {

    private final PostsService postsService;
    
    @PostMapping("/post")
    public @ResponseBody Posts hello(@RequestBody Posts post) {
        String id = post.getId();
        return postsService.findById(id);
    }
}

 

@ResponseBody가 Data를 반환하기 위해서는 viewResolver대신에 HttpMessageConverter가 동작한다. 

 

 

@RestController

@RestController는 @controller와 @ResponseBody를 합친 것이다.

@Controller의 역할은 Mdoel객체를 만들어 데이터를 담고 View를 찾는 것이지만, @RestController는 단순히 객체만을 반환하고 객체 데이터는 Json, XML, HTTP응답에 담아서 전송한다. 주용도는 Json 형태로 객체를 반환하는 것

1. Client URI 형식으로 웹 서비스에 요청을 보낸다

2. Mapping되는 Handler와 그 Type을 찾는 DispatcherServlet이 요청을 인터셉트한다.

3. RestController는 해당 요청을 처리하고 데이터를 반환한다.

 

@RestController와 @Controller의 차이점

1. @Controller는 클래스를 Spring MVC컨트롤러로 표시하는데 사용되며, @RestController는 RESTful 웹 서비스에서 사용되는 특수 컨트롤러이며 @Controller + @ResponseBody와 동일하다.

2. @RestController는 Sprint4.0에서 추가되었지만 @Controller는 Spring이 주석을 지원하기 시작한 이후에 존재하며 공식적으로 Spring 2.5버전에서 추가됨

3. @Controller Component주석이 달려있고, @RestController는 아래와 같이 @Controller와 @ResponseBody 주석이 달린 편의 컨트롤러이다.

댓글