2

멱등성과 MERGE 의 두 함정

ETL 파이프라인

학습 목표
  • 재적재 구조에서 멱등성이 왜 필수인지 안다
  • MERGE 를 키만으로 써야 하는 이유를 설명할 수 있다
  • 이벤트에 결정적 ID 를 발급하는 방법을 안다

적재의 제1원칙 — 멱등성

멱등성(idempotency): 같은 파일을 두 번 돌려도 그래프가 같아야 합니다.

스냅숏 데이터를 주기 재적재하는 우리 구조에서 멱등성이 없으면 실행마다 중복 노드가 쌓입니다. 한 달 뒤 "선박이 왜 12척으로 늘었지?"를 만나게 됩니다.

Cypher의 도구가 MERGE입니다 — "없으면 만들고 있으면 재사용".

함정 1: 전체 패턴 MERGE

MERGE (v:Vessel {imoNumber:"9074729", name:"한바다호"})   // ✗ 위험

이렇게 쓰면 이름이 한 글자라도 다르면 새 노드를 만듭니다. 앞 모듈에서 본 표기 요동("한바다호 / HANBADA")이 그대로 중복 노드가 됩니다.

MERGE 는 반드시 키만으로, 나머지 속성은 SET으로 붙입니다.

MERGE (v:Vessel {imoNumber: $imo})
ON CREATE SET v.createdAt = datetime()
SET v.name = $name, v.callSign = $callSign, v.grossTonnage = $gt

함정 2: 키 없는 이벤트

이벤트 노드는 자연키가 없어 재적재 때마다 중복됩니다. 입항 이벤트에 "이 이벤트임"을 증명할 고유 번호가 원래 없기 때문입니다.

해법은 코스 1 식별자 정책의 실전 적용입니다 — 결정적(deterministic) 이벤트 ID를 우리가 발급합니다.

원천 + 신고번호 (+ 이벤트유형)의 해시로 MRN 호환 로컬 ID를 만들면, 같은 신고는 언제 다시 적재해도 같은 ID → 같은 노드입니다.

💡 코스 1에서 "사건에는 강한 국제 식별자가 없어 우리가 설계해야 한다"고 했던 대목이 여기서 회수됩니다. 그때의 결정이 지금 중복 노드를 막습니다.

용어