티스토리 뷰
서론
현재 대다수의 SNS와 그외 많은 서비스들은 사용자들이 올리는 글 또는 사용자들의 사용패턴을 실시간으로 분석하고 그 과정을 통해 의미있는 데이터를 추출해내고 있다. 이와 같이 기업 입장에서는 실시간 데이터를 실시간으로 분석해내는 것이 중요한것 처럼 사용자는 자신이 쓴글이 누군가에게 실시간으로 알려지고 자신은 다른 사람들이 쓴 글의 정보를 실시간으로 받는 것을 원한다. 예를 들어 페이스북은 사용자가 게시글에 좋아요를 누르면 게시글을 작성한 사람에게 "누군가 자신의 글에 좋아요를 눌렀다" 라는 정보가 바로 알려지게 된다. 이런 기능을 푸시알림이라고 하며 푸시를 하기 위해서는 많은 기법들이 존재한며 해당 기법에 대해서 설명한다.
HTTP의 한계
우선 적으로 사용자 브라우저와 서버간에 정보를 주고 받기 위해서는 HTTP 프로토콜을 사용하게 되는데 HTTP 프로토콜 특성상 요청 한번에 응답 한번으로 연결이 끝나게 된다. 이렇게 되면 서버로 부터 변경내용을 실시간으로 받기 어려운데 이것을 해결하기 위한 방법이 Polling, Long Polling, Stream 3가지가 있다.
Polling 기법
가장 간단한 방법이며 동작 방법은 사용자가 일정 간격으로 두고 서버로 부터 통신을 해 변경 내용을 가져가는 방식이다. 이 방법으로 실시간 변경 내용을 제공하기에는 상당한 무리가 따르는데 이유는 실시간 데이터가 초당 으로 조회 되야 한다면 수많은 사용자가 매초마다 보내는 호출을 서버가 감당하기지 못할 수 있기 때문이며 버텨준다 하더라도 사용자요청 처리에 엄청난 자원을 낭비하게 될 것이다.
Long Polling 기법
Polling기법의 문제점을 해결하기 위한 방법으로 사용자가 서버로 변경 내용에 대한 요청을 보내면 요청을 받은 서버는 바로 해당 요청에 대해서 응답을 하는 것이 아니라 변경사항이 발생할 경우 요청에 대한 응답을 전달해주는 방법이다.
Streaming 기법
이 방법은 초기 한번의 연결로 서버에서 지속적으로 데이터를 내려 받을 수 있는 방법으로 계속되는 요청/응답 구조가 아니기 때문에 네트워크 부하를 줄일 수 있다. 또한 서버에서는 연결된 통신으로만 결과를 바로바로 전달 할 수 있기 때문에 자원 측면에서도 효율성이 높다. 대표적으로 Server-Sent Event와 WebSocket이 이와 같은 방법이며 이후 구현에서는 WebSocket을 사용하여 푸시서버를 구현해볼 예정이다.
결론
짧은 포스트이지만 여러가지를 찾아보고 나 나름대로 이해 하고 정리를 해보았다. 이후에 Netty를 사용해서 WebSocket기반 Push Server를 만들고 테스트버전으로 만들어본 사이트에 적용한 내용을 포스팅한다.