WEB SOCKET (웹 소켓)
실시간 (양방향) 통신을 위한 웹의 노력
개인적인 생각으로 HTML5의 새로운 스펙중에 사용자가 가장 흥미로워 한 것이 Canvas 라면
개발자가 가장 흥미로워 한 것은 바로 웹 소켓(Web Socket)이지 않나 싶다.
필자 역시 순수 웹 환경에서 연결 지향 양방향 통신을 지원하는 웹 소켓이 가장 눈에 띄는 것 중 하나였다.
과거 순수 웹 환경에서 채팅과 같은 실시간 응용프로그램을 위한 얼마나 많은 시도들이 있었던가
이제 박물관에서나 볼 법한 숨긴 frame(or iframe)을 통한 반복적인 재요청은 당시만 해도 웹에서 실시간 효과를 낼 수 있는
참신한 아이디어로 부상한 적이 있었다.
이후 Ajax의 등장으로 비동기로 반복 요청을 할 수 있어 그나마 조금은 개선 되었다.
그러나 여전히 클라이언트의 비 효율적인 재요청을 피할 수는 없었다.
그리고 이후 Comet의 등장으로 서버 데이터 수신 후 재 요청이 가능해져 불필요한 반복 요청의 비효율성은 개선되었다.
그러나 이 모든 것은 '폴링(polling)' 방식이다.
즉 데이터 수신을 위해 서버가 클라이언트에게 전송해 주는 푸시(push) 방식이 아니라 클라이언트가 서버에게 요청하는
폴링(polling) 방식이었다.
비교적 최적의 대안이었던 Comet 역시 무의미한 반복 요청을 피하기 위한 연결유지 기법이 적용되었지만
일정 시간 이후에는 연결을 종료하고 다시 연결해야 한다. 그래서 Comet을 Long-Polling라 한다.
웹의 진정한 실시간 (양방향) 통신, 웹 소켓(Web Socket)의 등장
초기 웹의 탄생 목적은 문서 전달과 하이퍼링크를 통한 문서 연결이었다.
웹을 위한 HTTP 프로토콜은 이러한 목적에 매우 부합하는 모델이다.
그러나 시대가 변하고 환경이 발전할수록 웹이 더 이상 문서공유에만 집중할 수 없었다.
갈수록 동적인 표현과 뛰어난 상호작용이 요구되었고 이로 인해 여러 새로운 기술이 탄생되었다.
플래시(플렉스), 자바 애플릿(자바 FX), ActiveX, 실버라이트 등을 들 수 있다.
하지만 이들은 웹에서 화려한 동작과 뛰어난 상호작용을 보장하지만 순수 웹 환경이 아니라 별도의 런타임을
플러그 인 형태로 브라우저에 설치해야 사용 가능하다.
HTML5의 그 주요 목적 중 하나인, 플러그 인 없는 일관되고 표준화된 웹 응용 환경이라는 가치하에 많은 참신한
스펙들이 개발되었다.
그 중 순수 웹 환경에서 실시간 양방향 통신을 위한 스펙이 바로 '웹 소켓(Web Socket)' 이다
웹 소켓은 웹 서버와 웹 브라우저가 지속적으로 연결된 TCP 라인을 통해 실시간으로 데이터를 주고 받을 수 있도록 하는
HTML5의 새로운 사양이다.
따라서 웹 소켓을 이용하면 일반적인 TCP 소켓과 같이 연결지향 양방향 전이중 통신이 가능하다.
이와 같은 특징으로 웹에서도 채팅이나 게임, 실시간 주식 차트와 같은 실시간이 요구되는 응용프로그램의 개발을 한층 효과적으로 구현할 수 있게 되었다.
웹 소켓이 필요한 5가지 징후
- Your web application has data that must flow bi-directional simultaneously.
- Your web application must scale to large numbers of concurrent users.
- Your web application must extend TCP-based protocols to the browser.
- Your web application developers need an API that is easy to use.
- Your web application must extend SOA over the Web and in the Cloud.
지원되는 브라우저 현황
https://m.mkexdev.net/98 (웹 소켓)
웹 채팅
https://compogetters.tistory.com/96(with chat)
- WebSocket 사용
- TextWebSocketHandler 상속하여 WebSocketHandler 생성
- json 형식을 통해 웹소켓을 통해 서버로 보냄
- handler는 이를 받아 ObjectMapper를 통해 해당 json 데이터를 chatMessage.class에 맞게 파싱하여 ChatMessage 객체로 변환
- 이 json 데이터에 들어있는 roomId를 이용하여 해당 채팅방을 찾아 handlerAction()이라는 메서드를 실행
- handlerAction() 메서드는 이 참여자가 현재 이미 채팅방에 접속된 상태인지, 이미 채팅에 참여해있는 상태인지를 판별
- 만약 채팅방에 처음 참여하는거라면 session을 연결해줌과 동시에 메시지를 보낼 것이고 아니라면 메시지를 해당 채팅방으로 보내게 됨
'Study > WEB' 카테고리의 다른 글
[WEB] HTTP Method (0) | 2023.01.26 |
---|---|
좋은 객체 지향 설계의 5가지 원칙 (SOLID) (0) | 2023.01.24 |
[WEB] WebRTC란? (0) | 2023.01.13 |
[WEB] Access Token & Refresh Token 원리 (feat. JWT) (0) | 2023.01.09 |
[WEB] JWT 토큰 인증 이란? (0) | 2023.01.08 |