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 어노테이션 이 포함되어야 합니다 . @EnableRedisWebSession 및 EnableSpringWebSession 어노테이션을 예외 없이 함께 사용할 수 없음을 기억하십시오 .
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 앱을 가동해 보겠습니다.
이제 우리 앱은 localhost:8080 에서 볼 수 있으며 Spring 로그인 페이지를 표시합니다. 기본 로그인 자격 증명( -u admin -p password )을 사용해 보십시오.
인증 후 기본 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은 업데이트된 세션 값을 표시합니다.
해당 Endpoints localhost:8080/websession 은 현재 WebSession 속성 id 및 note를 반환합니다.
6. 결론
WebFlux 애플리케이션에 Spring WebSession을 추가하는 방법을 배웠습니다. 자세한 내용은 훌륭한 공식 문서를 확인하십시오.
항상 그렇듯이 이 문서에 사용된 코드 샘플 은 GitHub에서 사용할 수 있습니다.