@Controller
public class MyController {
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("message", "Hello, Spring!");
return "hello"; // templates/hello.html로 이동 (Thymeleaf)
}
}
@RestController
public class MyRestController {
@GetMapping("/api/hello")
public String hello() {
return "Hello, REST!"; // 순수 문자열 반환
}
@GetMapping("/api/data")
public Map<String, String> getData() {
Map<String, String> data = new HashMap<>();
data.put("key", "value");
return data; // JSON으로 반환됨: {"key": "value"}
}
}
| 구분 | @Controller | @RestController |
|---|---|---|
| 반환 | 데이터 뷰(View) 페이지 (HTML, JSP 등) | JSON, XML, 문자열 등 (데이터 자체) |
| 용도 | 웹 애플리케이션의 UI 렌더링 | REST API 개발 |
| View Resolver 작동 | O (뷰 이름을 리턴하면 템플릿 렌더링) | X (데이터를 바로 HTTP Response로 반환) |
| @ResponseBody 필요 | 필요 (@ResponseBody를 추가해야 함) | 불필요 (@RestController에 내장됨) |
Controller
클라이언트한테 응답을 줄 때 view(html 파일)을 찾아서 전송
규모가 조금 작은 곳에서 프론트와 백을 하나의 서버로 만들때 사용
웹 애플리케이션: HTML 렌더링이 필요하면
RestController
클라이언트한테 응답을 줄 때 자신이 직접 내용을 전송
규모가 커졌을 때 프론트 서버를 따로 두고 스프링은 백엔드 서버로만 만들어서 사용할 때
REST API 개발: JSON 같은 데이터만 반환할 경우
대부분의 API 서버 개발에서는 @RestController를 사용하고, 전통적인 MVC 웹 애플리케이션에서는 @Controller를 사용