신호등이 몇 초 늦게 바뀌는 이유, 도시 데이터 플랫폼에서 찾는다
IoT 센서로 도시를 관측하고 데이터 통합 플랫폼으로 모아 AI 교통 분석까지 잇는 스마트시티 아키텍처 — 신호 최적화·배차·주차 예측 사례와 수치.
2026-08-12 · 최초 발행 2025-12-12
신호등 하나가 몇 초 늦게 바뀌는 것도 데이터가 쌓이면 혼잡의 원인이 된다. 스마트시티(Smart City)는 도시 전역의 센서·디바이스에서 모은 데이터를 통합·분석하고 AI로 운영 의사결정과 자동 제어까지 수행하는 사이버-물리 시스템이다.
도시가 다루는 데이터는 이기종이다
IoT 기반 도시 관리는 교통 신호기, CCTV, 노상주차, 대기오염, 홍수 센서 같은 이기종 디바이스에서 표준화된 프로토콜로 데이터를 수집·제어하는 일이다. 데이터 통합 플랫폼(Data Integration Platform)은 스트리밍 메시지 버스, 데이터 레이크하우스, 시공간 분석 스택, API 게이트웨이로 구성된 중앙·연합형 데이터 계층이다. AI 기반 교통 분석(AI-driven Traffic Analysis)은 실시간 교통량·속도·점유율·사고 지표를 추정하고, 신호 제어·경로 유도·배차 최적화를 위한 예측·처방 모델을 적용하는 일이다.
계층별로 나눠서 본다
IoT 디바이스·네트워크 계층은 MQTT/CoAP, 5G/LTE, LoRaWAN, 이더넷이 섞인 혼합 토폴로지로 구성되고, eSIM/eUICC·mTLS·하드웨어 루트키 기반 인증으로 보안을 확보한다. 엣지·게이트웨이 컴퓨팅 계층은 로컬에서 필터링·정규화·샘플링·이상치 제거를 수행해 네트워크 부담과 지연을 줄이고, OTA 업데이트·원격 구성·장애 자동 복구(Watchdog) 체계를 갖춘다.
데이터 통합 플랫폼은 Kafka/MQTT 브로커와 스키마 레지스트리(Avro/Protobuf), Exactly-once 스트리밍 파이프라인으로 수집하고, 레이크하우스(Delta/Iceberg/Hudi)와 시계열 DB, 지리공간(GeoParquet/PostGIS)을 동시에 운용해 저장하며, API 게이트웨이·지오서버·BI/실시간 대시보드로 데이터를 제공한다.
AI 기반 교통 분석 파이프라인은 온라인·오프라인으로 분리된 피처 스토어를 두고 모델 학습·검증·배포를 자동화(MLOps)하며, 온라인 추론으로 신호기 SPaT/Phase 같은 경로를 최적화하고 이벤트 기반 제어 명령을 발행한다.
운영·거버넌스·보안 계층은 데이터 카탈로그·계보(Lineage)·품질 규칙을 관리하고 표준 메타데이터를 수립하며, 개인정보 최소화·가명처리, 정책 기반 접근통제(RBAC/ABAC), 감사·보존 주기 준수를 담당한다.
현장 센서에서 신호 제어 명령까지
입력에서 출력까지, 조건은 어디서든 갈린다
입력 단계에서는 디바이스 ID·타임스탬프·위치·측정값에 서명과 시퀀스 넘버를 붙인다. 처리 단계에서는 엣지에서 단위·좌표계를 표준화하고, 브로커에서 스키마를 검증·버전 관리하며, 스트리밍 엔진에서 윈도우 집계·지오조인을 수행한다. 출력 단계에서는 레이크하우스에 원본·정제 레이어를 분리해 저장하고, TSDB에는 1~5초 지연의 KPI를 적재하며, API로 서비스한다.
스키마가 맞지 않으면 DLQ로 격리한 뒤 스키마 진화 규칙을 적용해 재처리한다. 중복 이벤트는 키 기반 디듀플리케이션과 업서트(merge)로 처리하고, 네트워크 장애 시에는 엣지 버퍼링과 지수 백오프 재시도, 오프라인 캐치업으로 대응한다.
교통 AI 모델의 라이프사이클(MLOps)은 히스토리 데이터를 레이크하우스에서 가져와 피처 엔지니어링을 거쳐 교차검증·드리프트 감지로 학습하고, 모델 레지스트리 버전 관리와 점진적 롤아웃·A/B 테스트로 배포하며, 실시간 성능(지연, 오류율, 추론 신뢰도)을 모니터링하면서 자동 롤백·재학습 파이프라인을 운영한다.
트랜잭션·일관성은 세 가지 방식으로 지킨다. 스트리밍은 트랜잭셔널 프로듀서/컨슈머와 체크포인팅으로 Exactly-once를 보장하고, 저장은 레이크하우스의 Merge-on-read/Copy-on-write를 선택하고 SCD Type 2로 상태를 추적하며, 제어 명령은 명령 ID·버전을 포함해 멱등적으로 처리하고 현장 컨트롤러가 마지막 적용 버전을 검증한다.
실제로 쓰이는 지점들
신호제어 최적화는 혼잡 구간을 실시간으로 검지해 사이클 길이·녹색분배를 최적화하며, 지연 시간을 515% 단축할 것으로 기대한다. 버스·택시 배차는 수요 예측 기반으로 배차·경로를 재지정해 운송 효율을 812% 개선한다. 주차 수요 예측·안내는 잔여면을 실시간으로 예측해 순환 교통을 줄이고 도심 혼잡을 완화한다. 안전·사건 감지는 급정거·역주행·보행자 위험 이벤트를 탐지해 관제 우선순위를 자동화한다.
중앙집중과 데이터 메시, 뭘 고를까
| 아키텍처 유형 | 성능 | 확장성 | 일관성 | 안정성 | 운영 편의 |
|---|---|---|---|---|---|
| 중앙 레이크하우스 중심 | 고성능 배치·준실시간 우수 | 수평 확장 용이 | 강한 스키마·거버넌스 | 성숙한 생태계 | 중앙팀 부담 증가 |
| 데이터 메시(부처·국 단위) | 도메인 최적화 우수 | 조직 병렬 확장 강점 | 계약 기반 일관성 | 도메인 편차 리스크 | 자율·표준 균형 필요 |
| 하이브리드(중앙+메시) | 균형적 | 중앙/도메인 병행 | 핵심 표준+자율 결합 | 장애 격리 용이 | 초기 설계 복잡 |
선택 기준은 다섯 갈래다. 성능은 신호제어(100500ms)와 정책분석(분 단위)의 지연 허용치로 가른다. 확장성은 디바이스 수(수십만)와 이벤트 TPS(수만수십만)로 판단한다. 일관성은 제어 명령에는 강한 일관성을, 분석에는 최종 일관성을 허용하는 식으로 나눈다. 안정성은 단일 장애 지점 제거와 멀티 AZ·리전 구성으로 확보한다. 운영 편의는 표준화·자동화 수준과 인력·예산 제약을 본다.
기대할 수 있는 효과
정량 효과로는 평균 통행 시간이 1020% 감소하고 버스 정시성이 815% 향상되며 주차 탐색 시간이 2030% 감소한다. 신호체계 최적화로 교차로 처리량은 512% 증가하고 차량당 CO₂ 배출은 5~10% 감소한다. 정성 효과로는 데이터 기반 정책결정이 가능해지고 사고 대응 시간이 단축되며 시민이 체감하는 서비스 품질이 올라간다. 표준화·자동화로 시스템의 유지보수성과 확장성도 개선된다.
데이터를 다루는 만큼 보안도 따라온다
데이터는 최소한으로 수집하고 가명처리·지리적 일반화를 적용하며 목적 외 사용을 금지한다. 제로트러스트 네트워크, 디바이스 인증서 순환, 키 관리(HSM/KMS)를 운영한다. 엣지에서 추론해 원천 영상을 외부로 반출하지 않는 방식과, 중앙에서 고성능으로 분석해 정확도·비용 효율을 높이는 방식 사이에는 트레이드오프가 있다. 접근 통제는 RBAC와 ABAC를 겹쳐 다층화하고, 감사 로그·보존 정책과 시민 동의·투명성을 함께 갖춘다.
5분 롤링 집계를 실제로 돌려보면
전제조건은 Python 3.10, Apache Spark 3.4, Kafka 3.x, 프로토콜 버퍼 또는 Avro 스키마, Delta Lake다. 아래는 교통 스트림을 5분 단위로 롤링 집계해 피처 토픽으로 퍼블리시하고 온라인 추론을 호출하는 예시다.
# pyspark-shell --packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.4.0,io.delta:delta-core_2.12:2.4.0
from pyspark.sql import SparkSession
from pyspark.sql.functions import from_json, col, window, avg, count, expr, to_json, struct
from pyspark.sql.types import StructType, StructField, StringType, DoubleType, TimestampType
spark = (SparkSession.builder
.appName("smartcity-traffic-stream")
.config("spark.sql.shuffle.partitions", "8")
.getOrCreate())
schema = StructType([
StructField("device_id", StringType()),
StructField("road_id", StringType()),
StructField("speed", DoubleType()),
StructField("occupancy", DoubleType()),
StructField("ts", TimestampType())
])
raw = (spark.readStream
.format("kafka")
.option("kafka.bootstrap.servers", "kafka:9092")
.option("subscribe", "traffic.raw")
.option("startingOffsets", "latest")
.load())
parsed = (raw.selectExpr("CAST(value AS STRING) as json")
.select(from_json(col("json"), schema).alias("e"))
.select("e.*"))
agg = (parsed
.withWatermark("ts", "10 minutes")
.groupBy(window(col("ts"), "5 minutes", "1 minute"), col("road_id"))
.agg(avg("speed").alias("avg_speed"),
avg("occupancy").alias("avg_occ"),
count("*").alias("n"))
.selectExpr("road_id",
"CAST(window.start AS STRING) AS window_start",
"CAST(window.end AS STRING) AS window_end",
"avg_speed","avg_occ","n"))
# 피처 토픽으로 퍼블리시
features = agg.selectExpr("CAST(road_id AS STRING) AS key",
"to_json(named_struct('road_id', road_id, 'ws', window_start, 'we', window_end, 'avg_speed', avg_speed, 'avg_occ', avg_occ, 'n', n)) AS value")
(features.writeStream
.format("kafka")
.option("kafka.bootstrap.servers", "kafka:9092")
.option("topic", "traffic.features")
.option("checkpointLocation", "/chk/traffic_features")
.outputMode("update")
.start())
# 필요 시 Delta Lake로 보존
(agg.writeStream
.format("delta")
.option("checkpointLocation", "/chk/traffic_delta")
.option("path", "/data/traffic/agg_5min")
.outputMode("append")
.start())
spark.streams.awaitAnyTermination()
Exactly-once는 Kafka 트랜잭셔널 싱크나 멱등 키 기반 업서트 전략으로 지키고, 스키마 진화는 스키마 레지스트리와 호환 규칙(backward/forward)을 지켜야 한다. 지연 지표는 정책 분석 경로에서 E2E p95 13분을 목표로 하고, 신호제어 경로는 100500ms로 별도의 경량 파이프라인을 구성한다.
스마트시티 구현의 본질은 이기종 IoT 데이터를 일관되게 통합·거버넌스하고, AI 기반 실시간 의사결정 파이프라인을 구축하는 데 있다. 레이크하우스와 스트리밍을 기반으로 한 표준 아키텍처에 MLOps 체계를 결합하면 확장성·안정성·운영 편의성을 함께 확보할 수 있다. 처음부터 전체 도시를 노리기보다 핵심 교차로·축선부터 단계적으로 적용하고 데이터 품질과 보안을 먼저 갖추는 편이 낫다.