REpresentional State Transfer은 애플리케이션이 URI를 통해 유일하게 식별하는 자원을 정의하는 아키텍쳐 스타일이다. REST 아키텍쳐 스타일을 따르는 웹 서비스를 RESTful Web Service라고 한다.
Spring MVC에서 HTTP Request에 대한 Response로 View가 전달되었다면, RESTful Web Service에서는 일반적으로 json format의 데이터가 전송된다.
@Controller, @RequetMapping, @RequetParam, @PathVariable, @ResponseBody, @RequestBody annotation을 사용하여 RESTful web service를 정의할 수 있다.
@Controller
@RequestMapping(path = "/fixed-deposits")
public class FixedDepositController {
...
@RequestMapping(method = RequestMethod.GET)
public ResponseEntity<List<FixedDepositDetails>> getFixedDepositList() {
...
return new ResponseEntity<List<FixedDepositDetails>>(
fixedDepositService.getFixedDeposits(), HttpStatus.OK
);
}
@RequestMapping annotation이 붙어 Request를 처리하는 method의 return type을 ResponseEntity<List<FixedDepositDetails>> 라고 정의하여 List<FixedDepositDetails> collection을 ResponseBody에 담아 전송할 것이라고 선언한다.
하지만 이 방법은 return 문에서 직접 ResponseEntity를 직접 생성해야 하는 번거로움이 있고, method의 return type도 길어진다. @ResponseBody + @ResponseStatus를 사용하여 method를 조금 더 깔끔하게 작성할 수 있다.
@Controller
@RequestMapping(path = "/fixed-deposits")
public class FixedDepositController {
...
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
@ResponseStatus(code = HttpStatus.OK)
public List<FixedDepositDetails> getFixedDepositList() {
...
return fixedDepositService.getFixedDeposits()
}
요청을 처리하다가 예외가 발생하면 다른 Status code와 에러 메세지를 가지고 return을 해야할텐데
아래와 같이 @ExceptionHandler를 사용하여 처리할 수 있다.
...
public class FixedDepositController {
...
@ExceptionHandler(ValidationException.class)
@ResponseBody
@ResponseStatus(code = HttpStatus.BAD_REQUEST)
public String handleException(Exception ex) {
...
return ex.getMessage();
}