Skip to content

Commit e482873

Browse files
committed
step3-1 pub/sub 기본 예제 (실시간 알림)
1 parent 005e923 commit e482873

16 files changed

Lines changed: 254 additions & 121 deletions

build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ repositories {
2020
dependencies {
2121
implementation 'org.springframework.boot:spring-boot-starter-amqp'
2222
implementation 'org.springframework.boot:spring-boot-starter-web'
23+
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
24+
implementation 'org.springframework.boot:spring-boot-starter-websocket'
2325
developmentOnly 'org.springframework.boot:spring-boot-devtools'
2426
testImplementation 'org.springframework.boot:spring-boot-starter-test'
2527
testImplementation 'org.springframework.amqp:spring-rabbit-test'

src/main/java/net/harunote/hellomessagequeue/step2/RabbitMQConfig.java

Lines changed: 0 additions & 47 deletions
This file was deleted.

src/main/java/net/harunote/hellomessagequeue/step2/WorkQueuController.java

Lines changed: 0 additions & 29 deletions
This file was deleted.

src/main/java/net/harunote/hellomessagequeue/step2/WorkQueueConsumer.java

Lines changed: 0 additions & 25 deletions
This file was deleted.

src/main/java/net/harunote/hellomessagequeue/step2/WorkQueueProducer.java

Lines changed: 0 additions & 20 deletions
This file was deleted.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package net.harunote.hellomessagequeue.step3;
2+
3+
import org.springframework.stereotype.Controller;
4+
import org.springframework.ui.Model;
5+
import org.springframework.web.bind.annotation.GetMapping;
6+
7+
@Controller
8+
public class HomeController {
9+
10+
@GetMapping("/home")
11+
public String home(Model model) {
12+
model.addAttribute("message", "Welcome to RabbitMQ Sample!");
13+
return "home"; // src/main/resources/templates/home.html 파일을 찾음
14+
}
15+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package net.harunote.hellomessagequeue.step3;
2+
3+
import org.springframework.web.bind.annotation.PostMapping;
4+
import org.springframework.web.bind.annotation.RequestBody;
5+
import org.springframework.web.bind.annotation.RequestMapping;
6+
import org.springframework.web.bind.annotation.RestController;
7+
8+
@RestController
9+
@RequestMapping("/notifications")
10+
public class NotificationController {
11+
12+
private final NotificationPublisher publisher;
13+
14+
public NotificationController(NotificationPublisher publisher) {
15+
this.publisher = publisher;
16+
}
17+
18+
@PostMapping
19+
public String sendNotification(@RequestBody String message) {
20+
publisher.publish(message);
21+
return "[#] Notification sent: " + message + "\n";
22+
}
23+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package net.harunote.hellomessagequeue.step3;
2+
3+
public class NotificationMessage {
4+
private String message;
5+
6+
// 기본 생성자 (필수)
7+
public NotificationMessage() {
8+
}
9+
10+
// 선택
11+
public NotificationMessage(String message) {
12+
this.message = message;
13+
}
14+
15+
public String getMessage() {
16+
return message;
17+
}
18+
19+
// 필수
20+
public void setMessage(String message) {
21+
this.message = message;
22+
}
23+
}
24+
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package net.harunote.hellomessagequeue.step3;
2+
3+
import org.springframework.amqp.rabbit.core.RabbitTemplate;
4+
import org.springframework.stereotype.Component;
5+
6+
@Component
7+
public class NotificationPublisher {
8+
9+
private final RabbitTemplate rabbitTemplate;
10+
11+
public NotificationPublisher(RabbitTemplate rabbitTemplate) {
12+
this.rabbitTemplate = rabbitTemplate;
13+
}
14+
15+
public void publish(String message) {
16+
rabbitTemplate.convertAndSend(RabbitMQConfig.FANOUT_EXCHANGE, "", message); // Fanout에서 routing key는 무시됨
17+
System.out.println("[#] Published Notification: " + message);
18+
}
19+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package net.harunote.hellomessagequeue.step3;
2+
3+
import org.springframework.amqp.rabbit.annotation.RabbitListener;
4+
import org.springframework.messaging.simp.SimpMessagingTemplate;
5+
import org.springframework.stereotype.Component;
6+
7+
@Component
8+
public class NotificationSubscriber {
9+
10+
public static final String CLIENT_URL = "/topic/notifications";
11+
// WebSocket으로 메시지를 전달하기 위한 Spring의 템플릿 클래스.
12+
private final SimpMessagingTemplate simpMessagingTemplate;
13+
14+
public NotificationSubscriber(SimpMessagingTemplate simpMessagingTemplate) {
15+
this.simpMessagingTemplate = simpMessagingTemplate;
16+
}
17+
18+
@RabbitListener(queues = RabbitMQConfig.QUEUE_NAME)
19+
public void subscriber(String message) {
20+
// RabbitMQ Queue에서 메시지 수신
21+
// String message = (String) rabbitTemplate.receiveAndConvert(RabbitMQConfig.QUEUE_NAME);
22+
System.out.println("Received Notification: " + message);
23+
// convertAndSend 를 통해 특정 경로로 메시지를 전달함
24+
simpMessagingTemplate.convertAndSend(CLIENT_URL, message); // 클라이언트에 브로드캐스트
25+
}
26+
27+
}

0 commit comments

Comments
 (0)