[DATA-008][중급] 데이터를 꺼내고 바꾸고 저장하기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[DATA-008][중급] 데이터를 꺼내고 바꾸고 저장하기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 118회 작성일 26-09-03 16:35

본문

[이번 수업]
원본 데이터를 분석하기 좋은 형태로 옮기는 파이프라인을 배웁니다. 주문 CSV를 추출하고 검증·집계한 뒤 결과 CSV에 적재하며 ETL과 ELT도 구분합니다.

[선수지식]
PY-006의 CSV 처리, DATA-003의 이상치, DATA-004의 집계를 알고 있어야 합니다.

[학습목표]
1. 추출·변환·적재 단계를 구분할 수 있습니다.
2. ETL과 ELT에서 변환 위치가 다른 이유를 설명할 수 있습니다.
3. 재실행해도 같은 결과가 나오는 파이프라인을 만들 수 있습니다.

[핵심개념]
데이터 파이프라인은 원천에서 목적지까지 자료가 이동하고 처리되는 단계의 연결입니다. 추출(Extract)은 파일·데이터베이스·API에서 원본을 읽는 단계입니다. 변환(Transform)은 자료형 검사, 결측치 처리, 중복 제거와 집계처럼 목적에 맞게 바꾸는 단계입니다. 적재(Load)는 검증된 결과를 목적지에 기록하는 단계입니다.

ETL은 변환한 뒤 목적지에 적재합니다. 정해진 스키마와 품질 규칙을 먼저 적용하거나 민감한 열을 적재 전에 제거할 때 알맞습니다. ELT는 원본을 대상 저장소에 먼저 적재하고 그 안에서 변환합니다. 원본을 보존해 여러 분석을 만들기 쉽지만 원본 구역에도 엄격한 접근 권한과 보관 기간이 필요합니다. 데이터 양, 대상 저장소의 계산 능력, 규제와 재처리 요구로 방식을 선택합니다.

멱등성은 같은 입력으로 여러 번 실행해도 최종 결과가 같다는 성질입니다. 단순 추가는 재시도 때 중복을 만들 수 있으므로 파티션을 교체하거나 고유 키로 갱신합니다. 실패한 작업은 완성 결과를 공개하지 않아야 합니다. 원본 위치·버전, 변환 코드 버전, 실행 시각, 행 수와 출력 위치를 기록하면 결과의 출처를 추적하는 데이터 계보가 됩니다.

[따라하기]
아래를 pipeline.py로 저장하세요. 임시 결과를 완성한 뒤 최종 파일로 교체하므로 중간 상태를 노출하지 않습니다.

```python
import csv
from collections import defaultdict
from pathlib import Path

source = Path("raw_orders.csv")
output = Path("customer_totals.csv")
temporary = Path("customer_totals.tmp")
source.write_text(
    "order_id,customer,amount\n"
    "o1,민수,2000\n"
    "o2,지우,1500\n"
    "o3,민수,1500\n",
    encoding="utf-8",
)

totals = defaultdict(int)
with source.open(newline="", encoding="utf-8") as file:
    rows = list(csv.DictReader(file))
    for row in rows:
        amount = int(row["amount"])
        if amount < 0:
            raise ValueError(f"invalid amount: {row['order_id']}")
        totals[row["customer"]] += amount

with temporary.open("w", newline="", encoding="utf-8") as file:
    writer = csv.writer(file)
    writer.writerow(["customer", "total"])
    writer.writerows(sorted(totals.items()))

temporary.replace(output)
print(f"extracted={len(rows)}, loaded={len(totals)}")
print(output.read_text(encoding="utf-8").strip())
```

Windows는 `py pipeline.py`, macOS와 Linux는 `python3 pipeline.py`로 실행합니다. 두 번 실행해도 행이 늘어나지 않습니다. 예상 결과입니다.

```text
extracted=3, loaded=2
customer,total
민수,3500
지우,1500
```

[흔한 실수]
문자열 금액을 숫자로 바꾸지 않거나 시간대·빈 값 규칙을 정하지 않기 쉽습니다. 재시도마다 행을 추가하고 일부 단계가 실패해도 완성 파일처럼 공개하는 것도 문제입니다. 잘못된 행은 조용히 버리지 말고 원본 식별자와 실패 이유를 격리 기록에 남기세요.

[보안 주의]
본인 소유의 로컬·격리 환경 자료만 사용하세요. 원본의 개인정보·토큰·비밀 열을 분류하고 필요 없는 값은 일찍 제거합니다. ELT로 원본을 먼저 적재한다면 원본 구역에 암호화·최소 권한·보관 만료를 적용하세요. 로그에는 전체 행 대신 실행 ID, 행 수, 스키마 버전과 오류가 난 원본 식별자만 남깁니다.

[직접 해볼 과제]
같은 `order_id` 행을 하나 더 넣어 중복 합산을 확인하세요. 그 뒤 이미 본 주문 ID는 다시 집계하지 않도록 집합을 추가하고 출력이 달라지는지 비교하세요.

[확인문제]
1. ETL과 ELT의 가장 중요한 차이는 무엇인가요?
2. 파이프라인을 멱등하게 만들어야 하는 이유는 무엇인가요?
3. 데이터 계보에는 어떤 정보를 남겨야 하나요?

[다음 학습]
다음 SWE-008에서는 모놀리스·모듈러 모놀리스·마이크로서비스의 선택 기준을 배웁니다.

[공식 참고 자료]
ETL·ELT 공식 아키텍처 안내: https://learn.microsoft.com/en-us/azure/architecture/data-guide/relational-data/etl
재실행 가능한 작업 공식 지침: https://airflow.apache.org/docs/apache-airflow/stable/best-practices.html
데이터 출처 추적 표준 개요: https://www.w3.org/TR/prov-overview/
Python CSV 공식 문서: https://docs.python.org/3/library/csv.html

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
4,049
어제
6,862
최대
16,772
전체
770,000
Copyright © 소유하신 도메인. All rights reserved.