😭 이슈 상황
- 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);
}
@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;
@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에 저장되어 있는 경기 일정 정보를 가져오는 것 역시 잘 된다.
🧐 느낀 점
📌 참고 사이트