Skip to content

Latest commit

 

History

History
239 lines (181 loc) · 9.65 KB

File metadata and controls

239 lines (181 loc) · 9.65 KB

Chapter 06 자바스크립트 및 프레임워크 통합

06-2 Java 백엔드와 웹 소켓 연동

개요

Java 백엔드 환경에서 웹 소켓을 구현하고 클라이언트와 연동하는 방법에 대해 알아봅니다. Spring 프레임워크의 웹 소켓 지원 기능, STOMP 메시징 구현 방법, 보안 및 인증 처리 방식, 그리고 확장성 있는 아키텍처 설계에 대해 살펴봅니다. 이를 통해 Java 기반 실시간 애플리케이션의 백엔드 구현 방법을 이해할 수 있습니다.

Spring WebSocket 지원

Spring 프레임워크는 웹 소켓 구현을 위한 다양한 기능을 제공합니다.

기본 구성 요소

graph TD
    A[Spring WebSocket] --> B[WebSocketHandler]
    A --> C[WebSocketConfigurer]
    A --> D[SockJS]
    A --> E[STOMP 지원]
    
    style A fill:#daa520,stroke:#333,stroke-width:2px
Loading

Spring의 웹 소켓 지원은 다음과 같은 주요 구성 요소로 이루어져 있습니다:

  1. WebSocketHandler: 웹 소켓 연결 및 메시지 처리를 담당하는 인터페이스
  2. WebSocketConfigurer: 웹 소켓 엔드포인트 및 핸들러 등록을 위한 구성 인터페이스
  3. SockJS: 웹 소켓을 지원하지 않는 브라우저를 위한 폴백 옵션
  4. STOMP 지원: 메시지 브로커 기반의 통신을 위한 STOMP 프로토콜 지원

기본 설정 흐름

flowchart TD
    A[의존성 추가] -->|spring-websocket, spring-messaging| B[WebSocket 구성 클래스 생성]
    B -->|@EnableWebSocketMessageBroker| C[메시지 브로커 설정]
    C --> D[엔드포인트 등록]
    D --> E[메시지 핸들러 구현]
    
    style A fill:#3cb371,stroke:#333,stroke-width:2px
    style E fill:#3cb371,stroke:#333,stroke-width:2px
Loading

Spring에서 웹 소켓을 설정하는 기본적인 흐름은 다음과 같습니다:

  1. 필요한 의존성 추가 (spring-websocket, spring-messaging)
  2. @EnableWebSocketMessageBroker 어노테이션을 사용한 구성 클래스 생성
  3. 메시지 브로커 및 애플리케이션 목적지 접두사 설정
  4. 웹 소켓 엔드포인트 등록
  5. 메시지 핸들러 메서드 구현

STOMP 메시징 구현

STOMP(Simple Text Oriented Messaging Protocol)는 Spring에서 웹 소켓 기반 메시징을 구현할 때 널리 사용되는 프로토콜입니다.

STOMP 아키텍처

graph TD
    A[클라이언트] -->|CONNECT| B[STOMP 브로커]
    A -->|SUBSCRIBE| B
    A -->|SEND| B
    B -->|MESSAGE| A
    
    style A fill:#c35b5b,stroke:#333,stroke-width:2px
    style B fill:#3cb371,stroke:#333,stroke-width:2px
Loading

메시지 흐름

sequenceDiagram
    participant Client
    participant Controller
    participant Broker
    participant Service
    
    Client->>Controller: SEND /app/message
    Controller->>Service: 메시지 처리
    Service->>Broker: 결과 전송
    Broker->>Client: MESSAGE /topic/messages
Loading

Spring에서 STOMP를 사용한 메시지 처리 흐름:

  1. 클라이언트가 /app 접두사로 시작하는 목적지로 메시지 전송
  2. 해당 메시지는 @MessageMapping 어노테이션이 지정된 컨트롤러 메서드로 라우팅
  3. 컨트롤러에서 메시지 처리 후 결과를 브로커에 전송
  4. 브로커는 해당 토픽을 구독 중인 모든 클라이언트에게 메시지 전달

주요 구성 요소

graph TD
    A[WebSocketMessageBrokerConfigurer] --> B[configureMessageBroker]
    A --> C[registerStompEndpoints]
    D[MessageMapping] --> E[Controller 메서드]
    F[SendTo/SendToUser] --> E
    
    style A fill:#daa520,stroke:#333,stroke-width:2px
    style D fill:#daa520,stroke:#333,stroke-width:2px
Loading

STOMP 메시징 구현의 주요 구성 요소:

  1. WebSocketMessageBrokerConfigurer: STOMP 메시징 구성을 위한 인터페이스
  2. configureMessageBroker(): 메시지 브로커 설정 메서드
  3. registerStompEndpoints(): STOMP 엔드포인트 등록 메서드
  4. @MessageMapping: 특정 목적지로 전송된 메시지를 처리할 메서드 지정
  5. @SendTo/@SendToUser: 처리 결과를 전송할 목적지 지정

보안 및 인증 처리

웹 소켓 연결에 대한 보안 및 인증은 실시간 애플리케이션에서 중요한 부분입니다.

인증 흐름

sequenceDiagram
    participant Client
    participant AuthInterceptor
    participant WebSocketHandler
    
    Client->>AuthInterceptor: 연결 요청 + 인증 토큰
    AuthInterceptor->>AuthInterceptor: 토큰 검증
    alt 유효한 토큰
        AuthInterceptor->>WebSocketHandler: 연결 허용
        WebSocketHandler->>Client: 연결 성공
    else 유효하지 않은 토큰
        AuthInterceptor->>Client: 연결 거부
    end
Loading

보안 구현 방식

graph TD
    A[Spring Security] --> B[ChannelInterceptor]
    B --> C[인증 토큰 검증]
    A --> D[메시지 권한 검사]
    D --> E[목적지 기반 접근 제어]
    
    style A fill:#daa520,stroke:#333,stroke-width:2px
Loading

Spring에서 웹 소켓 보안을 구현하는 주요 방식:

  1. ChannelInterceptor: 메시지 채널에 인터셉터를 등록하여 메시지 전송 전/후에 보안 검사 수행
  2. 인증 토큰 활용: HTTP 헤더나 쿼리 파라미터를 통해 전달된 토큰으로 사용자 인증
  3. Spring Security 통합: Spring Security와 통합하여 일관된 보안 정책 적용
  4. 목적지 기반 접근 제어: 특정 목적지에 대한 접근 권한 제어

확장성 있는 아키텍처 설계

대규모 실시간 애플리케이션을 위한 확장성 있는 아키텍처 설계 방법을 알아봅니다.

메시지 브로커 확장

graph TD
    A[Spring 애플리케이션] --> B[내장 브로커]
    A --> C[외부 브로커]
    C --> D[RabbitMQ]
    C --> E[ActiveMQ]
    C --> F[Kafka]
    
    style A fill:#3cb371,stroke:#333,stroke-width:2px
    style C fill:#daa520,stroke:#333,stroke-width:2px
Loading

Spring은 내장 메시지 브로커와 외부 메시지 브로커를 모두 지원합니다:

  1. 내장 브로커: 간단한 애플리케이션에 적합, 별도 설치 불필요
  2. 외부 브로커: 대규모 애플리케이션에 적합, 고가용성 및 부하 분산 지원
    • RabbitMQ, ActiveMQ, Kafka 등과 통합 가능

수평적 확장 아키텍처

graph TD
    A[로드 밸런서] --> B[인스턴스 1]
    A --> C[인스턴스 2]
    A --> D[인스턴스 3]
    B --> E[메시지 브로커]
    C --> E
    D --> E
    E --> F[데이터베이스]
    
    style A fill:#c35b5b,stroke:#333,stroke-width:2px
    style E fill:#daa520,stroke:#333,stroke-width:2px
Loading

확장성 있는 웹 소켓 아키텍처의 주요 구성 요소:

  1. 로드 밸런서: 클라이언트 연결을 여러 서버 인스턴스에 분산
  2. 세션 어피니티: 동일한 클라이언트의 요청을 동일한 서버로 라우팅
  3. 중앙 집중식 메시지 브로커: 모든 서버 인스턴스 간 메시지 공유
  4. 상태 공유 최소화: 서버 인스턴스 간 상태 공유를 최소화하여 확장성 향상

5가지 키워드로 정리하는 핵심 포인트

  1. Spring WebSocket: Spring 프레임워크는 웹 소켓 구현을 위한 포괄적인 지원을 제공하며, WebSocketHandler와 SockJS 등의 구성 요소를 통해 다양한 환경에서 실시간 통신을 구현할 수 있습니다.
  2. STOMP 메시징: STOMP 프로토콜을 활용하면 발행/구독 패턴 기반의 메시징 시스템을 쉽게 구현할 수 있으며, 메시지 라우팅과 처리를 위한 직관적인 API를 제공합니다.
  3. 보안 인터셉터: ChannelInterceptor를 활용한 메시지 채널 인터셉션을 통해 웹 소켓 연결 및 메시지에 대한 인증과 권한 검사를 구현할 수 있습니다.
  4. 외부 메시지 브로커: RabbitMQ, ActiveMQ, Kafka 등의 외부 메시지 브로커를 활용하면 대규모 트래픽을 처리할 수 있는 고가용성 메시징 시스템을 구축할 수 있습니다.
  5. 수평적 확장: 상태 공유를 최소화하고 중앙 집중식 메시지 브로커를 활용하는 아키텍처를 통해 웹 소켓 애플리케이션을 수평적으로 확장할 수 있습니다.

확인 문제

  1. Spring에서 웹 소켓 지원을 활성화하기 위해 사용하는 어노테이션은?

    • @EnableWebSocket
    • @EnableWebSocketMessageBroker
    • @ConfigureWebSocket
    • @WebSocketConfig
  2. STOMP 메시징에서 클라이언트로부터 받은 메시지를 처리하기 위해 컨트롤러 메서드에 사용하는 어노테이션은?

    • @SocketMapping
    • @StompMapping
    • @MessageMapping
    • @SubscribeMapping
  3. Spring WebSocket 애플리케이션에서 보안을 구현하는 방법으로 올바른 것은? (복수 응답)

    • ChannelInterceptor를 사용한 메시지 인터셉션
    • HTTP 세션을 웹 소켓 연결과 연동
    • 목적지 기반 접근 제어 구현
    • WebSocket 프로토콜 자체의 암호화 기능 활용
    • Spring Security와의 통합
  4. 대규모 웹 소켓 애플리케이션에서 확장성을 위해 사용할 수 있는 외부 메시지 브로커는?

    • Spring 내장 브로커
    • WebSocket 내장 브로커
    • RabbitMQ
    • WebSocketHandler
  5. 수평적으로 확장 가능한 웹 소켓 아키텍처의 특징으로 올바르지 않은 것은?

    • 로드 밸런서를 통한 연결 분산
    • 중앙 집중식 메시지 브로커 사용
    • 서버 인스턴스 간 상태 공유 최소화
    • 단일 서버에 모든 연결 집중

정답 및 해설 보기