Annotated Controllers[3] - @CookieValue

2024. 10. 9. 12:06Spring Framework/Web on Servlet Stack

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

@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