전통적인 Spring MVC의 **“@Controller”**와 Restful 웹서비스의 **”@RestController”**는 Spring Framework에서 사용되는 애너테이션으로, 둘 다 컨트롤러 역할을 하는 클래스에 붙이지만 작동 방식에 중요한 차이점이 있습니다.
- 어노테이션 간단 비교:
- @Controller = 웹 페이지 반환용 컨트롤러.
- @RestController = 데이터(JSON/XML) 반환용 컨트롤러 (@Controller + @ResponseBody).
1.@Controller
[View 반환하기]
주로 View를 반환하기 위해 사용합니다.

- Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
- DispatcherServlet이 요청을 처리할 대상을 찾는다.
- HandlerAdapter을 통해 요청을 Controller로 위임한다.
- Controller는 요청을 처리한 후에 ViewName을 반환한다.
- DispatcherServlet은 ViewResolver를 통해 ViewName에 해당하는 View를 찾아 사용자에게 반환한다.
[ Data반환하기]
하지만 Spring MVC의 컨트롤러를 사용하면서 Data를 반환해야 하는 경우도 있습니다.
데이터 반환을 위해 “@ResponseBody” 어노테이션을 활용해줍니다.
이를 통해 Controller도 Json 형태로 데이터를 반환할 수 있습니다.
- Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
- DispatcherServlet이 요청을 처리할 대상을 찾는다.
- HandlerAdapter을 통해 요청을 Controller로 위임한다.
- Controller는 요청을 처리한 후에 객체를 반환한다.
- 반환되는 객체는 Json으로 Serialize되어 사용자에게 반환된다.
[예시 코드]
@Controller
public class ViewController {
@ResponseBody //Data 반환
@RequestMapping("/hello")
public String hello(Model model) {
model.addAttribute("message", "Hello, Spring!");
return "hello"; // "hello.jsp" 또는 "hello.html" 등의 View를 렌더링
}
}
2.@RestController
@RestController는 @Controller에 @ResponseBody가 추가된 것입니다.
RestController의 주용도는 Json 형태로 객체 데이터를 반환하는 것입니다. 최근에 데이터를 응답으로 제공하는 REST API를 개발할 때 주로 사용하며 객체를 ResponseEntity로 감싸서 반환합니다.

[예시 코드]
@RestController
public class RestAPIController {
@RequestMapping("/hello")
public String hello() {
return "Hello, Spring!"; // HTTP 응답 본문에 "Hello, Spring!"을 작성
}
@RequestMapping("/json")
public Map<String, String> json() {
Map<String, String> response = new HashMap<>();
response.put("message", "Hello, Spring!");
return response; // JSON 형태로 반환
}
}
- Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
- DispatcherServlet이 요청을 처리할 대상을 찾는다.
- HandlerAdapter을 통해 요청을 Controller로 위임한다.
- Controller는 요청을 처리한 후에 객체를 반환한다.
- 반환되는 객체는 Json으로 Serialize되어 사용자에게 반환된다.
차이점 요약
특성 @Controller @RestController
| 주요 목적 | View 반환 (HTML, JSP 등 렌더링) | 데이터 반환 (JSON, XML 등) |
| 기본 동작 | 반환 값은 View 이름으로 해석 | 반환 값은 HTTP 응답 본문에 직접 전달 |
| 템플릿 엔진 연동 | 가능 (Thymeleaf, JSP 등) | 불가능 |
| REST API 구현 | 불편 (추가로 @ResponseBody 필요) | 간편 (기본적으로 JSON 반환) |
| 예제 반환 값 | View 이름 (예: hello.jsp) | JSON 문자열 또는 객체 (예: {"key":"value"}) |
| 적합한 상황 | HTML 페이지를 랜더링 하는 경우 | API 데이터를 반환하는 경우 |
[참고]
'Backend > Spring' 카테고리의 다른 글
| [기록]JSP로 페이징 구현 (0) | 2024.11.22 |
|---|---|
| [board_기록] 답글이 있는 게시판 만들기 (0) | 2024.11.22 |
| Spring Web (0) | 2024.11.20 |
| MyBatis : MapperXML (0) | 2024.11.19 |
| MyBatis : SqlSession (0) | 2024.11.19 |