랜덤 채팅방이나, 실시간 주식차트등과 같이
현재 내용이 갱신되게되면, 사용자는 실시간으로 갱신된 내용을 볼 수 있게 서비스를 만들고 싶었다.
이러한 서비스를 만들기 위해서는 WebSocket
을 활용해야 됐기 때문에, WebSocket
에 대해 알아보고자한다.
spring-boot-starter-websocket
라이브러리 추가 WebSocketConfig
설정(발행자, 구독자, endPoint)@Controller
생성 및 테스트평소 RestAPI에 익숙했던 사람이라면, 먼저 WebSocket에 대해 이해해야된다.
왜냐면, RestAPI가 HTTP 기반 통신인데, WebSocket역시 HTTP 기반 통신이기 떄문에 이둘의 차이를 알아야하고 어떻게 동작하는지 차이를 분명하게 알고 있어야한다.
게다가, 이사실을 알게되면, API != RestAPI 임을 깨닫고, RestAPI는 API 종류중 하나라는 것을 알게된다.
HTTP 요청/응답 모델
이 기반이였기때문에, 실시간 양방향 통신에는 한계가 있었다.
좀 더 구체적으로 알아보자
실시간 양방향 통신에는 한계
가 있다.RestAPI도 이 모델을 사용하고 있을 뿐이다. 다만, 클라이언트와 서버가 특정 상황을 보다 체계적으로 구분하기위해, GET, POST, PUT, DELETE등의 메소드를 만들었다.
양방향 데이터 통신
을 한다.HTML5 이후부터
표준화되어 이전 버전은 지원이 안될 수도 있다.오버헤드가 낮은 특징
이 있는데, 클라이언트와 서버가 통신할 때 초기와 마지막에 항상하는 것이 *way handshake임을 알 수 있다. 좋아!, 이제 연결은 됐어 그럼 이제 실시간 데이터교환은 어떻게 할까?
데이터를 어떻게 교환하는지 알려면 STOMP, Publish/Subscribe 프로토콜을 알아야한다.
컴퓨터 네트워크에 수많은 통신이 일어나고, 서로 구분하고 알기위해 서로 다른 기종의 컴퓨터끼리 통신하기 위해서 미리 정해놓은 통신 규약 및 통신 약속
계층 | 프로토콜 |
---|---|
응용(Application) | HTTP, SMTP, FTP, Telnet |
표현(Presentation) | ASCII, MPEG, JPEG, MIDI |
세션(Session) | NetBIOS, SAP, SDP, NWLink |
전송(Transport) | TCP, UDP, SPX |
네트워크(Network) | IP, IPX |
데이터 링크(Data Link) | Ethernet, Token Ring, FDDI, Apple Talk |
물리(Physical) | ISDN, wired(유선), wireles(Wi-Fi,5G) |
그렇기 때문에 HTTP 위에 WebSocket이 통신방식을 규약할 수 있고, WebSocket위에 STOMP으로 메시징 형식과 규칙을 추가할 수 있는 것이다.
STOMP프로토콜은 기본적으로 Publish/Subscribe 모델을 가지고 있다.
Publish/Subscribe(발행/구독) 모델은 메시지를 직접적으로 특정 수신자에게 보내는 대신,
메시지를 주제나 채널에 발행하여
관심 있는 구독자들이 해당 메시지를 받을 수 있게 하는 패턴(모델)
이로써, 본격적으로 WebSocket을 구현하기 전, 어떻게
구성되어 있는지 알아봤다.
websocket만 정리해서 올리려다보니, 뭔가 구체적으로 와닿지 않고 중간중간 정확히 모르는 개념이 발견될 때마다 그 것을 찾아 정리하다보니 점점 내용이 많아지는 것 같아 이번 포스팅은 여기서 마무리하고 다음에 다시 작성하고자한다.(STOMP 설명도 추가적으로 더 할 예정) 그리고 다음에는 코드내용도 같이 올려 보고자한다.