@RestController는 @Controller에 @ResponseBody가 결합된 어노테이션이며, 주로 JSON 형태의 객체 데이터를 반환하는 용도로 사용한다. 주로 RESTful 웹 서비스를 만들 때 자주 사용된다.
@Controller는 반환 값이 String이면 뷰 이름으로 인식해서 뷰를 찾고 뷰가 랜더링 되지만, 반면에 @RestController는 반환 값으로 뷰를 찾는 것이 아니라, HTTP 메시지 바디에 바로 입력한다.
@Controller
public class MyController {
@RequestMapping("/hello")
public String hello() {
return "hello"; // 뷰 이름 "hello"를 반환하여, hello.jsp 또는 hello.html을 찾음
}
}
@RestController
public class MyRestController {
@RequestMapping("/hello")
public String hello() {
return "hello"; // 문자열 "hello"를 HTTP 메시지 바디에 그대로 반환
}
@RequestMapping("/user")
public User getUser() {
return new User("John", 30); // 객체를 반환하면 JSON 형식으로 변환되어 반환됨
}
}
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
@PostMapping
public User createUser(@RequestBody User user) {
return userService.save(user);
}
@PutMapping("/{id}")
public User updateUser(@PathVariable Long id, @RequestBody User user) {
return userService.update(id, user);
}
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable Long id) {
userService.delete(id);
}
}
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<String> handleNotFound(ResourceNotFoundException ex) {
return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);
}
}