Redis 캐싱 도입

왜 필요할까?

현재 만다라트 전체 조회나 하위 목표 조회 시, Spring Boot 서버가 매번 데이터베이스에 쿼리를 보내고 결과를 조합하기 때문에 응답 시간이 1초 이상 소요됩니다. Redis 캐시에 결과를 저장해 두면, 동일한 요청이 반복될 때 DB를 거치지 않고 메모리에서 100ms 이하로 즉시 응답할 수 있습니다.

구체적인 구현과 기대 효과

구체적으로는 Spring의 @Cacheable 애노테이션을 사용해 서비스 메서드 결과를 Redis에 저장하고, 데이터 변경 시 @CacheEvict로 해당 키를 무효화합니다. 캐시 만료 시간(TTL)을 10분 내외로 설정하면, 사용자가 짧은 시간 내에 동일한 만다라트를 반복 조회하더라도 Redis가 즉각 응답을 제공하므로 사용자 체감 성능이 크게 개선됩니다. 또한 데이터베이스에 대한 동시 쿼리 부하가 줄어 들어, 동시 접속자가 증가하더라도 안정적으로 트래픽을 처리할 수 있습니다.

Circuit Breaker & Retry (Resilience4j)

기술 설명

외부 Gemini AI 호출은 우리 서비스의 핵심 기능이지만, 네트워크 장애나 AI 서비스 측의 지연이 발생할 경우 HTTP 타임아웃(기본 5초)까지 클라이언트 요청이 블록되어 전체 서비스 응답이 정지되는 문제가 있습니다. 이 문제를 해결하기 위해 Resilience4j 기반의 Circuit Breaker와 Retry 메커니즘을 도입할 수 있습니다. Circuit Breaker는 장애 임계치를 넘어선 연속적인 실패가 감지되면 자동으로 호출을 차단(open state)하고 즉시 실패를 반환하며, 일정 시간이 지나면 다시 호출을 재개(closed state)하는 구조입니다. Retry는 네트워크 오류와 같은 일시적 장애에 대해 지정된 횟수만큼 자동 재시도를 수행합니다.

왜 필요한가?

현재 AI 추천 로직은 외부 Gemini API가 느려지거나 장애가 나면 HTTP 타임아웃까지 기다린 뒤 서비스 전체가 블록되고, 사용자는 5초 이상 응답을 못 받는 경우가 생깁니다. Circuit Breaker를 쓰면 “이 서비스가 이미 문제를 일으켰으니 당분간 중단” 상태가 되었다가, 상태가 회복되면 다시 시도합니다. Retry를 쓰면 일시적 오류에는 자동 복구가 가능합니다.

기대 효과

외부 장애가 전체 서비스로 전파되는 것을 방지하고, 장애 시에도 빠른 응답을 보장함으로써 서비스 가용성을 높게 유지할 수 있습니다.

AI 서브 모델 추가