[java] 자바 웹소켓과 마이크로서비스 아키텍처의 결합

마이크로서비스 아키텍처를 구현하는 동안 실시간 통신을 위한 웹소켓을 적용해야 하는 경우가 많습니다. 웹소켓은 양방향 통신을 가능케 하는 프로토콜로, 서버와 클라이언트 간 지속적인 연결을 제공합니다. 이번 블로그에서는 자바 기반의 마이크로서비스 아키텍처와 웹소켓을 결합하는 방법을 살펴보겠습니다.

웹소켓 기능 추가하기

이미 구현된 마이크로서비스에 웹소켓을 추가하기 위해서는 먼저 웹소켓 서버를 구현해야 합니다. 자바에서는 Spring을 이용하여 쉽게 웹소켓을 구현할 수 있습니다. 다음은 간단한 웹소켓 서버를 구현하는 예시입니다.

import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean;
import org.springframework.context.annotation.Bean;
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;

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new MyWebSocketHandler(), "/my-websocket-endpoint").setAllowedOrigins("*");
    }
  
    @Bean
    public ServletServerContainerFactoryBean createWebSocketContainer() {
        ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
        container.setMaxTextMessageBufferSize(8192);
        container.setMaxBinaryMessageBufferSize(8192);
        return container;
    }
}

위의 코드에서 MyWebSocketHandler는 웹소켓 요청을 처리하는 핸들러 클래스입니다. registerWebSocketHandlers 메서드는 해당 핸들러를 /my-websocket-endpoint 경로에 매핑하고, createWebSocketContainer는 웹소켓 컨테이너를 생성합니다.

마이크로서비스와의 통합

웹소켓 서버를 구현했다면, 마이크로서비스와 웹소켓을 통합할 차례입니다. 마이크로서비스에서는 이벤트가 발생했을 때 해당 이벤트를 웹소켓으로 전달하는 방식으로 통합할 수 있습니다. Spring Cloud Stream을 사용하여 메시지 브로커와 연동하고, 그 메시지를 구독하여 웹소켓으로 발송하는 것이 일반적인 방법입니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.stereotype.Service;

@Service
public class EventPublisherService {
    @Autowired
    private Source source;

    public void publishEvent(String eventData) {
        Message<String> message = MessageBuilder.withPayload(eventData).build();
        source.output().send(message);
    }
}

위의 코드는 Spring Cloud Stream을 이용한 이벤트 발행 예시입니다. EventPublisherService에서는 Source를 주입받아 이벤트 데이터를 메시지로 변환하고, 해당 메시지를 송출합니다.

결론

이렇게 웹소켓을 마이크로서비스 아키텍처에 통합함으로써, 실시간 통신이 가능한 확장성 있는 시스템을 구축할 수 있습니다. 자바 언어와 Spring 프레임워크에서 제공하는 다양한 기술을 활용하여 현대적이고 유연한 시스템을 구현할 수 있습니다.

많은 기업들이 이러한 현대적인 아키텍처로의 전환 및 유지보수에 관심을 가지고 있으며, 관련 기술들에 대한 깊은 이해와 연구가 요구되고 있습니다. 이러한 기술들을 함께 공부하고 연구하여 보다 효율적이고 안정적인 시스템을 개발하는 것이 중요합니다.

References