Skip to content

fix: #253 Outbox 조건부 Bean 등록 순서 제거 - #254

Merged
PHJ2000 merged 4 commits into
mainfrom
fix/253-outbox-bean-registration
Sep 14, 2026
Merged

PHJ2000 merged 4 commits into
mainfrom
fix/253-outbox-bean-registration

Conversation

@geonusp

@geonusp geonusp commented Sep 13, 2026

Copy link
Copy Markdown
Collaborator

🔗 Jira Issue

  • 별도 Jira Issue 없음

🔒 Close Issue

🧩 한눈에 요약

어떤 버그였나?

  • Dev에서 Firebase 초기화는 성공했지만 Outbox 관련 빈과 스케줄러가 등록되지 않아 이벤트가 PENDING 상태로 누적됐다.

왜 발생했나? (Root Cause)

  • 일반 @Configuration에 연쇄 적용한 @ConditionalOnBean이 관련 Bean definition 처리 전에 평가되면 설정 전체가 제외된다.
  • 이후 FirebaseMessaging이 생성돼도 이미 제외된 Outbox 설정은 다시 평가되지 않는다.

어떻게 고쳤나?

  • OutboxFirebaseConfig 등록 조건을 app.firebase.enabled=true 속성 기준으로 변경했다.
  • OutboxSchedulingConfig는 Firebase와 polling 활성화 속성이 모두 true일 때 등록되도록 변경했다.
  • 실제 FirebaseConfig, OutboxFirebaseConfig, OutboxSchedulingConfig를 함께 로드하는 순서 회귀 테스트를 추가했다.
  • 테스트에서는 실제 Firebase 외부 호출을 Mock하고, OutboxPublisher 통합 테스트의 빈 구성은 테스트 계층으로 격리했다.

🧯 재현 & 검증

재현 방법

  • app.firebase.enabled=true, app.outbox.polling.enabled=true로 애플리케이션을 기동한다.
  • 기존 구현에서는 Firebase 초기화 후에도 Outbox 조건 평가 시점에 따라 OutboxPublisher와 스케줄러가 제외될 수 있다.
  • 기대 결과: 설정 처리 순서와 관계없이 Firebase 및 Outbox 관련 빈이 등록된다.
  • 기존 실제 결과: Outbox 관련 빈이 제외되고 이벤트가 PENDING으로 남는다.

재발 방지

  • 회귀 테스트 추가
  • 모니터링/알람 보강
  • 테스트 설정 의도 주석 보강

✅ Acceptance Criteria (AC)

  • app.firebase.enabled=true에서 Firebase 및 Outbox 관련 빈이 설정 처리 순서와 관계없이 등록된다.
  • app.firebase.enabled=false에서 Outbox 전송 빈이 제외되고 컨텍스트가 정상 기동한다.
  • app.outbox.polling.enabled=false에서 Outbox 스케줄러만 제외된다.
  • 운영 Firebase/Outbox 설정 조합을 함께 로드하는 회귀 테스트를 추가한다.
  • Dev 배포 후 tasks.scheduled.execution에서 scheduleOutboxPolling 실행을 확인한다.
  • 기존 PENDING 이벤트 상태 전이와 Tempo outbox process span 생성을 확인한다.
  • docs 레포 트러블슈팅 문서를 별도 반영한다.

🧪 테스트 / 검증

로컬

  • Command: gradlew.bat check --quiet --rerun-tasks
  • Result: PASS (exit code 0)
  • Targeted: OutboxFirebaseConditionContextTest 4개, OutboxPublisherIntegrationTest 11개 PASS

CI

  • 링크/결과: PR 생성 후 자동 실행

Smoke / 수동 검증

  • 시나리오: Dev 배포 후 스케줄러 실행, PENDING 상태 전이 및 Tempo span 확인
  • 결과: 배포 후 확인 예정

테스트 공백

  • 실제 FCM 전송은 자격증명과 외부 호출이 필요하므로 로컬 테스트에서 Mock 처리했다.

🧭 영향 범위

  • API 스펙 변경 없음
  • DB 스키마 변경 없음
  • 설정/환경변수 변경 없음
  • 캐시/큐 영향 없음
  • Firebase/Outbox 조건부 빈 등록 경계 변경

💥 Breaking / Compatibility

  • Breaking change 없음

🚀 배포/릴리즈

Feature Flag

  • 기존 app.firebase.enabled, app.outbox.polling.enabled 사용

모니터링/알림

  • 확인할 항목: tasks.scheduled.execution, Outbox 상태별 건수, Tempo outbox process
  • 에러/로그 키워드: Outbox 폴링, Outbox 이벤트 발송

⚠️ 리스크 & 롤백

리스크

  • Firebase가 활성화된 환경에서 기존에 누락되던 Outbox 스케줄러가 정상 실행되므로 누적된 PENDING 이벤트가 처리될 수 있다.

롤백

  • 배포 롤백으로 이전 이미지 복구 가능
  • DB 마이그레이션 없음

💬 리뷰 가이드

  • 꼭 봐야 하는 파일/로직: OutboxFirebaseConfig, OutboxSchedulingConfig, OutboxFirebaseConditionContextTest
  • 트레이드오프/대안: Bean 존재 조건 대신 명시적 활성화 속성을 사용해 설정 처리 순서 의존성을 제거했다.
  • 성능/보안/호환성 영향: 처리 로직 변경은 없으며 API·DB 호환성 영향도 없다.

- Firebase 활성화 속성을 기준으로 Outbox 전송 빈을 등록해 구성 처리 순서 의존성을 제거
- Firebase와 Outbox 폴링이 모두 활성화된 경우에만 스케줄러를 등록
- 테스트 프로필의 Firebase Mock 구성을 분리하고 조건 조합 회귀 테스트를 추가
- 검증: gradlew.bat check --quiet --rerun-tasks 통과
- 테스트 스케줄러 자동 실행이 DB 검증을 비결정적으로 만드는 이유를 설명
- FirebaseMessaging Mock과 OutboxPublisher 수동 호출 방식을 명시
- 검증: staged diff 및 whitespace 검사 통과
- FirebaseConfig의 test 프로필 제외 조건을 제거해 enabled 속성만 등록 기준으로 유지
- 실제 Firebase와 Outbox 운영 설정을 함께 로드하는 순서 회귀 테스트로 보강
- OutboxPublisher 통합 테스트는 Firebase를 켜지 않고 테스트 전용 Outbox 빈과 Mock으로 격리
- 검증: gradlew.bat check --quiet --rerun-tasks 통과
- FirebaseConfig가 test 프로필이 아닌 enabled 속성으로 비활성화됨을 명시
- FirebaseMessaging Mock의 선택 및 동작 설정 방식을 현재 테스트 구조에 맞게 수정
- 검증: gradlew.bat check --quiet --rerun-tasks 통과
@coderabbitai

coderabbitai Bot commented Sep 13, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Advanced

Run ID: e1dc4950-1dcc-4776-a119-d72634be79da

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@geonusp geonusp self-assigned this Sep 13, 2026
@PHJ2000
PHJ2000 self-requested a review September 14, 2026 01:38

@PHJ2000 PHJ2000 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

확인했습니다. 별다른 문제가 없어 머지하겠습니다.

@PHJ2000
PHJ2000 merged commit e5b80db into main Sep 14, 2026
3 checks passed
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.

[bug] Outbox 조건부 Bean 등록 순서로 알림 폴링 미실행

2 participants