응답 데이터를 만드는 방법도 크게 3가지이다.
스프링 부트는 아래 디렉토리에 있는 정적 리소스를 제공한다.
/static, /public, /resources. /META-INF/resources
뷰 템플릿은 jsp, thymeleaf 등의 뷰 템플릿을 거쳐 HTML이 생성되고 뷰가 응답을 만들어서 전달하는 것인데 스프링 부트는 기본적으로 아래 디렉토리에 있는 경로로 제공한다.
src/main/resources/templates
HTTP API의 경우 메세지 바디에 데이터를 전달해야 하므로 주로 json 형식으로 데이터를 전달한다.
@Slf4j
@Controller
public class ResponseBodyController {
//text 반환
@GetMapping("/response-body-string-v1")
public void responseBodyV1(HttpServletResponse response) throws IOException {
response.getWriter().write("ok");
}
@GetMapping("/response-body-string-v2")
public ResponseEntity<String> responseBodyV2() throws IOException {
return new ResponseEntity<>("ok", HttpStatus.OK);
}
@ResponseBody
@GetMapping("/response-body-string-v3")
public String responseBodyV3() {
return "ok";
}
//json 방식
@GetMapping("/response-body-json-v1")
public ResponseEntity<HelloData> responseBodyJsonV1(){
HelloData helloData = new HelloData();
helloData.setUsername("userA");
helloData.setAge(20);
return new ResponseEntity<>(helloData, HttpStatus.OK);
}
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@GetMapping("/response-body-json-v2")
public HelloData responseBodyJsonV2(){
HelloData helloData = new HelloData();
helloData.setUsername("userA");
helloData.setAge(20);
return helloData;
}
}
위의 예제를 살펴보자. 위의 string v1,2,3의 경우 요청 부분에서 설명한 부분과 상당히 겹치므로 생략하겠다. 그럼 나머지 json 방식의 v1와 v2인데
V1
v1의 경우 ResponseEntity를 직접사용하여 사용자에게 데이터를 반환하는 방법이다. 이 방식의 장점은 ResponseEntity의 상태값을 설정할 수 있는 매개변수가 존재하여 client에게 하나의 응답 상태값이 아닌 exception이나 어떠한 validation 체크를 통해 개발자가 유연하게 상태값을 설정하여 보낼 수 있다.
V2
V2의 경우 @ResponseStatus를 통해 응답 상태값을 보낼순 있지만 고정되어 있는 상태값이 전달되어진다. 하지만 간단한 요청과 같단한 응답의 로직이라면 V2의 코드가 훨씬 간결하고 코딩하기 편하다.
V1과 V2의 방법의 차이는 존재하는데 하나의 프로젝트에서 무조건 고정해서 사용할 필요는 없을거 같다. 그때 그때 그 로직의 상황에 따라 V1과 V2를 같이 사용하면 더욱 좋은 API를 만들 수 있을 것이다.