티스토리 뷰
서버는 클라이언트의 각각 다른 요청에 대하여 다른 방식으로 처리할 수 있으며,
클라이언트는 서버에서 반환해주는 데이터를 제한하여 받을 수 있다.
그것을 가능하게 해주는 것이 바로 consumes와 produces이다.
- consumes : Content-type헤더, 서버에서 클라이언트의 요청을 제한적으로 받아들인다.
- produces : Accept 헤더, 클라이언트는 서버가 반환하는 데이터를 제한적으로 받아들인다.
Spring에서는 클라이언트의 요청을 제한적으로 처리할 수 있는 다음의 기능을 제공한다.
// consumes = "처리 가능한 Media Type"
@GetMapping(value = "/mapping-test", consumes = "text/plain")
위와 같이 사용하면 클라이언트의 요청 Media Type이 "text/plain"인 경우에만 해당 요청 경로에 대하여 서버에서 처리할 수 있다.
아래의 사용 예시를 보자.
@Controller
public class TestController {
@GetMapping(value = "/mapping-test", consumes = "application/json")
@ResponseBody
public String mappingConsumes() {
log.info("Test");
return "ok";
}
}
클라이언트가 요청하는 Media Type이 "application/json"이어야만 "/mapping-test" 요청 경로에 대하여 서버에서 처리할 수 있다.
클라이언트에서 서버로 "hello"라는 text를 전송하였다. text의 경우에는 Media Type이 "text/plain"이다. 그러나 서버에서는 "application/json"에 한하여 처리를 가능할 수 있도록 설정했기 때문에 415 에러가 발생하는 것이다.
아래는 클라이언트가 {"username":"test", "age":99} 라는 json 형태로 서버에 전송하였을 경우이다. json 형식으로 데이터를 전송하였기 때문에 Media Type이 "application/json"이다. 서버에서 consumes를 사용하여 "application/json"에 한하여 요청을 처리할 수 있도록 처리하였기 때문에 에러가 발생하지 않는다.
다음은 클라이언트가 서버가 반환하는 데이터를 제한적으로 받는 경우이다.
아래는 클라이언트가 서버로부터 받는 데이터의 Media Type이 "text/plain"인 경우에만 처리할 수 있는 기능이다.
// produces = "처리 가능한 Media Type"
@GetMapping(value = "/mapping-test", produces = "text/plain")
아래의 사용 예시를 확인하자.
produces = "text/plain"으로 설정하였기 때문에 서버에서 응답하는 데이터의 Media Type이 "text/plain"인 경우에만 클라이언트가 처리할 수 있다.
@Controller
public class TestController {
@GetMapping(value = "/mapping-test", produces = "text/plain")
@ResponseBody
public String mappingProduces() {
return "ok";
}
}
클라이언트가 "text/plain"의 응답에 대해서만 처리를 가능하도록 하였지만, 아래의 경우에는 "application/json" 형태의 데이터를 응답하였기 때문에 406 에러가 발생한다.
아래는 정상적으로 처리된 경우이다. produces = "text/plain"으로 클라이언트가 요구하는 Media Type 제한을 걸었고, Accept 헤더를 "text/plain"으로 응답하였기 때문에 클라이언트에서 정상적으로 응답을 받는 경우이다.
"ok"라고 출력이 되는 이유는 @ResponseBody 애너테이션을 사용하였기 때문이다. @Controller 애너테이션만 사용하였다면 뷰리졸버를 통해 "ok"라는 파일을 찾겠지만, @ResponseBody 애너테이션을 사용함으로써 Http message body에 바로 "ok"를 반환하는 것이다.