https://sundaland.tistory.com/318
[ ▶ Annotated Controllers[3] - @CookieValue ]
@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를 사용할 수 있다.
'Web on Servlet Stack' 카테고리의 다른 글
Handler Method : @SessionAttribute (0) | 2024.10.11 |
---|---|
Handler Method : @SessionAttributes (0) | 2024.10.11 |
@RequestHeader (0) | 2024.10.11 |
@RequestParam (0) | 2024.10.11 |
Method Arguments (0) | 2024.10.11 |