안녕하세요! "Fargate와 Terraform으로 만드는 대용량 로그 생성기" 시리즈의 제2편입니다.
1편에서는 표준 로그 스키마와 전체적인 아키텍처를 살펴보았는데요.
이번 2편에서는 "어떻게 하면 컴퓨터가 만들어낸 로그를 사람이 만든 진짜 트래픽처럼 자연스럽게 만들 수 있을까?"에 대한 수학적 비밀과 4대 비즈니스 도메인(이커머스, 금융, 스마트팩토리, 게임)의 데이터 모델링을 파헤쳐 보겠습니다!
1. 단순한 1초 타이머(time.sleep(1))의 치명적인 한계
보통 초보 개발자가 로그 생성기를 만들 때 가장 먼저 떠올리는 코드는 다음과 같습니다.
while True:
generate_log()
time.sleep(1) # 1초마다 1개씩 생성?
하지만 현실 세계의 인터넷 트래픽은 절대로 시계추처럼 일정한 간격으로 들어오지 않습니다.
- 어떤 순간에는 0.05초 만에 요청 3개가 우르르 몰려옵니다.
- 어떤 순간에는 2초 동안 아무런 요청도 들어오지 않습니다.
- 점심시간이나 퇴근 후 저녁에는 트래픽이 폭발하고, 새벽 4시에는 한산해집니다.
- 금요일 저녁 게임 서버는 붐비지만, 주말 은행 업무 서버는 한산합니다.
우리는 이 모든 현실의 불규칙성과 비즈니스 패턴을 수학과 통계학을 이용해 코드로 녹여냈습니다.
2. 트래픽 제어 알고리즘: generator/app/traffic.py

A["현재 시각 (시간대 & 요일)"] --> B["1. 캘린더 가중치 계산\n(점심 피크, 주말 감소/증가)"]
B --> C["2. 랜덤 변동 Jitter 추가\n(±15% 무작위 흔들림)"]
C --> D["3. 돌발 버스트 Burst 검사\n(0.4% 확률로 2~5배 급증)"]
D --> E["4. 최종 현재 RPS 도출"]
E --> F["5. 지수분포 expovariate 적용\n(포아송 도착 시간 간격 계산)"]
F --> G["🎯 다음 로그 발생까지 대기 시간 (초)"]
🧠 핵심 1: 포아송 과정과 지수분포 (random.expovariate)
통계학에서 콜센터에 걸려오는 전화, 버스 정류장에 도착하는 승객, 웹 서버에 들어오는 요청처럼 "독립적인 사건이 무작위로 발생하는 현상"을 포아송 과정(Poisson Process)이라고 부릅니다.
그리고 사건과 사건 사이의 대기 시간(Inter-arrival Time)은 지수분포(Exponential Distribution)를 따릅니다.
# traffic.py
def next_sleep_seconds(self) -> float:
# 현재 RPS를 모수로 지수분포 난수 생성
interval = random.expovariate(self.current_rps())
# 시간 가속 배율 적용 및 최대 10초 제한
return min(interval / self.time_scale, 10.0)
current_rps()가 2.0이라면 평균적으로 0.5초(1 / 2.0)마다 이벤트가 발생합니다.- 하지만 고정된 0.5초가 아니라, 지수분포에 의해 어떤 때는 0.08초, 어떤 때는 1.4초가 무작위로 계산되어 완벽히 자연스러운 네트워크 트래픽 간격이 만들어집니다!
🧠 핵심 2: 24시간 시간대별 프로필 (HOURLY_PROFILE)
하루 24시간 동안 사람들의 행동 양식은 도메인마다 완전히 다릅니다.
HOURLY_PROFILE = {
# 이커머스: 점심시간(12~13시)과 저녁 퇴근 후(20~22시) 쇼핑 피크!
"ecommerce": [
0.25, 0.20, 0.18, 0.16, 0.18, 0.25,
0.45, 0.70, 0.85, 0.95, 1.05, 1.20,
1.35, 1.20, 1.05, 1.00, 1.10, 1.30,
1.55, 1.80, 1.95, 1.85, 1.25, 0.65,
],
# 금융: 은행 영업 시간(09~16시)에 압도적인 거래량
"finance": [
0.20, 0.16, 0.14, 0.13, 0.15, 0.22,
0.38, 0.65, 1.10, 1.55, 1.45, 1.35,
1.25, 1.30, 1.45, 1.50, 1.35, 1.10,
0.90, 0.75, 0.62, 0.50, 0.38, 0.28,
],
# 스마트팩토리: 24시간 3교대로 돌아가므로 비교적 일정함
"smartfactory": [
0.95, 0.95, 0.95, 0.95, 0.90, 0.85,
0.80, 1.00, 1.05, 1.05, 1.05, 1.00,
0.90, 1.00, 1.05, 1.05, 1.00, 0.90,
0.85, 1.00, 1.05, 1.05, 1.00, 0.95,
],
# 게임: 밤 9시~자정(21~24시)에 트래픽이 치솟음
"game": [
0.45, 0.30, 0.22, 0.18, 0.16, 0.18,
0.25, 0.35, 0.45, 0.50, 0.55, 0.60,
0.70, 0.75, 0.78, 0.82, 0.95, 1.20,
1.55, 1.90, 2.15, 2.25, 1.80, 1.10,
],
}
🧠 핵심 3: 요일 보정, Jitter, 그리고 돌발 버스트(Burst)
- 주말 보정: 금융(
finance)은 주말에 평일 대비55%수준으로 떨어지지만, 게임(game)은 주말에135%로 트래픽이 폭증합니다. - Jitter (무작위 변동): 매 순간
±15%의 노이즈(random.uniform(0.85, 1.15))를 곱해 정형화된 곡선을 탈피합니다. - 돌발 버스트 (Burst): 마케팅 푸시 알림, 타임 세일, 공장 설비 경보 등 돌발 상황을 위해
0.4%의 확률로 순간 트래픽이 2~5배 급증하는 버스트 상태를 구현했습니다.
3. 4대 비즈니스 도메인별 데이터 모델링
이제 각 산업 도메인의 특성에 맞춰 어떤 필드와 비즈니스 로직을 설계했는지 살펴보겠습니다.
classDiagram
class BaseLog {
+String event_id
+String trace_id
+DateTime occurred_at
+String domain
+String event_type
}
class EcommerceLog {
+String user_id
+String product_id
+Int quantity
+Int unit_price
+String payment_method
}
class FinanceLog {
+String customer_id
+String account_id
+Int amount
+Float risk_score
+String channel
}
class FactoryLog {
+String line_id
+String equipment_id
+Float temperature_c
+Float vibration_mm_s
+String quality_result
}
class GameLog {
+String player_id
+Int player_level
+Int ping_ms
+String match_id
+String result
}
BaseLog <|-- EcommerceLog
BaseLog <|-- FinanceLog
BaseLog <|-- FactoryLog
BaseLog <|-- GameLog
🛍️ 1. 이커머스 도메인 (domains/ecommerce.py)
- 이벤트 퍼널: 상품조회(
product_view) ➔ 검색(search) ➔ 장바구니(add_to_cart) ➔ 주문서 작성(checkout) ➔ 주문완료(order_created) ➔ 결제완료(payment_completed) - 특징: 뒤 단계로 갈수록 확률 가중치(
WEIGHTS = [34, 20, 17, 9, 11, 9])가 낮아지는 실제 전환율 퍼널(Funnel)을 모사했습니다.
💳 2. 금융 도메인 (domains/finance.py)
- 주요 이벤트: 로그인, 잔액조회, 카드결제, 계좌이체, 입금, 출금
- FDS(이상거래탐지) 필드:
risk_score를 베타분포(random.betavariate(2, 12))로 생성하여, 대부분의 거래는 10, 20점대로 안전하지만 아주 드물게 80, 90점대 고위험 이상 거래가 발생하도록 설계했습니다.
🏭 3. 스마트팩토리 IoT 도메인 (domains/smartfactory.py)
- 주요 이벤트: 센서 텔레메트리(
sensor_reading), 설비 상태(equipment_state), 품질 검사(quality_inspection), 알람 경보(alarm), 유지보수(maintenance_event) - 물리 센서 데이터: 모터 온도(평균 72°C, 표준편차 5.5°C), 진동(mm/s), 압력(bar), 회전수(RPM)를 정규분포(가우시안 분포,
random.gauss)로 현실감 있게 생성합니다. - 클라이언트 정보: 일반 PC 브라우저가 아닌 공장 내부 게이트웨이(
edge-gateway/3.2, 사설 IP) 형태로 커스텀 처리했습니다.
🎮 4. 게임 도메인 (domains/game.py)
- 주요 이벤트: 로그인, 세션 하트비트, 매치 시작/종료, 인게임 상점 아이템 구매, 퀘스트 완료
- 특징: 플레이어 레벨, 네트워크 핑(
ping_ms), 서버 리전(kr, jp, sea 등), 승패 결과, 획득 골드/경험치 등 게임 분석에 꼭 필요한 필드들을 총망라했습니다.
🎯 2편 요약 및 다음 편 예고
- 포아송 과정과 지수분포를 활용해 기계적이지 않은 자연스러운 요청 간격을 완성했습니다.
- 시간대별 프로필, 주말 보정, 노이즈 Jitter, 순간 Burst로 실제 서비스 트래픽의 기승전결을 구현했습니다.
- 4대 도메인(이커머스/금융/스마트팩토리/게임)의 실제 비즈니스 흐름을 정교하게 모델링했습니다.
하지만 실무에서 마주치는 데이터는 이렇게 깔끔하기만 할까요? 절대 아닙니다!
다음 [3편]에서는 "데이터 엔지니어의 숙명: 결측치와 이상치(오염 데이터) 의도적 주입 기법"을 통해 데이터 정제 실습을 위한 9가지 오염 기술을 다뤄보겠습니다.
'코딩 개발 > Date Engineer' 카테고리의 다른 글
| [4편] Terraform으로 100% 코드로 찍어내는 AWS 서버리스 인프라 (IaC) (0) | 2026.09.30 |
|---|---|
| [3편] 데이터 엔지니어의 숙명: 결측치와 이상치(오염 데이터) 의도적 주입 기법 (0) | 2026.09.29 |
| [1편] 데이터 엔지니어링의 시작: 왜 '현실적인 로그 생성기'가 필요할까? (아키텍처 & 스키마 설계) (0) | 2026.09.23 |
| [DE 8편] 이벤트 기반 데이터 파이프라인: S3 Producer/Consumer 패턴 & S3KeySensor를 활용한 데이터 감지 및 처리 (1) | 2026.09.22 |
| [DE 7편] Airflow와 AWS S3 연동 기초: Terraform 인프라 프로비저닝 & LocalFilesystemToS3Operator 실습 (0) | 2026.09.21 |