@RequestHeader

2024. 10. 9. 11:55Spring Framework/Web on Servlet Stack

[https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/requestheader.html]

@RequestHeader 어노테이션은 HTTP 요청의 헤더 값을 메서드 아규먼트에 바인딩하는 데 사용됩니다. 이 어노테이션을 사용하면 특정 헤더 값을 쉽게 메서드에서 받을 수 있으며, 스프링이 자동으로 해당 값을 제공해 줍니다.

예시 설명

HTTP 요청에 포함된 헤더 중 특정 헤더 값을 가져오는 방법을 생각해봅시다. 아래와 같은 HTTP 요청 헤더가 있다고 가정합니다.

Host: localhost:8080
Accept: text/html,application/xhtml+xml,application/xml;q=0.9
Accept-Language: fr,en-gb;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300

이 중에서 Accept-EncodingKeep-Alive 헤더 값을 컨트롤러 메서드로 전달받아 처리하고 싶다면, @RequestHeader 어노테이션을 사용하면 됩니다. 아래와 같은 방식으로 구현할 수 있습니다.

코드 예시 (Java)

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {

    @GetMapping("/demo")
    public void handle(
            @RequestHeader("Accept-Encoding") String encoding, 
            @RequestHeader("Keep-Alive") long keepAlive) {
        System.out.println("Accept-Encoding: " + encoding);
        System.out.println("Keep-Alive: " + keepAlive);
    }
}

코드 설명:

  1. @RequestHeader("Accept-Encoding") String encoding: HTTP 요청에서 Accept-Encoding 헤더 값을 받아서 encoding 변수에 저장합니다.
  2. @RequestHeader("Keep-Alive") long keepAlive: HTTP 요청에서 Keep-Alive 헤더 값을 받아서 keepAlive 변수에 저장합니다.

스프링은 자동으로 헤더 값을 메서드 아규먼트에 주입해 주며, 만약 헤더 값이 문자열이 아니라 다른 타입(예: long)일 경우에도 자동으로 타입 변환이 이루어집니다.

Map을 사용한 모든 헤더 값 가져오기

모든 헤더 값을 한 번에 처리하고 싶을 때는 Map<String, String>, MultiValueMap<String, String>, 또는 HttpHeaders 타입의 파라미터를 사용할 수 있습니다.

예시 (모든 헤더 값 출력하기)

import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {

    @GetMapping("/headers")
    public void handleAllHeaders(@RequestHeader HttpHeaders headers) {
        headers.forEach((key, value) -> {
            System.out.println(key + ": " + value);
        });
    }
}

코드 설명:

  1. @RequestHeader HttpHeaders headers: 모든 헤더 값을 HttpHeaders 객체로 받아옵니다. 이 객체는 헤더 이름과 값을 Map<String, List<String>> 형태로 저장합니다.
  2. headers.forEach((key, value) -> {...}): 모든 헤더 값을 반복하여 출력합니다.

이 방법을 사용하면 특정 헤더뿐만 아니라 요청에 포함된 모든 헤더 값을 처리할 수 있습니다.

Reactive 스택에서의 사용 (Spring WebFlux)

Spring WebFlux에서도 유사하게 @RequestHeader를 사용할 수 있습니다. Reactive 컨트롤러에서는 Mono 또는 Flux를 반환할 수 있습니다.

Reactive 컨트롤러 예시

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;

@RestController
public class ReactiveController {

    @GetMapping("/reactive-demo")
    public Mono<String> handleReactive(
            @RequestHeader("Accept-Encoding") String encoding,
            @RequestHeader("Keep-Alive") long keepAlive) {
        return Mono.just("Accept-Encoding: " + encoding + ", Keep-Alive: " + keepAlive);
    }
}

코드 설명:

  • Mono<String>을 반환하는 방식으로 비동기 응답을 처리합니다.
  • @RequestHeader는 기존의 MVC 방식과 동일하게 작동하며, 요청 헤더 값을 주입받아 사용할 수 있습니다.

따라서, Spring MVC와 WebFlux에서 @RequestHeader 어노테이션을 사용하면 쉽게 HTTP 요청의 헤더 값을 메서드 아규먼트에 바인딩하여 사용할 수 있습니다.

'Spring Framework > Web on Servlet Stack' 카테고리의 다른 글

Annotated Controllers[3] - @ModelAttribute  (0) 2024.10.09
Annotated Controllers[3] - @CookieValue  (0) 2024.10.09
Annotated Controllers[1]  (1) 2024.10.06
Filter  (0) 2023.05.19
Dispatcher Servlet  (0) 2023.05.02