Repository navigation
Conversation
xeoxxn
added this pull request to stack #127
October 19, 2026 12:07
github-actions
Bot
requested review from
jjunh33,
leegain1,
sangrae2325 and
tnals0924
October 19, 2026 12:07
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configuration
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. Comment |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
#️⃣연관된 이슈
refactor/#152-fee-request-history([Refactor/#152] 학생회비 납부 요청을 이력으로 쌓기 #156). GitHub 스택 #127로 묶여 있어 아래 PR이 머지되면 base가 자동으로 바뀝니다. 스택의 마지막 PR입니다 — [Feat/#123] 학생회비 납부 사용자 API 개편 #124 → [Feat/#125] 학생회비 납부 관리자 API 개편 #126 → [Refactor/#150] 학생회비 확인필요 상태를 REJECTED로 변경 #154 → [Feat/#151] 학생회비 납부 요청을 한 번에 받고 반려 시 재납부 허용 #155 → [Refactor/#152] 학생회비 납부 요청을 이력으로 쌓기 #156 머지 후에 머지해 주세요.members.is_fee_paid컬럼 · 리스너 · 백필🎯 해결하려는 문제가 무엇인가요?
회원의 회비 납부 여부를
members.is_fee_paid로 판정하도록 되돌릴 예정입니다. 빌릴게 대여 · 행사 신청 · 사물함처럼 납부 여부를 묻는 쪽은 같은 요청에서 이미 member를 읽어 영속성 컨텍스트에 올려둔 경우가 많아, 추가 쿼리 없이 판정할 수 있습니다.그런데 그 값을 바꾸는 쪽(운영진 처리)은 welfare이고 컬럼의 주인은 member입니다. 같은 트랜잭션에서 두 도메인을 함께 고치면,
c04398d에서 member 사본을 지운 이유("주인이 아닌 member 도메인에 welfare 상태를 심고, 같은 트랜잭션에서 맞출 책임을 양쪽에 지운다")가 다시 생깁니다.❓ 왜 해결해야 하나요?
welfare는 "회원의 납부 여부가 바뀌었다"는 사실만 남기고, member가 자기 리스너로 자기 컬럼을 고치게 하려면 그 사실이 먼저 기록돼야 합니다. 리스너와 컬럼은 member PR에서 하고, 이 PR은 기록만 합니다.
⭐ 어떻게 해결했나요?
이벤트 2개 (
core:commoncommon.event)MemberFeePaid하나로는 운영진 정정(납부 취소)을 담을 수 없습니다. 각각이 하나의 사실입니다common에 welfare의 상태 어휘를 들이지 않습니다occurredAt— 같은 회원의 납부 · 취소가 재시도로 순서가 뒤바뀌어 도착할 때 늦은 쪽을 가려내는 데 씁니다기록 시점 —
StudentTransferStatusServiceImpl.review()에서 납부 여부(paid)가 바뀔 때만PENDING → PAIDMemberFeePaidPAID → REJECTED·PAID → PENDING(운영진 정정)MemberFeePaymentCanceledPENDING → REJECTED, 학생 요청(→ PENDING)paid가 그대로false운영진은 회원의 최신 요청만 처리할 수 있으므로(#156) 이 요청의 변화가 곧 회원의 변화입니다.
트랜잭션 —
review()는AdminFeeReviewUseCase트랜잭션에 합류합니다. 상태 UPDATE · 아웃박스 INSERT ·payers동기화가 한 번에 커밋 · 롤백됩니다.OutboxWriter는MANDATORY라 트랜잭션 밖에서 부르면 바로 실패합니다.🔁 이 PR을 위해 스택을 갱신했습니다
origin/main을 [Feat/#123] 학생회비 납부 사용자 API 개편 #124 브랜치에 merge하고 위로 차례로 전파했습니다. 충돌은 #155의AdminFeeSearchUseCase한 곳([Feat/#151] 학생회비 납부 요청을 한 번에 받고 반려 시 재납부 허용 #155 쪽 유지)이었습니다app-api와admin-api에 같은 이름의FeeAccountProvider(@Component)가 있어 서버가 기동하지 못하는 문제(ConflictingBeanDefinitionException)를 발견했습니다. 버그가 생긴 #126에 수정 커밋(bd259f2, 관리자 쪽을AdminFeeAccountProvider로 변경)을 넣었습니다🧩 이 PR의 한계 & 트레이드오프
PUBLISHED로 처리하고OutboxCleaner가 7일 뒤 지웁니다. member PR에서 리스너를 붙여도 그 전까지의 변경은 다시 오지 않습니다RentalApplyConcurrencyTest의 서버 전체 컨텍스트 기동 포함(R2 환경변수가 필요한 테스트라 연결하지 않는 더미 값으로 실행), MySQL 8.4 컨테이너 FlywayV26,ModularityTests·DomainImplAccessTests. 이벤트 JSON 왕복은 Jackson 3.1.4로 확인했습니다(occurredAt마이크로초까지 동일). 이벤트가 실제로outbox_events에 쌓이는지 확인하는 테스트는 쓰지 않았습니다⛓️ 기존 기능에 미치는 영향
outbox_eventsINSERT가 최대 1건 늘어납니다🔀 Edge Case & 실패 시나리오
PAID → PAID(문구만 다시 저장 등)REJECTED → REJECTED(안내 문구 수정)payers동기화가 실패해 롤백FEE_REQUEST_NOT_LATEST로 막혀 이벤트 없음MemberFeePaid→MemberFeePaymentCanceled→MemberFeePaid순서로 3건 (occurredAt으로 순서 판별 가능)📋 검토한 대안과 선택 이유
FeePaymentStatusChanged): member가 필요한 건paid하나라, 쓸모없는 이벤트와 리스너 분기만 늘어납니다boolean paid: 가능하지만 "회원이 냈다 / 납부가 취소됐다"가 각각 사실로 읽히는 쪽을 택했습니다members직접 수정:c04398d에서 지운 구조로 되돌아갑니다💬 리뷰 포인트
[r]member PR에is_fee_paid백필이 반드시 들어가야 합니다 — 회원별 최신 요청이PAID인지로 한 번에 채웁니다 (위 한계 1번)[c]이벤트를 둘로 나눈 것과 이름[c]occurredAt에LocalDateTime을 쓴 것 — 기존 이벤트엔 시각 필드가 없었습니다