Websocket?

http는 비연결성, 무상태성을 가진 단방향 통신이라는 것을 알고 있을 것이다.

그런데 서버에서 클라이언트로 요청을 보내야 하는 상황, 이전에 주고 받은 요청들을 알고 있어야 하는 상황이 있으면 어떻게 해야 할까?

 

Polling

옛날에는 해결 방법으로 polling을 사용하였다.

클라이언트가 주기적으로 서버에 요청을 보내면, 서버에 응답 데이터가 있을 경우 응답이 반환 된다.

 

그러나 단점이 많이 존재하는데

1. 설정한 일정 시간마다 요청을 보내는 것일 뿐 실시간이 아니다.

2. 주기적으로 요청을 보내야 하기 때문에 필요없는 통신이 발생하며 프로그램에 부하를 주게 된다.

3. http 통신을 하기 때문에 오버헤드가 발생한다.

 

WebSocket

이런 불편함을 해결하기 위해 웹소켓이 등장하였다.

웹소켓은 양방향, 실시간 통신을 지원해주는 통신 프로토콜이다.

즉 서버에서 클라이언트로 요청을 보낼 수 있다는 뜻이다. 연결을 끊지 않았다면 언제든!

 

동작 방법

출처: 위키피디아

웹소켓의 동작은

- 클라이언트와 서버의 연결(핸드쉐이크)

- 양방향 메세지 전달

- 한 곳에서 연결을 끊음

이 세 가지 단계로 이루어져 있다.

 

HandShake

핸드쉐이크란, 서버와 클라이언트 간 연결이 잘 되었는지 서로 확인하는 과정이다.

이 과정은 http로 이루어 지며 웹소켓으로 프로토콜을 전환(Upgrade)할 것이라고 알린다.

 

Bidirectional messages

이제 실질적인 필요한 데이터를 주고 받는 부분이다.

여기서는 메세지 단위 통신이 이루어 지며, 양 방향으로 요청을 보낼 수 있다.

따라서 매번 헤더를 전송할 필요가 없기 때문에 오버헤드가 발생하지 않는다.

 

OneSides closes channel

클라이언트, 서버 중 한 쪽이 연결을 종료하면 웹소켓 채널이 닫힌다.

 

 

실제 사용에 대해서는 따로 포스팅을 해보겠다.

 

'Spring' 카테고리의 다른 글

QueryDSL의 null처리  (0) 2024.09.23
[Spring] JPA 심화 강의 정리  (1) 2024.06.26
[Spring] 🙉Fixture Monkey🙉  (1) 2024.06.15
[Spring] DB 테스트 환경 분리  (0) 2024.06.13
[Spring] AOP란 무엇일까? (+Spring AOP)  (0) 2024.06.12

+ Recent posts