Skip to content

refactor: 삐봇 연동 API의 슬랙 의존성 제거 - #2482

Merged
taejinn merged 2 commits into
developfrom
refactor/2481-pibot-slack-decoupling
Oct 7, 2026
Merged

taejinn merged 2 commits into
developfrom
refactor/2481-pibot-slack-decoupling

Conversation

@taejinn

@taejinn taejinn commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

🔍 개요


🚀 주요 변경 내용

  • 작업 조회는 작업 ID, 시도 토큰, 기한과 제보 내용만 반환하며 슬랙 전송 대상과 메시지 생성 또는 수정 방법은 삐봇에서 결정하도록 합니다.

    • 조치: 백엔드의 워크스페이스와 채널 설정, 메시지 번호, 전송 확인 모드와 슬랙 오류별 처리 로직을 제거합니다.
  • 작업 결과는 시도 토큰과 성공 또는 실패만 받도록 줄이고, 삐봇의 인증에는 기존 서비스 토큰을 사용합니다.

  • 기존 제보 변경 이력에 작업 상태를 기록해 아직 완료되지 않은 작업을 조회하도록 합니다. 실패하거나 기한이 지난 작업은 같은 작업 ID로 다시 배정하며, 재배정 전의 토큰으로 새 시도를 완료할 수 없도록 합니다.

    • 예: 배정 중 제보가 승인되면 기존 작업 완료 후 승인 상태를 담은 다음 작업을 제공합니다.
  • 제보 접수와 승인, 반려, 영양사 선처리와 관리자 조회는 기존 동작을 유지합니다.

  • 전송 관련 HTTP 테스트와 중복된 Swagger 검증을 제거하고, 작업 순서와 재배정, 동시 배정, 구버전 변경 기록을 확인하는 서비스 테스트 5개로 줄입니다.


💬 참고 사항

  • 작업 조회와 결과 통보의 본문이 변경되므로 삐봇을 함께 수정해야 합니다. 기존 작업 소비를 중지한 뒤 새 계약을 사용하는 백엔드와 삐봇으로 전환해야 합니다.

    • 조치: 백엔드에는 dining.report.bot-token만 등록하며, 슬랙 설정과 메시지 중복 반영 방지는 삐봇에서 관리합니다.
  • 이미 적용된 V12와 V13은 변경하지 않습니다. V14는 기존 변경 이력에 작업 정보를 추가하며, 기존 슬랙 전송 테이블은 적용 이력과 데이터를 보존하기 위해 남기되 실행 코드에서는 사용하지 않습니다.

    • 조치: 새 작업의 완료 상태는 기존 전송 테이블에 기록하지 않으므로 구버전 작업 소비자를 그대로 재가동하지 않습니다.
변경되는 삐봇 API
메서드 경로 내용
POST /internal/dining/soldout-reports/deliveries/claim 슬랙 정보 없이 작업 한 건 배정
POST /internal/dining/soldout-reports/deliveries/{deliveryId}/result 시도 토큰과 성공 또는 실패 결과 접수

✅ Checklist (완료 조건)

  • 코드 스타일 가이드 준수
  • 테스트 코드 포함됨
  • Reviewers / Assignees / Labels 지정 완료
  • 보안 및 민감 정보 검증 (API 키, 환경 변수, 개인정보 등)
검증 결과
  • Java 17과 UTC 환경에서 핵심 서비스 테스트 5개, DB 이관 테스트 1개와 기존 제보 테스트 7개를 통과했습니다.
  • 실제 삐봇과 슬랙을 연결한 검증은 포함하지 않습니다.

Summary by CodeRabbit

  • New Features

    • Dining report delivery now uses a simpler task-based workflow. Tasks include the report, an attempt token, and an expiry time; results report only success or failure.
    • Report changes are processed in order, with failed tasks eligible for retry after a short delay.
  • Improvements

    • Delivery results can be safely resubmitted, and reports remain available as fixed snapshots while delivery is pending.

@taejinn taejinn added 리팩터링 리팩터링을 위한 이슈입니다 DB DB 마이그레이션을 위한 라벨입니다. 공통 백엔드 공통으로 작업할 이슈입니다. labels Oct 7, 2026
@taejinn taejinn self-assigned this Oct 7, 2026
@coderabbitai

coderabbitai Bot commented Oct 7, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: abc932f8-b95a-484d-a82f-eacbe6f614ee
📥 Commits

Reviewing files that changed from the base of the PR and between 13299e1 and 8adfa14.

📒 Files selected for processing (28)
  • src/main/java/in/koreatech/koin/domain/dining/config/DiningReportDeliveryProperties.java
  • src/main/java/in/koreatech/koin/domain/dining/controller/DiningReportBotApi.java
  • src/main/java/in/koreatech/koin/domain/dining/controller/DiningReportBotController.java
  • src/main/java/in/koreatech/koin/domain/dining/dto/DiningReportDeliveryResponse.java
  • src/main/java/in/koreatech/koin/domain/dining/dto/DiningReportDeliveryResultRequest.java
  • src/main/java/in/koreatech/koin/domain/dining/dto/DiningReportDeliveryResultResponse.java
  • src/main/java/in/koreatech/koin/domain/dining/model/DiningReportChange.java
  • src/main/java/in/koreatech/koin/domain/dining/model/DiningReportDelivery.java
  • src/main/java/in/koreatech/koin/domain/dining/model/DiningReportDeliveryAttempt.java
  • src/main/java/in/koreatech/koin/domain/dining/model/DiningReportDeliveryFailureReason.java
  • src/main/java/in/koreatech/koin/domain/dining/model/DiningReportDeliveryMode.java
  • src/main/java/in/koreatech/koin/domain/dining/model/DiningReportDeliveryOperation.java
  • src/main/java/in/koreatech/koin/domain/dining/model/DiningReportDeliveryOutcome.java
  • src/main/java/in/koreatech/koin/domain/dining/model/DiningReportDeliveryStatus.java
  • src/main/java/in/koreatech/koin/domain/dining/model/DiningReportDeliveryTarget.java
  • src/main/java/in/koreatech/koin/domain/dining/model/DiningReportSequence.java
  • src/main/java/in/koreatech/koin/domain/dining/repository/DiningReportChangeRepository.java
  • src/main/java/in/koreatech/koin/domain/dining/repository/DiningReportDeliveryAttemptRepository.java
  • src/main/java/in/koreatech/koin/domain/dining/repository/DiningReportDeliveryRepository.java
  • src/main/java/in/koreatech/koin/domain/dining/repository/DiningReportDeliveryTargetRepository.java
  • src/main/java/in/koreatech/koin/domain/dining/service/DiningReportChangeService.java
  • src/main/java/in/koreatech/koin/domain/dining/service/DiningReportDeliveryService.java
  • src/main/java/in/koreatech/koin/global/code/ApiResponseCode.java
  • src/main/resources/db/migration/V14__decouple_dining_report_delivery.sql
  • src/test/java/in/koreatech/koin/acceptance/domain/DiningReportDeliveryApiTest.java
  • src/test/java/in/koreatech/koin/acceptance/domain/DiningSoldOutReportApiTest.java
  • src/test/java/in/koreatech/koin/acceptance/domain/DiningSoldOutReportConcurrencyTest.java
  • src/test/java/in/koreatech/koin/acceptance/migration/DiningSoldOutReportMigrationTest.java
💤 Files with no reviewable changes (11)
  • src/main/java/in/koreatech/koin/domain/dining/model/DiningReportDeliveryMode.java
  • src/main/java/in/koreatech/koin/domain/dining/repository/DiningReportDeliveryAttemptRepository.java
  • src/main/java/in/koreatech/koin/domain/dining/config/DiningReportDeliveryProperties.java
  • src/main/java/in/koreatech/koin/domain/dining/repository/DiningReportDeliveryRepository.java
  • src/main/java/in/koreatech/koin/domain/dining/repository/DiningReportDeliveryTargetRepository.java
  • src/main/java/in/koreatech/koin/domain/dining/model/DiningReportDeliveryAttempt.java
  • src/main/java/in/koreatech/koin/domain/dining/model/DiningReportDeliveryOperation.java
  • src/main/java/in/koreatech/koin/domain/dining/model/DiningReportDelivery.java
  • src/main/java/in/koreatech/koin/domain/dining/model/DiningReportDeliveryFailureReason.java
  • src/main/java/in/koreatech/koin/domain/dining/model/DiningReportDeliveryTarget.java
  • src/main/java/in/koreatech/koin/domain/dining/model/DiningReportSequence.java

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

The delivery workflow now stores task state and report snapshots on report changes. The bot API returns one claim shape and accepts SUCCEEDED or FAILED results. The migration backfills delivery state from existing records.

Changes

Report change delivery

Layer / File(s) Summary
Persist delivery state on report changes
src/main/java/in/koreatech/koin/domain/dining/model/*, src/main/java/in/koreatech/koin/domain/dining/repository/*, src/main/resources/db/migration/V14__decouple_dining_report_delivery.sql, src/test/java/in/koreatech/koin/acceptance/migration/DiningSoldOutReportMigrationTest.java, src/test/java/in/koreatech/koin/acceptance/domain/DiningSoldOutReportConcurrencyTest.java, src/main/java/in/koreatech/koin/domain/dining/config/DiningReportDeliveryProperties.java
Report changes now store delivery identifiers, snapshots, states, attempt tokens, expiry, retry time, and accepted outcomes. The repository selects due queued changes and expired in-progress changes, while excluding changes blocked by earlier undelivered sequences. Migration V14 adds the delivery fields and constraints and backfills existing rows.
Capture and claim report work
src/main/java/in/koreatech/koin/domain/dining/service/DiningReportChangeService.java, src/main/java/in/koreatech/koin/domain/dining/service/DiningReportDeliveryService.java, src/main/java/in/koreatech/koin/domain/dining/dto/DiningReportDeliveryResponse.java, src/main/java/in/koreatech/koin/domain/dining/controller/DiningReportBotApi.java, src/test/java/in/koreatech/koin/acceptance/domain/DiningReportDeliveryApiTest.java
The change service saves a serialized report snapshot. Claiming selects and issues one eligible change and returns its delivery ID, attempt token, expiry, and report. Tests cover claims, legacy changes, expiry, sequencing, and concurrent claims.
Record delivery results through the reduced API
src/main/java/in/koreatech/koin/domain/dining/dto/DiningReportDeliveryResultRequest.java, src/main/java/in/koreatech/koin/domain/dining/dto/DiningReportDeliveryResultResponse.java, src/main/java/in/koreatech/koin/domain/dining/service/DiningReportDeliveryService.java, src/main/java/in/koreatech/koin/domain/dining/controller/DiningReportBotController.java, src/main/java/in/koreatech/koin/domain/dining/controller/DiningReportBotApi.java, src/main/java/in/koreatech/koin/domain/dining/model/DiningReportDeliveryOutcome.java, src/main/java/in/koreatech/koin/domain/dining/model/DiningReportDeliveryStatus.java, src/main/java/in/koreatech/koin/global/code/ApiResponseCode.java, src/test/java/in/koreatech/koin/acceptance/domain/DiningReportDeliveryApiTest.java, src/test/java/in/koreatech/koin/acceptance/domain/DiningSoldOutReportApiTest.java
The result request now accepts only an attempt token and outcome. SUCCEEDED marks work delivered; FAILED queues it for a later attempt. The service handles repeated results and token conflicts, and the API schemas and tests reflect the reduced request and response shapes.

Priority: ➖ Normal

Estimated code review effort: 4 (Complex) | ~45 minutes

Change: Refactor

Sequence Diagram(s)

sequenceDiagram
  participant Bot
  participant DiningReportBotController
  participant DiningReportDeliveryService
  participant DiningReportChangeRepository
  participant DiningReportChange
  Bot->>DiningReportBotController: Request claim
  DiningReportBotController->>DiningReportDeliveryService: claim()
  DiningReportDeliveryService->>DiningReportChangeRepository: findClaimable()
  DiningReportChangeRepository-->>DiningReportDeliveryService: Eligible change
  DiningReportDeliveryService->>DiningReportChange: Initialize and issue attempt
  DiningReportDeliveryService-->>Bot: Delivery ID, attempt token, expiry, and report
  Bot->>DiningReportBotController: Submit attempt token and outcome
  DiningReportBotController->>DiningReportDeliveryService: recordResult()
  DiningReportDeliveryService->>DiningReportChangeRepository: Find change by delivery ID
  DiningReportDeliveryService->>DiningReportChange: Accept outcome
  DiningReportDeliveryService-->>Bot: Current delivery result
Loading

Merge Risk: 🔵 Low · up to 8adfa

This changes the bot API so that the bot, rather than the backend, handles Slack delivery. The code appears mergeable. However, the bot must be updated at the same time, and the old delivery consumer must be stopped before deployment. Otherwise report notifications could be missed or duplicated.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 67 functions across 16 files. (1 skipped: … Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Issue #2481 requires removing backend Slack routing and message-management logic while preserving delivery claim/result handling and approval/rejection behavior, and updating the API documentation and…
Out of Scope Changes check ✅ Passed The migration, change-history task state, snapshot handling, repository queries, and concurrency and migration tests support the issue's task-claim and result requirements. The remaining API, configur…
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: removing Slack dependencies from the 삐봇 integration API.
Full details: Docstring Coverage

Explanation

Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 67 functions across 16 files. (1 skipped: 1 unsupported.)

  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

@github-actions

github-actions Bot commented Oct 7, 2026 •

Copy link
Copy Markdown

Unit Test Results

   291 files  ±  0     291 suites  ±0   3m 32s ⏱️ -13s
1 430 tests  - 16  1 427 ✔️  - 16  3 💤 ±0  0 ❌ ±0 
1 438 runs   - 16  1 435 ✔️  - 16  3 💤 ±0  0 ❌ ±0 

Results for commit 4fe34d0. ± Comparison against base commit 13299e1.

♻️ This comment has been updated with latest results.

@taejinn
taejinn merged commit 03b1ea4 into develop Oct 7, 2026
7 checks passed
@taejinn
taejinn deleted the refactor/2481-pibot-slack-decoupling branch October 7, 2026 13:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

DB DB 마이그레이션을 위한 라벨입니다. 공통 백엔드 공통으로 작업할 이슈입니다. 리팩터링 리팩터링을 위한 이슈입니다

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[공통] 삐봇 연동 API의 슬랙 의존성 제거

2 participants