Frameworks/Node.js

[Node.js 강좌] 9. Socket.io vs Ajax 무엇을 쓸까?

양디 2016. 1. 12. 13:43


Socket.io ?


Socket.io는 저번에 나왔듯이, 소켓을 통해서 다른 환경의 프로그램들끼리 통신이 가능하게끔 해주는 모듈이다.


인터넷에서 사용하는 Websocket도 포함되어진다.


Socket.io의 특징은, 연결 - 통신 - 종료 의 단계로 이루어진다.


따라서 크게 구분을 나누자면, Persistent 와 Non-Persistent의 두가지 방식이 있겠다.


Non-Persistent는 socket 연결을 하고, 통신을 하고, 종료를 한다.

다음 통신을 하기 위해선 다시 연결을 하고, 통신이 끝나면 또 종료를 한다.

보통 페이지가 계속해서 움직이는 경우에는 이런 상황이 된다.

페이지가 넘어가면, js 파일을 다시 불러서 socket을 연결해야하는 과정을 거친다.


그런데 여기에서 지연시간(delay)가 상당히 크게 일어난다는 것이 문제이다.

소켓이 연결이 되면, 그 이후로 주고받는 통신은 굉장히 빠르다.

그러나 연결되기 위한 시간이 더 소모된다.


Persistent 는 반대이다. 소켓 연결을 하면, 통신을 종료하지 않고 계속해서 통신을 한다.

따라서 연결을 위한 지연 시간이 1회만 존재한다.


그러나 페이지가 이동하면, 어쩔수 없이 연결이 끊기게 된다.

이를 막기위해선 frame을 이용하거나, angular.js 등의 방식으로 Single page web을 구현하는 것이 좋은 해결책이 되겠다.


이런 연결 지연 시간 등은 ms 단위로, 매우 적지만 페이지를 로딩하는 시간과 합쳐지면 어느정도 사람의 인내에 영향을 끼칠 수도 있을 것이다.

Ajax?


Ajax는 Asynchronous Javascript and XML 의 약자이다.

한글로 풀어 쓰자면, 비동기 자바스크립트와 XML 이라고 할 수 있겠다.


Ajax는 흔히 jquery로 사용을 한다.

페이지 내부에서 자바스크립트로 데이터를 post 방식이나 get 방식으로 submit 하고, 

그 submit의 결과가 답신이 오면 콜백함수를 부르게 된다.


그럼 그 콜백함수에 따라서 페이지를 갱신할 수 있게 된다.


따로 연결과 종료를 위한 지연시간이 존재하지 않고, 페이지를 보내고 받는 시간만 존재한다고 생각하면 된다.

또한 단일 페이지 내부에서 얼마든지 실행할 수 있다는 장점이 있다.

그러나 보내는 방식이 HTTP 방식이기 때문에, http 프로토콜을 따라야 한다는 단점이 있다.

즉, 보내는 패킷이 http 방식으로 헤더 등의 필수 정보를 반드시 포함하여야 한다. 

물론 자동으로 정의가 되어서 가지만, 중요한 점은 그런 작은 데이터들이 모여서 큰 트래픽을 소모할 수 있다는 것이다.

Ajax vs Socket.io


이미지 출처 : http://www.cubrid.org/blog/cubrid-appstools/nodejs-speed-dilemma-ajax-or-socket-io/


위 그래프를 보면, ajax와 socket.io의 전송 속도가 거의 비슷한 것을 볼 수 있다.


그러나 그래프에는 나와있지 않지만, 같은 데이터를 전송하더라도 socket.io 방식으로 보내는 것이 ajax로 보내는 것보다 더 적은 트래픽을 소모한다.

이것은 매우 중요한 고려사항이 되어야 한다. 호스팅을 할 때에, 트래픽에 따라 서버 비용이 매우 늘어날 수 있기 때문이다.


그렇다고 해서 Socket.io가 무조건적인 해답이 되지는 않는다.


Websocket 을 적용시킬 수 없는 브라우저도 존재하는 것이고, socket들의 정보를 서버의 메모리상에 전부 저장하고 있어야하기 때문에 메모리의 부담이 커진다. 그러나 트래픽의 부담보다는 메모리 부담을 받아들이는게 나아보인다. (하드웨어의 발전으로 메모리는 매우 값싸다.)


또 페이지 이동이 잦을수록 Socket.io는 non-persistent에 가까워지므로 성능이 ajax에 비해 점점 떨어지게 된다.


따라서 자기 자신의 웹 서버의 기능과 목적에 따라 방식을 결정하여야 할 것이다.


관련 웹사이트 : http://www.cubrid.org/blog/cubrid-appstools/nodejs-speed-dilemma-ajax-or-socket-io/



Point !

상황과 기능에 맞게 결정하여야 한다.

페이지 이동이 잦다 : Ajax

트래픽 소모를 최소화 : Socket.io





댓글