서버에서 클라이언트로 푸시하는 방식에 대하여

웹 어플리케이션은 태생이 Client - Server 모델을 기반으로 만들어졌습니다. 클라이언트가 필요한 리소스를 서버에 요청하면 서버는 그에 대한 응답을 돌려줍니다. 이것이 기본적인 Client - Server 모델의 동작 방식입니다. 이 모델에서 항상 새로운 요청을 보내는 쪽은 클라이언트입니다. 그렇기 때문에 서버에서 클라이언트에게 먼저 데이터를 보낼 방법이 없었습니다. 이 문제를 해결하기 위해서 푸시 방식(Push)이 고안되었습니다.

푸시 방식은 서버에서 클라이언트에게 정보를 먼저 보내주는 전달 방식을 의미합니다.
클라이언트가 서버로부터 원하는 정보를 계속 요청하는 방식을 Pull 방식이라고 합니다.
스마트폰의 푸시 알람, 맞춤형 컨텐츠 이메일 알람 서비스가 모두 서버에서 클라이언트로 정보를 보내는 푸시 방식이라고 볼 수 있습니다.

우리가 흔하게 사용하는 채팅 어플리케이션의 경우 대부분이 Socket이라는 것을 통해 서버와 클라이언트가 연결되어 있습니다. 이 연결은 지속적이기 때문에 클라이언트 뿐만 아니라 서버에서도 다른 사람이 보낸 메시지를 전달할 때 문제가 없습니다. 연결된 TCP Socket으로 메시지를 전달하면 되기 때문입니다.

하지만 HTTP 프로토콜 특성상 웹 환경에서는 위와 같이 동작하기 힘듭니다. HTTP는 상태가 없습니다. 또한, 클라이언트가 서버에 요청을 보내고 응답을 받으면 연결이 끊어지게 됩니다. 이 상황에서는 서버가 먼저 클라이언트에게 무엇인가 전달할 수 없습니다.
이 문제를 해결하기 위해 여러 방법들이 개발되었습니다.
대표적으로 아래의 3가지 방법이 있습니다.

  • Polling
  • Long-Polling
  • Streaming

이 각각의 방법들에 대해 좀 더 자세히 살펴보도록 하겠습니다.

주기적인 Polling 방식

주기적인 Polling 방식은 일정한 시간 간격을 두고 클라이언트에서 서버로 계속 요청을 보내는 것입니다.
서버에서는 클라이언트의 요청을 받고 바로 응답을 합니다. 그리고 HTTP 연결이 끊어지게 됩니다.
문제는 어떤 시점에 서버의 이벤트가 발생될지 모른다는 것입니다. 그렇기 때문에 일정간격을 두고 계속 클라이언트가 요청을 보내는 것입니다. 이것은 주기적으로 서버의 변경사항을 받기 위해 갱신(Update)하는 작업으로 볼 수 있습니다.
클라이언트가 요청을 보낸 시점에 서버에 이벤트가 발생했다면 그때에 클라이언트는 변경된 서버의 정보를 받을 수 있습니다.

주기적인 Polling 방식은 클라이언트가 서버에게 주기적으로 새로운 데이터가 있는지 요청을 보내는 것입니다. 요청에 대한 서버 부담이 크지 않거나 실시간성이 중요하지 않은 서비스라면 이 방식을 채택해도 문제가 없습니다. 하지만 실시간성이 중요해져 요청 주기가 짧아지면 서버에 큰 부담을 줄 수 있기 때문에 주의해야 합니다.

Long-Polling 방식

Long Polling 방식은 주기적으로 요청을 보내는 Polling 방식과는 다릅니다. 정확히는 서버가 응답을 하는 시점이 다릅니다. 주기적인 Polling 방식에서는 서버 이벤트가 발생하지 않아도 즉각적으로 클라이언트에게 응답을 줍니다. 그렇기 때문에 요청주기가 짧아지면 새로운 연결이 계속 생성되고 끊어지기 때문에 서버에 많은 부하를 주게 되는 것입니다.

Long Polling 방식을 사용하면 일단 연결이 이루어지고 난 다음, 서버에서 이벤트가 발생할때까지 응답을 보류합니다. 이벤트 발생 시점에 클라이언트에게 응답하기 때문에 불필요한 연결을 줄일 수 있습니다. Long Polling 방식은 서버의 응답을 무한정 기다리는 것이 아니고 특정 시간이 지나면 해당 요청을 완료하고 다시 새롭게 요청하는 방식으로 진행됩니다.
Polling 방식과 마찬가지로 서버로부터 응답을 받게 되면 연결이 끊기게 됩니다.

Streaming 방식

스트리밍 방식은 클라이언트로부터 요청이 있고 난 후, 이에 응답하지 않고 필요할때마다 계속 데이터를 보내는 방식입니다. Polling과 Long Polling 방식은 서버가 응답을 한 뒤에 연결이 끊기기 때문에 서버 이벤트가 많이 발생할 경우 비효율적일 수 있습니다. 그만큼 요청 횟수가 늘어날 것이기 때문입니다.

스트리밍 방식은 서버의 상태변경이 매우 잦은 경우에 적합합니다. 스트리밍 방식은 일단 요청이 들어간 후, 해당 응답 스트림을 통해 서버에서 데이터가 계속 전송됩니다. 응답을 받은 뒤 연결이 끊어지는 Polling 방식과 Long-Polling 방식과 다른 점이 바로 여기에 있습니다. 스트리밍 방식이라고 무한정 연결을 지속하지는 않습니다. 일정시간을 정해두고 그 시간이 지나면 요청을 끊고 다시 새로운 연결을 생성합니다.


댓글()