본문 바로가기
C.W.K.
Stream
Lesson 01 of 06 · published

데이터 엔지니어링이 왜 중요해?

~12 min · foundation, career, mental-model

Level 0구경꾼
0 XP0/47 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

80% 문제

모든 ML 프로젝트, 모든 대시보드, 모든 분석 리포트, 모든 자동화 이메일 — 전부 어딘가 지저분한 데서 온 데이터 위에 얹혀 있어. 업계 설문은 15년째 같은 얘기를 해. 실무자들은 시간의 약 80% 를 데이터 wrangling 에 쓰고, 그 데이터로 하려던 진짜 일에는 20% 만 써. 비율은 조금씩 흔들려도 순서가 뒤집힌 적은 없어.

그 80% 가 데이터 엔지니어링이야. 화려하지 않아. 슬라이드에 못 넣는 일이야. 근데 더러운 데이터로 학습한 모델은 당연히 쓰레기 예측을 뱉고, 일관성 없는 schema 를 먹은 대시보드는 당연히 거짓말을 해. 숨은 가정을 깔고 앉은 파이프라인은 당연히 새벽 3시에 조용히 죽고 — 만든 사람은 8개월 전에 회사를 떠났지.

이 quest 에서 말하는 "데이터 엔지니어링"

이 단어, 좀 부풀려져 있어. 어떤 사람들한텐 "페타바이트 처리하는 Spark cluster 만들기" 야. 그것도 진짜 직업이긴 한데 소수의 일이고. 대부분의 실무자한테 — 이 quest 를 읽는 사람 거의 전부한테 — 데이터 엔지니어링은 훨씬 손에 잡히는 일이야.

  • 지저분한 파일 읽기 — 타입이 섞인 CSV, merged cell 투성이 Excel, 4단계로 중첩된 JSON 안에 진짜 뭐가 들었는지 파악하기.
  • 청소 — 타입 고치고, 날짜 파싱하고, null 처리하고, 문자열 정규화하고, 중복 걷어내기.
  • 변환 — 테이블 join, aggregate, 새 컬럼 derive, wide-to-long reshape.
  • 검증 — schema drift 가 downstream model 을 망가뜨리기 전에 잡아내기.
  • 산출 — 다른 사람이 (또는 미래의 너가) 검산 없이 믿고 쓸 수 있는 결과물 내놓기.

이게 일이야. 거의 다 Python 으로 하고, version control 안에 살고, 테스트를 받아. 나중에 페타바이트로 키우고 싶으면 같은 사고방식이 그대로 따라가 — Pandas 를 Spark 나 Dask 로 바꿔 끼우면 돼. 분야는 그대로야.

이 quest 끝나면 할 수 있는 것

  1. 웬만한 파일 포맷 (CSV, Excel, JSON, Parquet, Arrow IPC) 을 읽고, auto-detect 대신 explicit schema 를 직접 세우기.
  2. Pandas 나 Polars 중 상황에 맞는 쪽으로 청소하고 변환하기.
  3. 한 번 돌리든 스무 번 돌리든 같은 결과를 내는 idempotent 파이프라인 짜기.
  4. Pandera 나 Great Expectations 로 downstream 에 보내기 전에 검증하기.
  5. Airflow / Dagster / Prefect 로 스케줄 걸고 모니터링하기 — 그리고 왜 그걸 골랐는지 설명하기.
  6. Star schema 와 slowly changing dimension 으로 dimensional model 을 짜고 dbt 로 transformation 표현하기.
  7. 비용, lineage, PII — 일회성 스크립트를 시스템으로 만드는 것들을 따져보기.

여기까지가 약속이야. 남은 46개 lesson 이 거기까지 데려다줄게.

Code

데이터 엔지니어링 일의 모양 — 7줄로·python
import pandas as pd
import pandera.pandas as pa

# 1. Extract — source 가 준 지저분한 거 그대로 읽기
raw = pd.read_csv('orders_2026_q1.csv', dtype=str)  # 일단 다 string

# 2. auto-detect 가 추측한 게 아니라 *기대하는* schema 로 검증
schema = pa.DataFrameSchema({
    'order_id': pa.Column(str, unique=True),
    'customer_id': pa.Column(str),
    'order_date': pa.Column(pa.DateTime, coerce=True),
    'amount_usd': pa.Column(float, coerce=True, checks=pa.Check.ge(0)),
})
clean = schema.validate(raw, lazy=True)  # 에러 한 번에 다 모으기

# 3. Transform — 분석이 실제로 필요한 컬럼 derive
monthly = (
    clean.assign(month=lambda d: d['order_date'].dt.to_period('M'))
         .groupby('month', as_index=False)
         .agg(revenue=('amount_usd', 'sum'),
              orders=('order_id', 'nunique'))
)

# 4. Load — 다음 stage 가 믿고 읽을 수 있는 Parquet 쓰기
monthly.to_parquet('out/monthly_revenue.parquet', index=False)

External links

Exercise

본인 생활에서 CSV 나 Excel 파일 하나 골라 — 은행 명세서, 구매 이력 export, 뭐든. Excel 말고 텍스트 에디터로 열어 봐. 순진한 pd.read_csv() 가 깨질 만한 지점 세 개를 적어: 이상한 날짜 포맷, 한 컬럼 안에 섞인 타입, 통화 기호, locale 마다 다른 소수점, 숨은 헤더 row 같은 것들. 고치지는 마 — 지저분함을 또렷하게 보는 눈이 이번 연습의 전부야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.