Repository navigation
[#112] docs. 재매칭 중복 방지를 방 생성 시점으로 결정 (ADR 0013) - #113
Merged
Merged
Conversation
같은 두 사람이 한 주에 여러 그룹에서 만나 양쪽 다 선택하면 rematch 두 행이 각각 성사되고, 같은 주말에 방이 둘 열려 대화가 갈라진다. 이 중복을 어디서 막을지 정한다. 성사 트랜잭션이 아니라 방을 만드는 I2 에서 막는다. 두 성사는 모두 MATCHED 로 남기고(둘 다 사실이다) 방만 하나 만든다. I2 는 단일 스케줄러라 잠금·유일키 같은 동시성 장치가 필요 없다. 검토했으나 채택하지 않은 대안 셋과 근거를 ADR 에 남긴다. - 성사 시점 slot 테이블: 유일키 보유가 유일한 역할인데 대가가 컸고, 확보 실패를 유일키 위반 예외로 판정하면 트랜잭션이 롤백 전용이 되어 취소 전이가 유실된다 - rematch 에 nullable 컬럼 + UK: native 쓰기가 같은 행의 더티체킹과 충돌하고, 채팅 시각을 rematch 에 두지 않는다는 ADR 0012 결정과도 어긋난다 - 방을 둘 만들고 읽을 때 숨김: 규칙이 모든 읽기 경로로 퍼지고 숨긴 방에 메시지가 쌓인다 취소 사유가 NOT_MUTUAL 하나로 유지되므로 ADR 0012 의 cancel_reason 유예 결정도 그대로 간다. Refs #112 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
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.



무엇을
재매칭 중복을 어디서 막을지 정하고 기록합니다. 코드 변경 없음 — 문서 2개뿐입니다.
Refs #112
문제
같은 두 사람이 한 주에 서로 다른 그룹에서 함께 만날 수 있습니다(퀴즈셋당 여러 그룹 + 한 멤버의 다중 그룹 참여, ADR 0008). 양쪽 평가에서 서로를 선택하면
rematch두 행이 각각MATCHED가 되고, 같은 주말에 같은 쌍의 방이 두 개 열립니다. DB는 정상으로 받아들이지만(chat_room유일키가rematch.id기준), 두 사람이 서로 다른 방에 말을 걸어 상대가 답하지 않는다고 오해합니다.기획 확인 결과 횟수 제한은 없었습니다(2026-07-27) — 한 주에 여러 명과 성사 가능, 같은 상대와 다른 주말 재성사도 허용. 막을 것은 중복 하나입니다.
결정
방을 만드는 시점(
I2)에서 막습니다. 성사 트랜잭션은 중복을 신경 쓰지 않고 두 행 모두MATCHED로 남깁니다(둘 다 사실).I2는 단일 스케줄러라 순차 처리되므로 잠금·유일키 같은 동시성 장치가 필요 없습니다.검토했으나 채택하지 않은 대안
ADR에 근거를 남겼습니다.
save()의 유일키 위반 예외로 판정할 수 없습니다(제약 위반 예외 → Spring이 트랜잭션을 롤백 전용으로 마킹 → 같은 트랜잭션의 취소 전이가 커밋되지 못하고 제출 결과까지 유실, 재시도가 같은 경로를 반복하는 고착). 회피에INSERT IGNORE+ H2MODE=MySQL이 필요했습니다.rematch에 nullable 컬럼 + UK — NULL-distinct로 조건부 유일성을 흉내낼 수 있으나, native 쓰기가 같은 행의 JPA 더티체킹과 충돌하고(@DynamicUpdate필요, 또는 성사 로직을 SQL로 해체) 채팅 시각을rematch에 두지 않는다는 ADR 0012 결정과 어긋납니다.I2로 이월한 요구사항A3는 성사 2건에 같은chatRoomId를 채움I2단일 책임, SSOT는chat_room.opens_at/expires_at(C1)부수 효과
Rematch의 취소 사유가NOT_MUTUAL하나로 유지되어 ADR 0012의 "cancel_reason컬럼을 두지 않는다" 결정이 그대로 갑니다.A2(리뷰 제출 API)가 슬롯을 만질 필요가 없어져 선행 조건이 모두 충족됐습니다.이전 리비전
이 브랜치에
rematch_slot구현이 올라가 있었으나 위 재검토로 폐기하고 force-push했습니다. 남은 것은 결정 기록뿐입니다.🤖 Generated with Claude Code