반응형
기존에 Velog에서 포스팅을 했었는데, 블로그를 옮기기도 했고 최근에 다른 프로젝트에서 이 과정이 필요해 기존 게시글을 조금 다듬어서 포스팅하게 되었다.
Spring Web MVC에서 Spring session redis 적용
Spring session redis 적용기
위의 목차를 클릭하면 해당 글로 자동 이동 합니다.
의존성 관리
- Spring boot가 아니어서 starter 라이브러리를 사용하지 않고, 직접 추가해주어야 했다.
- Spring 버전 5.3.21, JDK 8을 기준으로도 정상작동하는 것을 확인했다.
- Maven을 기준으로 하고 있다.
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>2.6.4</version>
</dependency>
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>6.1.8.RELEASE</version>
</dependency>
Config 클래스
- 아마 springContext.xml을 사용하는 분들이 나는 XML이니까 Config 클래스 설정으로 설명이 되어 있으면 다른 포스팅을 찾으러 떠나는 경우가 있을 것이라고 생각한다.
- 사실 XML 설정이나 Config 설정이나 자세히 보면 동일하다.
- Bean을 정의하는 것을 XML 방식으로 어떻게 하는지 조금만 자세히 살펴보면 알 수 있다.
@Configuration
@EnableRedisHttpSession
public class RedisSessionConfig {
@Bean
public RedisConnectionFactory redisConnectionFactory() {
LettuceConnectionFactory factory = new LettuceConnectionFactory("localhost", 6379));
return factory;
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(redisConnectionFactory());
return redisTemplate;
}
@Bean
public CookieSerializer cookieSerializer() {
DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
// 쿠키 설정
cookieSerializer.setCookiePath("/");
cookieSerializer.setCookieName("SESSION");
cookieSerializer.setUseSecureCookie(true);
cookieSerializer.setUseHttpOnlyCookie(true);
cookieSerializer.setSameSite("None");
return cookieSerializer;
}
}
- 커넥션 팩토리에서는 Redis의 주소와 포트를 입력한다.
- 템플릿 설정에서는 어떤 형태로 저장되는지에 따라 조금 다르게 정의할 수 있다.
- 나는 세션에 객체도 담아야하기 때문에 키는 String으로 밸류는 Object로 정의했다.
- 마지막은 쿠키 설정이다. 쿠키 이름과 쿠키의 보안 설정들을 커스텀하는 것이 가능하다.
- 어노테이션들 중 @EnableRedisHttpSession은 Spring에서 Redis session을 사용하도록 설정을 해준다.
- 하지만 이 어노테이션도 결국 빈이기 때문에 우여곡절 끝에 xml에서 해당 빈을 생성했다.
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration" />
- 이 Bean은 SpringContext.xml에 설정해두면 된다.
- 마지막으로 session initializer 클래스를 생성해야 한다.
- 위 Config 클래스 자체를 아래의 이니셜라이저 클래스로 해도 무방할 듯 하다.
public class SessionInitializer extends AbstractHttpSessionApplicationInitializer {
}
- 간단하게 설명하면 @EnableRedisHttpSession 어노테이션으로 인해 생성된 빈은 SpringSessionRespsitoryFilter이다.
- 이니셜라이저는 이 빈이 서블릿 컨테이너에 등록되게 해준다. web.xml에서 직접 등록하는 것과 같은 일을 한다고 보면 된다.
- 아무래도 이 세션 자체는 톰캣에서 생성되는 것이기 때문에, 톰캣으로 들어온 요청이 내 필터를 지나면서 톰캣의 세션이 아니라 Spring에서 정의된 세션을 사용하도록 하는 것이라고 생각하고 있다.
Spring을 그대로 사용하려고 하면, 어쩜 이리 어려운 것들이 많은지... Springboot를 잘 쓰려면 결국 Spring을 알아야 하기에 이렇게 직접 세팅하는 것들을 익히는 것도 좋아보인다.
추천글
Spring API에 Spring session redis 적용하기
Spring session을 사용한 이유는 로드 밸런싱을 위해서 여러 개의 백엔드 컨테이너를 띄웠는데, 각각의 컨테이너 별로 세션을 가지고 있으면, 로드 밸런싱을 최초에 접속한 컨테이너로 사용자가 계
velog.io
반응형
'개발' 카테고리의 다른 글
Redis로 분산락 관리하기 (Spring에 Redisson 적용) (0) | 2025.02.08 |
---|---|
Redis의 고가용성 전략(Sentinel, Clustering) (0) | 2025.01.19 |
적절한 DB Connection Pool 설정하기 (0) | 2025.01.01 |
Servlet & JSP 기반의 웹 앱에 관계형 데이터베이스 연동하기 (MySQL, DBCP) (0) | 2024.08.26 |
Servlet & JSP를 사용해 MVC Model 2 패턴의 웹 앱 제작 기초 (1) | 2024.08.25 |