처음에는 위 문서를 바로 변역해보려고 했는데, 해당 문서에서는 서버는 WebSocket, 클라이언트는 ruby 를 이용하여 구현되어 있었다.
그래서, 그냥 결과물은 위 문서와 같게 하되, 서버는 socket.io, 클라이언트는 javascript를 이용하여 구현하기로 하였다.
‘data-changed’ 이벤트를 두번째 인자인 object와 함께 broadcasting 한다. ( 연결되어 있는 모든 클라이언트에게 해당 이벤트를 전달한다. )
broadcasting 되는 object는 index, vote 를 가지는데, index는 클라이언트의 버튼 index이고, vote는 현재 해당 버튼에 대한 vote 값을 1을 더해 전달한다.
이에 대해서는 밑에 client 예제를 설명할 때 이해할 수 있을 것이다.
위에서 보듯이 서버가 하는일은 딱 3가지다.
(물론 제대로 실시간 투표 시스템을 구현하려고 한다면, 이보다 훨씬 더 많은 일을 해야할 것이다.)
client 예제를 보자.
참고로 클라이언트는 다음과 같은 화면이 나오도록 구현할 것이다.
(2) index.html
- table 태그 안의 구조는 visualize가 해석할 수 있도록 만들어야 한다. 이는 사용하는 플러그인마다 조금씩 다르므로, 주의하도록 하자.
- visualize로 표현된 그래프 밑에 사용자가 입력할 수 있는 버튼을 추가하였다. 각 버튼마다 id를 두었다. ( 이 id가 websocket을 통해 전달되는 index이다.)
- javascript code : 아래 주석을 살펴보자. 조금 길다…
여기까지가 이번 예제에 대한 설명이다.
여러가지 브라우저에서 클라이언트를 실행하고, 버튼을 클릭하면, 실시간으로 그래프가 바뀌는 것을 아래와 같이 볼 수 있을 것이다. ( 테스트 결과, firefox에서 제대로 동작하지 않음을 확인하였다. 그외, 크롬, IE9, 사파리에서는 정상동작을 확인하였다. 클라이언트에서 DOM에 관한 핸들링을 할 때, 문제가 있는 것으로 추측된다.)
언제나 느끼지만, socket.io를 설명할 때, 클라이언트가 훨씬 코드가 길게 나온다. 이는 예제이기 때문에 서버의 코드가 굉장히 짧은 것이고, ( 서버가 해야할 수많은 일들을 생략 ) 클라이언트는 그래도 화면에 무엇인가를 그려줘야 하기때문에, 예제라고는 해도 생략할 수 없는 것들이 있다.
위 예제에서는 단순한 web socket 통신 및 데이타를 받아서 클라이언트가 refresh하는 동작만을 보여주는데, 사실 심각한 문제가 있다.
초기 데이타값이 table 태그안에 그대로 정의되어 있는 것이다. 따라서, 어떤 클라이언트에서 아무리 김태희에 클릭질을 해도, 다른 클라이언트가 접속하면, 초기값이 그대로 나올 것이다.
이를 해결하려면 서버가 데이타베이스(아니면, 뭐든지)를 통해 vote 값을 관리해야 하고, 클라이언트는 초기화면에서 이 값을 서버로부터 내려받아 그려주어야 할 것이다.