
매일 출퇴근길에 수십 번씩 마주치는 신호등, 한 번쯤 이런 생각 해보신 적 있으시죠? 새벽에 차 한 대 없는 교차로에서 빨간불에 멍하니 서 있다 보면 '이거 누가 정한 시간이지?' 싶고, 반대로 어떤 교차로는 내가 도착하자마자 신기하게 초록불로 바뀌기도 하거든요. 토목공학자 그래디 힐하우스가 운영하는 Practical Engineering 블로그에 2019년에 올라온 '신호등은 어떻게 동작할까'라는 글이 바로 이 궁금증을 풀어주는 글인데요. 읽다 보면 이게 사실상 도로 위에 깔린 실물 크기의 상태 머신(state machine)과 센서 시스템이라는 걸 알게 돼요. 개발자라면 오히려 더 재미있게 읽을 수 있는 주제라서 한번 풀어볼게요.
고정식 신호와 감응식 신호
신호등은 크게 두 종류로 나뉘어요. 하나는 고정식(fixed-time)으로, 말 그대로 미리 정해진 시간표대로 돌아가는 방식이에요. 동서 방향 40초, 남북 방향 30초, 이런 식으로 정해진 주기를 무한 반복하는 거죠. 구현하기 단순하고 예측이 쉽지만, 교통량이 시시각각 변하는 현실에는 잘 안 맞아요. 새벽에 빈 교차로에서 기다리게 만드는 주범이 바로 이 방식이거든요.
다른 하나는 감응식(actuated) 신호예요. 이게 뭐냐면, 센서로 차량이나 보행자가 실제로 있는지 감지해서 신호 시간을 그때그때 조절하는 방식이에요. 주도로는 항상 초록불을 기본으로 두고 부도로에 차가 감지될 때만 신호를 바꿔주는 반감응식도 있고, 모든 방향에 센서를 달아 전부 감지하는 완전감응식도 있어요. 컨트롤러는 각 방향에 대해 최소 녹색 시간, 최대 녹색 시간, 그리고 연장 시간(gap time) 같은 파라미터를 갖고 있는데요. 차가 계속 들어오면 녹색을 조금씩 연장하다가, 일정 시간 동안 차가 안 오면 '이제 됐다' 하고 끝내고(gap out), 아무리 차가 많아도 최대 시간에 도달하면 강제로 끝내요(max out). 타임아웃과 상한선을 두고 이벤트에 반응하는 구조가 딱 우리가 서버에서 짜는 로직이랑 닮았죠.
도로 아래 숨어 있는 센서들
그럼 차가 있는지는 어떻게 알까요? 가장 오래되고 널리 쓰이는 건 유도 루프(inductive loop) 검지기예요. 교차로 정지선 근처 아스팔트에 네모나거나 둥근 모양으로 잘라낸 자국을 보신 적 있을 텐데, 그 안에 전선 코일이 묻혀 있거든요. 이 코일에 전류를 흘리면 자기장이 생기고, 그 위에 자동차 같은 커다란 금속 덩어리가 올라오면 인덕턴스(전류 변화에 저항하는 성질)가 변해요. 컨트롤러는 이 변화를 감지해서 '차가 있다'고 판단하는 거예요. 금속 탐지기가 땅에 묻힌 셈이죠. 그래서 금속이 적은 자전거나 작은 오토바이는 감지가 잘 안 돼서 정지선에 서 있어도 신호가 안 바뀌는 문제가 생기기도 해요. 요즘은 카메라 영상 검지, 레이더, 자기장 센서 같은 대안도 많이 쓰이고, 보행자용으로는 우리가 잘 아는 횡단보도 버튼이 있고요.
컨트롤러와 위상, 그리고 충돌을 막는 구조
교차로 모퉁이에 서 있는 회색 철제 캐비닛이 바로 이 모든 걸 관장하는 컨트롤러예요. 여기서 중요한 개념이 위상(phase)인데, 이게 뭐냐면 '동쪽에서 서쪽으로 직진', '북쪽에서 좌회전'처럼 함께 움직일 수 있는 하나의 이동 흐름 단위예요. 컨트롤러가 하는 일은 결국 이 위상들에 순서대로 녹색을 배정하는 건데, 절대 서로 충돌하는 위상 두 개가 동시에 녹색이 되면 안 되잖아요. 그래서 링과 배리어(ring-and-barrier)라는 구조로 위상을 배치해요. 두 개의 링이 병렬로 진행되고, 배리어를 넘을 때는 두 링이 반드시 동기화되도록 강제하는 방식이라 구조적으로 충돌 조합이 나올 수 없게 만든 거예요.
황색 신호 시간도 대충 정한 게 아니에요. 도로의 제한 속도와 감속 능력을 바탕으로 계산하는데, 너무 짧으면 멈출 수도 지나갈 수도 없는 '딜레마 존'이 생기고, 너무 길면 사람들이 황색을 녹색처럼 취급하게 되거든요. 여기에 모든 방향이 잠깐 빨간불이 되는 전적색(all-red) 시간을 더해서 교차로가 완전히 비워지도록 해요.
컨트롤러가 고장 나면?
개발자 입장에서 제일 흥미로운 부분이 여기예요. 신호 캐비닛 안에는 컨트롤러와 별개로 충돌 감시 장치(conflict monitor)라는 독립 하드웨어가 들어 있어요. 이 장치는 컨트롤러의 판단을 믿지 않고, 실제 신호등으로 나가는 출력 전압을 직접 감시하다가 상충하는 방향에 동시에 녹색이 켜지는 등 이상이 감지되면 컨트롤러를 무시하고 교차로 전체를 점멸 신호로 전환해 버려요. 소프트웨어 버그가 나도 물리적으로 안전한 기본 상태로 떨어지도록 설계된 워치독인 셈이죠. 안전이 중요한 시스템에서 '감시자는 감시 대상과 분리되어야 한다'는 원칙을 아주 잘 보여주는 사례예요.
교차로들을 엮는 연동 제어
큰 도로에서 한 번 초록불을 받으면 다음 교차로들도 연달아 초록불이 되는 경험, 해보셨죠? 이게 연동(coordination)인데요. 인접한 교차로들이 같은 주기 길이(cycle length)를 쓰면서 각각의 시작 시점을 이동 시간만큼 어긋나게(offset) 맞춰두면 차량 무리가 '녹색 파도'를 타고 흘러가요. 요즘은 컨트롤러들이 중앙 관제 시스템에 연결되어 시간대별로 다른 시간표를 내려받고, 구급차나 소방차가 접근하면 우선 신호를 주는 기능도 붙어 있어요. 한국에서도 시 단위 교통정보센터가 이런 역할을 하고, 실시간 교통량 데이터로 신호 주기를 자동 조정하는 적응형 제어나 AI 기반 최적화 실증이 계속 이어지고 있죠.
개발자에게 주는 시사점
이 글이 재미있는 이유는 우리가 매일 짜는 코드의 패턴이 물리 세계에 그대로 나타나기 때문이에요. 이벤트 기반 상태 전이, 타임아웃과 상한선, 잡음 섞인 센서 입력을 신뢰할 만한 신호로 바꾸는 문제, 그리고 독립된 감시자를 두는 fail-safe 설계까지요. 임베디드나 IoT 쪽을 하시는 분이라면 바로 와닿을 거고, 백엔드 개발자라도 서킷 브레이커나 헬스 체크를 설계할 때 '충돌 감시 장치' 같은 사고방식을 빌려올 수 있어요. 주말에 링과 배리어 구조로 교차로 시뮬레이터를 하나 짜보는 것도 꽤 좋은 연습이 될 거예요.
한 줄로 정리하면, 신호등은 센서와 타이머와 안전장치로 이루어진 실물 상태 머신이고, 그 설계 원칙은 소프트웨어에도 그대로 통한다는 거예요. 여러분이 만드는 시스템에는 컨트롤러가 미쳐 날뛰어도 안전한 상태로 떨어뜨려 주는 '충돌 감시 장치'가 있나요?
🔗 출처: Hacker News