센서 데이터는 어디서 처리해야 하는가 — 에지·포그·클라우드 연속체 아키텍처

Edge AI, Fog Computing, Edge-to-Cloud Continuum을 하나의 연속체로 설계하는 아키텍처, 데이터 흐름, 운영·보안 모범사례를 정리한다

2026-08-12 · 최초 발행 2025-12-12

같은 애플리케이션 안에 지연시간 요구사항이 완전히 다른 두 종류의 작업이 섞여 있는 경우가 있다. 로봇 팔의 충돌 방지처럼 120ms 안에 응답해야 하는 제어 명령과, 분기별 수요 예측처럼 100ms수초가 걸려도 무방한 대규모 분석이다. 제조·리테일·모빌리티·에너지 산업에서 실시간성 요구와 데이터 상주성 규제가 강화되면서, 연산을 클라우드 한 곳에 몰아넣지 않고 현장으로 분산하는 에지 컴퓨팅이 부상한 배경이 여기에 있다. 이 글은 Edge AI, Fog Computing, Edge-to-Cloud Continuum을 하나의 연속체로 묶어 아키텍처와 운영·보안 관점의 실무 전략을 정리한다.

하나의 연속체를 이루는 계층

에지 컴퓨팅(Edge Computing)은 데이터가 생성되는 지점 근처에서 연산을 수행하는 분산 처리 패턴이다. 지연시간 단축, 대역폭 절감, 오프라인 내성 확보가 목적이다. Edge AI는 이 에지 디바이스·게이트웨이에서 모델 추론을 수행하는 형태로, 모델 경량화와 하드웨어 가속, 온라인/오프라인 혼합 운영이 특징이다. Fog Computing은 에지와 클라우드 사이의 지역(메트로·캠퍼스) 계층으로, 집계·캐싱·오케스트레이션·정책 적용을 담당한다. 이 세 계층을 디바이스→에지→포그→클라우드로 이어지는 연속적 컴퓨팅·데이터 계층으로 묶은 것이 Edge-to-Cloud Continuum이며, 위치 투명성과 정책 기반 배치, 데이터 상주성 준수를 목표로 한다.

계층마다 다른 역할

모델 라이프사이클은 학습을 클라우드·데이터센터에서, 추론을 에지·포그에서 분산 수행하는 구조를 취한다. 온디바이스 최적화(양자화·프루닝·지연 결합)를 적용하고, 모델 아티팩트는 서명·검증을 거쳐 A/B·캔러리 릴리스와 롤백 절차를 갖춰야 한다.

포그는 지역 집계·스케줄링·트래픽 셰이핑을 담당하며 유선·5G·LPWAN 같은 멀티액세스 경로를 최적화한다. OTA(Over-the-Air) 업데이트, 정책 전파, 서빙 플릿 상태 동기화 기능도 이 계층의 몫이다.

데이터 파이프라인은 로컬 버퍼→포그 캐시→클라우드 레이크/웨어하우스로 계층화되며, 샘플링·스케치·스파스 업로드로 대역폭을 최적화한다. 이런 요약·샘플링을 적용하면 업링크 대역폭이 60~85% 절감된다. CDC·이벤트 스트리밍 기반으로 결국적 일관성을 유지하되, 재전송과 중복 제거 메커니즘은 별도로 갖춰야 한다.

관측성은 분산 트레이싱·지표·로그 수집을 경량화하는 설계가 관건이며, SLO(지연·가용·오류율)와 SLI를 현장에서도 볼 수 있게 해야 한다. 정책 기반 자율 치유(재시도·격리·리이미지)와 구성 드리프트 탐지도 함께 도입한다.

보안·거버넌스는 제로 트러스트(디바이스 아이덴티티, mTLS, 정책 집행)를 기본으로 하고, 모델·컨테이너는 서명 검증과 SBOM 관리를 거친다. 데이터 상주성·프라이버시 규정을 준수해야 하며, 민감 데이터는 로컬에서 처리·암호화·토큰화해야 한다.

산업별로 무엇이 얼마나 좋아지는가

스마트 팩토리는 비전 검사·이상 징후 탐지와 로봇 충돌 방지 제어에 쓰인다. PLC/OPC-UA와 연계해 10ms 이하 제어 루프를 목표로 하며, 불량률이 30~60% 감소하고 라인 다운타임이 20% 이상 줄어드는 효과가 보고된다.

리테일/유통은 매장 내 행동 분석과 실시간 재고·냉장 온도 모니터링에 활용된다. 네트워크가 끊겨도 로컬에서 결제를 큐잉할 수 있으며, 재고 정확도가 15% 향상되고 냉장 이탈 경보 지연이 1초 미만으로 줄어든다.

커넥티드 차량/모빌리티는 ADAS 추론, V2X 메시지 필터링, 맵 업데이트 전처리에 쓰인다. 5G 커버리지 밖에서도 자율 운행 연속성을 유지할 수 있고, 위험 이벤트 응답 지연이 50ms 이내로, 업링크 트래픽이 70% 감소한다.

에너지/스마트 그리드는 변전소 상태 추정, 분산 발전 제어, 무효전력 보상에 쓰인다. 지역 포그에서 부하 평준화를 결정하며, 계통 사고 복구 시간이 40% 단축되고 손실 전력이 5~8% 줄어든다.

참조 아키텍처와 데이터 흐름

원시 이벤트/텔레메트리요약 데이터/경보배치 파이프라인/모델 업데이트경영 대시보드/재학습 모델OTA 배포/정책로컬 제어 명령(밀리초)현장디바이스(IoT/로봇/게이트웨이)에지 노드(추론/필터링)포그 계층(지역집계/오케스트레이션)클라우드(데이터레이크/AI플랫폼)

입력은 센서 스트림·영상 프레임·필드 버스 이벤트로, 디바이스 아이덴티티·타임스탬프·시퀀스 번호를 포함한다. 처리는 에지에서 전처리→추론→임계값 판단→요약/스케치 생성으로, 포그에서 집계→창 기반 분석→정책 평가로 이어지고, 클라우드에서는 피처 저장→모델 재학습→아티팩트 서명 및 배포가 이뤄진다. 출력은 밀리초 단위의 제어 명령, 현장 경보, 지역 KPI, 중앙 대시보드, 재학습 모델·정책의 OTA 배포로 나타난다.

네트워크가 끊기면 로컬 내구성 큐(Write-Ahead Log)로 버퍼링하고, 연결이 복구되면 백오프 재전송을 수행하며 메시지 키 기반으로 멱등 처리한다. 일관성 측면에서는 현장 명령은 로컬 강한 일관성을, 상위 집계는 결국적 일관성을 취하며 CRDT·버전 벡터나 "마지막 쓰기 우선" 정책 중 하나를 선택한다. 배포가 실패하면 서명 검증 실패 시 즉시 차단·롤백하고, 헬스 체크 기반 단계적 확장과 실패율 임계치 초과 시 자동 중지를 적용한다.

에지·포그·클라우드 비교

항목 에지 포그 클라우드
지연시간 1~20ms, 제어 루프 적합 10~100ms, 지역 의사결정 적합 100ms~수초, 대규모 분석 적합
확장성 디바이스 수 만큼 수평 확장 지역 클러스터 단위 확장 사실상 무한대, 글로벌 확장
일관성 로컬 강한 일관성, 글로벌 결국적 영역 혼합 일관성 서비스 선택적(강한/결국적)
안정성 네트워크 단절 내성 최상 지역 장애 격리 우수 WAN 의존, 백업/DR 유연
운영 편의 현장 분산 관리 난이도 높음 중간, 중앙집중 일부 가능 가장 용이, 자동화 성숙

에지·포그로 처리를 옮기면 클라우드 단독 대비 지연시간이 70~95% 감소하는 것으로 나타난다.

운영·보안에서 실제로 부딪히는 트레이드오프

보안은 디바이스 PKI·mTLS·하드웨어 신뢰점(TPM/TEE)을 적용하고 제로 트러스트 경계를 세우는 것이 기본이다. 모델·컨테이너 서명 검증과 SBOM 관리도 필요하다. 다만 강한 검증은 배포 지연과 리소스 사용 증가를 유발하므로 위험 기반 정책으로 균형을 맞춰야 한다.

데이터 거버넌스는 상주성 레이블, 마스킹, 동적 필터링으로 이뤄진다. 민감 데이터는 로컬에서 익명화한 뒤 메타데이터만 업링크한다. 과도한 필터링은 분석 정확도를 떨어뜨리므로 샘플링 전략과 어댑티브 업로드로 조절해야 한다.

운영 자동화는 GitOps와 정책 코드화, 플릿 상태 합의, 드리프트 탐지·자가치유, SLO 기반 알람 튜닝으로 구성된다. 자동 롤백 민감도가 지나치면 릴리즈가 자주 정지되므로 단계적 배포 윈도우로 완충한다.

비용·성능 측면에서는 가속기를 채택하면 단위 노드 CAPEX는 늘지만 트래픽·클라우드 OPEX는 줄어든다. 총소유비용(TCO) 관점에서 지표화해 균형점을 판단해야 한다.

에지 추론에서 MQTT 업링크까지

Python 3.10+, onnxruntime 1.17 이상, paho-mqtt 2.1 이상, opencv-python-headless(선택), 내장 SQLite3 환경을 전제로 한다.

# edge_infer_mqtt.py
# 목적: 에지 추론→로컬 내구성 큐→MQTT 업링크(멱등·재시도)
import json, os, time, sqlite3, hashlib, random
import onnxruntime as ort
import numpy as np
import paho.mqtt.client as mqtt

DB = "edge_queue.db"
TOPIC = "site/line1/anomaly"
BROKER = os.getenv("MQTT_BROKER", "fog.local")
CLIENT_ID = f"edge-{random.randint(1000,9999)}"

def init_db():
    conn = sqlite3.connect(DB)
    conn.execute("CREATE TABLE IF NOT EXISTS q(id INTEGER PRIMARY KEY, key TEXT UNIQUE, payload TEXT, ts INTEGER)")
    conn.commit(); conn.close()

def enqueue(payload: dict):
    key = hashlib.sha256(json.dumps(payload, sort_keys=True).encode()).hexdigest()
    conn = sqlite3.connect(DB)
    try:
        conn.execute("INSERT OR IGNORE INTO q(key,payload,ts) VALUES(?,?,?)",
                     (key, json.dumps(payload), int(time.time()*1000)))
        conn.commit()
    finally:
        conn.close()

def dequeue_batch(n=50):
    conn = sqlite3.connect(DB)
    cur = conn.execute("SELECT id,key,payload FROM q ORDER BY id LIMIT ?", (n,))
    rows = cur.fetchall()
    conn.close()
    return rows

def delete_ids(ids):
    conn = sqlite3.connect(DB)
    conn.executemany("DELETE FROM q WHERE id=?", [(i,) for i in ids])
    conn.commit(); conn.close()

def infer(frame: np.ndarray) -> dict:
    # 데모용 더미 추론(실전: onnx 모델 로드→sess.run)
    score = float(np.clip(frame.mean()/255.0 + np.random.normal(0,0.01), 0, 1))
    return {"score": score, "anomaly": score > 0.8}

def publisher_loop(client: mqtt.Client):
    backoff = 1
    while True:
        rows = dequeue_batch()
        if not rows:
            time.sleep(0.2); continue
        try:
            for rid, key, payload in rows:
                # QoS1 + 멱등 키(서버 측 중복 제거 가정)
                info = client.publish(TOPIC, payload, qos=1, properties=None)
                info.wait_for_publish(timeout=5)
            delete_ids([r[0] for r in rows])
            backoff = 1
        except Exception:
            time.sleep(min(backoff, 30)); backoff *= 2

def main():
    init_db()
    client = mqtt.Client(client_id=CLIENT_ID, clean_session=False)
    client.connect(BROKER, 1883, keepalive=30)
    client.loop_start()

    # 추론 루프
    for _ in range(5000):
        frame = (np.random.rand(224,224,3)*255).astype(np.uint8)
        res = infer(frame)
        payload = {"ts": int(time.time()*1000), "device": CLIENT_ID, **res}
        enqueue(payload)
        time.sleep(0.05)  # 20Hz
    publisher_loop(client)

if __name__ == "__main__":
    main()

내구성 큐 덕분에 오프라인 내성이 확보되고, SHA-256 키로 멱등성이 보장된다. QoS1로 최소 한 번 전송을 보장하되 서버 측 중복 제거를 함께 두는 것이 권장된다. 실전 배포에서는 모델 서명 검증, 리소스 제한(cgroups), 헬스 프로브의 준비 상태 점검이 추가로 필요하다. 이런 오프라인 내성 덕분에 현장 업무 연속성이 확보되어 계획외 다운타임이 20~40% 줄어들고, 데이터 상주성이 유지되어 민감정보의 외부 유출 리스크가 감소하며 공급망 무결성도 강화된다.

에지·포그·클라우드를 연속체로 설계하면 지연·대역폭·규제 제약을 동시에 해소할 수 있다. 파일럿 단계에서는 한정된 유스케이스와 명확한 SLO를 정의하고 OTA·관측성·보안 체계부터 우선 구축하는 것이 순서다. 이후 모델 라이프사이클 자동화와 정책 기반 오케스트레이션을 도입해 규모를 확장해 나간다.

에지컴퓨팅EdgeAIFogComputingIoTMQTT