“단순함이야말로 궁극의 정교함이다” — 레오나르도 다 빈치
“대부분의 정보는 무관하며 대부분의 노력은 낭비된다. 하지만 전문가만이 무엇을 무시해야 할지 안다” — 제임스 클리어, 『원자적 습관』
화려해 보이는 데이터 파이프라인의 이면
여러 시스템으로 구성된 정교한 데이터 파이프라인을 운영하고 계신가요? 겉보기에는 세련되어 보이지만, 그 이면은 사실 복잡한 실타래일 수 있습니다. 서로 다른 구성 요소를 연결하기 위한 끊임없는 연동 작업이 필요하고, 지속적인 모니터링이 요구되며, 운영·디버깅·관리를 위해 특수한 전문성을 지닌 큰 팀이 필요할지도 모릅니다.
게다가 사용하는 시스템이 많아질수록 데이터가 중복 저장되는 지점도 늘어나고, 데이터가 동기화되지 않거나 최신성을 잃을 가능성도 커집니다. 더 심각한 문제는 각 하위 시스템이 서로 다른 회사에서 독립적으로 개발된다는 점입니다. 어느 한 시스템의 업그레이드나 버그 수정이 여러분의 파이프라인과 데이터 레이어 전체를 무너뜨릴 수 있습니다.
주의하지 않으면 아래 영상에 나오는 것처럼 통제하기 어려운 상황에 처할 수 있습니다. 계속 읽기 전에 꼭 확인해 보시길 권합니다.

복잡도를 가중시키는 14가지 변수
복잡성이 발생하는 이유는 간단합니다. 각 시스템이 겉으로는 단순해 보여도, 실제로는 파이프라인에 다음과 같은 변수들을 끌어들이며 상당한 복잡도를 더하기 때문입니다.
- 프로토콜 — 시스템은 어떻게 데이터를 전송하는가? (HTTP, TCP, REST, GraphQL, FTP, JDBC)
- 데이터 포맷 — 어떤 형식을 지원하는가? (Binary, CSV, JSON, Avro)
- 데이터 스키마와 진화 — 데이터는 어떻게 저장되는가? (테이블, 스트림, 그래프, 문서)
- SDK와 API — 필요한 SDK와 API를 제공하는가?
- ACID와 BASE — ACID 또는 BASE 일관성을 보장하는가?
- 마이그레이션 — 데이터를 시스템 안팎으로 손쉽게 이전할 수 있는가?
- 내구성(Durability) — 내구성과 관련해 어떤 보장을 제공하는가?
- 가용성(Availability) — 가용성은 어느 수준인가? (99.9%, 99.999%)
- 확장성(Scalability) — 어떻게 확장되는가?
- 보안 — 시스템은 얼마나 안전한가?
- 성능 — 데이터 처리 속도는 얼마나 빠른가?
- 호스팅 옵션 — 클라우드 호스팅인가, 온프레미스 전용인가, 아니면 혼합형인가?
- 클라우드 지원 — 내가 사용하는 클라우드와 리전에서 동작하는가?
- 추가 시스템 의존성 — 또 다른 시스템이 필요한가? (예: Kafka를 위한 Zookeeper)
이 중 데이터 포맷, 스키마, 프로토콜 같은 변수들은 ‘변환 오버헤드(transformational overhead)’라고 부르는 항목에 해당합니다. 반면 성능, 내구성, 확장성 같은 변수들은 ‘파이프라인 오버헤드(pipeline overhead)’에 해당합니다. 이 두 분류가 합쳐진 것이 바로 ‘임피던스 불일치(impedance mismatch)’입니다. 이를 측정할 수 있다면 시스템의 복잡도를 계산하고, 그 결과를 바탕으로 단순화할 수 있습니다.
여러분은 이렇게 반문할 수 있습니다. “내 시스템은 복잡해 보이지만, 사실 우리 요구사항에는 가장 단순한 시스템이다.” 그렇다면 그것을 어떻게 증명할 수 있을까요?
즉, 데이터 레이어가 진정으로 단순한지 복잡한지 어떻게 측정하고 판단할 수 있을까요? 그리고 두 번째로, 기능을 추가할 때 시스템이 계속 단순하게 유지될지 어떻게 예측할 수 있을까요? 로드맵에 새로운 기능을 추가할 때마다 시스템도 함께 늘려야 하는 것일까요?
바로 이 지점에서 ‘임피던스 불일치 테스트’가 등장합니다. 먼저 임피던스 불일치가 무엇인지 살펴본 뒤, 테스트 방법 자체로 넘어가겠습니다.
임피던스 불일치란 무엇인가?
이 용어는 원래 전기공학에서 유래했습니다. 에너지가 A 지점에서 B 지점으로 전달될 때 전기 임피던스의 불일치로 인해 에너지 손실이 발생하는 현상을 설명하기 위한 개념입니다.
간단히 말해, 가진 것이 필요한 것과 일치하지 않는 상태를 의미합니다. 이를 해결하려면 현재 가진 것을 필요한 형태로 변환한 뒤 사용해야 합니다. 따라서 불일치가 존재하고, 그 불일치를 해소하기 위한 오버헤드가 발생합니다.
데이터 플랫폼의 경우, 데이터는 어떤 형태와 규모로 존재하며, 이를 사용하기 전에 변환 과정을 거쳐야 합니다. 이 변환은 여러 번 일어날 수 있고, 그 사이에 여러 시스템이 개입할 수도 있습니다.
데이터베이스 세계에서 임피던스 불일치가 발생하는 이유는 크게 두 가지입니다.
- 변환 오버헤드: 시스템이 데이터를 처리하거나 저장하는 방식이 실제 데이터의 모습, 혹은 우리가 데이터를 바라보는 방식과 다를 때 발생합니다. 예를 들어 서버에서는 컬렉션, 스트림, 리스트, 셋, 배열 등 다양한 자료구조로 데이터를 자연스럽게 모델링할 수 있습니다. 하지만 이 데이터를 저장하려면 RDBMS의 테이블이나 JSON 문서 스토어의 형태로 매핑해야 하고, 읽을 때는 그 반대 과정을 거쳐야 합니다. 참고로 객체지향 언어 모델과 관계형 테이블 모델 간의 특정 불일치는 ‘객체-관계형 임피던스 불일치(Object-relational impedance mismatch)’로 알려져 있습니다.
- 파이프라인 오버헤드: 서버에서 처리하는 데이터의 양과 유형이 데이터베이스가 감당할 수 있는 규모와 다를 때 발생합니다. 예를 들어 모바일 기기에서 초당 수백만 건의 이벤트가 유입된다면, 일반적인 RDBMS나 문서 스토어로는 이를 저장하거나 손쉽게 집계·계산하기 어렵습니다. 그래서 Kafka나 Redis Streams 같은 특수 스트림 처리 시스템이 필요하고, 저장을 위해 데이터 웨어하우스까지 추가로 도입해야 할 수 있습니다.
임피던스 불일치 테스트(IMS)
이 테스트의 목표는 플랫폼 전체의 복잡도를 측정하고, 앞으로 기능을 추가할 때 그 복잡도가 커지는지 줄어드는지 확인하는 것입니다.
테스트 방식은 ‘변환 오버헤드’와 ‘파이프라인 오버헤드’를 ‘임피던스 불일치 점수(Impedance Mismatch Score, IMS)’로 계산하는 것입니다. 이를 통해 현재 시스템이 다른 시스템에 비해 이미 복잡한지, 그리고 기능이 추가될수록 복잡도가 시간이 지나며 증가하는지 알 수 있습니다.
IMS 계산 공식은 다음과 같습니다.

공식은 두 종류의 오버헤드를 모두 더한 뒤 기능 수로 나눕니다. 이렇게 하면 기능당 총 오버헤드, 즉 복잡도 점수를 얻을 수 있습니다.
이해를 돕기 위해 네 가지 서로 다른 간단한 데이터 파이프라인을 비교하며 점수를 계산해 보겠습니다. 또한 두 단계에 걸쳐 간단한 애플리케이션을 구축한다고 가정하여, 기능이 추가될 때마다 IMS 점수가 어떻게 변하는지 살펴보겠습니다.
1단계: 실시간 대시보드 구축
모바일 기기에서 수백만 건의 버튼 클릭 이벤트가 유입되고 있으며, 급감이나 급증이 발생하면 알림을 받아야 한다고 가정해 봅시다. 그리고 이 전체 기능을 더 큰 애플리케이션의 하나의 피처로 간주합니다.
Case 1: 테이블에 맞지 않을 수 있음에도 RDBMS만 사용해 이벤트를 저장하는 경우입니다.

- 변환 오버헤드 = 1
- 이벤트 스트림을 테이블로 변환해야 합니다.
- 파이프라인 오버헤드 = 1
- 파이프라인에 DB가 하나뿐입니다.
- 기능 수 = 1

Case 2: Kafka로 이벤트를 처리한 뒤 RDBMS에 저장하는 경우입니다.

- 변환 오버헤드 = 1
- Kafka는 클릭 스트림을 쉽게 처리할 수 있지만, Kafka에서 RDBMS로 옮기는 과정이 오버헤드입니다.
- 파이프라인 오버헤드 = 2
- RDBMS와 Kafka, 두 개의 시스템이 있습니다. (Zookeeper는 제외하고 계산합니다.)
- 기능 수 = 1

Case 3: Kafka로 이벤트를 처리한 뒤 KsqlDB에 저장하는 경우입니다.

- 변환 오버헤드 = 0
- Kafka는 클릭 스트림을 쉽게 처리할 수 있습니다.
- 파이프라인 오버헤드 = 1
- 시스템이 하나뿐입니다(Kafka + KsqlDB). (Zookeeper는 제외합니다.)
- 기능 수 = 1

Case 4: Redis Streams로 이벤트를 처리한 뒤 RedisTimeSeries에 저장하는 경우입니다. 둘 다 Redis에 속하며 Redis와 네이티브하게 연동됩니다.

- 변환 오버헤드 = 0
- Redis Streams는 클릭 스트림을 쉽게 처리할 수 있습니다.
- 파이프라인 오버헤드 = 1
- 시스템이 하나뿐입니다(Redis Streams + RedisTimeSeries).
- 기능 수 = 1

1단계 결론
네 가지 시스템을 비교한 결과, Case 3과 Case 4가 IMS 1점으로 가장 단순했습니다. 이 시점에서는 두 case가 동일하지만, 기능을 추가하면 어떻게 될까요?
시스템에 기능을 더 추가하면서 IMS가 어떻게 유지되는지 확인해 보겠습니다.
2단계: IP 화이트리스트 기능이 추가된 실시간 대시보드
이번에는 동일한 앱에 허용된 IP 주소에서 들어온 요청만 처리하도록 하는 새로운 기능을 추가한다고 가정합니다.
Case 1: 여전히 RDBMS만으로 이벤트를 저장하고, IP 화이트리스트에는 Redis나 Memcached를 사용하는 경우입니다.

- 변환 오버헤드 = 1
- IP 화이트리스팅에는 변환이 필요 없습니다. 다만 이벤트 스트림을 테이블로 변환해야 합니다.
- 파이프라인 오버헤드 = 2
- Redis + RDBMS, 두 개의 시스템이 있습니다.
- 기능 수 = 2

Case 2: Redis + Kafka + RDBMS를 사용하는 경우입니다.

- 변환 오버헤드 = 1
- IP 화이트리스팅에는 변환이 필요 없습니다. Kafka 역시 스트림을 쉽게 처리합니다.
- 파이프라인 오버헤드 = 3
- Redis + Kafka + RDBMS, 세 개의 시스템이 있습니다. 참고: Kafka에 필요한 Zookeeper는 제외했습니다. 포함하면 점수는 더 올라갑니다.
- 기능 수 = 2

Case 3: Redis + Kafka + KsqlDB를 사용하는 경우입니다.

- 변환 오버헤드 = 0
- IP 화이트리스팅에는 변환이 필요 없습니다. Kafka와 KsqlDB도 스트림을 쉽게 처리합니다.
- 파이프라인 오버헤드 = 2
- Redis + (Kafka + KsqlDB)로 구성됩니다. 참고: 이 경우 Kafka + KsqlDB를 하나의 시스템으로 간주합니다.
- 기능 수 = 2

Case 4: Redis + Redis Streams + RedisTimeSeries를 사용하는 경우입니다.

- 변환 오버헤드 = 0
- IP 화이트리스팅에는 변환이 필요 없습니다. Redis Streams와 RedisTimeSeries도 스트림과 알림을 쉽게 처리합니다.
- 파이프라인 오버헤드 = 1
- Redis + Redis Streams + RedisTimeSeries로 구성되지만, 세 가지 모두 동일한 시스템(Redis)에 속합니다.
- 기능 수 = 2

2단계 결론
기능을 하나 추가했을 때 각 case의 IMS 점수 변화는 다음과 같습니다.
- Case 1: 1단계에서 2점 → 1.5점으로 하락
- Case 2: 1단계에서 3점 → 2점으로 하락
- Case 3: 1단계에서 1점 → 1점 유지
- Case 4: 1단계에서 1점 → 0.5점으로 하락 (최고 성적)
즉, 이 예제에서 IMS 1점으로 가장 낮은 점수를 기록했던 Case 4는 새로운 기능이 추가되면서 오히려 점수가 개선되어 0.5점에 도달했습니다.
주의할 점: 기능을 더 많이, 혹은 다르게 추가하면 Case 4가 계속 가장 단순하다고 보장할 수 없습니다. 하지만 그것이 바로 IMS 점수의 핵심입니다. 모든 기능을 나열하고, 여러 아키텍처를 비교한 뒤, 자신의 사용 사례에 가장 적합한 것을 선택하면 됩니다.
더욱 쉽게 활용할 수 있도록, 간단한 스프레드시트로 구현할 수 있는 IMS 계산기를 소개합니다.
IMS 계산기 사용법
사용 방법은 다음과 같습니다.
- 각 데이터 레이어 또는 데이터 파이프라인에 대해 다음을 나열합니다.
- 현재 보유한 기능 목록
- 로드맵에 있는 기능 목록 — 이 부분이 중요합니다. 추가 오버헤드 없이 다가올 기능들을 데이터 레이어가 계속 지원할 수 있는지 확인해야 하기 때문입니다.
- 각 기능에 대해 변환 오버헤드와 파이프라인 오버헤드를 매핑합니다.
- 모든 오버헤드의 합을 기능 수로 나눕니다.
- 서로 다른 시스템 조합을 가진 파이프라인에 대해 2~3단계를 반복하며 비교·대조합니다.
데이터 파이프라인 1

데이터 파이프라인 2

요약
결과를 깊이 생각하지 않은 채 복잡한 데이터 레이어를 만들기란 매우 쉽습니다. IMS 점수는 여러분이 더 의식적으로 결정을 내릴 수 있도록 돕기 위해 고안되었습니다.
IMS 점수를 활용하면 자신의 사용 사례에 맞춰 여러 시스템을 손쉽게 비교하고, 어떤 것이 실제로 가장 적합한지 판단할 수 있습니다. 또한 시스템이 기능 확장에도 견디며 가능한 한 단순한 상태를 유지할 수 있는지 검증할 수도 있습니다.
항상 기억하세요.
“단순함이야말로 궁극의 정교함이다” — 레오나르도 다 빈치
“대부분의 정보는 무관하며 대부분의 노력은 낭비된다. 하지만 전문가만이 무엇을 무시해야 할지 안다” — 제임스 클리어, 『원자적 습관』