← 기술 지식

기술 지식 / 소프트웨어 설계 / 상태·데이터 모델

계정 병합의 권리 원장·늦은 결제·취소 경계

소유 증명과 항목별 합산/합집합/제약을 정하고 병합 예약·대표 세대·이벤트 중복·부분 재개·사용 후 보정·세션 회수를 설명합니다.

설계 · 원리·구현·운영
기술 지식 트리

계정 ID 치환과 보존 대상별 병합 규칙

A와 B의 소유권을 모두 증명한 뒤 대표 계정과 병합할 항목을 정합니다. 이메일 문자열이 같다는 사실만으로 소유 증명을 대신하지 않습니다. 구매·포인트·쿠폰·제재·로그인 수단은 같은 합산 규칙을 쓸 수 없습니다.

데이터 병합 규칙의 예
포인트 원장·만료·사용 이력을 보존한 이전
상품 권리 안정 주문 ID 기준 중복 제거·합집합
환불·분쟁 현재 주문 상태·제한 유지
일회성 쿠폰 사용 이력 보존·추가 횟수 생성 금지
제재 정상 계정 병합으로 제한 제거 금지
로그인 수단 provider별 소유 증명·충돌 처리

단순 잔액 합산 뒤 원장을 잃으면 환불·만료·중복 판정을 할 수 없습니다. 되돌릴 수 없는 변경 전에 구체 결과와 제한을 사용자에게 확인합니다.

계정 병합은 ID를 하나로 바꾸는 작업이 아니라 여러 원장과 권리의 소유권을 단계적으로 이전하는 작업입니다. 병합 중 늦게 도착한 사건과 사용 후 취소가 있기 때문에, 대표 ID만 갱신하는 방식보다 항목 ID·세대·보정 상태를 함께 기록하는 방식이 안전합니다.

병합 사건의 최소 trace는 A/B 소유 증명 → generation 7 예약 → E가 원본 A로 도착 → 저장 지점에서 A→B,generation 7 재검사 → event ID E의 대표 원장 적용입니다. 재검사에서 generation이 8로 바뀌었다면 기존 쓰기를 강행하지 않고 재조회 또는 보류로 전환해야 합니다. 연습에서는 E를 두 번 재전송하고, E 적용 뒤 포인트 일부를 사용한 다음 취소를 넣어 원장 합계·사용 이력·조정 원장이 각각 한 번만 바뀌는지 확인합니다. 숫자 잔액만 같아지는 경우는 성공 증거로 충분하지 않습니다.

교차 병합과 원본 쓰기의 상태 계약

동시에 A→B와 B→C가 들어오면 중간 대표·순환·이중 이전이 생길 수 있습니다. 두 계정 ID를 고정된 순서로 lock(동시 변경을 막는 잠금)으로 묶거나, 두 계정의 expected version(읽었을 때의 버전)을 한 원자 예약에서 검사해 병합 등록의 경합을 원자적으로 처리합니다.

이미 진행 중인 계정에는 새 병합을 무작정 시작하지 않고, 대표 조회는 최종 대표와 병합 generation(대표 귀속을 구분하는 세대)을 함께 반환합니다. 대표 연결을 따라가다 이미 방문한 계정으로 되돌아오는 순환은 거절합니다.

최종 대표가 자기 자신을 가리키는 종료 표식은 순환과 구분합니다.

내구 병합 ID 아래에 계정·구매·보상별 단계 상태, 이전한 원장 항목 ID, 실패 내용, 대사 필요 여부를 저장합니다. 병합 작업이 중단됐다가 완료 단계를 재개하면 원본 잔액을 다시 더하지 말고, 고정된 항목 ID가 이미 처리됐는지 확인한 뒤 처리되지 않은 효과만 적용합니다. 여러 service의 효과가 하나의 DB rollback으로 함께 되돌아간다고 가정하지 말고, 단계별 성공과 실패를 남겨 재개 또는 보정 대상으로 구분합니다.

원본 ID의 늦은 사건도 대표와 세대로 판정합니다두 계정 소유 증명·병합 예약. 대표 계정·병합 generation. 기존 권리 원장 이전. 원본으로 온 늦은 결제. 대표 원장 · 안정 ID·조건부 적용원자 예약항목별 재개현재 귀속 확인이전 ID주문·event ID두 계정 소유 증명·병합 예약대표 계정·병합 generation기존 권리 원장 이전원본으로 온 늦은 결제대표 원장 · 안정 ID·조건부 적용
원본 ID의 늦은 사건도 대표와 세대로 판정합니다 화살표는 사건 귀속입니다. 발견한 대표가 아니라 저장 시점의 권위·generation을 검사하고 안정된 주문/event ID로 중복을 막습니다.
그림을 글로 읽기
  • 두 계정 소유 증명·병합 예약
  • 대표 계정·병합 generation
  • 기존 권리 원장 이전
  • 원본으로 온 늦은 결제
  • 대표 원장 · 안정 ID·조건부 적용
  1. 두 계정 소유 증명·병합 예약 → 대표 계정·병합 generation: 원자 예약
  2. 대표 계정·병합 generation → 기존 권리 원장 이전: 항목별 재개
  3. 대표 계정·병합 generation → 원본으로 온 늦은 결제: 현재 귀속 확인
  4. 기존 권리 원장 이전 → 대표 원장 · 안정 ID·조건부 적용: 이전 ID
  5. 원본으로 온 늦은 결제 → 대표 원장 · 안정 ID·조건부 적용: 주문·event ID

전환 직전 결제의 누락·중복 방지

결제 E가 원본 A로 도착했고 조회 결과 현재 대표가 B·generation 7이라면, 실제 원장 저장에서 세대 확인과 E의 적용을 원자적으로 묶어 B에 한 번만 반영합니다. 병합 전환 중이라 적용 대상을 확정할 수 없으면 E를 내구 보류로 기록하고 나중에 어느 원장에 적용할지와 적용 위치를 남깁니다.

mapping(원본과 대표를 연결한 기록)을 조회한 뒤에도 저장 권위가 바뀔 수 있으므로 실제 저장 지점의 generation 조건이 깨지면 저장하지 말고 대표를 재조회합니다. A와 B 양쪽에 지급한 다음 잔액을 합산하면 같은 E를 두 번 반영하는 중복입니다.

환불·취소도 동일한 안정 주문 ID에 연결합니다. 중복 event ID와 동일 주문의 서로 다른 상태 사건을 구분하며 옛 worker의 늦은 쓰기는 거절합니다. 완료 후 원본 session/token은 정책에 맞춰 폐기·재인증하고 옛 ID의 조회·늦은 event routing을 유지할 기간을 정합니다.

병합 취소와 항목별 역이전·보정 경계

아직 이전하지 않은 병합은 예약과 실행권을 해제하는 것으로 취소할 수 있습니다. 하지만 포인트 100을 B로 옮긴 뒤 B에서 60을 썼다면, A의 옛 100 snapshot(이전 시점의 잔액)을 그대로 복원할 경우 이미 사용한 60까지 다시 생겨 재화를 만들 수 있습니다. 따라서 현재 잔액과 권리를 먼저 대조하고, 실제 이전된 항목만 항목별로 역이전하며 필요한 차이는 조정 원장에 기록합니다. 자동 보정이 불가능하면 성공한 것처럼 원복하지 말고 수동 대사 상태로 남깁니다.

취소와 정상 완료가 경합하면 expected state/version·정정 ID로 한 전이를 확정합니다. 기존 성공 이력을 지우지 않고 취소 가능·보상 가능·수동 확인의 경계를 명시합니다. 제재·쿠폰 사용 기록도 보정에서 사라지지 않아야 합니다.

중간 실패의 권리·제한 대조

동시 병합·늦은 결제·응답 유실·같은 단계 반복·사용 후 취소·옛 token·보류 event를 시험합니다. 성공 표시보다 권리 합계·주문 원장·제재·사용 이력·미처리 수를 확인합니다. 이 노트는 병합 설계이며 실제 사용자 계정을 병합한 실행 결과는 아닙니다.

후속·관련 개념

이 개념의 확장

함께 읽을 문서

전체 기술 지식
선택 연습 · 관련 질문 3개

질문은 이해를 확인하는 보조 자료입니다. 학습 경로와 문서의 범위는 질문 수와 독립적입니다.