개요

테스트를 해보려고 테스트 컨트롤러에 @RestController을 설정한 후 String으로 view 이름을 리턴했더니 화면에 입력한 view 이름이 그대로 나왔다.

@RestController
public class TestController {

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


왜 그럴까?

  • @RestController에는 @Controller 애노테이션과 @ResponseBody 애노테이션이 포함되어 있다. Controller에서 페이지 렌더링과 Json 데이터를 함께 리턴해야 할 때 사용한다.
  • @Controller는 리턴 값이 String이라면 view 이름으로 인식하여 view를 찾아 렌더링 한다.
    • 페이지 이동(@Controller), Json 데이터 리턴(@ResponseBody)
  • @ResponseBody: 자바 객체를 HTTP 요청의 body 내용으로 매핑하는 역할을 하는 애노테이션

형태

@Controller

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller

@RestController

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController


해결 방법

ModelAndView를 사용하여 setViewName()에는 이동할 view 이름, addObject() 등에는 사용할 변수명을 입력해주면, @RestController@Controller 애노테이션 둘 다 상관없이 동작한다.