1. Aerospike vs Redis 간단 비교
둘 다 NoSQL 데이터베이스지만, 아키텍처와 확장성에서 차이가 있다.
특징 | Aerospike | Redis |
아키텍처 | 대규모 데이터 셋을 처리하도록 설계됨하이브리드 메모리 아키텍처(RAM & SSD 효율적 사용) | 단일 코어에서 실행되는 인메모리 데이터 구조 저장소주로 RAM에 데이터를 저장하도록 설계됨 |
확장성 | 자동 샤딩과 데이터 재분배를 통해 수평 확장에 최적화됨 | Redis Cluster를 통해 최대 1000개의 노드로 확장 가능수직 확장에 더 적합 |
데이터 모델 | 키-값 저장소와 문서 모델을 지원 | 키-값 저장소이면서 다양한 데이터 구조를 지원 |
과거에는 Aerospike를 사용했지만, 최근에는 Redis 사용이 증가하고 레퍼런스가 적어지면서 Aerospike 서버를 Redis로 마이그레이션하는 작업이 필요해졌다.
2. 마이그레이션 계획
처음 계획은 다음과 같았다:
- Aerospike 서버만 사용하는 프로젝트에 Redis 의존성 추가
- 두 개의 DB가 공존하는 상태에서 Redis로 복제
- 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]
원인 분석
- Redis 관련 빈 구성 문제
- RedisConverter 빈을 생성할 때, 필요한 RedisMappingContext 대신 KeyValueMappingContext가 주입되었다.
- 이는 Spring이 올바른 빈을 선택하지 못했거나, 설정 충돌로 인해 발생하는 문제다.
- @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 순으로 조정하면 해결될 수 있음
하지만 내 경우에는 이 방법이 효과가 없어서... 결국 오류 해결은 못했지만... 꽤나 고생을 한 것 같다.
혹시나 비슷한 문제로 다른 분들이 오랜 시간 고생하지 않기를 바라면서 글을 올린다.