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
를 메서드 위에 붙이면 됩니다.@RestController
는 View를 반환할 수 없습니다. JSON 기반 응답에만 적합합니다.- 모든 API에서 일관된 JSON 응답을 원한다면,
@RestControllerAdvice
와ResponseEntity
패턴도 함께 고려하세요.
6. 마무리
@Controller
와 @RestController
는 사용하는 목적에 따라 구분해서 써야 합니다. Spring은 View 중심 웹 앱과 API 서버 모두를 지원하므로, 각 기능에 맞는 어노테이션을 사용하는 것이 유지보수성과 명확성을 높이는 길입니다. 실무에서는 API 서버인 경우 거의 대부분 @RestController
를 기본값으로 두고 개발하는 것이 일반적입니다.
'개발 > JAVA' 카테고리의 다른 글
@Component, @Service, @Repository 차이 – 스프링 개발자를 위한 실전 가이드 (0) | 2025.09.20 |
---|---|
Spring Bean과 IoC/DI 개념 이해 – 스프링의 핵심 철학 (0) | 2025.09.19 |
Spring에서 Controller, Service, Repository 계층 구조란? (0) | 2025.09.17 |
Spring Boot로 Hello World REST API 만들기 (0) | 2025.09.16 |
application.properties와 application.yml 설정하기 - Spring Boot 설정 파일 완전 정복 (0) | 2025.09.14 |