Skip to content

[refactor] AnalysisServiceImpl의 블로킹 재시도 로직 비동기 방식으로 개선 #230

@lSNOTNULL

Description

@lSNOTNULL

🥸 어떤 기능인가요?

블로킹 재시도 로직 비동기 방식으로 개선

현재 AnalysisServiceImpl의 analyzerExpenseData 메소드는 WebClient를 사용한 외부 API 호출 후 .block()을
사용하여 동기적으로 결과를 처리하고 있습니다.

이로 인해, 실패 시 재시도 로직 또한 Thread.sleep()을 사용하는 블로킹 방식으로 구현되어 있습니다.

Spring WebFlux 기반의 리액티브 애플리케이션에서 Thread.sleep()과 같은 블로킹 코드는 워커 스레드를
점유하여, 동시에 여러 요청을 효율적으로 처리해야 하는 리액티브 시스템의 장점을 저해하고 전체적인 성능 및
확장성을 떨어뜨리는 주요 원인이 됩니다.


✅ 작업 내용

  • analyzerExpenseData 메소드 시그니처 변경
    * 기존: AnalyzeExpenseResponseDTO.Suggestion 반환
    * 변경: Mono<AnalyzeExpenseResponseDTO.Suggestion> 반환

  • 재시도 로직 변경
    * Thread.sleep()을 사용한 for 루프를 제거합니다.
    * Reactor가 제공하는 비동기 재시도 연산자인 retryWhen과 Retry.backoff(...)을 사용하여 지수 백오프 및
    지터를 구현합니다.

  • 호출 스택 전파
    * analyzerExpenseData 메소드의 반환 타입이 Mono로 변경됨에 따라, 이를 호출하는 상위
    메소드(getLlmAnalysisResult, analyzeExpenses) 및 관련 Controller의 API 엔드포인트까지 리액티브 체인이
    유지되도록 수정이 필요할 수 있습니다.

기대 효과

  • 성능 및 확장성 향상: 블로킹 호출을 제거하여 워커 스레드가 다른 요청을 효율적으로 처리할 수 있게 되어,
    부하 상황에서의 애플리케이션 응답성과 처리량이 개선됩니다.
    • 코드 일관성: 프로젝트가 사용하는 리액티브 스택(WebFlux)의 설계 원칙과 코드 스타일을 일관성 있게
      유지합니다.
    • 리소스 효율성: 서버의 스레드 리소스를 비효율적으로 점유하는 것을 방지합니다.

😇 이때까지 끝낼게요!

기능 개발 완료 예상 날짜를 작성해주세요.
예: 2025년 9월 1일 (월)


😵 참고할만한 자료 (선택)

src/main/java/store/lastdance/service/analysis/AnalysisServiceImpl.java
(수정 범위에 따라) AnalysisController.java 등 관련 상위 클래스


🙇‍♀️ 이슈 확인했어요:)

  • 팀원 A
  • 팀원 B

Metadata

Metadata

Assignees

Labels

LLM거대 언어 모델을 활용한 분쟁 중재, 지출 분석 등 지능형 기능.Refactor리팩토링analysis가계부 AI지출분석

Type

No type
No fields configured for issues without a type.

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions