토이프로젝트 겸 네이버 챗봇을 연동하여 실시간 답변을 해주는 기능을 제작해보려 했다. 그 와중에 springboot 의 webSocket을 이용해야 한다고 해서 살펴보게 되었다. 과거에 C++ socket을 이용하여 채팅시스템을 만들어본 기억은 나는데, 복습 겸 WebSocket을 포스팅 해보도록 한다.
Naver Chatbot
연동을 위한 WebSocket
웹 소켓은 사용자의 브라우저와 서버 사이의 인터액티브 통신 세션을 설정할 수 있게 하는 고급 기술입니다. 개발자는 웹 소켓 API를 통해 서버로 메시지를 보내고 서버의 응답을 위해 서버를 Polling하지 않고도 이벤트 중심 응답을 받는 것이 가능합니다.
출처 : 이곳
HTTP
포트인 80포트위에서 동작해서 방화벽에 제약이 없음HTTP
프로토콜로 접속까지 이용 후 WebSocket
프로토콜로 이용이 된다고 한다. 일반적인 Socket
통신과 비슷한 맥락이다. 사실 기억이 잘...
사진은 위의 사진을 보며 참고하도록 하자.
서버와 클라이언트간의 웹소켓 연결은
HTTP
프로토콜을 통해 이루어진다. 연결이 정상적으로 이루어지면 서버와 클라이언트 간에 웹소켓 연결(TCP/IP
)기반이 이루어지고 일정 시간이 지나면HTTP
연결은 자동으로 끊어진다.
handshake
란?
쉽게 주고받기라고 한다. 개념적으로 살펴보면, TCP가 연결지향 프로토콜이어서 서로의 연결상태확인을 위해서 여러방법중 3-way handshaking 이라는 방법을 사용하는데
클라이언트쪽에서 서버에 SYN이라는 연결 요청패킷을 보내면
서버에서 ACK이라는 요청에 응답하는 패킷과 SYN을 함께 보내고
클라이언트가 이를 정상적으로 받았다면 다시 요청에 응답하는 ACK을 보내는 과정을 보내는 3단계로 과정이다.
정보처리기사에 보면 3-way-handshaking 이라는 단어가 나온다. 주고받기로 알아두자.
일단 예시코드는 Spring
에서 지원되는 API
있기 때문에, 적절한 코드로 예를 들어보려고 한다.
예제를 찾아보면 각자의 설정마다 다르게 나온다. 필자는 Naver Chatbot 을 만들기 위해 이용하기 때문에, Chatbot 예제를 중심으로 쓰려고 한다.
웹소켓 기본설정
package com.millie.chatbot.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").withSockJS(); //웹 소캣을 사용하기 위해 설정하는 부분
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.setApplicationDestinationPrefixes("/app"); //prefix 설정
registry.enableSimpleBroker("/hello"); //hello 이라는 주제에 브로커를 설정
}
}
bean
에 등록하기 위해 명시해준다후에 NaverChatbot 에서 지원하는 Controller
와 연동하여 사용할 수 있다.
💡나열을 해보자면,
Polling
서버로 일정 주기 요청 송신, real-time 통신에서는 언제 통신이 발생할지 예측이 불가능, 불필요한 request와 connection을 생성
Long Polling
Polling의 단점을 최소화 하기 위해 서버에서 조금 더 대기해서 이벤트를 받는다, 서버에 요청 보내고 이벤트가 생겨 응답 받을 때 까지 연결이 종료되지 않는다
Streaming
서버에 요청을 보내고 끊기지 않은 연결상태에서 끊임없이 데이터 수신, 클라이언트에서 서버로의 데이터 송신이 어렵다
출처 : 이란
🤔브라우저 호환도 되는가?
💡사진으로 설명할 수 있다.
출처 : 이곳
오랜만의 포스팅이다.
좀 더 열심히 해서 예쁘게 채워보도록 하자.
다음에는 NaverChatbot 을 포스팅 해보겠다.