Aerospike에서 Redis로 마이그레이션하며 겪은 문제와 해결 과정

1. Aerospike vs Redis 간단 비교

둘 다 NoSQL 데이터베이스지만, 아키텍처와 확장성에서 차이가 있다.

특징 Aerospike Redis
아키텍처 대규모 데이터 셋을 처리하도록 설계됨하이브리드 메모리 아키텍처(RAM & SSD 효율적 사용) 단일 코어에서 실행되는 인메모리 데이터 구조 저장소주로 RAM에 데이터를 저장하도록 설계됨
확장성 자동 샤딩과 데이터 재분배를 통해 수평 확장에 최적화됨 Redis Cluster를 통해 최대 1000개의 노드로 확장 가능수직 확장에 더 적합
데이터 모델 키-값 저장소와 문서 모델을 지원 키-값 저장소이면서 다양한 데이터 구조를 지원

 

과거에는 Aerospike를 사용했지만, 최근에는 Redis 사용이 증가하고 레퍼런스가 적어지면서 Aerospike 서버를 Redis로 마이그레이션하는 작업이 필요해졌다.

 

2. 마이그레이션 계획

처음 계획은 다음과 같았다:

  1. Aerospike 서버만 사용하는 프로젝트에 Redis 의존성 추가
  2. 두 개의 DB가 공존하는 상태에서 Redis로 복제
  3. Aerospike 의존성을 삭제하여 완전히 Redis로 전환

그러나 첫 단계인 Redis 의존성 추가부터 오류가 발생했다.

 

3. 발생한 오류와 분석

Spring Boot 애플리케이션에서 Redis 설정을 추가한 후, 다음과 같은 에러가 발생했다.

Caused by: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'redisKeyValueTemplate':
Cannot resolve reference to bean 'redisKeyValueAdapter' while setting constructor argument;
nested exception is org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'redisKeyValueAdapter': Cannot resolve reference to bean 'redisConverter' while setting constructor argument;

 

이 오류는 @Autowired 어노테이션을 사용했지만, 해당하는 Bean을 찾을 수 없어 발생한 UnsatisfiedDependencyException이다.

특히 redisConverter 빈 생성 과정에서 KeyValueMappingContext를 RedisMappingContext로 변환하지 못하는 문제가 있었다.

 

Error creating bean with name 'redisConverter':
Unsatisfied dependency expressed through constructor parameter 0:
Could not convert argument value of type [org.springframework.data.keyvalue.core.mapping.context.KeyValueMappingContext]
to required type [org.springframework.data.redis.core.mapping.RedisMappingContext]

 

원인 분석

  1. Redis 관련 빈 구성 문제
    • RedisConverter 빈을 생성할 때, 필요한 RedisMappingContext 대신 KeyValueMappingContext가 주입되었다.
    • 이는 Spring이 올바른 빈을 선택하지 못했거나, 설정 충돌로 인해 발생하는 문제다.
  2. @EnableRedisRepositories와 @EnableAerospikeRepositories 간 충돌
    • Spring Data Redis와 Spring Data Aerospike 둘 다 spring-data-keyvalue-context를 사용하므로, 빈 주입 과정에서 충돌이 발생한다.

4. 해결 방법

에러의 원인이 Aerospike와 Redis가 동일한 spring-data-keyvalue-context를 사용하고 있기 때문으로 보였기에,

Aerospike 관련 코드를 모두 주석 처리한 후 다시 실행했다. 그러자 Redis 코드가 정상적으로 동작했다.

 

어차피 최종 목표는 Aerospike 의존성을 완전히 제거하는 것이었기 때문에,

별도로 충돌 문제를 해결하지 않고 Aerospike 의존성을 삭제하는 방향으로 진행했다.

 

5. 참고 자료 및 다른 해결 방법

같은 문제를 겪은 사람이 있었고, 아래의 해결 방법을 제시하고 있다.

https://okky.kr/questions/457730

  • Bean 주입 순서를 Redis -> Aerospike 순으로 조정하면 해결될 수 있음

하지만 내 경우에는 이 방법이 효과가 없어서... 결국 오류 해결은 못했지만... 꽤나 고생을 한 것 같다.

 

혹시나 비슷한 문제로 다른 분들이 오랜 시간 고생하지 않기를 바라면서 글을 올린다.