Home > Network > 2024 > 🌐[Network] STOMP(Simple/Streaming Text Messaging Protocol)λž€ λ¬΄μ—‡μΌκΉŒμš”?

🌐[Network] STOMP(Simple/Streaming Text Messaging Protocol)λž€ λ¬΄μ—‡μΌκΉŒμš”?
Network

🌐[Network] STOMP(Simple/Streaming Text Messaging Protocol)λž€ λ¬΄μ—‡μΌκΉŒμš”?

  • STOMP(Simple/Streaming Text Messaging Protocol)λŠ” ν…μŠ€νŠΈ 기반의 λ©”μ‹œμ§• ν”„λ‘œν† μ½œλ‘œ, ν΄λΌμ΄μ–ΈνŠΈμ™€ λ©”μ‹œμ§• 브둜컀(Message Broker) κ°„μ˜ 톡신을 μ§€μ›ν•˜κΈ° μœ„ν•΄ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
    • 일반적으둜 WebSocketκ³Ό ν•¨κ»˜ μ‚¬μš©λ˜λ©°, Pub/Sub νŒ¨ν„΄μ˜ λ©”μ‹œμ§•μ„ 더 μ‰½κ²Œ κ΅¬ν˜„ν•  수 있게 λ„μ™€μ€λ‹ˆλ‹€.

1️⃣ STOMP의 μ£Όμš” νŠΉμ§•.

1️⃣ κ°„λ‹¨ν•œ λ©”μ‹œμ§• ν”„λ‘œν† μ½œ.

  • STOMPλŠ” κ°„λ‹¨ν•œ λ©”μ‹œμ§€ ν”„λ ˆμž„ ꡬ쑰λ₯Ό κ°€μ§€κ³  μžˆμ–΄ μ΄ν•΄ν•˜κ³  κ΅¬ν˜„ν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€.
  • λ©”μ‹œμ§€ ν”„λ ˆμž„μ€ λͺ…ν™•ν•œ 헀더와 λ³Έλ¬Έ(Body)으둜 κ΅¬μ„±λ©λ‹ˆλ‹€.

2️⃣ WebSocket μƒμœ„ λ ˆμ΄μ–΄ ν”„λ‘œν† μ½œ.

  • STOMPλŠ” WebSocket을 기반으둜 λ™μž‘ν•˜μ§€λ§Œ, WebSocket의 λ‹¨μˆœν•œ 톡신 방식에 Pub/Sub(λ°œν–‰/ꡬ독) κΈ°λŠ₯을 μΆ”κ°€ν•˜μ—¬ λ©”μ‹œμ§• μ‹œμŠ€ν…œμ„ κ΅¬ν˜„ν•©λ‹ˆλ‹€.
  • WebSocket은 λ‹¨μˆœνžˆ μ–‘λ°©ν–₯ μ—°κ²°λ§Œ μ§€μ›ν•˜μ§€λ§Œ, STOMPλ₯Ό 톡해 더 λ³΅μž‘ν•œ λ©”μ‹œμ§€ 전달 νŒ¨ν„΄μ„ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3️⃣ μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ κ°„μ˜ λ©”μ‹œμ§•.

  • STOMPλŠ” μ„œλ²„-ν΄λΌμ΄μ–ΈνŠΈ λ˜λŠ” ν΄λΌμ΄μ–ΈνŠΈ-ν΄λΌμ΄μ–ΈνŠΈ κ°„μ˜ λ©”μ‹œμ§€λ₯Ό 전솑할 수 μžˆλ„λ‘ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  • 주둜 λ©”μ‹œμ§€ 브둜컀(예: ActiveMQ, RabbitMQ)와 ν•¨κ»˜ μ‚¬μš©λ©λ‹ˆλ‹€.

4️⃣ Pub/Sub νŒ¨ν„΄ 지원.

  • ν΄λΌμ΄μ–ΈνŠΈλŠ” νŠΉμ • 주제(Topic) λ˜λŠ” 큐(Queue)λ₯Ό ꡬ독(Subscribe)ν•˜μ—¬, ν•΄λ‹Ή μ£Όμ œμ— λ°œν–‰λœ λ©”μ‹œμ§€λ₯Ό 받을 수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ STOMP ν”„λ ˆμž„ ꡬ쑰.

  • STOMP λ©”μ‹œμ§€ ν”„λ ˆμž„μ€ λ‹€μŒκ³Ό 같은 ꡬ쑰둜 λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

μš”μ†Œ ꡬ성.

1️⃣ λͺ…λ Ή(command)

  • ν”„λ ˆμž„μ˜ λͺ©μ μ„ μ •μ˜ν•©λ‹ˆλ‹€.(예: CONNECT, SEND, SUBSCRIBE, UNSUBSCRIBE)

2️⃣ 헀더(headers)

  • ν”„λ ˆμž„κ³Ό κ΄€λ ¨λœ μΆ”κ°€ 정보λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.(예: λͺ©μ μ§€, μ½˜ν…μΈ  νƒ€μž… λ“±)

3️⃣ λ³Έλ¬Έ(body)

  • λ©”μ‹œμ§€ λ‚΄μš©(선택 사항)

예제

  • μ•„λž˜λŠ” λ©”μ‹œμ§€ 전솑(SEND) ν”„λ ˆμž„ μ˜ˆμ œμž…λ‹ˆλ‹€.
    ```hash
    SEND
    destination:/queue/test
    content-type:text/plain

Hello, STOMP!

- **λͺ…λ Ή :** SEND
- **헀더 :** destination:/queue/test, content-type:text/plain
- **λ³Έλ¬Έ :** Hello, STOMP!

## 3️⃣ Springμ—μ„œ STOMP μ‚¬μš© 예제.
- Spring BootλŠ” **STOMP**와 **WebSocket**을 κ²°ν•©ν•˜μ—¬ λ©”μ‹œμ§•μ„ κ΅¬ν˜„ν•  수 μžˆλ„λ‘ κΈ°λΆ„ 지원을 μ œκ³΅ν•©λ‹ˆλ‹€.

### 1️⃣ STOMP μ˜μ‘΄μ„± μΆ”κ°€.
- build.gradle λ˜λŠ” pom.xml에 λ‹€μŒ μ˜μ‘΄μ„±μ„ μΆ”κ°€ν•©λ‹ˆλ‹€.

```groovy
implementation 'org.springframework.boot:spring-boot-starter-websocket'

2️⃣ WebSocket μ„€μ •.

  • STOMP μ—”λ“œν¬μΈνŠΈμ™€ λ©”μ‹œμ§€ 브둜컀λ₯Ό μ„€μ •ν•˜λŠ” @Configuration 클래슀λ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.
    ```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.WebSocketMessageBrokerConfigurer;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
    config.enableSimpleBroker("/topic"); // ν΄λΌμ΄μ–ΈνŠΈ ꡬ독 μ£Όμ†Œ
    config.setApplicationDestinationPrefixes("/app"); // ν΄λΌμ΄μ–ΈνŠΈ λ°œν–‰ μ£Όμ†Œ
}

@Override
public void registerStompEndpoints(org.springframework.web.socket.config.annotation.StompEndpointRegistry registry) {
    registry.addEndpoint("/ws") // WebSocket μ—”λ“œν¬μΈνŠΈ
            .setAllowedOrigins("*") // CORS ν—ˆμš©
            .withSockJS(); // SockJS 지원
} } ```

3️⃣ 컨트둀러

  • STOMP λ©”μ‹œμ§€λ₯Ό μ²˜λ¦¬ν•  컨트둀러λ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.
    ```java
    import org.springframework.messaging.handler.annotation.MessageMapping;
    import org.springframework.messaging.handler.annotation.SendTo;
    import org.springframework.stereotype.Controller;

@Controller
public class ChatController {

@MessageMapping("/sendMessage") // ν΄λΌμ΄μ–ΈνŠΈκ°€ λ©”μ‹œμ§€ λ°œν–‰ν•  경둜
@SendTo("/topic/messages") // κ΅¬λ…λœ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 보낼 경둜
public String sendMessage(String message) {
    return "μ„œλ²„ 응닡: " + message;
} } ```

4️⃣ ν΄λΌλ¦¬μ–ΈνŠΈ JavaScript

  • JavaScriptλ₯Ό μ‚¬μš©ν•˜μ—¬ STOMP λ©”μ‹œμ§€λ₯Ό μ „μ†‘ν•˜κ³  μˆ˜μ‹ ν•©λ‹ˆλ‹€.
    ```javascript
    const socket = new SockJS(β€˜/ws’); // μ„œλ²„ WebSocket μ—”λ“œν¬μΈνŠΈ
    const stompClient = Stomp.over(socket);

stompClient.connect({}, () => {
console.log(β€˜WebSocket 연결됨’);

// λ©”μ‹œμ§€ ꡬ독
stompClient.subscribe('/topic/messages', (message) => {
    console.log('μˆ˜μ‹ ν•œ λ©”μ‹œμ§€:', message.body);
});

// λ©”μ‹œμ§€ λ°œν–‰
stompClient.send('/app/sendMessage', {}, 'Hello from client!'); }); ```

4️⃣ κ²°λ‘ .

  • STOMPλŠ” WebSocket을 λ³΄μ™„ν•˜μ—¬ 효율적으둜 λ©”μ‹œμ§€λ₯Ό λ°œν–‰ν•˜κ³  κ΅¬λ…ν•˜λŠ” 데 도움을 μ£ΌλŠ” κ³ μˆ˜μ€€ ν”„λ‘œν† μ½œμž…λ‹ˆλ‹€.
  • Spring Bootμ—μ„œ 기본적으둜 μ§€μ›ν•˜λ―€λ‘œ, μ‰½κ²Œ μ‹€μ‹œκ°„ κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.