springboot redis 연동
2023. 10. 11. 09:44ㆍ스프링
gradle에 추가해준다.
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.session:spring-session-data-redis'
redisConfig 파일을 하나 작성해주어야 하는데 우선 @EnableRedisHttpSession을 통해서 redis로 HttpSession을 사용한다. 꼭 명시 해주자.
@Configuration
@EnableRedisHttpSession(redisNamespace = "${spring.session.redis.namespace}")
@RequiredArgsConstructor
public class RedisConfig {
private static final int sessionTimeoutSeconds = 3600;
@Value("${spring.redis.cluster.nodes}")
private List<String> clusterNodes;
private final ApplicationContext context;
@Primary
@Bean
public RedisIndexedSessionRepository overriddenSessionRepository(RedisIndexedSessionRepository sessionRepository) {
sessionRepository.setDefaultMaxInactiveInterval(sessionTimeoutSeconds);
return sessionRepository;
}
@Bean
public SpringSessionBackedSessionRegistry<? extends Session> springSessionBackedSessionRegistry(RedisIndexedSessionRepository repository) {
return new SpringSessionBackedSessionRegistry<>(repository);
}
@Bean
public RedisConnectionFactory lettuceConnectionFactory() {
List<String> profiles = Arrays.asList(context.getEnvironment().getActiveProfiles());
RedisConfiguration redisConfiguration;
if (profiles.contains("local")) {
String[] split = clusterNodes.get(0).split(":");
redisConfiguration = new RedisStandaloneConfiguration(split[0], Integer.parseInt(split[1]));
} else {
redisConfiguration = new RedisClusterConfiguration(clusterNodes);
}
return new LettuceConnectionFactory(redisConfiguration);
}
@Bean
public RedisTemplate<Object, Object> redisTemplate() {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(lettuceConnectionFactory());
redisTemplate.setEnableTransactionSupport(true);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer(new ObjectMapper()));
return redisTemplate;
}
}
프로젝트 환경에서 개발서버 같은 경우에 cluster방식으로 redis를 사용하기 때문에 local과 분기 처리해서 레디스 설정을 해주었다.
또한 RedisTemplate을 bean등록을 할때 value를 serialize를 할때 현재 genericJackson2JsonRedisSeriaizer를 하고 있는데 이 타입의 경우 클래스 경로까지 redis에 저장이 되어서 같은 redis환경을 사용하는 프로젝트에서 충돌이 있을 수 있다.
나는 현재 프로젝트 별로 네임스페이스를 따고 두고 있어서 그냥 놔뒀지만 같이 공유해야 할 경우 StringRedisSerializer를 사용하고 별도에 로직이 필요하다. bean 등록 한 springsessionedBackedSessionRegistry는 분산환경에서 세션관리를 위해 등록해주고
security 설정에서
private final SpringSessionBackedSessionRegistry<? extends Session> springSessionBackedSessionRegistry;
의존성 주입을 해준 후
.sessionManagement(manage ->
manage
.sessionFixation().changeSessionId()
.maximumSessions(1)
.maxSessionsPreventsLogin(true)
.sessionRegistry(springSessionBackedSessionRegistry)
.expiredUrl(LOGIN)
registry로 등록해준다.
'스프링' 카테고리의 다른 글
spring filterChain 동작과정 (1) | 2023.11.15 |
---|---|
스프링부트 개발 가이드 (1) | 2023.11.08 |
네이버 클라우드 sens 알림톡 발송 (0) | 2023.09.26 |
yml 파일 암호화 (1) | 2023.08.29 |
springdoc swagger 사용하기 (0) | 2023.03.09 |