Repository navigation
Conversation
xeoxxn
added this pull request to stack #127
October 19, 2026 09:24
github-actions
Bot
requested review from
jjunh33,
leegain1,
sangrae2325 and
tnals0924
October 19, 2026 09:24
This was referenced Oct 19, 2026
|
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 |
…ee-request-history
This was referenced Oct 19, 2026
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.
#️⃣연관된 이슈
feat/#151-fee-single-step-request([Feat/#151] 학생회비 납부 요청을 한 번에 받고 반려 시 재납부 허용 #155). GitHub 스택 #127로 묶여 있어 아래 PR이 머지되면 base가 자동으로 바뀝니다. [Feat/#123] 학생회비 납부 사용자 API 개편 #124 → [Feat/#125] 학생회비 납부 관리자 API 개편 #126 → [Refactor/#150] 학생회비 확인필요 상태를 REJECTED로 변경 #154 → [Feat/#151] 학생회비 납부 요청을 한 번에 받고 반려 시 재납부 허용 #155 머지 후에 머지해 주세요.🎯 해결하려는 문제가 무엇인가요?
student_transfer_statuses가 회원당 한 행이라, 반려된 학생이 다시 내면 이전 요청(남은 학기 · 캡처 · 금액 · 안내 문구)을 덮어씁니다. 운영진은 "3학기라고 했다가 반려되자 2학기로 바꿔 다시 낸" 이력을 볼 수 없습니다.또 같은 회원의 첫 요청이 동시에 두 번 오면 두 번째가 500입니다 (#155의 한계).
❓ 왜 해결해야 하나요?
members.is_fee_paid를 아웃박스 이벤트로 맞출 때, "어느 요청이 납부 여부를 바꿨는지"를 요청 ID로 가리켜야 합니다⭐ 어떻게 해결했나요?
저장 (
V26)uk_student_transfer_statuses_member_id제거active_member_id = IF(status IN ('PENDING', 'PAID'), member_id, NULL)생성 컬럼(VIRTUAL)에 UNIQUE. MySQL UNIQUE는NULL을 여럿 허용하므로 반려 행은 몇 개든 남고, 진행 중 · 완료 요청은 회원당 하나만 들어갑니다.members.active_student_id와 같은 패턴입니다(member_id, student_transfer_status_id)— 기존 유니크를 지우기 전에 만들어 조회가 인덱스를 잃는 순간이 없게 했습니다MemberJpaEntity와 같은 방식)회원의 지금 상태 = 최신 요청 = PK 최대
requested_at은 초 단위라 같은 초에 겹칠 수 있습니다findFirstByMemberIdOrderByIdDesc/ 목록 · 회원별:r.id = (SELECT MAX(r2.id) ... WHERE r2.memberId = r.memberId)동작
REJECTED일 때만 새 행을 INSERT합니다. 이전 행은 고치지 않습니다RepositoryImpl.save가saveAndFlush+ConstraintViolationUtil로 409FEE_REQUEST_ALREADY_REQUESTED로 바꿉니다 (사물함LockerApplicationRepositoryImpl과 같은 패턴)FEE_REQUEST_NOT_LATEST(신규). 지난 요청을 되살리면 진행 중 요청이 둘이 될 수 있어서입니다FeeSubmitUseCase의 이전 이미지 삭제 로직을 걷어냈습니다커밋 순서 — 중간 커밋에서도 데이터가 꼬이지 않게 잡았습니다
🧩 이 PR의 한계 & 트레이드오프
ItemOptimisticLockTest—MySqlJpaTest상속)로 FlywayV20→V26실제 적용,ddl-auto=validate엔티티 검증, 새 JPQL 파싱까지 통과했습니다.ModularityTests·DomainImplAccessTests통과⛓️ 기존 기능에 미치는 영향
student_transfer_statuses에 같은 회원의 행이 여러 개 생깁니다. 이 테이블을member_id로 조회하는 곳은 전부 최신 행 기준으로 바꿨습니다 (payers는 그대로 회원당 1행)FEE_REQUEST_NOT_LATEST가 납니다 ("지난 요청"은 이 PR에서 처음 생깁니다)saveAndFlush라 INSERT · UPDATE가 즉시 나갑니다. 같은 트랜잭션 안이라 원자성은 그대로입니다🔀 Edge Case & 실패 시나리오
PENDING, 나머지는 409FEE_REQUEST_ALREADY_REQUESTEDREJECTED2행 +PENDING1행. 화면 · 목록은 최신(PENDING)PATCHFEE_REQUEST_NOT_LATESTREJECTED를PAID로 정정📋 검토한 대안과 선택 이유
SELECT ... FOR UPDATE): 첫 요청은 잠글 행이 없습니다. 갭 락으로 막을 수는 있지만 두 요청이 같은 갭을 잡으면 교착으로 끝나기 쉽습니다is_latest플래그 컬럼: 새 행마다 이전 행 UPDATE가 따라와 쓰기가 둘이 되고, 둘이 어긋날 여지가 생깁니다💬 리뷰 포인트
[c]생성 컬럼 유니크로 동시 요청을 막는 방식[c]지난 요청 처리를 막은 것 (FEE_REQUEST_NOT_LATEST)[a]saveAndFlush로 바꾼 것 — 운영진 처리 트랜잭션에서도 UPDATE가 즉시 나갑니다