목록전체 글 (194)
imhamburger 님의 블로그
1. 역정규화기역정규화기 패턴은 쿼리에서 조인(Join) 연산을 줄이거나 완전히 제거하여 데이터 접근 및 조회 성능을 최적화하는 스토리지 패턴이다.1. 문제 상황데이터 웨어하우스 스토리지 위에 관계형 데이터 모델을 구현하여 운영하였다.초기에는 데이터 볼륨이 적어 문제가 없었으나, 서비스가 크게 성장하면서 데이터 분석 부서로부터 쿼리 실행 시간이 너무 느리다는 불만이 발생하였다.분석 결과, 전체 쿼리의 80% 이상이 8개 이상의 테이블을 동시에 조인하고 있어 극심한 성능 저하와 비용 상승을 유발하고 있었다.2. 해결책조인된 테이블의 모든 값들을 단일 레코드로 평면화(Flattening)하여, 네트워크를 통한 데이터 교환 과정 자체를 없앤다.평면화의 두 가지 접근 방식일반적인 컬럼 방식: 조인 대상 테이블의..
패턴 #54: 메타데이터 강화기데이터를 쿼리 엔진에 적재하기 전에 관련 없는 데이터 파일이나 블록을 건너뛰어(Pruning) 조회 성능을 최적화하고 비용을 줄이는 패턴이다. 1. 문제 상황기존에 JSON 데이터셋을 이벤트 시간 기준으로 수평 파티셔닝하여 배치 작업 속도를 개선함.새로 고용된 데이터 분석가들이 동일하게 파티션된 데이터셋을 사용하지만, 실제로는 파티션 내에서도 극히 일부분(작은 부분집합)의 레코드만 다룸.사용량 기반 과금형 쿼리 서비스를 이용하는 환경에서, 쿼리가 항상 전체 파티션 데이터셋을 엔진에 적재한 뒤 필터링 로직을 적용함.이로 인해 쿼리 실행 지연과 클라우드 비용 증가 문제가 발생함.목적: 데이터셋을 쿼리 엔진에 적재하기 전에 필터링 로직을 먼저 적용할 수 있는 구조가 필요함. 2...
스토리지 계층의 레이아웃을 정의할 때 핵심은 데이터셋에 쉽게 접근할 수 있도록 나누는 최선의 방법을 찾는 것이다. 이를 위해 데이터 표현 접근 방식과 스토리지 최적화 원칙을 이해하고, 수평적 구성과 수직적 구성을 담당하는 두 가지 파티셔닝 패턴을 활용해야 한다.1. 스토리지 레이아웃 사전 고려사항 및 데이터 표현 방식스토리지 최적화를 위한 핵심 원칙불필요한 데이터 관련 작업을 피하기 위해 메타데이터 계층을 활용한다.비용이 많이 드는 작업은 한 번만 실행하고, 후속 독자(reader)들을 위해 이를 구체화한다.비용이 많이 드는 목록 작업을 피하여 데이터 준비 단계를 단순화한다.데이터 표현 접근 방식정규화기 접근 방식: 데이터 일관성을 선호한다.비정규화기 접근 방식: 더 나은 실행 시간을 위해 일관성을 절충..
데이터셋을 다른 파이프라인과 공유하면 그 가치를 크게 향상할 수 있다. 하지만 데이터셋에 개인 식별 정보(PII) 등의 민감 정보가 포함되어 있고 사용자가 제3자 공유에 동의하지 않았다면, 데이터 공유 전 특별한 준비 단계를 수행해야 한다.패턴 #46: 익명화기 (Anonymizer)1. 문제 정의조직에서 고객 행동 분석 및 커뮤니케이션 전략 최적화를 위해 외부 데이터 분석 회사와 계약을 체결했다.공유 데이터셋에 다수의 개인 식별 정보(PII) 속성이 포함되어 있으나, 일부 사용자가 제3자 공유에 동의하지 않은 상태이다.데이터 엔지니어링 팀은 공유 데이터셋이 개인정보 보호 규정을 완전히 준수하도록 처리 파이프라인을 구축해야 하는 임무를 맡았다.NOTE: 개인 식별 정보(PII)만이 아니다 PII가 가장 ..
패턴 #42: 제자리 덮어쓰기1. 개요 및 문제 정의개요: 수직 파티셔너 패턴은 시간과 컴퓨팅 자원이 충분할 때 유용하지만, 그렇지 못한 상황에서는 검증된 덮어쓰기 전략인 '제자리 덮어쓰기' 패턴이 대안이 된다.문제: 테라바이트 규모의 데이터가 시간 기반 수평 파티션에 저장된 레거시 시스템을 넘겨받았으나, 개인 데이터 관리 전략이 아직 정의되지 않은 상황이다. 이 프로젝트는 조직 내에서 널리 사용되고 있으며, 정부의 새로운 개인정보 보호 규정에 따라 사용자가 요청할 때 개인 데이터를 즉시 제거해야 하는 요구사항을 충족해야 한다.2. 해결책 및 구현 방식현재 아키텍처 리팩터링을 위한 자원이 부족하므로 제자리 덮어쓰기(In-Place Overwriter) 패턴을 적용한다. 구현은 데이터 스토리지 기술에 따라..
1. 독립된 시퀀서 (Isolated Sequencer)문제 상황 및 해결책원시 데이터를 정리해 데이터 시각화 팀에 제공해야 하지만, 조직이 분리되어 있어 두 프로세스를 단일 파이프라인으로 병합할 수 없는 환경에서 이 패턴이 활용된다.데이터 제공자와 컨슈머 관점에 따라 파이프라인을 물리적으로 나누어 독립적인 두 개의 파이프라인을 생성하고, 이를 효과적으로 결합하는 것이 핵심이다.이를 위해 의존성을 구현하는 두 가지 주요 트리거 전략을 사용할 수 있다.데이터 기반 전략 vs 작업 기반 전략데이터 기반 전략: 데이터 프로듀서가 데이터셋과 함께 '준비 마커(Marker)' 파일을 생성하면, 컨슈머는 이를 감지하여 작업을 시작한다. 두 파이프라인의 결합이 느슨하여 데이터 컨슈머 측이 더 많은 자유도를 가지며 ..
실시간 데이터 처리를 하다 보면 '세션(Session)' 단위로 데이터를 묶어서 분석해야 할 때가 많다.예를 들어, 한 사용자가 웹사이트에 들어와서 이탈하기 전까지 어떤 행동을 순서대로 했는지 분석하는 '유저 세션 분석'이 대표적이다.이를 효율적으로 해결하기 위한 디자인 패턴인 상태 저장 세션화 처리기(Stateful Sessionizer) 패턴에 대해 알아보자! 1. 상태 저장 세션화 처리기(Stateful Sessionizer)1-2. 배경: 기존 배치(Batch) 방식의 한계와 문제점기존의 배치 파이프라인이나 단순한 증분 세션화 방식은 데이터를 시간 기반(예: 1시간 단위 파티션)으로 나누어 처리한다. 하지만 이 방식은 다음과 같은 치명적인 문제가 존재한다.지연 시간(Latency) 문제: 비즈니스..
1. 메타데이터 데코레이터 (Metadata Decorator)래퍼 패턴의 하위 개념이자 실무에서 강력하게 쓰이는 메타데이터 데코레이터 패턴은 데이터 변환을 수행할 때 레코드 자체에 '언제, 어떤 잡에 의해, 어떤 규칙으로 처리되었는지'를 증명하는 기술적/비즈니스적 컨텍스트를 주입하는 기법이다.문제 상황: 파이프라인이 고도화되면서 다양한 소스에서 포맷이 제각각인 데이터가 실시간으로 밀려들기 시작한다. 데이터 처리 도중 특정 필드가 계산되었거나 포맷이 변경되었을 때, 다운스트림 분석가나 디버깅 중인 엔지니어가 "이 레코드가 정확히 몇 번 버전의 배치 잡에 의해, 언제 최종 변경되었는지" 추적하기가 불가능해진다. 원래 값을 유지하는 것만으로는 데이터의 계보(Lineage)와 신뢰성을 보장하기 어렵다.해결책:..
1. 데이터 강화 (Data Enrichment)원시 데이터는 기술적 제약으로 인해 품질이나 확장된 컨텍스트가 부족한 경우가 많다. 데이터 강화 패턴은 이러한 제한을 극복하고 데이터를 다양한 이해관계자에게 훨씬 유용하게 만들어 준다.정적 조이너 (Static Joiner) 패턴만약 강화하려는 데이터셋의 본질이 정적(Static)이라면, 가장 직관적이고 쉬운 정적 조이너 패턴을 선택하면 된다.문제 상황: 새로 진행되는 프로젝트에서 사용자의 등록 일자와 일상적인 활동 간의 의존성을 분석해 달라는 비즈니스 요청을 받았다. 하지만 안타깝게도 활동 원시 데이터셋에는 사용자 컨텍스트가 포함되어 있지 않고, 오직 정적 사용자 참조 데이터셋에서만 해당 정보를 찾을 수 있는 상황이다. 비즈니스 요구에 대응하기 위해 이 ..
데이터 엔지니어링을 하다 보면 가장 까다로운 작업 중 하나가 바로 '이미 존재하는 데이터의 변경 사항을 어떻게 반영할 것인가?'이다.데이터셋을 완전히 삭제하고 새로 교체하는 '덮어쓰기(Overwrite)' 방식은 멱등성(Idempotency)을 보장하는 가장 단순하고 확실한 방법이다. 하지만 데이터 규모가 커지거나, 데이터 제공자가 변경·수정된 일부 데이터만 포함하는 '증분형 데이터셋'을 제공할 때는 전체 덮어쓰기 방식으로 쉽게 관리할 수 없다. 1. 병합(Merge, Upsert) 패턴병합 패턴은 데이터셋의 정체성이 정적이고 데이터셋이 갱신이나 삽입만을 지원할 때, 기존 데이터셋과 변경 사항을 결합하는 최선의 방법이다. 흔히 MERGE(속칭 UPSERT) 명령어로 표현된다. 1.1 구현을 위한 단계적 ..