T_era

MediaMapping의 속성별 차이점 본문

Programing/Spring

MediaMapping의 속성별 차이점

블스뜸 2025. 5. 6. 17:07

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).
    • 제공 가능한 응답 형식 명시: 해당 핸들러 메서드가 어떤 형식의 데이터를 응답으로 제공할 수 있는지 명시적으로 나타낸다.

예시:

@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