❗️문제 상황
dependencies {
implementation 'org.springframework.ai:spring-ai-redis-store-spring-boot-starter'
}
ai:
openai:
api-key: ${OPENAI_API_KEY}
embedding:
options:
model: text-embedding-3-large
vectorstore:
redis:
uri: ${REDIS_VECTOR_URI}
port: ${REDIS_VECTOR_PORT}
index: qfeedV-index
prefix: qfeedV
initialize-schema: true
최종 프로젝트에 Vector Database가 필요해 Spring Redis Search 라이브러리를 추가해 환경정보 설정을 yml파일에 해주고 어플리케이션을 실행하였다.
설정 방식은 공식 문서를 참고하였다.
하지만, 다음과 같이 VectorStore Bean을 만들지 못한다는 에러가 발생하였다.
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of constructor in com.wsws.moduleexternalapi.feed.client.RedisVectorClient required a bean of type 'org.springframework.ai.vectorstore.VectorStore' that could not be found.
Action:
Consider defining a bean of type 'org.springframework.ai.vectorstore.VectorStore' in your configuration.
이 오류가 더더욱 이해가 안됐던게 프로젝트에 적용하기 전, 테스트 프로젝트를 하나 따로 만들어 적용 했을 때는, 정상적으로 동작을 했다는 것이었다.
💡 원인 파악 및 해결 과정
우선 테스트 프로젝트와 최종 프로젝트의 환경 차이를 깊게 생각해봤다.
눈에 들어오는 건 Spring Data Redis 유무였다.
테스트 프로젝트에는 Spring Redis Search만 있었고, 최종 프로젝트에는 다른 곳에서도 Redis가 사용되기에 Spring Data Redis도 추가되어 있었다.
dependencies {
// redis
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
}
혹시 스프링이 자동으로 Redis Search에 대한 VectorStore Bean을 만드는 과정에서 Spring Data Redis 설정과 충돌이 발생해 그런건 아니었을까 하는 의심이 들었다.
따라서 나는 VectorStore를 수동으로 주입하기로 결정하였다.
이 방법 역시 공식문서를 참고하였다.
먼저, 자바 진영에서 redis client를 구성하기 위한 라이브러리인 jedis라이브러리가 필요하다.
implementation 'redis.clients:jedis:5.1.0'
그 이후, 다음과 같이 Bean정보를 작성해주었다.
package com.wsws.moduleexternalapi.feed.config;
@Configuration
@RequiredArgsConstructor
public class RedisVectorStoreConfig {
@Value("${spring.ai.vectorstore.redis.uri}")
private String redisHost;
@Value("${spring.ai.vectorstore.redis.port}")
private int redisPort;
@Value("${spring.ai.vectorstore.redis.index}")
private String redisIndex;
@Value("${spring.ai.vectorstore.redis.prefix}")
private String redisPredix;
@Bean
public JedisPooled jedisPooled() {
return new JedisPooled(redisHost, redisPort);
}
@Bean
public RedisVectorStore redisVectorStore(JedisPooled jedisPooled, EmbeddingModel embeddingModel) {
RedisVectorStore.RedisVectorStoreConfig config = RedisVectorStore.RedisVectorStoreConfig.builder()
.withIndexName(redisIndex)
.withPrefix(redisPredix)
.build();
return new RedisVectorStore(config, embeddingModel, jedisPooled, true);
}
}
정상적으로 실행되는 모습!
✅ 정리
아쉽게도 이와 관련된 참고 자료를 찾진 못했다.
Spring ai가 아직 스냅샷이라 이런 버그가 존재하는 것 같다.
이 오류에서 알아야할 점은 Spring Redis Search라이브러리를 Spring Data Redis 라이브러리와 함께 사용하는 경우 반드시 VectorStore Bean을 수동으로 등록해주어야 한다는 점이다.
'트러블 슈팅 > Spring Data' 카테고리의 다른 글
[트러블 슈팅] Could not create query for public abstract (0) | 2025.01.01 |
---|---|
[Trouble-Shooting] Spring JPA @ColumnDefault 오류 (0) | 2024.04.11 |