ETL에서 클린 코드: Python, Go, SQL이 각각 여러분에게 다른 사고 방식을 가르쳐 줍니다
Source: Dev.to

Hey Devs 👋
때때로 데이터 엔지니어링에서 가장 큰 교훈은 거대한 시스템이나 화려한 아키텍처에서 오지 않는다… 더 단순한 것에서 온다:
언어 간 전환.
나는 Python, Go, 그리고 SQL을 각각 다른 단계에서 사용해 데이터를 이동하고 변환하는 일련의 ETL 작업을 하고 있었다. 며칠 동안 이 언어들을 오가며 작업한 뒤, 뭔가가 깨달았다:
“잠깐… 각 언어가 나에게 ETL을 다르게 쓰도록 강요하고 있구나.”
ETL과 조금이라도 관련이 있거나 데이터 엔지니어링 기본을 배우고 있다면, 왜 사람들은 데이터 시스템에서 언어를 자주 섞어 쓰는지 이해하는 데 도움이 될 것이다.
🧩 트리거: 3가지 사고방식을 가르쳐 준 간단한 작업
작은 연습으로 시작했다:
- 원시 데이터 정리 → Python
- 처리된 데이터를 효율적으로 푸시 → Go
- 데이터베이스 안에서 형태 만들기 → SQL
작업 자체는 특별하지 않았지만, 각 언어가 나에게 생각하게 만든 방식은 완전히 달랐다.
🐍 Python: 표현력 있는 변환의 언어
Python은 ETL을 유연하게 만든다. 행을 정리하든, 스키마를 정규화하든, CSV → Parquet 변환이든, Python은 다음을 장려한다:
- 가독성 높은 변환
- 빠른 실험
- 지저분한 데이터 처리
- “설명하듯이 작성하기”
ETL 로직을 가장 쉽게 표현할 수 있는 곳이다.
Python 사용 시 사고방식:
“모든 엣지 케이스를 다루는 명확한 코드를 작성하자.”
성능보다는 정확성과 명확성에 집중한다.
적합한 경우:
- 피처 엔지니어링
- 데이터 정제(워랭글링)
- 포맷 변환
- 데이터 보강 단계
⚡ Go: 구조와 성능을 강제하는 언어
데이터를 빠르게 이동해야 할 때—단순 변환이 아니라—Go가 빛난다. Go는 다음을 강요한다:
- 엄격한 타입 지정
- 예측 가능한 메모리 사용
- 배치 처리
- 동시성 패턴
- 제어된 오류 처리
사실상 ETL 사고방식을 새롭게 재배선한다:
“효율적으로, 일관되게, 빠르게 만들자.”
Python이 스토리텔링이라면, Go는 구축이다.
적합한 경우:
- 인제스트 스크립트
- 커넥터
- 대량 삽입
- 데이터 이동을 위한 CLI 도구
(예를 들어 ClickHouse에 삽입한다면, Go가 매우 자연스럽게 느껴진다.)
🧾 SQL: 절차가 아닌 의도를 표현하는 언어
SQL은 ETL이 항상 단계별 코드를 작성하는 것이 아니라는 점을 상기시킨다. 때때로 우리는 단순히:
- 데이터의 형태를 기술하고
- 관계를 기술하고
- 원하는 정제된 결과를 기술한다
…그리고 엔진이 나머지를 처리한다.
SQL은 다른 정신 모델을 강요한다:
“어떻게 계산할지 말하지 말고, 어떤 결과가 필요한지만 데이터베이스에 알려라.”
적합한 경우:
- 중복 제거
- 집계
- 표준화된 테이블 조인
- 분석용 데이터셋 형태 만들기
종종 SQL 하나의 우아한 SELECT 문이 전체 Python 코드를 대체한다.
🧠 더 큰 교훈: 깨끗한 ETL은 하나의 언어에 국한되지 않는다
사람들은 종종 묻는다:
- “Python만으로 ETL이 충분할까?”
- “Go로 전환해야 할까?”
- “언제 SQL이 변환을 담당해야 할까?”
세 가지를 모두 섞어 사용해 본 뒤, 진실은 훨씬 단순하다:
깨끗한 ETL은 각 언어의 강점을 결합함으로써 얻어진다.
- 변환에는 Python 사용
- 인제스트 + 성능에는 Go 사용
- 모델링 + 결과 형태 지정에는 SQL 사용
이것을 배우기 위해 거대한 파이프라인이 필요하지 않다—작은 작업 하나만으로도 차이를 명확히 알 수 있다.
💬 여러분 차례
이 언어들을 ETL에 번갈아 사용해 본 적이 있다면, 여러분의 이야기를 듣고 싶다:
- 무엇이 자연스러웠나요?
- 무엇이 고통스러웠나요?
- 어느 언어가 더 깨끗한 설계로 이끌었나요?
그리고 데이터 엔지니어링을 배우고 있다면—작은 다중 언어 ETL 실험을 해보라. 어떤 튜토리얼보다 더 많은 것을 배울 수 있을 것이다.