https://sundaland.tistory.com/317
[ ▶ @RequestHeader ]
@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 요청의 헤더 값을 메서드 아규먼트에 바인딩하여 사용할 수 있다.
'Web on Servlet Stack' 카테고리의 다른 글
Handler Method : @SessionAttributes (0) | 2024.10.11 |
---|---|
Annotated Controllers[3] - @CookieValue (0) | 2024.10.11 |
@RequestParam (0) | 2024.10.11 |
Method Arguments (0) | 2024.10.11 |
Servlet (0) | 2024.10.08 |