T_era
MediaMapping의 속성별 차이점 본문
headers, consumes, produces 속성은 Spring MVC에서 HTTP 요청을 특정 핸들러 메서드에 매핑하거나, 해당 메서드의 응답 방식을 설정하는 데 사용되지만, 대상으로 하는 HTTP 헤더와 목적이 명확히 다르다.
headers:
- 대상 헤더: 모든 종류의 HTTP 요청 헤더를 대상으로 한다. Content-Type, Accept, 사용자 정의 헤더 등 어떤 헤더든 지정하여 매핑 조건으로 사용할 수 있다.
- 목적:
- 요청 매핑 조건: 특정 헤더의 존재 여부, 특정 값 여부를 기반으로 요청을 특정 핸들러 메서드에 매핑하는 데 사용된다.
예를 들어, 특정 사용자 에이전트에서 보낸 요청만 처리하거나, 특정 API 키를 담은 헤더가 있는 요청만 처리하도록 설정할 수 있다. - 응답 헤더 설정: 메서드에서 응답 헤더를 직접 설정하는 대신, 어노테이션 레벨에서 특정 헤더 값을 설정할 수도 있다
(덜 일반적인 사용법).
- 요청 매핑 조건: 특정 헤더의 존재 여부, 특정 값 여부를 기반으로 요청을 특정 핸들러 메서드에 매핑하는 데 사용된다.
예시:
@GetMapping(value = "/resource", headers = "X-Custom-Header=value1")
public String getResourceWithCustomHeader() {
return "Resource with custom header";
}
@PostMapping(value = "/data", headers = {"Content-Type=application/xml", "Accept=application/json"})
public String postDataWithXmlAndAcceptJson() {
return "Data received as XML, will produce JSON";
}
2. consumes:
- 대상 헤더: Content-Type 요청 헤더만을 대상으로 한다. Content-Type 헤더는 요청 본문의 미디어 타입을 나타낸다.
- 목적:
- 요청 매핑 조건: 요청 본문의 데이터 형식을 기반으로 요청을 특정 핸들러 메서드에 매핑하는 데 사용된다.
예를 들어, JSON 형식의 데이터가 담긴 POST 요청만 처리하도록 제한할 수 있다. - 수용 가능한 요청 형식 명시: 해당 핸들러 메서드가 어떤 형식의 요청 본문을 처리할 수 있는지 명시적으로 나타낸다.
- 요청 매핑 조건: 요청 본문의 데이터 형식을 기반으로 요청을 특정 핸들러 메서드에 매핑하는 데 사용된다.
예시:
@PostMapping(value = "/users", consumes = "application/json")
public String createUserFromJson(@RequestBody User user) {
// JSON 형식의 요청 본문을 User 객체로 변환하여 처리
return "User created from JSON";
}
@PutMapping(value = "/products/{id}", consumes = {"application/xml", "application/json"})
public String updateProduct(@PathVariable Long id, @RequestBody Object product) {
// XML 또는 JSON 형식의 요청 본문을 처리
return "Product updated";
}
3. produces:
- 대상 헤더: Accept 요청 헤더를 참조하여 응답의 Content-Type 응답 헤더를 설정하는 데 사용된다. Accept 헤더는 클라이언트가 이해할 수 있는 응답 미디어 타입 목록을 나타낸다.
- 목적:
- 응답 형식 지정: 해당 핸들러 메서드가 어떤 형식의 응답 데이터를 생성하여 보낼 것인지 서버에게 알려준다. Spring은 클라이언트의 Accept 헤더와 서버의 produces 설정을 비교하여 가장 적절한 응답 형식을 선택하려고 시도한다
(Content Negotiation). - 제공 가능한 응답 형식 명시: 해당 핸들러 메서드가 어떤 형식의 데이터를 응답으로 제공할 수 있는지 명시적으로 나타낸다.
- 응답 형식 지정: 해당 핸들러 메서드가 어떤 형식의 응답 데이터를 생성하여 보낼 것인지 서버에게 알려준다. Spring은 클라이언트의 Accept 헤더와 서버의 produces 설정을 비교하여 가장 적절한 응답 형식을 선택하려고 시도한다
예시:
@GetMapping(value = "/items/{id}", produces = "application/json")
public ResponseEntity<Item> getItemAsJson(@PathVariable Long id) {
Item item = // ... 조회 로직
return ResponseEntity.ok()
.contentType(MediaType.APPLICATION_JSON) // 명시적으로 설정할 수도 있음
.body(item);
}
@GetMapping(value = "/reports", produces = {"application/pdf", "text/csv"})
public ResponseEntity<byte[]> getReport(@RequestParam String format) {
byte[] reportData;
MediaType mediaType;
if ("pdf".equalsIgnoreCase(format)) {
reportData = // ... PDF 생성 로직
mediaType = MediaType.APPLICATION_PDF;
} else {
reportData = // ... CSV 생성 로직
mediaType = MediaType.TEXT_CSV;
}
return ResponseEntity.ok()
.contentType(mediaType)
.body(reportData);
}
요약:
속성대상 헤더주요 목적사용 시점
| headers | 모든 요청 헤더 | 특정 헤더의 존재/값 기반으로 요청 매핑, (드물게) 응답 헤더 설정 | 요청 매핑 (주요), 응답 설정 (부) |
| consumes | Content-Type | 요청 본문의 미디어 타입 기반으로 요청 매핑, 수용 가능한 요청 형식 명시 | 요청 매핑 (주요), 메서드가 처리할 수 있는 요청 형식 명시 |
| produces | Accept (참조) | 응답 데이터의 Content-Type 설정, 제공 가능한 응답 형식 명시, Content Negotiation에 활용 | 응답 생성 시, 메서드가 생성할 수 있는 응답 형식 명시, 클라이언트가 선호하는 형식에 따라 응답 형식을 결정하는 데 활용 |
핵심은 어떤 HTTP 헤더를 기준으로 매핑 또는 응답 설정을 하는지에 따라 구분된다. headers는 가장 일반적인 헤더들을 포함한 모든 헤더를, consumes는 요청 본문의 형식(Content-Type), produces는 응답 본문의 형식(Content-Type, 클라이언트의 Accept 헤더 기반)을 다룬다.
'Programing > Spring' 카테고리의 다른 글
| Client에서 Server로 데이터 전달 방식 정리 (0) | 2025.05.06 |
|---|---|
| MultiValueMap (0) | 2025.05.06 |
| 특정 파라미터 및 헤더 매핑 (0) | 2025.05.06 |
| @PathVariable 정리 (0) | 2025.05.06 |
| @RequestMapping 어노테이션 정리 (0) | 2025.05.06 |