티스토리 뷰

Spring

[Spring] consumes, produces

heemang.dev 2023. 5. 10. 16:12

 

서버는 클라이언트의 각각 다른 요청에 대하여 다른 방식으로 처리할 수 있으며, 

클라이언트는 서버에서 반환해주는 데이터를 제한하여 받을 수 있다.

 

그것을 가능하게 해주는 것이 바로 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 에러가 발생하는 것이다.

Media Type : text/html

 

아래는 클라이언트가 {"username":"test", "age":99} 라는 json 형태로 서버에 전송하였을 경우이다. json 형식으로 데이터를 전송하였기 때문에 Media Type이 "application/json"이다. 서버에서 consumes를 사용하여 "application/json"에 한하여 요청을 처리할 수 있도록 처리하였기 때문에 에러가 발생하지 않는다.

Media Type : 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 에러가 발생한다.

Accept : application/json

 

아래는 정상적으로 처리된 경우이다. produces = "text/plain"으로 클라이언트가 요구하는 Media Type 제한을 걸었고, Accept 헤더를 "text/plain"으로 응답하였기 때문에 클라이언트에서 정상적으로 응답을 받는 경우이다.

Accept : text/plain


 

"ok"라고 출력이 되는 이유는 @ResponseBody 애너테이션을 사용하였기 때문이다. @Controller 애너테이션만 사용하였다면 뷰리졸버를 통해 "ok"라는 파일을 찾겠지만, @ResponseBody 애너테이션을 사용함으로써 Http message body에 바로 "ok"를 반환하는 것이다.

Total
Today
Yesterday
최근에 올라온 글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30