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