Skip to content

링크 저장 시 AI 요약 생성 비동기 처리 리팩토링 및 Worker 책임 분리#181

Open
ckdals4600 wants to merge 3 commits intomainfrom
feature/#179-refactor-inital-summarize-asynchronous
Open

링크 저장 시 AI 요약 생성 비동기 처리 리팩토링 및 Worker 책임 분리#181
ckdals4600 wants to merge 3 commits intomainfrom
feature/#179-refactor-inital-summarize-asynchronous

Conversation

@ckdals4600
Copy link
Contributor

관련 이슈

PR 설명

  • 링크 저장 시 발생하는 요약 큐 적재 로직을 완벽한 비동기로 전환하여 메인 API 응답 지연을 방지함.
  • 수동으로 구현되었던 재시도 로직을 스프링의 선언적 애노테이션으로 개선하여 가독성과 유지보수성을 향상함.
  • SummaryWorker에 집중되어 있던 책임을 분리하여 트랜잭션 프록시 내부 호출 버그를 해결하고 DB 커넥션 점유 시간을 최적화함.

작업 내용

비즈니스 로직 및 인프라

  • LinkEventListener@Async를 적용하여 요약 큐 적재 작업을 백그라운드 스레드로 완전히 분리함.
  • 기존 whilesleep 기반의 재시도 로직을 @Retryable(최대 3회, 100ms 대기)로 깔끔하게 리팩토링함.
  • 최대 재시도 횟수 초과 시 안전한 예외 처리를 위해 @Recover 복구 메서드를 구현함.
  • 비동기 및 재시도 기능의 전역 활성화를 위해 AsyncConfig 설정 클래스 신설함.
  • 단일 책임 원칙(SRP)에 따라 SummaryWorker의 로직을 인프라(SummaryWorker), 비즈니스/DB(SummaryService), 외부 API 통신(AiSummaryClient)으로 완벽히 분리함.
  • SummaryWorker@Transactional 메서드 내부 호출(Self-Invocation) 버그를 수정하여 롤백 안정성을 확보함.
  • 응답 대기가 긴 AI 서버 호출 구간을 DB 트랜잭션 밖으로 빼내어 DB 커넥션 풀 고갈 위험을 차단함.

테스트

  • LinkEventListenerTest

    • AOP 프록시 테스트 환경(@EnableRetry, @EnableAspectJAutoProxy)을 명시적으로 구성하여 Spring Retry 동작 검증함.
    • 큐 적재 실패 시 최대 3회 재시도 동작 및 최종 실패 시 @Recover 복구 로직 정상 작동 확인함.
    • 여러 이벤트 인입 시 누락 없는 큐 순차 적재 검증함.
  • SummaryWorkerTest

    • 메인 쓰레드 차단 없이 별도 쓰레드(summary-worker)에서 백그라운드 실행됨을 검증함.
    • Mockito timeout(), InOrder를 활용하여 비동기 환경에서의 큐 아이템 순차 처리 안정성 확보함.
    • 큐 대기(Sleep) 로직 및 예외 발생 시에도 워커 종료 없이 지속 동작하는 로직 확인함.
  • LinkFacadeTest

    • 테스트 환경의 객체 주입 문제로 발생한 이벤트 중복 검증 에러(TooManyActualInvocations)를 atLeastOnce()로 수정하여 해결함.
    • 링크 신규 생성 시 비동기 처리를 위한 LinkCreatedEvent 이벤트 정상 발행 확인함.
    • 메타데이터 크롤링, AI 요약 재생성(차이점 비교), 링크 CRUD 등 핵심 비즈니스 로직 검증함.

- 메인 API 응답 지연 방지를 위해 요약 큐 적재 로직을 @async로 비동기화함.
- 기존 while/sleep 기반의 수동 재시도 로직을 Spring @retryable 어노테이션으로 대체하여 코드 가독성 및 유지보수성을 향상함.
- 재시도 최대 횟수(3회) 초과 시 대체 흐름 처리를 위해 @recover 로직을 추가함.
- AsyncConfig 설정에 @EnableAsync, @EnableRetry 활성화 애노테이션을 추가함.
@github-actions
Copy link

github-actions bot commented Feb 27, 2026

📊 코드 커버리지 리포트

Overall Project 91.33% -0.95% 🍏
Files changed 85.88% 🍏

File Coverage
LinkController.java 100% 🍏
LinkEventListener.java 100% 🍏
MockSummaryClient.java 100% 🍏
LinkFacade.java 100% 🍏
SummaryCommandService.java 100% 🍏
RagSummaryClient.java 97.53% -2.47% 🍏
LinkService.java 96.82% -3.18%
SummaryWorker.java 95% 🍏
LinkQueryService.java 79.46% -19.64%
SummaryService.java 63.16% -36.84% 🍏

@ckdals4600 ckdals4600 force-pushed the feature/#179-refactor-inital-summarize-asynchronous branch from 5a01bd7 to de98703 Compare February 27, 2026 14:57
- SummaryWorker 내 @transactional 내부 호출(Self-Invocation)로 인한 프록시 우회 및 롤백 불가 버그를 수정함.
- SummaryWorker에 집중되어 있던 인프라 로직과 비즈니스 로직을 분리하여 단일 책임 원칙(SRP)을 준수함.
- 로직을 순수 DB/비즈니스 처리를 담당하는 SummaryService와 외부 AI 서버 통신을 전담하는 SummaryClient로 분리함
- 오래 걸리는 외부 AI API 호출 구간을 DB 트랜잭션 범위 밖으로 분리하여 DB 커넥션 풀 고갈 위험을 완벽히 제거함.
@ckdals4600 ckdals4600 force-pushed the feature/#179-refactor-inital-summarize-asynchronous branch from de98703 to 0880395 Compare March 1, 2026 19:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

링크 저장 시 AI 요약 생성 비동기 처리 리팩토링 및 연동

1 participant