Books./2026년

데이터 엔지니어링 디자인 패턴

harrykim 2026. 3. 5. 15:39

 

한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬받아 작성된 서평입니다

 

 

이 글에 대해

한빛미디어에서 2026년 1월 30일에 출간한 바르토시 코니에치니 저, 김인범 역의 '데이터 엔지니어링 디자인 패턴'을 읽고 작성한 서평입니다. 원서의 제목은 'Data Engineering Design Patterns: Recipes for Solving the Most Common Data Engineering Problems'이며, 오라일리 시리즈에 해당하는 372쪽 분량의 책입니다.

 




이 책을 집어든 이유

올해 초, 팀을 옮겼습니다.

새로운 팀에서 맡게 된 일은 결제 시스템의 아키텍처를 바꾸는 것이었습니다. 비즈니스 규칙이 데이터베이스 질의문과 자바 코드 사이에 흩어져 있던 구조를 걷어내고, 도메인 계층으로 옮기는 작업이었습니다. 기술 스택도 함께 바뀌었습니다. 마이바티스에서 JPA와 QueryDSL로, 자바에서 코틀린으로. 단순히 도구를 바꾸는 것이 아니라, 시스템이 세상을 바라보는 방식 자체를 바꾸는 일이었습니다.

그런데 변화는 거기서 멈추지 않았습니다. 새로 오신 리더 분께서 데브옵스 담당자 분과 함께 데이터 파이프라인을 구축하기 시작하셨습니다. 결제 시스템이 이벤트 기반 구조로 전환되면, 그 이벤트들이 만들어내는 데이터의 흐름도 새롭게 설계해야 합니다. 보상 트랜잭션이 발생했을 때 그 데이터가 어디로 흘러가야 하는지, 정산에 필요한 수치들을 어떤 경로로 모아야 하는지, 장애가 났을 때 어디서부터 다시 시작할 수 있는지. 새로운 아키텍처에 걸맞은 데이터의 길을 닦는 작업이 바로 옆에서 벌어지고 있었습니다.

저는 그 흐름을 옆에서 지켜보면서, 한 가지 감각이 또렷해지는 것을 느꼈습니다. 제가 짜는 서비스 코드와 그 코드가 만들어내는 데이터의 흐름은 서로 떨어진 것이 아니라, 하나의 몸에 붙은 두 개의 팔이라는 감각이었습니다. 한쪽 팔이 어떻게 움직이는지 모르면서 다른 쪽 팔만 잘 쓸 수는 없습니다.

그래서 이 책을 집어 들었습니다. 데이터 파이프라인을 직접 만드는 것은 제 역할이 아니지만, 그 파이프라인이 어떤 원리로 설계되는지를 이해해야 제가 짜는 코드도 그 흐름 안에서 제 자리를 찾을 수 있을 것이라고 생각했습니다.



이 책이 다루는 범위

이 책은 총 10개의 장으로 나뉘어 있고, 약 70가지의 디자인 패턴을 설명합니다. 각 장이 어떤 주제를 다루는지 하나씩 적어보겠습니다. 조금 길어질 수 있지만, 이 책이 어떤 범위를 다루고 있는지를 알아야 "이 책이 나에게 필요한 책인가"를 판단할 수 있기 때문에 적어두는 것입니다.

1장은 도입부입니다. 

 데이터 엔지니어링이라는 분야에서 디자인 패턴이란 무엇인지를 설명하고, 이 책 전체에서 공통으로 사용할 예제 상황을 여기서 소개합니다.

2장은 데이터 수집 패턴을 다룹니다.

 외부에 있는 데이터를 시스템 안으로 가져오는 여러 가지 방법을 설명하는 장입니다. 한 번에 전부 가져오는 방식을 전체 적재라고 하고, 이전에 가져온 이후로 바뀐 부분만 가져오는 방식을 증분 적재라고 합니다. 원본 데이터베이스에서 데이터가 변경될 때마다 그 변경 사항을 실시간으로 감지해서 가져오는 방식도 있는데, 이것을 변경 데이터 캡처라고 부릅니다. 이 밖에도 데이터를 그대로 복제하는 방식, 특정 이벤트가 발생했을 때 자동으로 처리를 시작하는 이벤트 기반 방식 등이 포함되어 있습니다.

3장은 오류 관리 패턴입니다. 

 시스템이 처리할 수 없는 형식의 데이터가 들어왔을 때, 그 데이터를 버리지 않고 별도의 저장 공간에 따로 빼놓는 방법이 나옵니다. 이것을 데드 레터(Dead-Letter)라고 부릅니다. 같은 데이터가 두 번 들어왔을 때 하나를 걸러내는 방법, 정해진 시간 안에 도착하지 못한 데이터를 나중에 기존 결과에 합치는 방법, 처리 도중 장애가 발생했을 때 어디서부터 다시 시작할지를 정하는 체크포인트 방법 등을 설명합니다.

4장은 멱등성 패턴입니다. 

 멱등성이라는 말이 낯설 수 있는데, 쉽게 말하면 같은 작업을 한 번 실행하든 열 번 실행하든 결과가 항상 똑같은 성질을 뜻합니다. 예를 들어 "계좌에 1만 원을 입금하라"는 요청이 네트워크 오류 때문에 두 번 전송되었을 때, 실제로 입금되는 금액은 2만 원이 아니라 1만 원이어야 합니다. 이것을 보장하는 여러 가지 방법을 다루는 장입니다. 기존 데이터를 통째로 새 데이터로 교체하는 방법, 데이터에 붙어 있는 고유한 식별 값을 기준으로 중복 여부를 판단하는 방법, 데이터베이스의 트랜잭션이라는 기능을 이용하는 방법 등이 포함되어 있습니다. 여기서 트랜잭션이란, 여러 개의 작업을 하나의 묶음으로 처리해서 전부 성공하거나 전부 실패하게 만드는 것을 의미합니다.

5장은 데이터 가치 패턴입니다.

 원래 있던 데이터에 다른 출처의 데이터를 붙여서 더 쓸모 있는 데이터로 만드는 방법, 데이터를 특정 기준으로 합산하거나 평균을 내는 집계 방법, 사용자의 행동을 시간 단위로 묶어서 하나의 세션으로 만드는 방법, 데이터를 특정 기준에 따라 순서대로 정렬하는 방법 등을 설명합니다.

6장은 데이터 흐름 패턴입니다.

 여러 개의 처리 작업을 어떤 순서로 연결할지, 여러 곳에서 들어오는 데이터를 하나로 모을지, 반대로 하나의 데이터를 여러 갈래로 나눠 보낼지, 이 전체적인 흐름을 누가 어떻게 관리할지를 다룹니다.

7장은 데이터 보안 패턴입니다.

 개인정보 보호 관련 법률에 따라 특정 사용자의 데이터를 삭제해야 할 때 어떻게 처리하는지, 누가 어떤 데이터에 접근할 수 있는지를 제어하는 방법, 데이터를 암호화하거나 개인을 특정할 수 없도록 익명으로 바꾸는 방법, 비밀번호나 인증 정보 같은 민감한 설정값을 안전하게 관리하는 방법을 다룹니다.

8장은 데이터 저장 패턴입니다.

 용량이 큰 데이터를 여러 조각으로 나눠서 저장하는 파티셔닝이라는 방법, 데이터를 읽는 속도를 높이기 위한 여러 가지 최적화 방법, 데이터를 중복 없이 깔끔하게 나눠서 저장하는 정규화와 반대로 읽기 편하게 합쳐서 저장하는 비정규화를 설명합니다.

9장은 데이터 품질 패턴입니다.

 데이터가 시스템에 저장되기 전에 품질을 검사하는 방법, 데이터의 구조가 바뀔 때 기존에 돌아가고 있는 시스템과의 호환성을 유지하는 방법 등을 다룹니다. 여기서 데이터의 구조란, 데이터가 어떤 항목으로 이루어져 있고 각 항목이 어떤 형식인지를 정의한 것을 의미하는데, 이것을 스키마라고 부릅니다.

10장은 데이터 관찰성 패턴입니다.

 데이터 파이프라인이 제대로 돌아가고 있는지를 감시하는 방법을 다루는 장인데, 데이터 흐름이 갑자기 끊겼을 때 이를 감지하는 방법, 처리 속도가 느려졌을 때 담당자에게 알림을 보내는 방법, 특정 데이터가 어디에서 만들어져서 어디로 흘러갔는지를 추적하는 방법 등을 설명합니다.

 




좋았던 점

이 책에서 가장 먼저 눈에 들어온 것은 형식의 일관성이었습니다. 70가지 패턴 모두가 같은 구조로 서술되어 있습니다. 어떤 문제가 있는지, 그 문제를 어떻게 해결하는지, 해결한 뒤에 어떤 결과가 따르는지. 이 세 박자가 흐트러지지 않습니다. 덕분에 한 번 읽어두면, 나중에 비슷한 문제가 생겼을 때 해당 패턴을 곧바로 찾아볼 수 있습니다. 처음부터 끝까지 순서대로 읽는 책이 아닙니다. 필요한 순간에 필요한 부분을 다시 여는 책입니다.

다루는 범위가 넓다는 점도 좋았습니다. 데이터를 외부에서 가져오는 것부터 시작해서, 저장하고, 가공하고, 품질을 검사하고, 보안을 적용하고, 감시하는 것까지. 데이터 파이프라인의 첫 숨부터 마지막 숨까지를 전부 다루고 있습니다. 특정 기술이나 특정 클라우드 서비스에 묶여 있지 않고 패턴 그 자체에 집중하고 있기 때문에, 어떤 기술 도구를 사용하고 있든 적용할 수 있습니다.

그리고 개인적으로 가장 반가웠던 것이 있습니다. 그동안 이름을 붙이지 못했던 것들에, 이름이 생겼습니다.

예를 들어 저는 일괄 처리 작업이 중간에 실패한 뒤 다시 실행할 때 데이터가 꼬이지 않도록 처리하는 로직을, 그냥 "재처리를 안전하게 만드는 것" 정도로 뭉뚱그려 부르고 있었습니다. 이 책은 그것을 '멱등성 패턴'이라는 큰 범주 아래에서 덮어쓰기, 병합, 키 기반 멱등성, 트랜잭션 기반 쓰기 같은 구체적인 이름으로 분류해놓았습니다. 이름이 생기면 대화가 달라집니다. 팀에서 시스템 설계를 의논할 때 "이 부분은 키 기반 멱등성 방식으로 가겠습니다"라고 한마디 하면, 서로의 머릿속에 같은 그림이 떠오릅니다. 긴 설명이 필요 없어집니다. 물론 팀원분들도 이 책을 함께 읽어야 가능한 이야기이지만요.

분량도 적절했습니다. 372쪽이고 각 패턴에 대한 설명이 군더더기 없이 간결해서, 출퇴근 지하철에서 2주 정도면 전체를 다 읽을 수 있었습니다.



아쉬웠던 점

저는 데이터 엔지니어링이라는 분야에 대해 아는 것이 거의 없는 상태에서 이 책을 읽기 시작했습니다. 데이터 파이프라인이라는 말조차 이번에 처음 들었습니다. 백엔드 엔지니어로서 데이터베이스에 질의를 보내고, 서버 사이의 통신을 설계하고, 일괄 처리 작업을 돌리는 것에는 익숙했지만, 데이터가 시스템과 시스템 사이를 흘러가는 길 자체를 설계하는 일은 제가 서 있던 세계와 다른 세계의 일이었습니다.

그래서 이 책을 읽는 동안, 저자가 숨쉬듯 자연스럽게 사용하는 용어들이 저에게는 낯선 언어였습니다. 전체 적재, 증분 적재, 변경 데이터 캡처, 데이터 압축, 데이터 준비 상태 확인. 이런 단어들이 아무런 설명 없이 문장 속에 녹아 있을 때, 저는 그 문장이 무엇을 말하고 있는지를 파악하기 위해 같은 단락을 여러 번 다시 읽어야 했습니다. 제가 지금까지 겪어본 적이 없는 개념들이 마치 당연한 상식처럼 등장하는 것이 당혹스러웠습니다.

패턴 자체도 낯설었습니다. 이 책이 가볍게 소개하고 넘어가는 패턴들조차, 제가 지금까지 한 번도 겪어본 적 없는 방식으로 문제를 바라보고 있었습니다. 같은 데이터를 다루더라도, 그 데이터의 흐름을 설계하는 사람과 그 데이터를 서비스 안에서 사용하는 사람은 문제를 인식하는 방식이 다르다는 것을, 이 책을 통해 처음 느꼈습니다. 단순히 새로운 도구를 배우는 것이 아니라, 문제를 바라보는 시선 자체를 바꾸지 않으면 이해할 수 없는 종류의 내용이었습니다.

그래서 읽는 내내, 이런 생각이 머릿속을 떠나지 않았습니다. 이 패턴이 실제로 운영되고 있는 시스템에서 어떻게 돌아가고 있는지를 직접 볼 수 있다면, 글로 읽는 것보다 훨씬 빠르게 이해할 수 있을 텐데. 패턴의 설명은 논리적으로 잘 정리되어 있었지만, 제 경험 안에 그 패턴을 걸어둘 못이 없었기 때문에, 읽는 즉시 흘러내리는 느낌이 들었습니다. 실제로 가동 중인 데이터 파이프라인을 옆에서 지켜보면서 이 책을 다시 읽는다면, 그때는 지금과 완전히 다른 깊이로 들어올 것 같습니다.

코드 예제에 대해서도 아쉬움이 남았습니다. 각 패턴마다 예제 코드가 붙어 있기는 한데, 그 예제가 패턴의 겉모습만 보여주고 있었습니다. 제가 원했던 것은 그 안쪽이었습니다. 이 패턴 없이 만들면 어떤 일이 벌어지는지, 적용한 뒤에는 구조가 어떻게 달라지는지. 그 전과 후를 나란히 놓고 보여주었다면, 패턴이 왜 필요한지가 글자가 아니라 감각으로 와닿았을 것입니다.

실패의 이야기가 더 있었으면 좋겠다는 생각도 했습니다. "운영 환경에서 이런 장애가 터졌고, 새벽 세 시에 호출을 받았고, 그래서 이 패턴을 도입하게 되었다." 그런 종류의 서사가 곁들여졌다면, 패턴이 지식이 아니라 경험으로 들어왔을 것입니다. 지금의 이 책은 패턴 목록 자체는 잘 정리되어 있지만, 그 패턴이 왜 만들어져야만 했는지에 대한 절실함이 조금 부족합니다. 해결책은 있는데, 그 해결책이 필요해진 순간의 고통이 충분히 전해지지 않는 느낌이었습니다.



결제 시스템을 다루는 사람의 관점에서

저는 데이터 엔지니어가 아닙니다. 백엔드 엔지니어입니다. 그래서 이 책을 데이터 파이프라인을 직접 만드는 사람의 눈으로 읽은 것이 아니라, 그 파이프라인 옆에서 서비스 코드를 짜는 사람의 눈으로 읽었습니다.

가장 도움이 되었던 장은 4장, 멱등성 패턴이었습니다.

결제 시스템에서 멱등성은 목숨줄입니다. 사용자가 결제 버튼을 연속으로 여러 번 누르거나, 네트워크가 끊겨서 같은 요청이 두 번 전송되거나, 일괄 처리 작업이 중간에 멈춰서 다시 실행해야 할 때. 그 결과는 한 번 처리한 것과 항상 같아야 합니다. 2만 원이 빠져나가야 할 곳에서 4만 원이 빠져나간다면, 그것은 장애가 아닙니다. 사고입니다. 이 책은 그 사고를 막는 방법을 여러 갈래로 나누어 설명해주고 있었습니다. 기존 데이터를 전부 새 데이터로 교체하는 방법, 고유한 식별 값으로 중복을 판단하는 방법, 트랜잭션으로 여러 작업을 하나로 묶는 방법, 데이터를 수정하지 않고 새로운 데이터를 쌓아 올리는 불변 방식. 각각의 방법이 어떤 상황에 맞고 어떤 한계가 있는지를 구분해주는 것이, 머리로 이해한 것이 아니라 손에 쥐어지는 느낌이었습니다.

3장의 오류 관리 패턴도 시점이 좋았습니다. 마침 결제 시스템에서 형식을 해석하는 데 실패한 거래 내역을 어떻게 처리할지 고민하고 있었는데, 데드 레터 패턴이 딱 그 상황이었습니다. 처리할 수 없는 데이터를 그냥 버리는 것이 아니라, 별도의 공간에 격리해두었다가 나중에 원인을 분석하거나 수동으로 다시 처리할 수 있게 해주는 방식입니다. 정산을 위한 일괄 처리에서 늦게 도착한 데이터를 기존 결과에 합치는 방법을 다룬 부분도, 마침 그 처리 방식을 설계하려던 참이어서 곧바로 참고할 수 있었습니다. 필요한 순간에 필요한 페이지가 열린다는 것. 책과의 관계에서 이보다 좋은 타이밍은 없습니다.

반면에 6장 데이터 흐름이나 10장 관찰성은 가볍게 훑고 넘겼습니다. 저는 에어플로우(Airflow)나 대그스터(Dagster) 같은, 데이터 처리 작업의 순서와 실행을 관리해주는 도구를 직접 사용하지 않기 때문에, 이 부분은 그런 도구를 직접 운영하시는 분에게 더 의미가 있을 것 같습니다.



이 책이 맞는 분, 안 맞는 분

데이터 파이프라인을 직접 설계하거나 운영하고 계신 분에게 가장 잘 맞는 책이라고 생각합니다. 특히 자기가 지금 하고 있는 방식에 이름을 붙이고 싶으신 분, 다른 사람과 시스템 설계를 논의할 때 "이 부분은 이런 패턴으로 처리하겠습니다"라고 한마디로 정리하고 싶으신 분에게 쓸모가 있을 것입니다.

저처럼 백엔드 개발을 하면서 대량 데이터의 일괄 처리, 데이터의 정합성 보장, 이벤트를 기반으로 한 시스템 구조 같은 영역에서 일하고 계신 분도 읽어볼 가치가 있다고 생각합니다. 반드시 전체를 정독하실 필요는 없습니다. 지금 고민하고 계신 주제에 해당하는 장만 골라서 읽으셔도 충분합니다.

다만, 저처럼 데이터 엔지니어링이라는 분야를 이번에 처음 접하시는 분이라면, 이 책이 쉽지 않을 것이라는 점은 미리 말씀드리고 싶습니다. 저자가 당연하게 사용하는 용어와 개념이 처음 보는 분에게는 벽처럼 느껴질 수 있습니다. 그렇다고 읽지 말라는 뜻은 아닙니다. 저도 끝까지 읽었고, 다 이해하지 못한 부분이 있더라도 데이터가 흘러가는 세계의 윤곽을 처음으로 그려볼 수 있었습니다. 다만, 한 번 읽어서 전부 흡수하겠다는 기대보다는, 실무에서 관련된 상황을 만났을 때 다시 돌아와 읽겠다는 마음으로 접근하시는 것이 좋을 것 같습니다.



읽고 나서

데이터 엔지니어링을 잘 아는 분에게 이 책은, 이미 하고 있는 것들에 이름을 붙여주는 책일 것입니다. 저처럼 이 분야를 처음 접한 사람에게는, 한 번도 들여다본 적 없는 세계의 지도를 처음 펼쳐보는 경험이었습니다. 모든 길을 다 걸어본 것은 아닙니다. 하지만 어디에 어떤 길이 있는지를 처음으로 알게 되었습니다.

코드 예제가 더 실전적이었다면, 패턴이 필요해진 순간의 이야기가 더 생생했다면 하는 아쉬움은 있습니다. 그래도 데이터 엔지니어링이라는 분야에서 70가지 패턴을 일관된 구조로 정리해놓은 이런 종류의 모음집은 이전에 없었습니다. 이 시도 자체가 가치 있다고 느꼈습니다.

저는 이 책을 처음부터 끝까지 한 번 읽은 뒤, 지금은 태블릿에 넣어두고 있습니다. 시스템 설계에 대한 고민이 생길 때마다 해당하는 장을 다시 열어봅니다.

사전처럼 쓰는 책. 그것이 이 책의 올바른 사용법인 것 같습니다.

 


출처.

대표 이미지: https://www.facebook.com/hanbitmedia/posts/%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8-%EB%A7%A4%EB%B2%88-%EC%B2%98%EC%9D%8C%EB%B6%80%ED%84%B0-%EC%84%A4%EA%B3%84%ED%95%98%EA%B3%A0-%EA%B3%84%EC%8B%A0%EA%B0%80%EC%9A%94%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%88%98%EC%A7%91%EB%B6%80%ED%84%B0-%EA%B4%80%EC%B0%B0-%EA%B0%80%EB%8A%A5%EC%84%B1%EA%B9%8C%EC%A7%80-%EB%B0%98%EB%B3%B5%EB%90%98%EB%8A%94-%EB%AC%B8%EC%A0%9C%EB%A5%BC-70%EA%B0%80%EC%A7%80-%ED%91%9C%EC%A4%80-%ED%8C%A8%ED%84%B4%EC%9C%BC%EB%A1%9C-%EB%81%9D%EB%82%B8%EB%8B%A4%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EA%B0%80-%EB%B0%94%EB%80%8C%EC%96%B4%EB%8F%84/1386401220167314/