레디스 내부의 index를 나눠 사용할 때 어떻게 스프링부트를 사용한 프로젝트에서 이 정보를 구분해서 가져올까?

yeom yaloo·2024년 4월 10일
0

😭 이슈 상황

  • redis 내부에서는 index를 구분으로 사용 가능한 데이터베이스 공간을 제공하는데 우리는 3개의 큰 주제로 크롤링을 진행해 3개의 index를 이용하여 크롤링 데이터를 저장하고 있다.
  • 이때 key,{key: value} 형식인 hash를 이용해서 데이터를 저장하고 가져오려 했는데 이 부분이 꼬여서 다른 대안책으로 진행해야 했다.
  • 그래서 redis index를 따로 두는 형식으로 진행하기로 했고 이를 위해서 batch 프로그램 내의 redis 설정을 따로 진행하기로 했다.

🤓 해결 방안

1. 상속 받아 사용할 Redis Config 부모 설정 파일 작성

@Configuration
public class RedisConfig {
    @Value("${spring.data.redis.host}")
    private String host;

    @Value("${spring.data.redis.port}")
    private int port;

    public RedisConnectionFactory redisConnectionFactory(int dbIndex) {
        final RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
        redisStandaloneConfiguration.setHostName(host);
        redisStandaloneConfiguration.setPort(port);
        redisStandaloneConfiguration.setDatabase(dbIndex);
        return new LettuceConnectionFactory(redisStandaloneConfiguration);

    }
}

2. Match Schedule을 가져올 자식 설정 파일 작성

public class MatchScheduleRedisConfig extends RedisConfig {

	@Bean
	@Primary 
	public RedisConnectionFactory matchScheduleRedisConnectionFactory() {
		return redisConnectionFactory(0);  // Redis DB 선택
	}


	@Bean
	@Qualifier("matchScheduleRedisTemplate")
	public RedisTemplate<?, ?> matchScheduleRedisTemplate(ObjectMapper objectMapper) {
		RedisTemplate<?, ?> template = new RedisTemplate<>();

		template.setKeySerializer(new StringRedisSerializer());
		template.setValueSerializer(new GenericJackson2JsonRedisSerializer(objectMapper));
		template.setHashKeySerializer(new StringRedisSerializer());
		template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer(objectMapper));
		template.setConnectionFactory(matchScheduleRedisConnectionFactory());
		return template;
	}
}

3. 잘 적용되는지 테스트

@SpringBootTest
@AutoConfigureDataRedis
@AutoConfigureDataJpa
public class MatchScheduleReaderTest {
    
    @Autowired
    private RedisTemplate<String, String> matchScheduleRedisTemplate; // String으로 직렬화하여 저장

    @Autowired
    ObjectMapper objectMapper;
    
    @BeforeEach
    public void setup() {
        MockitoAnnotations.initMocks(this);
        matchScheduleReader = new MatchScheduleReader(matchScheduleRedisTemplate, objectMapper);
    }

    @Test
    public void test() throws JsonProcessingException {

        Set<String> keys = matchScheduleRedisTemplate.keys("*");

        for (String key : keys) {
            String json = matchScheduleRedisTemplate.opsForValue().get(key);

            MatchScheduleDTO matchScheduleDTO = objectMapper.readValue(json, MatchScheduleDTO.class);
            System.out.println(matchScheduleDTO.getMatchDate());
            System.out.println(matchScheduleDTO.getMatchState());
            System.out.println(matchScheduleDTO.getAwayTeamScore());
            System.out.println(matchScheduleDTO.getMatchTitle());

        }
    }
}
  • 통합 테스트를 이용해서 진행했고 해당 0번 index에 저장되어 있는 경기 일정 정보를 가져오는 것 역시 잘 된다.

🧐 느낀 점

📌 참고 사이트

profile
즐겁고 괴로운 개발😎

0개의 댓글