프로그래밍/JAVA Spring

[Spring 스프링] Spring MVC - Annotated Controllers(@Controller와 @RestController)

hectick 2023. 4. 20. 02:45

 

Annotated Controllers

스프링 MVC에서 컨트롤러임을 나타내는 어노테이션으로는 @Controller 와 @RestContoller가 있다. 

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

 

Controller
RestController

 

 

 

@ResponseBody가 하는 일이 뭘까?

 

@ResponseBody 어노테이션은 HTTP Response Body에 데이터를 넣어주는 일을 한다.

따라서 이 어노테이션이 달린 메서드는 HTTP Response Body에 데이터를 넣어 반환한다.

 

 

 

@Controller 와 @RestController

 

@Controller @RestController의 주요한 차이점은 메서드가 무엇을 반환할 수 있는가?이다. 

 

@RestController는 메서드가 객체를 반환하는데, 자동으로 @ResponseBody가 HTTP Response Body에 넣어 반환한다. 이 때 HttpMessageConverter가 객체를 HTTP Response Body에 들어갈 수 있는 형태로 바꿔준다.

 

@Controller는 메서드는 일반적으로 View의 이름을 반환하는데, ViewResolver가 View의 이름으로 View를 찾는다. 그리고 View가 렌더링되어서 Http Response Body에 포함되게 된다.

    @Controller
    @RequestMapping("/return-value")
    public class ReturnValueController {

        @GetMapping("/thymeleaf")
        public String thymeleaf() {
            return "sample";
        }
    }

여기서 sample이라는 View 이름이 sample.html이라는 View로 매핑된다.

 

 

 

물론 다음처럼 @Controller에서도 직접 Http Response Body 에 들어가는 데이터를 직접 넣어줄 수도 있다.

이 때는 View 이름을 반환하는게 아니므로 ViewResolver가 사용되지 않는다.

    @Controller
    @RequestMapping("/return-value")
    public class ReturnValueController {

        @GetMapping("/users")
        @ResponseBody
        public User responseBodyForUser() {
            return new User("name", "email");
        }

        @GetMapping("/users/{id}")
        public ResponseEntity<User> responseEntity(@PathVariable Long id) {
            return ResponseEntity.ok(new User("name", "email"));
        }

    }

 

 

 

나의 결론

 

View를 반환할 때는 @Controller를 쓰고, 데이터를 반환할 때는 @RestController를 쓰면 될 것 같다!