본문 바로가기

SpringBoot from Laravel

Spring Boot vs Laravel: 웹소켓(WebSocket) 실시간 데이터 처리 비교

반응형

 

실시간 데이터 처리는 채팅, 알림 시스템, 주식 가격 변동, IoT 데이터 스트리밍 등에서 중요한 역할을 합니다.

Laravel과 Spring Boot 모두 웹소켓(WebSocket)을 활용한 실시간 데이터 전송을 지원하지만, 구현 방식이 다릅니다.

 

이번 글에서는 Laravel과 Spring Boot에서 웹소켓을 활용하여 실시간 데이터를 처리하는 방법을 비교합니다.

 

1. WebSocket 개념 & Laravel vs Spring Boot 비교

2. Laravel에서 WebSocket 적용 (Pusher, Ratchet)

3. Spring Boot에서 WebSocket 적용 (STOMP, SockJS)

4. 성능 및 확장성 비교

1️⃣ WebSocket 개념 & Laravel vs Spring Boot 비교

 

📌 WebSocket이란?

HTTP는 요청(Request)이 있어야만 응답(Response)이 가능하지만, WebSocket은 양방향(Bi-Directional) 통신이 가능

클라이언트가 서버에 요청하지 않아도, 서버에서 클라이언트로 데이터를 보낼 수 있음 (Push 방식)

 

📌 Laravel vs Spring Boot 웹소켓 비교

비교 항목Laravel (PHP)Spring Boot (Java)

웹소켓 라이브러리 Pusher, Ratchet, Swoole Spring WebSocket (STOMP, SockJS)
서버 실행 방식 PHP 자체는 웹소켓 지원 X (Node.js 또는 Pusher 사용) 내장 지원 (Spring WebSocket)
실시간 데이터 전송 Pusher + Redis STOMP + SockJS
성능 PHP 자체는 멀티스레드 지원 X 멀티스레드 지원으로 성능 우수

Spring Boot는 기본적으로 웹소켓을 지원하지만, Laravel은 별도의 서비스(Pusher, Ratchet 등)를 사용해야 함.

2️⃣ Laravel에서 WebSocket 적용 (Pusher, Ratchet 활용)

 

Laravel은 기본적으로 웹소켓을 지원하지 않으며, Pusher 또는 Ratchet을 사용해야 합니다.

🔹 (1) Laravel + Pusher로 실시간 데이터 전송

 

(1) Pusher 패키지 설치

composer require pusher/pusher-php-server

(2) .env에 Pusher 설정 추가

PUSHER_APP_ID=your-app-id
PUSHER_APP_KEY=your-app-key
PUSHER_APP_SECRET=your-app-secret
PUSHER_APP_CLUSTER=mt1
BROADCAST_DRIVER=pusher

(3) config/broadcasting.php 설정 추가

'connections' => [
    'pusher' => [
        'driver' => 'pusher',
        'key' => env('PUSHER_APP_KEY'),
        'secret' => env('PUSHER_APP_SECRET'),
        'app_id' => env('PUSHER_APP_ID'),
        'options' => [
            'cluster' => env('PUSHER_APP_CLUSTER'),
            'useTLS' => true,
        ],
    ],
],

(4) Laravel 이벤트 & 브로드캐스트 구현

use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class MessageSent implements ShouldBroadcast {
    use InteractsWithSockets;

    public $message;

    public function __construct($message) {
        $this->message = $message;
    }

    public function broadcastOn() {
        return ['chat-channel'];
    }
}

Laravel에서는 Pusher를 활용하여 실시간 데이터를 전달하지만, PHP 자체적으로 웹소켓을 실행할 수는 없음.

🔹 (2) Laravel + Ratchet으로 웹소켓 직접 구현

 

Laravel에서 Ratchet을 사용하면 웹소켓 서버를 직접 실행할 수 있습니다.

 

(1) Ratchet 패키지 설치

composer require cboden/ratchet

(2) WebSocket 서버 구현 (WebSocketServer.php)

use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;

class WebSocketServer implements MessageComponentInterface {
    protected $clients;

    public function __construct() {
        $this->clients = new \SplObjectStorage;
    }

    public function onOpen(ConnectionInterface $conn) {
        $this->clients->attach($conn);
    }

    public function onMessage(ConnectionInterface $from, $msg) {
        foreach ($this->clients as $client) {
            if ($from !== $client) {
                $client->send($msg);
            }
        }
    }

    public function onClose(ConnectionInterface $conn) {
        $this->clients->detach($conn);
    }

    public function onError(ConnectionInterface $conn, \Exception $e) {
        $conn->close();
    }
}

(3) WebSocket 서버 실행

php artisan websockets:serve

Laravel + Ratchet을 사용하면 웹소켓을 직접 구현할 수 있지만, 성능과 확장성에서 Node.js나 Spring Boot보다 떨어짐.

3️⃣ Spring Boot에서 WebSocket 적용 (STOMP + SockJS 활용)

 

Spring Boot는 내장된 WebSocket 기능을 제공하며, 별도의 서비스 없이 STOMP 또는 SockJS를 사용하여 웹소켓을 구현할 수 있습니다.

🔹 (1) Spring Boot WebSocket 설정 (pom.xml)

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

🔹 (2) WebSocket 설정 (WebSocketConfig.java)

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").setAllowedOrigins("*").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic");
        registry.setApplicationDestinationPrefixes("/app");
    }
}

🔹 (3) 메시지 컨트롤러 (MessageController.java)

import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;

@Controller
public class MessageController {

    @MessageMapping("/chat")
    @SendTo("/topic/messages")
    public String sendMessage(String message) {
        return message;
    }
}

Spring Boot에서는 @EnableWebSocketMessageBroker를 사용하여 내장된 웹소켓 서버를 쉽게 실행할 수 있음.

4️⃣ 성능 및 확장성 비교

비교 항목 Laravel (PHP) Spring Boot (Java)
웹소켓 기본 지원 여부 ❌ 직접 지원 X (Pusher, Ratchet 필요) ✅ 내장 지원 (STOMP, SockJS)
성능 PHP는 싱글스레드라 성능이 낮음 Java는 멀티스레드 지원으로 성능 우수
확장성 Pusher, Redis를 통해 확장 가능 기본적으로 확장성 높음
사용자 수 증가 대응 Node.js 연동 필요 Spring Boot 자체적으로 처리 가능

Spring Boot는 웹소켓을 기본 지원하며 성능과 확장성이 우수하지만, Laravel은 Pusher, Ratchet 같은 외부 서비스를 사용해야 함.

📌 결론: Spring Boot vs Laravel WebSocket 비교 정리

 

Laravel

웹소켓 직접 지원 X → Pusher 또는 Ratchet 사용 필요

PHP는 싱글스레드라 성능이 낮음

실시간 채팅, 알림 구현 가능하지만, 확장성 한계 존재

 

Spring Boot

웹소켓 기본 지원 (@EnableWebSocketMessageBroker)

멀티스레드 기반으로 성능 우수 & 확장성 뛰어남

실시간 데이터 처리가 더 쉽고 빠름

 

📌 결론: Spring Boot는 웹소켓을 기본 지원하며 확장성이 뛰어나지만, Laravel은 외부 서비스(Pusher, Ratchet)를 사용해야 함. 

 

🔥 다음 글에서는 “Spring Boot vs Laravel: CI/CD(자동 배포) 구축 비교”를 다룰 예정! 😊

반응형