Skip to content

Commit 6458b8a

Browse files
authored
#89 SSE 기능 개선 및 Kafka 활용
2 parents e91e342 + 9ff4f0e commit 6458b8a

File tree

6 files changed

+50
-14
lines changed

6 files changed

+50
-14
lines changed

nodejs-frontend/static/js/roomlist/roomlist.js

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,9 @@ const roomList = {
6565
});
6666

6767
eventSource.addEventListener('roomDeleted', function(event) {
68-
const deletedRoom = JSON.parse(event.data);
69-
const deletedRoomId = deletedRoom.roomId;
68+
const { roomId } = JSON.parse(event.data);
7069
$('#roomTableBody')
71-
.find(`[data-id='${deletedRoomId}'], [data-roomid='${deletedRoomId}']`)
70+
.find(`[data-id='${roomId}'], [data-roomid='${roomId}']`)
7271
.closest('tr')
7372
.remove();
7473
});
@@ -78,16 +77,24 @@ const roomList = {
7877
});
7978

8079
eventSource.addEventListener("changeUserCnt", function (event) {
81-
const chatRoom = JSON.parse(event.data);
82-
const chatRoomId = chatRoom.roomId;
83-
const userCnt = chatRoom.userCount;
84-
const {maxUserCnt} = chatRoom;
80+
const { roomId, userCount, maxUserCnt } = JSON.parse(event.data);
8581

8682
const $row = $('#roomTableBody')
87-
.find(`[data-id='${chatRoomId}'], [data-roomid='${chatRoomId}']`)
83+
.find(`[data-id='${roomId}'], [data-roomid='${roomId}']`)
8884
.closest('tr');
8985

90-
$row.find('span.room-user-count').text(`${userCnt}/${maxUserCnt}`);
86+
$row.find('span.room-user-count').text(`${userCount}/${maxUserCnt}`);
87+
});
88+
89+
eventSource.addEventListener("changeRoomSetting", function (event) {
90+
const { roomId, roomName, userCount, maxUserCnt } = JSON.parse(event.data);
91+
92+
const $row = $('#roomTableBody')
93+
.find(`[data-id='${roomId}'], [data-roomid='${roomId}']`)
94+
.closest('tr');
95+
96+
$row.find('span.room-user-count').text(`${userCount}/${maxUserCnt}`);
97+
$row.find('.enterRoomBtn, .directEnterBtn').text(roomName);
9198
});
9299

93100
window.addEventListener("beforeunload", () => {

springboot-backend/src/main/java/webChat/model/kafka/RoomEvent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
@Getter
66
public enum RoomEvent {
77
ROOM_CREATE,
8-
// ROOM_UPDATE,
8+
ROOM_UPDATE,
99
ROOM_DELETE,
1010
ROOM_USER_CNT
1111
}

springboot-backend/src/main/java/webChat/service/chatroom/ChatRoomService.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,10 @@ public boolean delChatRoom(String roomId) throws BadRequestException {
201201
// 채팅방 수정
202202
public ChatRoom updateRoom(String roomId, String roomName, String roomPwd, int maxUserCnt) throws BadRequestException {
203203
ChatRoom chatRoom = redisService.getRedisDataByDataType(roomId, DataType.CHATROOM, KurentoRoom.class);
204+
// 방 이름 혹은 최대 인원 수 변경 시에 kafka -> sse를 통해 실시간 방 업데이트
205+
if (!chatRoom.getRoomName().equals(roomName) || chatRoom.getMaxUserCnt() != maxUserCnt) {
206+
chatKafkaProducer.sendChangedRoomSettingEvent(chatRoom);
207+
}
204208
chatRoom.setRoomName(roomName);
205209
chatRoom.setRoomPwd(roomPwd);
206210
chatRoom.setMaxUserCnt(maxUserCnt);

springboot-backend/src/main/java/webChat/service/chatroom/SseService.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import webChat.model.room.ChatRoom;
77

88
import java.io.IOException;
9+
import java.util.ArrayList;
910
import java.util.List;
1011
import java.util.concurrent.CopyOnWriteArrayList;
1112

@@ -31,7 +32,7 @@ public SseEmitter createEmitter() {
3132

3233
// 방 생성 시, 연결된 모든 클라이언트에게 이벤트 전송
3334
public void sendRoomCreatedEvent(ChatRoom room) {
34-
List<SseEmitter> deadEmitters = new CopyOnWriteArrayList<>();
35+
List<SseEmitter> deadEmitters = new ArrayList<>();
3536

3637
for (SseEmitter emitter : emitters) {
3738
try {
@@ -48,7 +49,7 @@ public void sendRoomCreatedEvent(ChatRoom room) {
4849

4950
// 방 삭제 시 이벤트 전송
5051
public void sendRoomDeletedEvent(ChatRoom room) {
51-
List<SseEmitter> deadEmitters = new CopyOnWriteArrayList<>();
52+
List<SseEmitter> deadEmitters = new ArrayList<>();
5253

5354
for (SseEmitter emitter : emitters) {
5455
try {
@@ -67,7 +68,7 @@ public void sendRoomDeletedEvent(ChatRoom room) {
6768
// 핑 관련 이벤트 전송
6869
@Scheduled(fixedDelay = 10_000L * 7) // 7분
6970
public void sendPingToClients() {
70-
List<SseEmitter> deadEmitters = new CopyOnWriteArrayList<>();
71+
List<SseEmitter> deadEmitters = new ArrayList<>();
7172
for (SseEmitter emitter : emitters) {
7273
try {
7374
emitter.send(SseEmitter.event()
@@ -82,7 +83,7 @@ public void sendPingToClients() {
8283

8384
// 방 인원수 변경 시 이벤트 전송
8485
public void sendRoomUserCntEvent(ChatRoom room) {
85-
List<SseEmitter> deadEmitters = new CopyOnWriteArrayList<>();
86+
List<SseEmitter> deadEmitters = new ArrayList<>();
8687

8788
for (SseEmitter emitter : emitters) {
8889
try {
@@ -93,7 +94,21 @@ public void sendRoomUserCntEvent(ChatRoom room) {
9394
deadEmitters.add(emitter);
9495
}
9596
}
97+
emitters.removeAll(deadEmitters);
98+
}
99+
100+
public void sendChangeRoomSettingEvent(ChatRoom room) {
101+
List<SseEmitter> deadEmitters = new ArrayList<>();
96102

103+
for (SseEmitter emitter : emitters) {
104+
try {
105+
emitter.send(SseEmitter.event()
106+
.name("changeRoomSetting")
107+
.data(room));
108+
} catch (IOException e) {
109+
deadEmitters.add(emitter);
110+
}
111+
}
97112
emitters.removeAll(deadEmitters);
98113
}
99114
}

springboot-backend/src/main/java/webChat/service/kafka/ChatKafkaProducer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,9 @@ public void sendRoomUserCntEvent(ChatRoom chatRoom) {
2828
KafkaRoomEvent kafkaRoomEvent = KafkaRoomEvent.of(chatRoom.getRoomId(), chatRoom.getInstanceId(), RoomEvent.ROOM_USER_CNT);
2929
kafkaTemplate.send("room-events", chatRoom.getRoomId(), kafkaRoomEvent);
3030
}
31+
32+
public void sendChangedRoomSettingEvent(ChatRoom chatRoom) {
33+
KafkaRoomEvent kafkaRoomEvent = KafkaRoomEvent.of(chatRoom.getRoomId(), chatRoom.getInstanceId(), RoomEvent.ROOM_UPDATE);
34+
kafkaTemplate.send("room-events", chatRoom.getRoomId(), kafkaRoomEvent);
35+
}
3136
}

springboot-backend/src/main/java/webChat/service/kafka/ChatRoomEventConsumer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ public void listen(ConsumerRecord<String, KafkaEvent> record) throws BadRequestE
4848
log.info("===========roomUserCnt==========");
4949
sseService.sendRoomUserCntEvent(chatRoom);
5050
}
51+
// 방 설정 변경 (방 이름, 최대 인원 수)
52+
case ROOM_UPDATE -> {
53+
log.info("===========roomSetting==========");
54+
sseService.sendChangeRoomSettingEvent(chatRoom);
55+
}
5156
}
5257
}
5358
}

0 commit comments

Comments
 (0)