스프링에서 동일한 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
헤더로 요청하면 해당 이미지를 내려주도록 처리가 가능하다.
물론 단순히 서버가 클라이언트에게 반환해줄 수 있는 데이터 타입을 명시하기 위해서 사용할 수도 있다!
참고
'Server > Spring' 카테고리의 다른 글
Spring - Servlet과 Spring의 차이! (0) | 2022.11.16 |
---|---|
Spring - 의존성 주입의 3가지 방법 비교! (0) | 2022.11.08 |
Spring - 다중 데이터 소스 환경에서 spring.sql.init이 동작하지 않는 이슈 해결 (0) | 2022.10.22 |
Spring - Request DTO에 NoArgsConstructor의 AccessLevel을 어떻게 설정할까?! (3) | 2022.10.03 |
Spring - Unique Key를 제어하는 방법 (비교) + Exception 처리! (0) | 2022.09.28 |