`@RestController` is basically `@Controller` + `@ResponseBody`, so methods return the response body (often JSON) directly. `@Controller` is typically used for server-rendered views/templates.
`@Controller` is an MVC controller. By default, a method returning `String` is treated as a **view name** and rendered via a view resolver (Thymeleaf, JSP, etc.).
`@RestController` applies `@ResponseBody` to every handler method, meaning:
JSON:
@RestController
class UserApi {
@GetMapping("/users/{id}")
UserDto get(@PathVariable long id) { /* ... */ }
}View:
@Controller
class PageController {
@GetMapping("/login")
String loginPage() { return "login"; }
}