Springboot STOMP ํ๋กํ ์ฝ์ผ๋ก Web Socket ํต์ ํ๊ธฐ
1. ๋ฉ์์ง ํ(Message Queue)
2. STOMP ํ๋กํ ์ฝ
3. Springboot STOMP ํ๋กํ ์ฝ์ผ๋ก Web Socket ํต์ ํ๊ธฐ
1. ๋ฉ์์ง ํ(Message Queue)
๋ฉ์์ง ํ(Message Queue)๋ ๋น๋๊ธฐ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ ํต์ ์ ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
๋ฉ์์ง๋ฅผ ํ(Queue)์ ์์์ ์ผ๋ก ์ ์ฅํ์ฌ, FIFO(First-In-First-Out, ์ ์ ์ ์ถ)๋ก ๋์ํฉ๋๋ค.
์ด๋ฌํ ๋ฉ์์ง ํ๋ฅผ ์ฌ์ฉํ๋ RabbitMQ, Kafka์ ๊ฐ์ ๋ฉ์์ง ๋ธ๋ก์ปค(Message Broker)๊ฐ ์กด์ฌํฉ๋๋ค.
ํด๋น ํฌ์คํ ์์๋ RabbitMQ์ ๋ํด ๋ค๋ค๋ณด๊ฒ ์ต๋๋ค.
2. STOMP ํ๋กํ ์ฝ
STOMP(Simple Text Oriented Messaging Protocol)์ ๋ฉ์ธ์ง๋ฅผ ํจ์จ์ ์ผ๋ก ์ ๋ฌํ ๋ ์ฌ์ฉํ๋ ํ๋กํ ์ฝ์ ๋๋ค.
TCP์ WebSocket ๊ฐ์ ์๋ฐฉํฅ ํต์ ํ๋กํ ์ฝ์ ๊ธฐ๋ฐ์ผ๋ก ๋์ํฉ๋๋ค.
3. Springboot STOMP ํ๋กํ ์ฝ์ผ๋ก Web Socket ํต์ ํ๊ธฐ
Springboot์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด์ฅ SimpleBroker๊ฐ ์กด์ฌํฉ๋๋ค. STOMP ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ๋ด์ฅ SimpleBroker์ ํต์ ํด๋ณด๊ณ ์ ํฉ๋๋ค. RabbitMQ์ ๊ฐ์ ์ธ๋ถ ๋ฉ์์ง ๋ธ๋ก์ปค์ ์ฐ๋ํ ๋ ํต์ ์ ์ํด STOMP ํ๋กํ ์ฝ์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์, ์ด๋ฅผ ํ์ฉํ ํต์ ๋ฐฉ์์ ๋ํด ํ์ตํด๋ณด๊ฒ ์ต๋๋ค.
์ ์ฒด์ ์ธ ํต์ ๊ตฌํ์ ์ํด์๋ ์๋์ 6๊ฐ์ ํ์ผ์ด ํ์ํฉ๋๋ค.
WebSocketConfig.java, GreetingController.java, Greeting.java, HelloMessage.java, index.html, app.js
ํด๋น ํฌ์คํ ์์๋ 4๊ฐ์ javaํ์ผ์ ๋ํ ์ค๋ช ๋ง ๋ค๋ฃจ๊ฒ ์ต๋๋ค.
- WebSocketConfig.java
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/gs-guide-websocket");
}
}
configureMessageBroker๋ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ฒฝ๋ก๋ฅผ ์ค์
registerStompEndPoints๋ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์ ์ํ ์ ์๋ ์ถ์ ๊ตฌ ์ค์
1. configureMessageBroker ๋ฉ์๋ - 1๋ฒ ๋ฌธ์ฅ
/topic์ ๋ชจ๋ ๋ฉ์์ง๋ /topic ๊ฒฝ๋ก๋ฅผ ํตํด ์ ๋ฌ๋๋ค๋ ์๋ฏธ์ ๋๋ค.
/topic/greetings ์ด๋ผ๋ ๊ฒฝ๋ก๊ฐ ์์ผ๋ฉด ์ด ๊ฒฝ๋ก๋ฅผ ๊ตฌ๋ ํ ์ฌ๋๋ค์๊ฒ ๋ฉ์์ง๊ฐ ์ ๋ฌ๋ฉ๋๋ค.
2. configureMessageBroker ๋ฉ์๋ - 2๋ฒ ๋ฌธ์ฅ
/app์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ๋ /app/hello ๊ฐ์ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋ฒ๋ก ๊ฐ๋ ๋ฉ์์ง์ ์ถ๋ฐ ๊ฒฝ๋ก์ ๋๋ค.
3. registerStompEndPoints ๋ฉ์๋
ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์ฐ๊ฒฐํ๋ ค๋ฉด ์ฃผ์๊ฐ ํ์ํฉ๋๋ค.
ํด๋ผ์ด์ธํธ๋ http://[์๋ฒ์ฃผ์]/gs-guide-websocket ์ผ๋ก ์ฐ๊ฒฐ์ ์์ํ ์ ์์ต๋๋ค.
- GreetingController.java
@Controller
public class GreetingController {
@MessageMapping("/hello")
@SendTo("/topic/greetings")
public Greeting greeting(HelloMessage message) throws Exception {
Thread.sleep(1000);
return new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!");
}
}
1. @MessageMapping("/hello")
ํด๋ผ์ด์ธํธ๊ฐ /app/hello ๊ฒฝ๋ก๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ฉด ์ด ๋ฉ์๋๊ฐ ํธ์ถ๋ฉ๋๋ค.
2. @SendTo("/topic/greetings")
๋ฉ์๋๊ฐ ์คํ๋๋ฉด ์ฒ๋ฆฌ๋ ๊ฒฐ๊ณผ๊ฐ /topic/greetings ๊ฒฝ๋ก๋ก ์ ๋ฌ๋ฉ๋๋ค.
3. Thread.sleep(1000);
1์ด๋์ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ๋ ์ฝ๋์ ๋๋ค.
์๋ฒ๊ฐ ๊ณ์ฐ์ ํ๊ฑฐ๋ ์๋ต์ ์ ์ ์ง์ฐ์ํค๊ณ ์ถ์ ๊ฒฝ์ฐ์ ์ฌ์ฉํฉ๋๋ค.
4. return new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!");
message.getName()์ผ๋ก ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ ์ด๋ฆ์ ๊ฐ์ ธ์ต๋๋ค. ์ ์์ ์ธ HTML ์ฝ๋ ์ฝ์ ๋ฐฉ์ง๋ฅผ ์ํด HtmlUtils.htmlEscape๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ๋ฐํ๋ Greeting ๊ฐ์ฒด๋ /topic/greetings ๊ฒฝ๋ก๋ก ์ ๋ฌ๋ฉ๋๋ค.
- Greeting.java
public class Greeting {
private String content;
public Greeting() {
}
public Greeting(String content) {
this.content = content;
}
public String getContent() {
return content;
}
}
/topic/greetings ๊ฒฝ๋ก๋ก ์ ๋ฌ๋ Greeting ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ฝ๋์ ๋๋ค.
- HelloMessage.java
public class HelloMessage {
private String name;
public HelloMessage() {
}
public HelloMessage(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
ํด๋ผ์ด์ธํธ์์ html๋ก๋ถํฐ ์ ๋ ฅ์ ๋ฐ์์ฌ ์ฝ๋์ ๋๋ค.
์ฐธ๊ณ ์ฌ์ดํธ
[๊ฐ๋จ์ ๋ฆฌ] ๋ฉ์ธ์ง ํ(Message Queue)๋?
๊ฐ์๋ฉ์์ง ํ(Message Queue)๋ ๋ฉ์์ง๋ฅผ ์ก์ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ (Producer)๊ณผ ์ด๋ฅผ ์์ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ (Consumer) ๊ฐ์ ๋น๋๊ธฐ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ์์คํ ์ ๋๋ค. ๋ฉ์์ง ํ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ์์ง๋ฅผ
hahahoho5915.tistory.com
[์๋ฒ] ๋ฉ์ธ์ง ํ(Message Queue) ์ ์์๋ณด์
์๋ ํ์ธ์ ์ค๋์ ๋ฉ์ธ์ง ํ(Message Queue) ์ ๋ํด ์ ๋ฐ์ ์ธ ์ดํด์ ๋ํ์ ์ธ ์ข ๋ฅ์ ์์๋ณด๊ฒ ์ต๋๋ค.๋ฉ์ธ์ง ํ ๋ฅผ ๋ณธ๊ฒฉ์ ์ผ๋ก ์์๋ณด๊ธฐ ์ ์ ๋ฉ์ธ์ง ์งํฅ ๋ฏธ๋ค์จ์ด(MOM) ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
velog.io
[IT์ ๋ณด] ๋ฉ์์ง ํ(Message Queue, MQ) ๊ฐ๋
๋ฉ์์ง ํ(Message Queue, MQ)๋? ๋ฉ์์ง ํ(MessageQueue: MQ)๋ ํ๋ก์ธ์ค ๋๋ ํ๋ก๊ทธ๋จ ์ธ์คํด...
blog.naver.com
[RabbitMQ] ๊ธฐ์ด ๊ฐ๋
AMQP๋ฅผ ๊ตฌํํ ์คํ์์ค ๋ฉ์ธ์ง ๋ธ๋ก์ปค์ด๋ค.producers์์ consumers๋ก ๋ฉ์ธ์ง(์์ฒญ)๋ฅผ ์ ๋ฌํ ๋ ์ค๊ฐ์์ ๋ธ๋ก์ปค ์ญํ ์ ํ๋ค.์ฌ์ฉํ๋ ์ผ์ด์ค๋ ๋ค์๊ณผ ๊ฐ๋ค.์์ฒญ์ ๋ง์ ์ฌ์ฉ์์๊ฒ ์ ๋ฌํ ๋์์ฒญ
velog.io
[Architecture] ๋ฉ์์ง ํ์ ๋ฉ์์ง ๋ธ๋ก์ปค - MSA์ ํต์ฌ์์
๋ฉ์์ง ํ์ ์ ์์ MSA ์ํคํ ์ฒ์์ ๋ฉ์์ง ๋ธ๋ก์ปค๊ฐ ์ ํ์ํ์ง ์ค๋ช ํฉ๋๋ค.
velog.io
WebSocket์ Stomp
Websocket์ ๋ฉ์์ง ๋ฐฉ์๋ง ์ ์ ์ํ๋ค๋ฉด ์ข์ Server/Client ์์ผ ์๋ฒ๋ฅผ ์์ฑํ ์ ์๋ค.ํ์ง๋ง, ๋จ์ํ ํต์ ๊ตฌ์กฐ๋ก ์ธํด WebSocket๋ง์ ์ด์ฉํด ์์ผ์๋ฒ๋ฅผ ๊ตฌํํ๋ฉด ํด๋น ๋ฉ์ธ์ง๊ฐ ์ด๋ค ์์ฒญ์ธ์ง, ์ด
velog.io
Spring Websocket & STOMP
์ค๋ซ๋ง์ ์์ฑํ๋ ๊ธฐ์ ๋ธ๋ก๊ทธ ํฌ์คํ ์ ๋๋ค. ์ด ๊ธ์์๋ ์คํ๋ง ๋ถํธ ๊ธฐ๋ฐ์ ์น์์ผ ๋ฐ STOMP์ ๋ํด์ ์ค๋ช ํฉ๋๋ค. ์ด ๊ธ์ ์ฝ๊ธฐ ์ํด์๋ ๊ธฐ๋ณธ์ ์ธ HTTP ์ง์์ด ์์ด์ผ ํ๋ฉฐ, ์คํ๋ง ํ๋ ์์
brunch.co.kr
Getting Started | Using WebSocket to build an interactive web application
In Spring’s approach to working with STOMP messaging, STOMP messages can be routed to @Controller classes. For example, the GreetingController (from src/main/java/com/example/messagingstompwebsocket/GreetingController.java) is mapped to handle messages t
spring.io
๋ฌธ์ ๊ฐ ์์ผ๋ฉด ๋๊ธ ๋จ๊ฒจ์ฃผ์ธ์ !
ํผ๋๋ฐฑ์ ์ธ์ ๋ ํ์์ ๋๋ค <3
'๐ Infra' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Cloud] Spring Cloud (0) | 2025.02.11 |
---|---|
[CI/CD] Github Actions, Jenkins (0) | 2025.01.15 |
[MQ] Pub/Sub ๊ตฌ์กฐ - RabbitMQ, Kafka, Redis (0) | 2025.01.13 |
[Docker] Docker, Docker Compose, Kubernetes (0) | 2025.01.13 |
[Nginx] Nginx๋ก ๋ก๋๋ฐธ๋ฐ์ฑ ํ๊ธฐ (0) | 2025.01.11 |