콘텐츠로 이동

ADR-0052: Sync 온프렘 토폴로지 재검토 — 클라우드 사상에서도 2모듈 표준 유지, 근거 재정초

  • 상태: 승인됨
  • 날짜: 2026-08-12
  • 관련: ALPHA-956 · ADR-0036(2모듈 표준 — 재검토 대상, 유지 결론) · ADR-0051(BYOC 배포 토폴로지) · ADR-0021(DMZ 배치) · ADR-0040(무결성 서명 목표 계약) · sync-protocol.md

맥락

ADR-0036 은 Sync Agent(DMZ)+Intake(내부망) 2모듈 상시 분리를 표준으로 정했고, 표준 판정의 결정적 근거는 "다수 증권사의 망분리 정책(DMZ→내부망 직접 DB 커넥션 금지, 망연계 솔루션 경유 요구)과의 충돌" — 물리 망분리 전제였다. ADR-0051 로 기본 납품 형태가 증권사 클라우드 계정(BYOC, 경계=서브넷+SG)으로 확정되면서 이 근거가 기본 형태에서 사라졌고, 0051 은 "서브넷+SG 경계가 신뢰 구역 분리를 대체하는지 정면으로 다루는 별도 ADR"을 의무로 남겼다. 이 ADR 이 그 재검토다.

재검토에서 두 가지를 대조했다.

① 신뢰 구역 논거 대 서브넷+SG. 2모듈 분리가 사는 것: 외부와 통신하는 프로세스(sync-agent)가 내부망 DB 자격증명을 갖지 않는다 — 외부 접점이 탈취돼도 DB 직행 경로가 없다. 클라우드 사상에서 외부 방향 유입 표면은 좁다(벤더 방향은 outbound Pull 뿐, 전송은 PrivateLink — 0051 결정 3, 비AWS 테넌트는 인터넷 outbound 443). sync-agent 가 여는 리스너는 내부망 쪽 하나다 — intake 가 폴링하는 릴레이 표면(GET /internal/v1/bundles, 내부망→DMZ 방향 제어 신호로 0036 이 허용한 경로). 그러나 이 분리 자체의 대체물은 서브넷+SG 에 없다 — SG 는 경로를 좁힐 뿐, "외부 통신 프로세스와 DB 자격증명의 분리"는 모듈 경계가 만든다. 즉 0036 의 핵심 논거는 망연계 장비가 아니라 신뢰 구역 분리이고, 이는 사상 후에도 유효한 방어 계층이다.

② 전환 비용의 방향. 0036 결과 절은 작성 시점(2026-07-21) 기준 "Intake 는 walking skeleton 단계에서 구현된다(현재 미구현)"고 썼으나, 이는 이미 지난 기록이다 — 현재 저장소에는 2모듈이 구현·검증돼 있다: sync-agent 의 릴레이 표면(BundleRelayController)과 intake 의 폴링·적재(IntakePoller· BundleIngestor)가 테스트와 함께 존재하고, Raw Event Store writer 메타데이터도 V202607211900__update_sync_writer_comments.sql 로 writer = intake 가 이미 적용돼 있다. 게다가 구현은 0036 이 예시한 조율(DMZ-local 진행 마크 + commit-ack 신호)보다 단순한 무상태 릴레이다 — sync-agent 는 진행 상태를 아예 갖지 않고, 재개점은 intake 의 committed cursor(sync_state) 단독이며 intake 가 매 pull 의 after 로 전달한다. "commit-ack 없이 전진 금지"라는 0036 의 정확성 요구는 전진시킬 상태 자체가 없어 자동 성립한다(유실 없음 불변식은 IntakePoller 의 틱 재시도가 지킨다). 따라서 "단일 모듈로 자리바꿈"은 배선 절감이 아니라 이미 낮게 구현된 조율 위에서 기구현 자산의 병합·cursor 소유권 이전·마이그레이션 재작업을 새로 사는 것이다.

결정

  1. 클라우드 사상을 포함한 전 배치 형태에서 2모듈 표준을 유지한다. ADR-0036 의 결정 골격(2모듈 표준·cursor 권위 = Intake·단일 모듈 옵션·Cloud 계약 불변)은 유효하다 — 예외는 조율 메커니즘 문면 하나로, 결정 5가 부분 대체한다. 바뀌는 것은 표준 판정의 근거다: "망연계 요구 증권사와의 충돌 회피"(물리 전제, 기본 형태에서 소멸)가 아니라 ① 외부 통신 프로세스와 DB 자격증명의 신뢰 구역 분리는 사상 후에도 유효한 방어 계층이고 ② 그 배선은 이미 구현·테스트·마이그레이션까지 완료된 자산이라 유지가 최소 비용이다.
  2. 클라우드 사상에서의 배치 대응을 명시한다. sync-agent 는 DMZ 사상 서브넷, intake 와 DB 는 내부망 사상 서브넷에 배치한다(ADR-0051 단계 2 이상에서 성립). SG 규칙은 두 방향이다: intake SG → sync-agent SG 인바운드(릴레이 폴링 /internal/v1/bundles — 내부망→DMZ 제어 신호, 0036 허용 경로의 사상)와 intake SG → DB SG 인바운드(적재). sync-agent 는 DB 에 닿는 규칙이 없다 — 신뢰 구역 분리가 SG 표면에 그대로 드러난다. 단계 0·1(단일 호스트 compose) 에서는 두 모듈이 한 호스트에 공존한다 — 모듈 경계(프로세스·역할 분리)는 전 단계에서 유지되고, 네트워크 경계만 단계 2에서 생긴다(0051 의 "실 테넌트 배치 최소선 = 단계 2" 한정과 정합).
  3. 단일 모듈 구성은 0036 문면 그대로 옵션으로 존치한다 — 컴포넌트 최소화를 원하고 DMZ 사상 구역→DB 직접 커넥션을 승인하는 테넌트의 선택지.
  4. Cloud 계약은 불변이다(0036 불변 절 승계). pull 표면은 Tenant Sync API 하나(cursor 기반 delta·mTLS), 방향은 outbound Pull only, 인증서-테넌트 바인딩(sync-auth.md) 유지. 무결성은 전송 계층(mTLS/TLS)에 위임하며 앱 레벨 체크섬은 폐기됐고 발신자 서명이 목표 계약이다(ADR-0040 — 이 ADR 은 건드리지 않는다).
  5. 0036 의 조율 메커니즘 문면을 부분 대체한다. 0036 결정은 "Sync Agent 는 DMZ-local 진행 마크를 두되 Intake commit-ack 까지만 전진, ack 는 정확성 필수"를 명령형으로 요구했다. 이 명령의 목적 불변식은 "재개점이 intake commit 을 앞서지 않는다(유실 없음)"이고, 현행 구현(무상태 릴레이 — 진행 마크 없음, 재개점 = intake committed cursor 단독, IntakePoller 틱 재시도)은 그 불변식을 전진시킬 상태 자체를 제거해 충족한다. 따라서 규범을 구현 형태에 맞춘다: 마크·ack 메커니즘 요구는 이 결정으로 대체되고, 규범은 "재개점 = intake committed cursor 단독, sync-agent 는 durable 진행 상태를 갖지 않는다"다. 상태형 릴레이(마크·ack)로 되돌리려면 새 ADR 이 필요하다. 이 부분 대체와 함께 두 곳을 갱신한다(승인 전환 ALPHA-957 에서 이행): ① 0036 헤더·README 인덱스의 부분 대체 표기(0046→0047·0051 선례) ② sync-protocol.md Cursor 절의 "DMZ-local 마크는 commit-ack 까지만 전진·ack 정확성 필수" 서술을 무상태 규범으로 개정. 그 외 후속 문서 변경은 없다 — context.md· state-machine·아키텍처 뷰 매핑 개정이 필요 없고, 0036 결과 절의 "미구현" 서술은 작성 시점의 사실 기록이라 수정하지 않는다(현행 구현 상태는 맥락 ②가 기록한다).

대안

  • 클라우드 사상 표준을 단일 모듈로 자리바꿈(재검토의 당초 후보) — 근거였던 "조율 배선 비용 절감"은 성립하지 않는다: 실구현이 무상태 릴레이라 절감할 조율 상태가 애초에 없고(맥락 ②), 전환은 기구현 모듈 병합·cursor 소유권 이전·writer 메타데이터 재변경이라는 신규 비용이다. 신뢰 구역 분리(맥락 ①)를 자격 없이 포기하는 방향이기도 하다. 배제.
  • 전역 단일 모듈 표준(물리 포함) — 위와 같고, 추가로 망연계 요구 증권사에서 매번 예외 설계를 부활시킨다(0036 이 걷어낸 문제). 배제.
  • 0036 을 대체하는 재작성 ADR — 결정이 그대로인데 문서만 갈아끼우면 이력 노이즈만 생긴다. 근거 재정초는 이 ADR 의 기록으로 충분하다. 배제.
  • 결정 유보 — 0051 이 재검토를 의무로 명시했고, 유보하면 "표준 근거가 소멸했다"는 의심이 배치 계열 결정마다 재발한다. 지금 종결한다. 배제.

결과

  • 얻는 것: ADR-0051 의 재검토 의무 종결. 2모듈 표준의 근거가 배치 형태와 무관하게 성립하도록 재정초됐다("망연계 때문"이 아니라 "신뢰 구역 분리 + 기구현 자산"). 구현·배포는 무변경이다 — 규범을 이미 검증된 구현 형태에 맞추는 결정이라, 코드가 아니라 문서(0036 표기·sync-protocol Cursor 절)만 승인 시점에 따라온다.
  • 잃는 것/트레이드오프: 기본 납품 형태에서 컴포넌트가 하나 더 있고(모듈 2개 + 릴레이 홉), 0036 문면의 마크·ack 서술과 무상태 릴레이 구현 사이의 해석을 이 ADR(결정 5)이 지고 간다. 클라우드 사상 심사에서 "서브넷 분리가 있는데 왜 모듈도 나누나"는 질문에는 맥락 ①(자격증명 분리는 SG 가 대체하지 못함)로 답한다.
  • 따라오는 의무: ~~① ADR-0036 헤더·README 인덱스 부분 대체 표기 ② sync-protocol.md Cursor 절의 마크·ack 서술 개정~~ — 둘 다 승인 전환(ALPHA-957)에서 이행됐다. 그 외 문서 개정·구현 변경은 불요. ADR-0051 의 "따라오는 의무" 중 0036 재검토 항목이 이 ADR 로 이행됐다.