Open WonYong-Jang opened 6 years ago
WebSocket은 웹상에서 쉡게 소켓통신을 하게 해주는 라이브러리로 실시간 채팅 서비스등등 여러 유용한 서비스 기반이 된다. 스프링 부트환경에서는 이러한 서비스를 구현하기 위해서 필요한 2가지가 있는데 WebSocket의 기능을 보완해주고 향상시켜주는 SockJS라이브러리와 메시징 전송을 좀 더 효율적으로 지원해 주기 위한 STOMP 프로토콜이 존재한다. 스프링 부트 환경에서는 핸들러와 브로커라는 개념을 이용해서 서로간의 통신을 하게된다.
아래 소스와 같이 SimpMessageTemplate 사용하여 multi chat 구현 완료
스프링의 STOMP 지원을 설정할 때의 부작용으로 스프링 애플리케이션 컨텍스트 내에 SimpMessageTemplate 빈이 이미 존재한다. 따라서 여기서 새 인스턴스를 생성할 필요는 없다. SimpMessagingTemplate을 주입하기 위해 @Autowired를 가지고 애너테이션된다.
메시지를 convertAndSend()를 사용하여 STOMP 토픽으로 보낼 때 또는 핸들러 메소드의 결과로서 그 토픽을 구독하는 클라이언트는 메시지를 수신한다.
@Autowired
private SimpMessagingTemplate simpMessagingTemplate;
@MessageMapping("/topic/{chatRoomId}")
public void handleChat(@Payload ChatMessage message, @DestinationVariable("chatRoomId") String chatRoomId) {
this.simpMessagingTemplate.convertAndSend("/topic/"+chatRoomId, message);
}
=> TCP는 연속성보다 신뢰성 있는 전송이 중요할 때에 사용하는 프로토콜 - 연결형 서비스로 가상 회선 방식을 제공 => 발신지와 수신지를 연결하여 패킷을 전송하기 위한 논리적 경로를 배정 - TCP 연결 설정 => 3 way-handshaking방법 이용 / 4-way handshaking을 통해 해제한다. => 목적지와 수신지를 확실히 하여 정확한 전송을 보장하기 위해서 세션을 수립하는 과정(신뢰성 보장) - 흐름 제어 및 혼잡 제어 => 신뢰성을 보장해주기 때문에 UDP보다 속도 느림 - 높은 신뢰성을 보장 - UDP보다 속도가 느리다. - TCP 재전송 타이머
- 데이터그램: 독립적인 관계를 지니는 패킷이라는 뜻, => UDP는 비연결형 프로토콜, 즉 연결을 위해 할당되는 논리적인 경로가 없는데, 그렇기 때문에 각각의 패킷은 다른 경로로 전송되고, 각각의 패킷은 독립적인 관계를 지니게 되는데 이렇게 데이터를 서로 다른 경로로 독립적으로 처리 - 비연결형 서비스로 데이터그램 방식을 제공 => 연결 설정하고 해제하는 과정이 존재하지 않음, 서로 다른 경로로 독립적으로 처리함에도 패킷에 순서를 부여하거나 재조립을 하거나 흐름제어 또는 혼잡제어와 같은 기능 처리하지 안함 - 정보를 주고 받을 때 정보를 보내거나 받는다는 신호절차를 거치지 않는다. - UDP헤더의 CheckSum 필드를 통해 최소한의 오류만 검출 - 신뢰성 낮고 TCP 보다 속도가 빠르다. =>> 신뢰성보다는 연속성이 중요한 서비스 ( ex) 실시간 서비스(streming)에 자주 사용됨 )
TCP를 실시간 멀티미디어 정보를 처리하는데, 사용할 경우 TCP의 오류정정 특성상 메시지가 도착하지 않을경우 다음 메시지를 받지 않고, 메시지 재전송을 요구하므로, 실시간으로 전송하기에는 그리 적당하지 않기 때문이다.
반면 UDP를 사용하면 중간에 패킷에 소실되더라도 개의치 않고 다음 패킷을 받아들이므로 실시간으로 메시지 처리가 가능
- 패킷 통신방식의 인터넷 프로토콜인 IP / 전송 조절 프로토콜인 TCP로 이루어져 있다.
- IP는 패킷 전달 여부를 보증하지 않고, 패킷을 보낸 순서와 받는 순서가 다를 수 있다.(Unreliable datagram service)
TCP는 IP 위에서 동작하는 프로토콜로, 데이터의 전달을 보증하고 보낸 순서대로
받게 해준다.
- HTTP, FTP, SMTP 등 TCP를 기반으로 한 많은 수의 애플리케이션 프로토콜들이 IP위에서 동작하기 때문에, 묶어서 TCP/IP라고 부른다.
1) IP는 데이터 조각들을 최대한 빨리 목적지로 보내는 역할, 조각들의 순서가 뒤바뀌거나 일부가 누락되더라도 크게 상관하지 않고 효율적인 방법으로 보내는데 집중 / 4 byte 이루어진 주소번호
- Domain Name Service 사용해서 식별이 쉽도록 ( ex) 211.234.109.2 ==> yahoo.co.kr )
2) TCP는 IP보다 느리지만 꼼꼼한 방식으로 사용, 도착한 조각을 점검하여 줄을 세우고 망가졌거나 빠진 조각을 다시 요청
- 패킷이 빠졌을 경우, 재전송 요청 하는 기능
- 패킷에 일련번호를 줌으로써, 서로 다르게 도착될지도 모르는 패킷의 순서를 재조합하는 기능
- 서버와 클라이언트간에 데이터를 신뢰성있게 전달하기 위해 만들어진 프로토콜
두 방식의 조합을 통하여 인터넷 데이터 통신을 하는 것을 묶어 TCP/IP라 부름
-7개 계층을 나눈 이유는, 각 계층에 대한 캡술화와 은닉이 가능하기 때문 ex ) 서비스 개발자는 Application Layer 와 Presentation Layer 만 신경 쓰면 됨
1) 응용프로그램 계층(Application) - 다른 계층의 서비스에 접근할 수 있게 하는 애플리케이션을 제공. - 애플리케이션들이 데이터를 교환하기 위해 사용하는 프로토콜을 정의 => HTTP : WWW의 Web 페이지 파일을 전송하는데 사용 - TCP/IP 네트워크를 사용하거나 관리하는 것을 도와주는 프로토콜 => DNS(Domain Name System)
응용프로그램 (FTP, Telnet, SMTP) 등으로 이루어짐 2) 전송계층 ( Transport ) - 자료의 송수신을 담당
각각 시스템 연결하고, TCP 프로토콜을 이용하여 데이터 전송 - TCP / UDP이 핵심 프로토콜 3) 인터넷 ( Internet ) - 어드레싱(addressing), 패키징(packaging), 라우팅(routing) 기능을 제공 - 논리적 주소인 IP를 이용한 노드간 전송과 라우팅 기능을 처리하게 됨 - 네트워크 상 최종 목적지까지 정확하게 연결되도록 연결성을 제공하게 됨. 4) 물리 ( Physical Layer ) - 물리적 계층 / 이더넷 카드와 같은 하드웨어
TCP 는 UDP와 달리 연결지향인데, 이는 데이터가 전송되기 전에 Brower 와 Server 간의 연결을 성립하는 과정이 데이타를 전송하는 과정 전에 이루어지게 된다.
HTTP(Hyper Text Transfer Protocol) : 하이퍼텍스트 문서를 전달하기 위한 규약
Open source link
WebSocket
WebSocket Configuration
The @EnableWebSocketMessageBroker is used to enable our WebSocket server.
WebSocketMessageBrokerConfigurer interface and provide implementation for some of its methods to configure the websocket connection.
SockJS is used to enable fallback options for browsers that don’t support websocket.
Why do we need STOMP? Well, WebSocket is just a communication protocol. It doesn’t define things like - How to send a message only to users who are subscribed to a particular topic, or how to send a message to a particular user. We need STOMP for these functionalities.
The HTML file( index.html ) contains the user interface for displaying the chat messages. It includes sockjs and stomp javascript libraries.
SockJS is a WebSocket client that tries to use native WebSockets and provides intelligent fallback options for older browsers that don’t support WebSocket. STOMP JS is the stomp client for javascript.