Skip to content

[feat] 당일 봉사 미이행 처리와 날짜별 기록 API - #251

Merged
kimseongchan0914 merged 9 commits into
developfrom
feat/volunteer-duty-missed
Oct 15, 2026
Merged

kimseongchan0914 merged 9 commits into
developfrom
feat/volunteer-duty-missed

Conversation

@kimseongchan0914

Copy link
Copy Markdown
Contributor

✨ 작업 내용

당일 봉사자로 지정됐는데 봉사를 하지 않은 학생(미이행)을 기록하고, 날짜별로 조회하는 API를 추가했습니다.

API 설명
POST /api/v1/volunteer/{studentId}/duty/missed 오늘 지정 미이행 처리 {delta, reason} → 명단 항목
GET /api/v1/volunteer/duties?date=yyyy-MM-dd 날짜별 당일 봉사자 기록(없으면 오늘). status·adjusted·addedCount·reason
GET /api/v1/volunteer/duties/summary?month=yyyy-MM 월 단위 미이행 요약 {"2026-10-14": 2}
PATCH /api/v1/volunteer/duties/{date}/{studentId}/missed 그날 횟수 미처리 미이행 처리 → 그날 기록
  • V20 migration: volunteer_duty.status에 MISSED, volunteer_adjustment에 duty_id(지정당 DUTY_MISSED 하나, partial unique)와 kind=DUTY_MISSED
  • 미이행은 지정을 지우지 않고 MISSED로 바꾸며, 상태 변경·조정 기록·횟수 변경을 한 트랜잭션에서 합니다. delta 0이면 미이행만 기록(adjusted: false), 음수는 남은 횟수까지만 차감합니다.
  • 운영일이 지났는데 ASSIGNED인 지정은 저장값을 바꾸지 않고 조회 때 MISSED, adjusted: false로 보입니다.
  • 미이행 지정은 완료·취소할 수 없습니다(409 DUTY_MISSED). 완료한 지정은 미이행으로 바꿀 수 없고(409 DUTY_ALREADY_COMPLETED), 이미 횟수를 처리한 미이행은 다시 처리할 수 없습니다(409 DUTY_ALREADY_ADJUSTED).
  • 하네스 포인터: [docs] 당일 봉사 미이행 처리와 날짜별 기록 Start-Up-harness#37 (REQ-COM-006, DEC-034, ACC-COM-007, contracts/volunteer.openapi.yaml)

🔍 리뷰 시 참고사항

  • 동시성: 미이행은 지정 행을 FOR UPDATE로 잠근 뒤 학생 행을 잠급니다. 완료 처리(지정 UPDATE → 학생 UPDATE)와 잠금 순서가 같아 서로 기다리다 멈추지 않습니다. 같은 Idempotency-Key 재시도는 지정 잠금으로 줄을 서서 한 번만 반영되고, 다른 지정·종류·delta에 쓴 키는 409 IDEMPOTENCY_KEY_REUSED입니다.
  • CANCELLED는 없습니다. 지정 취소는 지금처럼 행을 지우므로 날짜별 기록에 나오지 않습니다.
  • 웹 영향: 명단 todayDuty에 MISSED, 조정 이력 kind에 DUTY_MISSED가 새로 나옵니다.
  • 미이행은 지정 알림을 지우지 않고, 학생 앱 봉사 내역(완료만)에 넣지 않습니다.
  • 하네스 PR이 먼저 머지되면 포인터를 main 커밋으로 맞추겠습니다.

검증: 빈 PostgreSQL에서 ./gradlew clean build 통과(테스트 636개, 실패 0). 로컬 개발 DB(기존 데이터 있음)에서는 이번 변경과 무관한 FaceTemplateRepositoryTest 1개가 남은 데이터 때문에 실패했습니다. 실제 웹 연동은 확인하지 않았습니다.


✅ 체크리스트

  • 문서(README, .env.example 등) 변경이 필요한 경우 작성 또는 수정했나요?
  • 작업한 코드가 정상적으로 동작하는 것을 직접 확인했나요?
  • 필요한 경우 테스트 코드를 작성하거나 수정했나요?
  • Merge 대상 브랜치를 올바르게 설정했나요?
  • PR에 관련 없는 작업이 포함되지 않았나요?
  • 적절한 라벨과 리뷰어를 설정했나요?

📎 관련 이슈(선택)

🤖 Generated with Claude Code

@kimseongchan0914 kimseongchan0914 added the feature 새로운 기능 추가 label Oct 15, 2026
@kimseongchan0914 kimseongchan0914 added the server Spring 서버 영역 label Oct 15, 2026
@kimseongchan0914 kimseongchan0914 added feature 새로운 기능 추가 server Spring 서버 영역 labels Oct 15, 2026
@kimseongchan0914 kimseongchan0914 self-assigned this Oct 15, 2026

@wook10 wook10 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

좋은 코드입니다!

@kimseongchan0914
kimseongchan0914 merged commit 688d007 into develop Oct 15, 2026
2 checks passed
@kimseongchan0914 kimseongchan0914 mentioned this pull request Oct 15, 2026
4 of 6 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature 새로운 기능 추가 server Spring 서버 영역

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants