Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20240805 웹소켓(WebSocket) 본문

개발Article

[TIL]20240805 웹소켓(WebSocket)

최밤빵 2024. 8. 5. 22:43

일단 맡고있던 CRUD를 끝내고, 웹소켓을 위해 여러가지를 알아보았다. 저런 실시간느낌의 알림? 같은건 다른것도 있었는데 그건 나중에 다른 개발일지에 정리하기로하고, 오늘은 웹소켓에 대해 정리한 내용을 개발일지로 기록하기..! 

웹소켓(WebSocket)은 클라이언트와 서버 간의 양방향 통신을 가능하게 하는 프로토콜로, 실시간 웹 애플리케이션 개발에 필수적인 기술 중 하나이다. 전통적인 HTTP 요청-응답 방식과 달리, 웹소켓은 지속적인 연결을 통해 실시간으로 데이터를 주고받을 수 있어, 채팅 애플리케이션, 실시간 알림 서비스, 주식 거래 시스템 등에서 매우 유용하게 사용된다. 오늘 개발일지에서는 웹소켓의 개념과 동작 원리, 주요 기능, 구현 방법, 그리고 사용 시 주의사항을 정리해봤다. 

🫨웹소켓(WebSocket)이란?

웹소켓(WebSocket)은 웹 표준 기술로, 클라이언트와 서버 간의 지속적인 연결을 유지하면서 실시간 양방향 통신을 가능하게 하는 프로토콜이다. 웹소켓을 통해 서버는 클라이언트로부터 받은 요청에 응답할 뿐만 아니라, 클라이언트가 요청을 보내지 않더라도 실시간으로 데이터를 푸시(Push)할 수 있다. 이는 HTTP 통신 방식과 가장 큰 차이점이다.

 

▶ 웹소켓의 주요 개념과 동작 원리

웹소켓의 주요 개념은 다음과 같다:

 

→ 양방향 통신:

웹소켓은 클라이언트와 서버 간의 양방향 통신을 지원한다. 서버는 클라이언트로부터 요청이 있을 때만 응답하는 것이 아니라, 클라이언트와의 연결이 유지되는 한 언제든지 데이터를 보낼 수 있다.

→ 지속적인 연결:

웹소켓은 한 번 연결이 이루어지면 클라이언트와 서버 간의 연결이 계속 유지된다. 이는 HTTP 프로토콜의 요청-응답 방식과 달리, 매번 새로 연결을 설정할 필요가 없으므로, 네트워크 자원을 절약하고 성능을 향상시킬 수 있다.

→ 효율성:

웹소켓은 지속적인 연결을 통해 데이터를 전송하기 때문에, HTTP 프로토콜에 비해 네트워크 오버헤드가 적고, 더 빠른 데이터 전송이 가능하다. 특히, 실시간 애플리케이션에서는 이러한 효율성이 큰 장점으로 작용한다.

 

▶웹소켓의 주요 기능

웹소켓은 다양한 기능을 제공하여 실시간 애플리케이션을 개발하는 데 유용하다. 주요 기능은 다음과 같다:

 

→ 실시간 데이터 전송:

웹소켓은 실시간으로 데이터를 주고받을 수 있어, 주식 거래 시스템, 실시간 채팅 애플리케이션, 온라인 게임 등에서 활용된다.

→ 푸시 알림:

서버가 클라이언트에 데이터를 푸시할 수 있어, 클라이언트가 특정 이벤트를 실시간으로 받을 수 있다. 예를 들어, 메신저 애플리케이션에서 새로운 메시지가 도착했을 때 알림을 푸시할 수 있다.

→ 방(Room) 기능:

여러 클라이언트가 특정 방에 참여하여 메시지를 주고받는 구조를 지원한다. 이를 통해 채팅 애플리케이션에서 그룹 채팅 기능을 구현할 수 있다.

→ 확장성(Scalability):

웹소켓은 대규모 사용자를 지원할 수 있도록 확장 가능하다. 서버 측에서 여러 웹소켓 연결을 관리하고, 클러스터링을 통해 부하를 분산시킬 수 있다.

 

▶ 웹소켓의 기본적인 구현 예시

웹소켓을 구현하기 위해서는 클라이언트와 서버 양쪽에서 모두 웹소켓을 설정해야 한다. 아래는 Java Spring Boot 를 사용하여 웹소켓을 간단히 구현하는 예시이다. ( 클라이언트는 왕왕고수 진환님이 잘하실거니까..!)

▷서버 측 구현 (Spring Boot)

 
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import org.springframework.web.socket.handler.TextWebSocketHandler;

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new SimpleTextWebSocketHandler(), "/ws").setAllowedOrigins("*");
    }

    private static class SimpleTextWebSocketHandler extends TextWebSocketHandler {
        @Override
        protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
            String payload = message.getPayload();
            System.out.println("Received message: " + payload);
            session.sendMessage(new TextMessage("Echo: " + payload));  // 받은 메시지를 그대로 클라이언트에게 돌려보낸다.
        }
    }
}

→@EnableWebSocket: 웹소켓을 활성화하는 애너테이션이다.

→ WebSocketConfigurer 인터페이스를 구현하여, registerWebSocketHandlers 메서드에서 웹소켓 핸들러를 등록한다.

→ TextWebSocketHandler: 텍스트 기반의 메시지를 처리하는 간단한 핸들러를 정의한다.

→ handleTextMessage 메서드는 클라이언트로부터 메시지를 수신하고, 동일한 메시지를 다시 클라이언트에게 전송하는 역할을 한다.

 

▶웹소켓 사용 시 주의사항

웹소켓을 사용하기 전에 몇 가지 주의할 점이 있다:

 

→ 네트워크 상태에 대한 고려:

웹소켓은 네트워크 상태에 따라 연결이 끊어질 수 있다. 이를 방지하기 위해 재연결 로직을 구현하거나, 연결 상태를 지속적으로 모니터링해야 한다.

→ 보안 문제:

웹소켓은 민감한 데이터를 전송할 때 보안에 취약할 수 있다. SSL/TLS를 사용하여 보안을 강화하고, 적절한 인증 및 인가 메커니즘을 구현하는 것이 중요하다.

→ 서버 자원 관리:

많은 웹소켓 연결을 처리하려면 서버의 자원(메모리, CPU 등)을 적절히 관리해야 한다. 대규모 웹소켓 애플리케이션의 경우, 클러스터링 및 로드 밸런싱을 통한 확장성 확보가 필요하다.

 

▶정리

웹소켓은 실시간 양방향 통신을 가능하게 하는 강력한 도구로, 실시간 애플리케이션을 개발하는 데 매우 유용하다. 하지만 웹소켓을 처음 구현하는 나에게는 연결 관리, 보안 설정, 서버 자원 관리 등 여러 가지 어려움이 많아보인다. 특히, 다양한 예외 상황에 대비한 코드를 작성하는 것이 중요하다하는데, 작업하면서 틈틈히 공부해야될 것 같다. 예시 코드는 너무 간단해 보이는데, 이것도 어려운 기능 중 하나라고 들어서 지레 겁부터 먹었는데 그래도 어쩌겠어 해야지. 경험해 볼 수 있다는거에 좋게 생각하기로 했다...!