1. 소개

이 기사에서는 Spring WebFlux와 Spring Session을 결합하는 방법에 대해 알아봅니다. 특히 Spring Boot 2의 WebFlux와 Spring Session을 통합하는 Spring WebSession을 사용하는 방법을 배웁니다.

Spring 세션 은 " 이름-값 쌍 의 단순화된 맵 "으로 정의됩니다. 세션 은 사용자주체  와 같은 HTTP 세션에 중요한 값을 추적합니다 . 따라서 새로운 반응형 WebFlux Mono Flux 개체 와 함께  세션 관리를 사용할 수 있습니다 스프링 세션은 또한 다른 애플리케이션 컨테이너(단지 Tomcat이 아닌) 사용을 지원합니다.

Spring Session에 대한 자세한 내용은 Baeldung 의 또 다른 훌륭한 기사를 확인하십시오 .

2. 메이븐 설정

이제 앱을 설정하고 구성해 보겠습니다. 고맙게도 pom.xml 구성 은 매우 쉽습니다. 먼저 관련 Spring 세션 의존성과 함께 Spring Boot 2.xx를 사용해야 합니다. Maven Repository를 통해 최신 버전을 추가합니다.

그런 다음 pom.xml 에 추가합니다 .

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
    <version>2.5.1</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    <version>2.5.1</version>
</dependency>
<dependency> 
    <groupId>org.springframework.session</groupId> 
    <artifactId>spring-session-core</artifactId> 
    <version>2.5.1</version> 
</dependency>

이 세 가지 의존성은 메모리 내 세션 관리를 위한 최소 요구 사항입니다. Redis의 경우 다음을 사용합니다.

그런 다음  pom.xml 에 다음을 추가합니다 .

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>2.5.1</version>
</dependency>
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
    <version>2.5.1</version>
 </dependency>

이제 클래스를 구성해 보겠습니다.

3. 메모리 내 구성

메모리 내 구성을 사용하려면 구성 클래스를 추가합니다.

@Configuration
@EnableSpringWebSession
public class SessionConfig {
 
    @Bean
    public ReactiveSessionRepository reactiveSessionRepository() {
        return new ReactiveMapSessionRepository(new ConcurrentHashMap<>());
    }
}

(반응) 저장소를 세션 관리자와 연결합니다. 해당 값을 HashMap 에 저장합니다 .

중요한 것은 구성 클래스에 @EnableSpringWebSession 어노테이션 이 포함되어야 한다는 것 입니다.

4. 레디스 구성

이제 Redis를 연결해 보겠습니다. Redis를 사용하여 WebSession  을 관리하려면 구성 클래스를 추가하십시오.

@Configuration
@EnableRedisWebSession
public class RedisConfig {
 
    @Bean
    public LettuceConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory();
    }
}

구성 클래스에는 @EnableRedisWebSession  어노테이션 이 포함되어야 합니다 @EnableRedisWebSessionEnableSpringWebSession 어노테이션을 예외 없이 함께 사용할 수 없음을 기억하십시오 .

Docker 는 Redis와 상호 작용하는 가장 쉬운 방법 중 하나입니다. Docker를 설치한 후 세 가지 명령만 입력하면 됩니다. 명령을 실행하여 Redis 인스턴스를 불러옵니다.

$ docker stop redis
$ docker rm redis
$ docker run -d --name redis -p 6379:6379 redis:4.0.5-alpine

다음으로 앱을 테스트해 보겠습니다.

5. 실전

이제 반응형 REST 컨트롤러를 앱에 추가해 보겠습니다.

@GetMapping("/websession")
public Mono<String> getSession(WebSession session) {
    session.getAttributes().putIfAbsent("note", "Howdy Cosmic Spheroid!");
    return Mono.just((String) session.getAttributes().get("note"));
}

그런 다음 REST 핸들러에 매개변수를 추가하여 WebSession 을 사용할 수 있습니다. Map을 반환하는 .getAttributes() 메서드를 사용하여 값을 가져오거나 설정할 수 있습니다 .

Spring 앱을 가동해 보겠습니다.

웹세션 1
이제 우리 앱은 localhost:8080 에서 볼 수 있으며  Spring 로그인 페이지를 표시합니다. 기본 로그인 자격 증명( -u admin -p password )을 사용해 보십시오.

웹 세션 2

인증 후 기본 WebSession 값( 0   및 "Howdy Cosmic Spheroid!" )을 변경할 수 있습니다. 컬 명령 실행 :

$ curl -i -H "Accept: application/json" -H "Content-Type:application/json" -X GET http://localhost:8080/websession/test?id=222¬e=helloworld

또는  http://localhost:8080/websession/test?id=222¬e=helloworld URL을 방문하십시오 . 그 후 localhost:8080/websession 에서 반환된 JSON은 업데이트된 세션 값을 표시합니다.

웹세션 3

해당 Endpoints  localhost:8080/websession  은 현재 WebSession 속성 idnote를 반환합니다.

6. 결론

WebFlux 애플리케이션에 Spring WebSession을 추가하는 방법을 배웠습니다. 자세한 내용은 훌륭한 공식 문서를 확인하십시오.

항상 그렇듯이 이 문서에 사용된 코드 샘플 은 GitHub에서 사용할 수 있습니다.

Generic footer banner