스프링 부트 애플리케이션에서 실시간 알림 기능 구현하는 방법

스프링 부트 애플리케이션에서 실시간 알림 기능 구현하는 방법
SeedividendPosted On Dec 6, 20245 min read

현재 알림은 많은 현대 애플리케이션에서 중요한 기능으로, 사용자 참여를 향상시키고 응답성을 향상시킵니다. 강력한 생태계를 갖춘 Spring Boot은 실시간 알림을 구현하는 것을 간단하고 효율적으로 만듭니다.

이 블로그에서는 Spring Boot와 WebSocket을 사용하여 실시간 알림 시스템을 구축하는 방법을 살펴보겠습니다.

실시간 알림이란 무엇인가요?

실시간 알림을 통해 애플리케이션은 사용자에게 즉시 업데이트를 푸시할 수 있습니다. 이렇게 하면 사용자가 페이지를 새로 고칠 필요가 없거나 업데이트를 확인하기 위해 반복적으로 요청을 보내지 않아도 됩니다.

전형적인 사용 사례는 다음과 같습니다:

  • 채팅 애플리케이션 (예: Slack, WhatsApp)
  • 주식 시장 업데이트
  • 대시보드 시스템 안의 알림

스프링 부트에서 실시간 알림: 완전 가이드

디지털 시대에 있어서 실시간 알림은 많은 현대 애플리케이션에 대한 중요한 기능으로, 사용자 참여를 높이고 응답성을 향상시킵니다. 강력한 생태계를 갖춘 Spring Boot은 실시간 알림을 구현하는 것을 간편하고 효율적으로 만들어줍니다.

이 블로그에서는 Spring Boot와 WebSocket을 사용하여 실시간 알림 시스템을 구축하는 방법에 대해 살펴보겠습니다.

실시간 알림이란?

실시간 알림은 애플리케이션이 사용자에게 업데이트를 즉시 전달할 수 있는 기능을 의미합니다. 이를 통해 사용자는 페이지를 새로 고치거나 업데이트를 확인하기 위해 반복적인 요청을 보낼 필요가 없어집니다.

전형적인 사용 사례는 다음과 같습니다:

  • 채팅 애플리케이션(예: Slack, WhatsApp)
  • 주식 시장 업데이트
  • 대시보드 시스템의 알림

실시간 통지에 WebSocket을 사용하는 이유

WebSocket은 실시간 시나리오에 적합한 전 이중 통신 채널을 제공하여 단일 TCP 연결을 통해 작동합니다. 요청-응답 주기에 의존하는 HTTP와 달리 WebSocket은 지속적인 연결을 유지하여 서버가 즉시 업데이트를 보낼 수 있게 합니다.

단계별 구현 방법

1. 스프링 부트 애플리케이션 설정

다음 종속성을 포함하여 스프링 부트 애플리케이션을 생성해보세요:

  • Spring Web
  • WebSocket
  • Spring Boot DevTools (핫 리로딩을 위한 선택 사항)

Maven의 pom.xml에 종속성을 추가해주세요:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>
</dependencies>

2. WebSocket 구성

연결을 설정하기 위해 WebSocket 구성 클래스를 생성하세요.

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 NotificationHandler(), "/notifications").setAllowedOrigins("*");
    }
}

3. WebSocket 핸들러 생성

WebSocket 연결을 관리하는 핸들러를 정의하세요.

import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

public class NotificationHandler extends TextWebSocketHandler {
    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        // 실시간 알림 모의
        session.sendMessage(new TextMessage("안녕하세요, 새로운 알림이 있습니다!"));
    }
}

4. 알림 트리거 시뮬레이션

알림을 시뮬레이션하기 위해, 알림을 트리거하는 REST API 엔드포인트를 생성합니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class NotificationController {
    private final List<WebSocketSession> sessions;

    @Autowired
    public NotificationController(List<WebSocketSession> sessions) {
        this.sessions = sessions;
    }

    @GetMapping("/send-notification")
    public String sendNotification() {
        sessions.forEach(session -> {
            try {
                session.sendMessage(new TextMessage("New update received!"));
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
        return "Notification sent!";
    }
}

알림을 받으려면 클라이언트가 WebSocket 연결을 설정해야 합니다.

<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Notification</title>
</head>
<body>
    <h1>실시간 알림</h1>
    <div id="notifications"></div>

    <script>
        const socket = new WebSocket('ws://localhost:8080/notifications');
        socket.onmessage = function (event) {
            const div = document.getElementById("notifications");
            div.innerHTML += `<p>${event.data}</p>`;
        };
    </script>
</body>
</html>

시스템 테스트

  • Spring Boot 애플리케이션을 시작합니다.
  • 브라우저에서 클라이언트 측 HTML 파일을 엽니다.
  • /send-notification API를 사용하여 알림을 트리거합니다.

고급 기능 향상

  • 인증: 토큰이나 세션 기반 인증을 사용하여 WebSocket 연결을 안전하게 유지합니다.
  • 확장성: RabbitMQ나 Kafka와 같은 메시지 브로커를 사용하여 여러 서버에 알림을 브로드캐스트합니다.
  • 영속성: 알림을 데이터베이스에 저장하여 역사적으로 확인할 수 있도록 합니다.

결론

Spring Boot와 WebSocket을 활용하여 높은 응답성을 가진 실시간 알림 시스템을 구축할 수 있습니다. 이 접근 방식은 사용자가 즉각적인 업데이트를 받도록 보장하여 애플리케이션의 전반적인 경험을 향상시킵니다.