Server/Spring

Spring - consumes와 produces 이해하기!

JaeHoney 2022. 11. 2. 18:07

스프링에서 동일한 URL인데 Content-Type 헤더에 따라 다른 Controller method를 실행시키려면 아래와 같은 RequestMapping 애노테이션의 consumes 속성을 사용한다.

@PostMapping(path = "/resources", consumes = MediaType.APPLICATION_JSON_VALUE) 

그 뿐만 아니라 Content-Type에 대한 제약을 걸 때도 consumes를 사용하는데, produces 속성과 헷갈리게 되는 경우가 많다.

 

그래서 consumes는 produces와 어떻게 다른 지 알아보자!

consumes

해당 애노테이션의 RequestMapping.consumes의 속성에 대한 description을 확인해봤다.

해당 내용을 번역하면 '미디어 유형별로 매핑 범위를 좁힐 때 사용한다. 미디어 유형 중 하나가 요청 내용의 Content-Type과 일치해야 한다.'정도로 읽을 수 있다.

 

Content-Type요청을 받는 쪽에서 데이터를 어떻게 해석해야 하는 지를 명시하기 위한 헤더로 Request(요청)Response(응답)에서 모두 사용할 수 있다.

 

descrption을 보면 consumes해당 컨트롤러 메서드가 처리할 Content-Type(요청 헤더)를 제한하고자 할 때 사용함을 알 수 있다.

produces

RequestMapping.produces 속성의 description을 살펴보았다.

해당 내용을 번역하면 produces는 '미디어 유형별로 매핑 범위를 좁힐 때 사용한다. 해당 구성은 반환 가능한 미디어 유형을 뜻한다. 일반적으로 Accept 헤더에서 추출되지만, 쿼리 매개변수 또는 기타에서 파생할 수도 있다.' 정도로 직역할 수 있다.

 

Accept 헤더의 의미는 다음과 같다.

  • Accept 헤더요청하는 입장에서 특정 타입의 데이터를 원할 때 사용한다.

그래서 만약 두 개의 Controller method가 아래와 같이 있다고 가정하자.

@PostMapping(path = "/resources", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Dto> getJson() {
    // .. 생략
    return dto;
}

@PostMapping(path = "/resources", produces = MediaType.APPLICATION_OCTET_STREAM)
public ResponseEntity<Resource> getImageResource() {
    // .. 생략
    return imageResource;
}

이제 해당 url(/resources)로 요청을 보낼 때 기대하는 결과(Accept 헤더)에 따라서 다른 종류의 반환 값을 내려줄 수 있다.

 

가령 Accept:application/json 헤더로 요청한다면 JSON을 내려주고, Accept:application/octet-stream 헤더로 요청하면 해당 이미지를 내려주도록 처리가 가능하다.

 

물론 단순히 서버가 클라이언트에게 반환해줄 수 있는 데이터 타입을 명시하기 위해서 사용할 수도 있다!

참고