2024. 10. 9. 12:06ㆍSpring Framework/Web on Servlet Stack
@CookieValue
어노테이션은 HTTP 요청에 포함된 쿠키 값을 메서드의 아규먼트로 바인딩하는 데 사용됩니다. 이를 통해 컨트롤러에서 HTTP 요청에 포함된 특정 쿠키 값을 손쉽게 처리할 수 있습니다.
기본 개념
HTTP 요청을 통해 서버로 전송되는 쿠키는 클라이언트 측에서 저장하고 있는 정보입니다. 서버는 이 쿠키 값을 활용해 세션을 추적하거나 사용자 정보를 관리할 수 있습니다. @CookieValue
어노테이션을 사용하면 특정 쿠키의 값을 직접 아규먼트로 받을 수 있습니다.
예시 상황:
클라이언트에서 서버로 다음과 같은 HTTP 요청이 있다고 가정합니다.
Cookie: JSESSIONID=415A4AC178C59DACE0B2C9CA727CDD84
위 요청에서 JSESSIONID
쿠키의 값을 컨트롤러 메서드에서 받아 처리하고 싶을 때, @CookieValue
어노테이션을 사용하여 쿠키의 값을 아규먼트로 받을 수 있습니다.
예시 코드 (Java)
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
@GetMapping("/demo")
public void handle(@CookieValue("JSESSIONID") String cookie) {
System.out.println("JSESSIONID: " + cookie);
}
}
코드 설명:
@CookieValue("JSESSIONID")
: HTTP 요청에 포함된JSESSIONID
쿠키의 값을 받아서cookie
라는 아규먼트에 저장합니다.- 이 쿠키 값은 메서드 내에서 사용할 수 있으며, 여기서는
System.out.println()
을 통해 값을 출력하는 예시를 보여줍니다.
타입 변환
만약 쿠키 값이 String
이 아니라 다른 타입(예: long
, int
등)이어야 한다면, 스프링은 자동으로 타입 변환을 적용합니다. 예를 들어, 아래와 같이 쿠키 값이 숫자로 변환될 수 있습니다.
@GetMapping("/demo")
public void handle(@CookieValue("sessionId") long sessionId) {
System.out.println("Session ID: " + sessionId);
}
스프링은 내부적으로 String
값을 숫자 타입으로 변환하는 로직을 가지고 있으므로, 쿠키 값이 숫자 형식이라면 자동으로 변환이 가능합니다.
모든 쿠키 값을 Map으로 받기
만약 요청에 포함된 모든 쿠키를 다루고 싶다면, Map<String, String>
을 사용하여 쿠키 이름과 값을 한 번에 받을 수 있습니다.
예시 코드 (모든 쿠키 받기)
@GetMapping("/cookies")
public void handleAllCookies(@CookieValue Map<String, String> cookies) {
cookies.forEach((key, value) -> {
System.out.println(key + ": " + value);
});
}
코드 설명:
@CookieValue Map<String, String> cookies
: HTTP 요청에 포함된 모든 쿠키를 이름과 값으로 받습니다. 이 정보는Map
형태로 저장되며, 각 쿠키의 이름이key
이고, 쿠키 값이value
가 됩니다.cookies.forEach()
를 통해 모든 쿠키의 이름과 값을 출력하는 방식입니다.
Reactive 스택에서의 사용 (Spring WebFlux)
Spring WebFlux에서도 @CookieValue
어노테이션을 사용할 수 있습니다. WebFlux에서는 비동기 처리를 위해 Mono
또는 Flux
를 반환할 수 있으며, @CookieValue
는 기존 Spring MVC와 유사하게 작동합니다.
Reactive 컨트롤러 예시
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;
@RestController
public class ReactiveController {
@GetMapping("/reactive-demo")
public Mono<String> handleReactive(@CookieValue("JSESSIONID") String cookie) {
return Mono.just("JSESSIONID: " + cookie);
}
}
코드 설명:
Mono<String>
: Reactive 프로그래밍에서는 비동기 처리를 위해Mono
타입을 사용합니다.Mono
는 0 또는 1개의 값을 비동기적으로 반환할 때 사용됩니다.@CookieValue("JSESSIONID")
을 통해JSESSIONID
쿠키 값을 아규먼트로 받아 처리한 후, 그 값을Mono.just()
로 감싸서 반환합니다.
요약
@CookieValue
는 HTTP 요청에서 특정 쿠키 값을 아규먼트로 받아오는 어노테이션입니다.- 쿠키 값은
String
뿐만 아니라 숫자 등 다른 타입으로도 자동 변환이 가능합니다. - 모든 쿠키 값을 한꺼번에 다루고 싶다면
Map<String, String>
을 사용하여 쿠키 이름과 값을 관리할 수 있습니다. - Spring WebFlux에서도 동일하게
@CookieValue
를 사용할 수 있으며, 비동기 처리를 위해Mono
또는Flux
를 사용할 수 있습니다.
'Spring Framework > Web on Servlet Stack' 카테고리의 다른 글
Handler Method : @SessionAttributes (6) | 2024.10.09 |
---|---|
Annotated Controllers[3] - @ModelAttribute (0) | 2024.10.09 |
@RequestHeader (0) | 2024.10.09 |
Annotated Controllers[1] (1) | 2024.10.06 |
Filter (0) | 2023.05.19 |