WebSockets 사용을 실시간 시스템 설계의 전부로 오해해서는 안 됩니다. 실제 면접관들이 원하는 것은 단순한 소켓 구현이 아니라, 네트워크 오류 상황(3 AM cases)에 대한 깊은 이해와 아키텍처적 접근입니다. 재연결 정책, 데이터 신선도 관리, 그리고 멱등성 처리가 핵심 요소입니다.
핵심 포인트
재연결 정책: 지터가 포함된 지수 백오프 방식이 필수입니다.
데이터 신선도: 연결 끊김 시 오래된 데이터를 실시간처럼 보여주면 안 됩니다.
처리 로직 설계: 최소 한 번 전달은 멱등성(idempotency)을 보장해야 합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
프론트엔드 시스템 설계 면접을 보면 항상 지원자가 “실시간 업데이트를 위해 WebSockets를 사용할 것입니다”라고 말하고 인터뷰어가 고개를 끄덕이는 순간이 있습니다. 그 끄덕임은 함정입니다. WebSockets는 아키텍처가 아닙니다. 그것들은 어려운 대화의 시작에 불과합니다.
여기에 그 질문의 실제 버전이 있으며, 이 문제 때문에 저도 정말 골머리를 앓았습니다. 제가 작업했던 대시보드에서 소켓을 통해 실시간 티커(ticks)를 스트리밍했습니다. 데모에서는 완벽했습니다. 그러다 호텔 Wi-Fi를 사용하는 사용자가 4초 동안 끊겼고, 소켓이 재연결되었으며 UI는 아무 문제도 없는 것처럼 보였습니다. 하지만 가격 데이터가 오래된 상태였습니다 (stale). 고장 난 것이 아니라, 단순히 오래된 것입니다. 가장 최악의 종류의 오류입니다: 자신만만하고 조용한 오류입니다. 재연결은 성공했고 스트림은 재개되었지만, 그 4초 동안 발생한 모든 메시지는 공백 속으로 사라졌습니다. 일주일이 지나도록 아무도 알아차리지 못했습니다. 해결책은 더 나은 소켓 라이브러리가 아니었습니다. 그것은 소켓 주변의 모든 것이었습니다.
면접관들이 “실시간 업데이트를 설계해 보세요”라고 말할 때 정말로 원하는 것은 바로 이것입니다. 그들은 3시의 비상 상황(3 AM cases)을 원합니다.
데모에서는 절대 보여주지 않는 세 가지 요소가 있습니다. 첫째, 재연결 자체가 실제 제품입니다. connect 호출은 한 줄에 불과합니다. 하지만 재연결 정책이 아키텍처입니다: 지터(jitter)를 포함한 지수 백오프(exponential backoff) 방식이거나, 아니면 여러분의 전체 클러스터가 마치 스스로 만든 작은 DDoS 공격처럼 같은 순간에 재시도하는 것입니다. 게다가 UI에는 눈에 보이는 연결 상태 표시기가 있어야 합니다. 왜냐하면 오래된 데이터를 실시간인 것처럼 제시하는 것은 사용자에게 거짓말을 하는 것이기 때문입니다.
셋째, 최소 한 번 전달(at-least-once delivery)은 중복을 의미하므로, 모든 핸들러는멱등성(idempotent)을 가져야 합니다. 같은 메시지를 두 번 받는 것은 버그가 아니라 올바른 동작입니다. 이를 두 번 적용해도 동일한 결과를 얻어야 하며, 그렇지 않으면 카운터가 표류하고 아무도 그 이유를 설명할 수 없게 됩니다.
진짜 중요한 관점은 이것입니다. 면접 답변은 사고 과정(incident review)을 보여주는 것입니다. 저희가 오래된 데이터에 대해 수행했던 사후 분석(post-mortem)에서 정확히 세 가지 실행 항목이 도출되었습니다. 지터(jitter)를 사용한 백오프(backoff), 간격 재현(gap replay)을 위한 시퀀스 ID, 그리고멱등성 핸들러(idempotent handlers)입니다. 면접관들은 여러분이 소켓 문서를 외우고 있는지 테스트하는 것이 아닙니다. 네트워크가 거짓말을 할 때 무슨 일이 일어날지 고민해봤는지 확인하는 것입니다. 왜냐하면 네트워크는 결국 항상 그렇게 하기 때문입니다.
다음 디자인 문서나 면접에서 활용하세요. 재연결 체크리스트를 복사-붙여넣기하기 쉽게 정리했습니다:
REAL-TIME CHECKLIST (새벽 3시의 약속)
1. 재연결: 지터가 포함된 지수적 백오프(exponential backoff) + 지터, 최대 지연 시간 제한.
2. UI는 연결 상태를 표시해야 함: 오래된 데이터를 실시간 데이터로 절대 제시해서는 안 됨.
...