안녕하세요 :)
오늘은 외주 프로젝트를 하나 받게 되었습니다.
이미지에 보이는 것처럼, '사용자가 업로드한 동영상을 처리한 후, 보행 파라미터 시각화 결과를 웹앱에서 보여주는' 작업이었습니다.
프로젝트를 시작하기 전에 '어떻게 하면 처리된 데이터를 실시간으로 빠르게 시각화할 수 있을까?'를 고민하게 되었고, 이에 대한 해결책으로 Polling과 SSE(Server-Sent Events)를 고려하게 되었습니다. 처음에는 SSE가 적합할 것 같았지만, 팀원과 논의 후 Polling이 더 나은 선택이라는 결론에 도달하게 되었습니다.
이 글에서는 Polling과 SSE의 차이점을 설명하고, 왜 Polling이 더 적합하다고 생각했는지를 정리해보겠습니다.
우선 Polling과 SSE가 뭔지 알아야겠죠? 먼저 Polling부터 알아보도록 하겠습니다.
Polling이란?
Polling은 클라이언트가 일정 주기로 서버에 HTTP 요청을 보내어 새로운 데이터가 있는지 확인하는 통신 방법입니다. 이 방식에서 클라이언트는 주기적으로 서버에 요청을 보내고, 서버는 요청이 있을 때만 응답합니다. 만약 서버에 새로운 데이터가 없다면 빈 응답을 보내거나 '데이터 없음' 상태를 반환하게 됩니다.
Polling의 동작방식을 간단히 말씀드리면 아래와 같습니다.
- 클라이언트가 서버에 요청을 보냅니다.
- 서버는 최신 상태로 응답하게 됩니다. 새로운 데이터가 있다면 데이터를 클라이언트에 보내주고, 없다면 빈 응답을 반환합니다.
- 일정 시간이 지나면 클라이언트는 다시 서버에 요청을 보냅니다.
- 이 과정을 반복하며, 서버에서 갱신된 데이터를 받아옵니다.
생각보다 단순한 동작방식이지요?
이러한 Polling 기법의 장점과 단점은 뭐가 있을까요?
[장점]
- 구현이 매우 간단합니다. 서버와 클라이언트가 독립적으로 동작하며, 복잡한 연결 상태를 관리할 필요가 없습니다.
- 서버와 클라이언트 간에 지속적인 연결을 유지할 필요가 없어, 리소스를 절약할 수 있습니다. 즉, 서버는 클라이언트가 요청을 보낼 때만 응답하면 되기 때문에 서버의 자원 소모가 줄어든다는 말입니다.
[단점]
- 네트워크 트래픽이 증가할 수 있습니다. 데이터가 필요하지 않더라도 클라이언트가 주기적으로 서버에 요청을 보내기 때문에 불필요한 트래픽이 발생할 수 있습니다.
- 실시간성이 제한될 수 있습니다. 클라이언트의 요청 주기가 길 경우, 서버에서 이벤트가 발생하거나 새로운 데이터가 업데이트 되어도 클라이언트가 이를 인식하는 데 시간이 걸릴 수 있습니다.
SSE란?
SSE는 Server-Sent Events의 줄임말이고, 서버가 클라이언트에게 단방향으로 실시간 데이터를 지속적으로 전송하는 통신 방식입니다. HTTP 프로토콜을 기반으로 하며, 서버에서 이벤트나 새로운 데이터가 발생할 때마다 클라이언트에게 데이터를 자동으로 푸시하는 구조입니다.
SSE는 아래와 같이 동작합니다.
- 클라이언트가 서버에 연결을 요청합니다.
- HTTP 요청을 통해 SSE 채널을 설정합니다.
- 서버는 클라이언트와 연결을 유지하면서 새로운 데이터나 이벤트가 발생할 때마다 클라이언트에게 데이터를 전송합니다.
- 클라이언트는 이런 방식으로 서버에서 전송된 데이터를 실시간으로 수신합니다.
- 만약 연결이 끊긴 경우, 클라이언트는 자동으로 재연결을 시도하게 됩니다.
그렇다면 SSE의 장단점은 뭘까요?
[장점]
- 실시간 데이터 처리에 용이합니다. 서버에서 이벤트가 발생할 때마다 클라이언트에게 즉시 전송하기 때문입니다.
- HTTP 기반이기 때문에 구현이 쉽고, 별도의 복잡한 설정이 필요 없습니다.
- 어느 한 쪽에서 연결이 끊겨도 자동으로 재연결을 시도합니다.
- 웹소켓보다 가벼운 통신이 가능하고, 서버와 클라이언트 간 오버헤드가 적습니다.
[단점]
- 단방향 통신만 지원합니다. 만약, 양방향 통신 기술이 필요한 경우 웹소켓과 같은 다른 방식을 사용해야 합니다.
- SSE는 연결 수에 제한이 있습니다. HTTP 기반이기 때문에, 동시에 많은 클라이언트가 접속하게 되면 서버에 부담이 크게 갈 수 있습니다.
- 일부 구형 브라우저에는 지원하지 않습니다. 하지만 대부분의 브라우저는 지원하니 큰 단점은 아닙니다.
그렇다면 왜 Polling 방식을 선택하였는가
곰곰히 생각해본 결과, Polling을 선택한 몇 가지 근거를 적어보겠습니다.
- 짧은 주기의 실시간 데이터 업데이트가 필요하지 않을 것입니다.
- 보행 파라미터 시각화와 같은 작업은 초 단위의 실시간성이 반드시 필요하지 않을 것입니다. Polling은 주기적으로 데이터를 확인하는 방식이기 때문에, 데이터가 즉각적으로 반영될 필요가 없는 경우 적합하다고 생각합니다. 즉, SSE처럼 데이터가 변경될 때마다 실시간으로 전달받지 않아도 충분히 요구사항을 충족시킬 수 있다는 말입니다.
- 많은 트래픽이 요구되는 환경이 조성되지 않을 것입니다.
- 이번 프로젝트는 하나의 동영상에 대한 처리된 데이터를 시각화하는 작업이기 때문에, 동시 접속자가 많아지거나 트래픽이 많이 발생하는 환경이 아닙니다. Polling이 서버에 지속적으로 요청을 보낸다고 해도, 이로 인해 서버에 큰 부하가 생길 가능성이 낮다고 생각했습니다.
- SSE의 경우, 만약 연결이 끊겼을 때 확실히 재연결이 된다는 보장이 없습니다.
- SSE는 지속적인 연결을 관리하고 유지해야 합니다. 그리고 연결이 끊어질 경우, 재연결을 시도해야 합니다. 하지만 Polling은 요청-응답 사이클만 관리하면 되기 때문에, 주기적으로 서버에 새로운 연결을 맺고 데이터를 가져오는 구조로 동작합니다. 따라서 연결이 끊겨서 데이터를 주고받지 못할 가능성이 적고 연결 상태를 지속적으로 유지할 필요도 없기 때문에 Polling이 더 적합하다고 생각했습니다.
이러한 생각을 바탕으로 Polling방식이 해당 외주 프로젝트에 더 적합하다고 생각했습니다.
Polling과 SSE가 적합한 사용 사례
위에 작성한 내용들을 정리하는 섹션이 될 것만 같은데, 정리해보자면 이렇습니다.
Polling은 주로 실시간성이 중요하지 않거나 주기적인 데이터 업데이트가 필요한 경우에 적합합니다. 예를 들어, 뉴스 피드 업데이트, 상태 점검, 일정 주기마다 확인해야 하는 데이터 요청 등에 많이 사용됩니다. 특히, 동시 접속자가 많지 않고 트래픽이 적은 환경에서는 Polling 방식이 서버에 부담을 주지 않으면서도 안정적인 데이터 업데이트를 제공합니다.
SSE는 실시간으로 서버에서 발생하는 이벤트나 데이터를 클라이언트에게 즉시 전달해야 하는 경우에 적합합니다. 실시간 채팅, 주식 시세 업데이트, 알림 시스템 등에서 SSE가 효과적으로 사용될 수 있습니다. 다만, 지속적인 연결을 유지해야 하기 때문에 서버 부하가 많거나 동시 접속자가 많을 경우 적절한 로드 밸런싱 전략이 필요합니다.
끝내는 말
오늘은 외주 프로젝트에서 시작된 고민을 바탕으로, Polling과 SSE에 대해서 알아보았습니다.
처음에는 SSE를 고려했지만, 프로젝트의 특성과 요구 사항을 분석한 결과 Polling 방식이 더 적합하다는 결론을 내리게 됐습니다.
제가 바로 위에 각 방식이 적합한 사례를 작성해놓았는데, 반드시 저 사례를 따라갈 필요는 없습니다.
기술 선택에서 중요한 점은 상황에 맞는 최적의 솔루션을 찾는 것이라고 생각합니다. 각 방식의 장단점을 잘 이해하고 프로젝트에 맞게 적용할 때, 효율적이고 올바른 결과를 얻을 수 있습니다. 제가 이번 프로젝트에서 Polling 방식이 더 적합하다고 결론내린 것처럼 말이죵.
Best Practice를 따라가는 것도 좋은 선택이지만, 이런 상세 요구사항을 잘 살펴보고 생각한 후에 사용할 기술을 선택하는 것도 좋은 거 같습니다 ㅎ.ㅎ
읽어주셔서 감사합니다 :)
'네트워크' 카테고리의 다른 글
HTTP에서 HTTPS로: 인증서, 암호화, 그리고 송수신의 비밀 (2) | 2025.04.08 |
---|---|
Socket이 뭘까? WebSocket과 Socket.io 알아보기 (2) | 2024.11.13 |
SSH에 대해 알아보자. (0) | 2024.10.19 |