2024. 10. 9. 11:55ㆍSpring Framework/Web on Servlet Stack
@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-Encoding
과 Keep-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);
}
}
코드 설명:
@RequestHeader("Accept-Encoding") String encoding
: HTTP 요청에서Accept-Encoding
헤더 값을 받아서encoding
변수에 저장합니다.@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);
});
}
}
코드 설명:
@RequestHeader HttpHeaders headers
: 모든 헤더 값을HttpHeaders
객체로 받아옵니다. 이 객체는 헤더 이름과 값을Map<String, List<String>>
형태로 저장합니다.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 |