[SpringBoot / WebSocket] 웹소켓은 무엇일까요 !

RealPark·2023년 2월 23일
1
post-thumbnail

개요

토이프로젝트 겸 네이버 챗봇을 연동하여 실시간 답변을 해주는 기능을 제작해보려 했다. 그 와중에 springboot 의 webSocket을 이용해야 한다고 해서 살펴보게 되었다. 과거에 C++ socket을 이용하여 채팅시스템을 만들어본 기억은 나는데, 복습 겸 WebSocket을 포스팅 해보도록 한다.

  • Naver Chatbot 연동을 위한 WebSocket
  • 토이프로젝트
  • 너무 오랜만에 등장

🛠️ WebSocket이란?


웹 소켓은 사용자의 브라우저와 서버 사이의 인터액티브 통신 세션을 설정할 수 있게 하는 고급 기술입니다. 개발자는 웹 소켓 API를 통해 서버로 메시지를 보내고 서버의 응답을 위해 서버를 Polling하지 않고도 이벤트 중심 응답을 받는 것이 가능합니다.
출처 : 이곳


특징

  • 실시간 양방향 통신
  • 클라이언트와 서버의 통신에서 데이터 요청 / 응답을 위한 지속적인 폴링 방식이 아니라서, 더 낮은 부하를 사용하여 실시간 통신이 가능
  • HTTP 포트인 80포트위에서 동작해서 방화벽에 제약이 없음
  • HTTP 프로토콜로 접속까지 이용 후 WebSocket 프로토콜로 이용이 된다고 한다.

일반적인 Socket 통신과 비슷한 맥락이다. 사실 기억이 잘...


🔥WebSocket 작동원리


사진은 위의 사진을 보며 참고하도록 하자.

서버와 클라이언트간의 웹소켓 연결은 HTTP프로토콜을 통해 이루어진다. 연결이 정상적으로 이루어지면 서버와 클라이언트 간에 웹소켓 연결(TCP/IP)기반이 이루어지고 일정 시간이 지나면 HTTP연결은 자동으로 끊어진다.

  1. TCP/IP 접속 요청
  2. TCP/IP 접속 수락
  3. 웹소켓 열기 handshake 요청
  4. 웹소켓 열기 handshake 수락
  5. 웹소켓 데이터 송, 수신

handshake 란?

쉽게 주고받기라고 한다. 개념적으로 살펴보면, TCP가 연결지향 프로토콜이어서 서로의 연결상태확인을 위해서 여러방법중 3-way handshaking 이라는 방법을 사용하는데
클라이언트쪽에서 서버에 SYN이라는 연결 요청패킷을 보내면
서버에서 ACK이라는 요청에 응답하는 패킷과 SYN을 함께 보내고
클라이언트가 이를 정상적으로 받았다면 다시 요청에 응답하는 ACK을 보내는 과정을 보내는 3단계로 과정이다.

정보처리기사에 보면 3-way-handshaking 이라는 단어가 나온다. 주고받기로 알아두자.


👀WebSocket 예시코드


일단 예시코드는 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 이라는 주제에 브로커를 설정
    }
}
  • @Configuration 으로 클래스를 bean에 등록하기 위해 명시해준다
  • @EnableWebSocket 을 명시하여 클래스에 적용

후에 NaverChatbot 에서 지원하는 Controller와 연동하여 사용할 수 있다.


🤔자문자답


🤔WebSocket 이전의 기술은 어떤게 있나?

💡나열을 해보자면,

  • Polling
    서버로 일정 주기 요청 송신, real-time 통신에서는 언제 통신이 발생할지 예측이 불가능, 불필요한 request와 connection을 생성

  • Long Polling
    Polling의 단점을 최소화 하기 위해 서버에서 조금 더 대기해서 이벤트를 받는다, 서버에 요청 보내고 이벤트가 생겨 응답 받을 때 까지 연결이 종료되지 않는다

  • Streaming
    서버에 요청을 보내고 끊기지 않은 연결상태에서 끊임없이 데이터 수신, 클라이언트에서 서버로의 데이터 송신이 어렵다

출처 : 이란


🤔브라우저 호환도 되는가?

💡사진으로 설명할 수 있다.

출처 : 이곳


📋마무리

오랜만의 포스팅이다.

좀 더 열심히 해서 예쁘게 채워보도록 하자.

다음에는 NaverChatbot 을 포스팅 해보겠다.

profile
게으른 개발자의 기록

0개의 댓글