새소식

반응형
Spring/etc

[Spring] @Controller @RestController 차이

  • -
반응형

Spring에서 컨트롤러를 지정해주기 위한 어노테이션은 @Controller와 @RestController가 있습니다.

 

@Controller : 전통적인 Spring MVC의 컨트롤러

@RestController : Restuful 웹서비스의 컨트롤러

 

주요한 차이점은 HTTP Response Body가 생성되는 방식입니다.

 

@Controller

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

아래의 그림과 같은 Work Flow를 가진다.

Client -> Dispatcher Servlet -> Handler Mapper -> Controller -> View Resolver -> View -> Client

출처: https://mangkyu.tistory.com/49

  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";
    }
}

 

@Controller가 Data를 반환하는 경우 

@ResponseBody 어노테이션을 활용 -> Json 형태로 데이터를 반환 

출처: https://mangkyu.tistory.com/49

 

이러한 형태로 사용하게 된다면, 모든 메서드에 @ResponseBody Annotation을 넣어줘야 하는 번거로움 존재 

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

 

예시 코드

@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);
    }
}

 

@RestController

@RestController = @Controller + @ResponseBody 

주용도는 Json 형태로 객체 데이터를 반환하는 것

위의 @Controller가 Data를 반환하는 경우와 같은 케이스를 커버한다고 생각하면 된다.

 

예시 코드

@RestController
@RequiredArgsConstructor
public class IndexController {

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

 

정리하면, Controller에서 view를 반환하는 케이스 이외에 json data를 반환해야 되는 케이스에 

@Controller + @ResponseBody를 함께 쓰는 번거로움을 해결하기 위해서 

@RestController 탄생 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.