@RestController vs @Controller – Spring MVC에서의 핵심 차이점 정리

Spring으로 웹 애플리케이션 또는 REST API를 개발하다 보면 @Controller@RestController를 언제 어떻게 써야 할지 혼란스러울 때가 있습니다. 둘 다 HTTP 요청을 처리하기 위해 사용되는 어노테이션이지만, 사용하는 목적과 동작 방식에는 명확한 차이가 있습니다.

실무에서 자주 마주하는 이 두 어노테이션의 개념과 차이, 사용 사례를 정리해 보겠습니다.

 

 

1. @Controller – 전통적인 MVC 패턴을 위한 어노테이션

@Controller는 Spring MVC에서 View 기반 애플리케이션을 만들 때 사용하는 어노테이션입니다. 핵심은 메서드의 반환값이 View의 이름이라는 점입니다. 일반적으로 JSP, Thymeleaf 같은 템플릿 엔진과 함께 사용됩니다.

@Controller
public class HomeController {

    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("message", "Hello, Spring!");
        return "hello"; // templates/hello.html 이 렌더링됨
    }
}

즉, 브라우저에 HTML 페이지를 렌더링하고자 할 때 @Controller를 사용합니다.

 

2. @RestController – API 응답을 위한 컨트롤러

@RestController@Controller + @ResponseBody가 결합된 특수한 형태로, RESTful API 개발에 최적화되어 있습니다. 반환값은 View가 아닌 HTTP 응답 본문(body)으로 직렬화됩니다. 보통 JSON이나 XML 형태로 응답하게 됩니다.

@RestController
public class ApiController {

    @GetMapping("/api/hello")
    public Map<String, String> hello() {
        return Map.of("message", "Hello, REST!");
    }
}

별도의 ViewResolver 없이 Jackson 같은 메시지 컨버터가 자동으로 객체를 JSON으로 변환해 응답합니다.

 

3. 차이점 비교 요약

비교 항목 @Controller @RestController
용도 HTML View 렌더링 REST API 응답 (JSON/XML)
기본 반환 값 View 이름 HTTP Body (데이터 자체)
템플릿 엔진 필요 예 (JSP, Thymeleaf 등) 아니오
메시지 컨버터 사용 안함 자동으로 JSON 변환
@ResponseBody 사용 직접 메서드에 지정 필요 자동 포함됨

4. 어떤 경우에 어떤 어노테이션을 써야 하나?

  • 웹 애플리케이션(UI가 필요한 경우): @Controller를 사용
  • 프론트엔드가 React, Vue, Angular로 구성된 SPA: 백엔드 API는 @RestController 사용
  • 혼합 프로젝트: View 렌더링과 API가 혼재된 경우, 각 목적에 따라 분리하여 사용

 

5. 실무 팁

  • @Controller를 사용할 때 데이터만 응답하고 싶다면, @ResponseBody를 메서드 위에 붙이면 됩니다.
  • @RestControllerView를 반환할 수 없습니다. JSON 기반 응답에만 적합합니다.
  • 모든 API에서 일관된 JSON 응답을 원한다면, @RestControllerAdviceResponseEntity 패턴도 함께 고려하세요.

 

6. 마무리

@Controller@RestController는 사용하는 목적에 따라 구분해서 써야 합니다. Spring은 View 중심 웹 앱과 API 서버 모두를 지원하므로, 각 기능에 맞는 어노테이션을 사용하는 것이 유지보수성과 명확성을 높이는 길입니다. 실무에서는 API 서버인 경우 거의 대부분 @RestController를 기본값으로 두고 개발하는 것이 일반적입니다.