Skip to content

Commit ceca5e6

Browse files
authored
♻️ refactor: convertAndSend 계층 변경
* ♻️ convertAndSend 계층 변경 * chore: Java 스타일 수정 * ♻️ 충돌 해결 * chore: Java 스타일 수정 --------- Co-authored-by: github-actions <>
1 parent 83554bb commit ceca5e6

File tree

6 files changed

+52
-157
lines changed

6 files changed

+52
-157
lines changed

backend/src/main/java/io/f1/backend/domain/game/app/RoomService.java

Lines changed: 42 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,8 @@
1313
import static io.f1.backend.global.util.SecurityUtils.getCurrentUserNickname;
1414

1515
import io.f1.backend.domain.game.dto.ChatMessage;
16+
import io.f1.backend.domain.game.dto.MessageType;
1617
import io.f1.backend.domain.game.dto.RoomEventType;
17-
import io.f1.backend.domain.game.dto.RoomExitData;
18-
import io.f1.backend.domain.game.dto.RoomInitialData;
19-
import io.f1.backend.domain.game.dto.RoundResult;
2018
import io.f1.backend.domain.game.dto.request.RoomCreateRequest;
2119
import io.f1.backend.domain.game.dto.request.RoomValidationRequest;
2220
import io.f1.backend.domain.game.dto.response.GameSettingResponse;
@@ -32,6 +30,7 @@
3230
import io.f1.backend.domain.game.model.RoomSetting;
3331
import io.f1.backend.domain.game.model.RoomState;
3432
import io.f1.backend.domain.game.store.RoomRepository;
33+
import io.f1.backend.domain.game.websocket.MessageSender;
3534
import io.f1.backend.domain.question.entity.Question;
3635
import io.f1.backend.domain.quiz.app.QuizService;
3736
import io.f1.backend.domain.quiz.dto.QuizMinData;
@@ -62,6 +61,7 @@ public class RoomService {
6261
private final AtomicLong roomIdGenerator = new AtomicLong(0);
6362
private final ApplicationEventPublisher eventPublisher;
6463
private final Map<Long, Object> roomLocks = new ConcurrentHashMap<>();
64+
private final MessageSender messageSender;
6565
private static final String PENDING_SESSION_ID = "PENDING_SESSION_ID";
6666

6767
public RoomCreateResponse saveRoom(RoomCreateRequest request) {
@@ -116,8 +116,7 @@ public void enterRoom(RoomValidationRequest request) {
116116
}
117117
}
118118

119-
public RoomInitialData initializeRoomSocket(
120-
Long roomId, String sessionId, UserPrincipal principal) {
119+
public void initializeRoomSocket(Long roomId, String sessionId, UserPrincipal principal) {
121120

122121
Room room = findRoom(roomId);
123122

@@ -150,11 +149,15 @@ public RoomInitialData initializeRoomSocket(
150149
SystemNoticeResponse systemNoticeResponse =
151150
ofPlayerEvent(player.getNickname(), RoomEventType.ENTER);
152151

153-
return new RoomInitialData(
154-
roomSettingResponse, gameSettingResponse, playerListResponse, systemNoticeResponse);
152+
String destination = getDestination(roomId);
153+
154+
messageSender.send(destination, MessageType.ROOM_SETTING, roomSettingResponse);
155+
messageSender.send(destination, MessageType.GAME_SETTING, gameSettingResponse);
156+
messageSender.send(destination, MessageType.PLAYER_LIST, playerListResponse);
157+
messageSender.send(destination, MessageType.SYSTEM_NOTICE, systemNoticeResponse);
155158
}
156159

157-
public RoomExitData exitRoom(Long roomId, String sessionId, UserPrincipal principal) {
160+
public void exitRoom(Long roomId, String sessionId, UserPrincipal principal) {
158161

159162
Object lock = roomLocks.computeIfAbsent(roomId, k -> new Object());
160163

@@ -165,7 +168,8 @@ public RoomExitData exitRoom(Long roomId, String sessionId, UserPrincipal princi
165168

166169
/* 방 삭제 */
167170
if (isLastPlayer(room, sessionId)) {
168-
return removeRoom(room);
171+
removeRoom(room);
172+
return;
169173
}
170174

171175
/* 방장 변경 */
@@ -181,11 +185,14 @@ public RoomExitData exitRoom(Long roomId, String sessionId, UserPrincipal princi
181185

182186
PlayerListResponse playerListResponse = toPlayerListResponse(room);
183187

184-
return new RoomExitData(playerListResponse, systemNoticeResponse, false);
188+
String destination = getDestination(roomId);
189+
190+
messageSender.send(destination, MessageType.PLAYER_LIST, playerListResponse);
191+
messageSender.send(destination, MessageType.SYSTEM_NOTICE, systemNoticeResponse);
185192
}
186193
}
187194

188-
public PlayerListResponse handlePlayerReady(Long roomId, String sessionId) {
195+
public void handlePlayerReady(Long roomId, String sessionId) {
189196
Player player =
190197
roomRepository
191198
.findPlayerInRoomBySessionId(roomId, sessionId)
@@ -195,7 +202,9 @@ public PlayerListResponse handlePlayerReady(Long roomId, String sessionId) {
195202

196203
Room room = findRoom(roomId);
197204

198-
return toPlayerListResponse(room);
205+
String destination = getDestination(roomId);
206+
207+
messageSender.send(destination, MessageType.PLAYER_LIST, toPlayerListResponse(room));
199208
}
200209

201210
public RoomListResponse getAllRooms() {
@@ -214,30 +223,34 @@ public RoomListResponse getAllRooms() {
214223
}
215224

216225
// todo 동시성적용
217-
public RoundResult chat(Long roomId, String sessionId, ChatMessage chatMessage) {
226+
public void chat(Long roomId, String sessionId, ChatMessage chatMessage) {
218227
Room room = findRoom(roomId);
219228

229+
String destination = getDestination(roomId);
230+
231+
messageSender.send(destination, MessageType.CHAT, chatMessage);
232+
220233
if (!room.isPlaying()) {
221-
return buildResultOnlyChat(chatMessage);
234+
return;
222235
}
223236

224237
Question currentQuestion = room.getCurrentQuestion();
225238

226239
String answer = currentQuestion.getAnswer();
227240

228-
if (!answer.equals(chatMessage.message())) {
229-
return buildResultOnlyChat(chatMessage);
241+
if (answer.equals(chatMessage.message())) {
242+
room.increasePlayerCorrectCount(sessionId);
243+
244+
messageSender.send(
245+
destination,
246+
MessageType.QUESTION_RESULT,
247+
toQuestionResultResponse(currentQuestion.getId(), chatMessage, answer));
248+
messageSender.send(destination, MessageType.RANK_UPDATE, toRankUpdateResponse(room));
249+
messageSender.send(
250+
destination,
251+
MessageType.SYSTEM_NOTICE,
252+
ofPlayerEvent(chatMessage.nickname(), RoomEventType.ENTER));
230253
}
231-
232-
room.increasePlayerCorrectCount(sessionId);
233-
234-
return RoundResult.builder()
235-
.questionResult(
236-
toQuestionResultResponse(currentQuestion.getId(), chatMessage, answer))
237-
.rankUpdate(toRankUpdateResponse(room))
238-
.systemNotice(ofPlayerEvent(chatMessage.nickname(), RoomEventType.ENTER))
239-
.chat(chatMessage)
240-
.build();
241254
}
242255

243256
private Player getRemovePlayer(Room room, String sessionId, UserPrincipal principal) {
@@ -268,12 +281,11 @@ private boolean isLastPlayer(Room room, String sessionId) {
268281
return playerSessionMap.size() == 1 && playerSessionMap.containsKey(sessionId);
269282
}
270283

271-
private RoomExitData removeRoom(Room room) {
284+
private void removeRoom(Room room) {
272285
Long roomId = room.getId();
273286
roomRepository.removeRoom(roomId);
274287
roomLocks.remove(roomId);
275288
log.info("{}번 방 삭제", roomId);
276-
return RoomExitData.builder().removedRoom(true).build();
277289
}
278290

279291
private void changeHost(Room room, String hostSessionId) {
@@ -298,7 +310,7 @@ private void removePlayer(Room room, String sessionId, Player removePlayer) {
298310
room.removeSessionId(sessionId);
299311
}
300312

301-
private RoundResult buildResultOnlyChat(ChatMessage chatMessage) {
302-
return RoundResult.builder().chat(chatMessage).build();
313+
private String getDestination(Long roomId) {
314+
return "/sub/room/" + roomId;
303315
}
304316
}

backend/src/main/java/io/f1/backend/domain/game/dto/RoomExitData.java

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

backend/src/main/java/io/f1/backend/domain/game/dto/RoomInitialData.java

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

backend/src/main/java/io/f1/backend/domain/game/dto/RoundResult.java

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

backend/src/main/java/io/f1/backend/domain/game/websocket/GameSocketController.java

Lines changed: 7 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,7 @@
66
import io.f1.backend.domain.game.app.GameService;
77
import io.f1.backend.domain.game.app.RoomService;
88
import io.f1.backend.domain.game.dto.ChatMessage;
9-
import io.f1.backend.domain.game.dto.MessageType;
10-
import io.f1.backend.domain.game.dto.RoomExitData;
11-
import io.f1.backend.domain.game.dto.RoomInitialData;
12-
import io.f1.backend.domain.game.dto.RoundResult;
139
import io.f1.backend.domain.game.dto.request.DefaultWebSocketRequest;
14-
import io.f1.backend.domain.game.dto.response.GameStartResponse;
15-
import io.f1.backend.domain.game.dto.response.PlayerListResponse;
1610
import io.f1.backend.domain.user.dto.UserPrincipal;
1711

1812
import lombok.RequiredArgsConstructor;
@@ -26,6 +20,7 @@
2620
@RequiredArgsConstructor
2721
public class GameSocketController {
2822

23+
// todo 삭제
2924
private final MessageSender messageSender;
3025
private final RoomService roomService;
3126
private final GameService gameService;
@@ -37,19 +32,7 @@ public void initializeRoomSocket(@DestinationVariable Long roomId, Message<?> me
3732

3833
UserPrincipal principal = getSessionUser(message);
3934

40-
RoomInitialData roomInitialData =
41-
roomService.initializeRoomSocket(roomId, websocketSessionId, principal);
42-
43-
String destination = getDestination(roomId);
44-
45-
messageSender.send(
46-
destination, MessageType.ROOM_SETTING, roomInitialData.roomSettingResponse());
47-
messageSender.send(
48-
destination, MessageType.GAME_SETTING, roomInitialData.gameSettingResponse());
49-
messageSender.send(
50-
destination, MessageType.PLAYER_LIST, roomInitialData.playerListResponse());
51-
messageSender.send(
52-
destination, MessageType.SYSTEM_NOTICE, roomInitialData.systemNoticeResponse());
35+
roomService.initializeRoomSocket(roomId, websocketSessionId, principal);
5336
}
5437

5538
@MessageMapping("/room/exit/{roomId}")
@@ -58,59 +41,32 @@ public void exitRoom(@DestinationVariable Long roomId, Message<?> message) {
5841
String websocketSessionId = getSessionId(message);
5942
UserPrincipal principal = getSessionUser(message);
6043

61-
RoomExitData roomExitData = roomService.exitRoom(roomId, websocketSessionId, principal);
62-
63-
String destination = getDestination(roomId);
64-
65-
if (!roomExitData.isRemovedRoom()) {
66-
messageSender.send(
67-
destination, MessageType.PLAYER_LIST, roomExitData.getPlayerListResponses());
68-
messageSender.send(
69-
destination, MessageType.SYSTEM_NOTICE, roomExitData.getSystemNoticeResponse());
70-
}
44+
roomService.exitRoom(roomId, websocketSessionId, principal);
7145
}
7246

7347
@MessageMapping("/room/start/{roomId}")
7448
public void gameStart(@DestinationVariable Long roomId, Message<?> message) {
7549

7650
UserPrincipal principal = getSessionUser(message);
7751

78-
GameStartResponse gameStartResponse = gameService.gameStart(roomId, principal);
79-
80-
String destination = getDestination(roomId);
81-
82-
messageSender.send(destination, MessageType.GAME_START, gameStartResponse);
52+
gameService.gameStart(roomId, principal);
8353
}
8454

8555
@MessageMapping("room/chat/{roomId}")
8656
public void chat(
8757
@DestinationVariable Long roomId,
8858
Message<DefaultWebSocketRequest<ChatMessage>> message) {
89-
RoundResult roundResult =
90-
roomService.chat(roomId, getSessionId(message), message.getPayload().getMessage());
91-
92-
String destination = getDestination(roomId);
9359

94-
messageSender.send(destination, MessageType.CHAT, roundResult.getChat());
95-
96-
if (!roundResult.hasOnlyChat()) {
97-
messageSender.send(
98-
destination, MessageType.QUESTION_RESULT, roundResult.getQuestionResult());
99-
messageSender.send(destination, MessageType.RANK_UPDATE, roundResult.getRankUpdate());
100-
messageSender.send(
101-
destination, MessageType.SYSTEM_NOTICE, roundResult.getSystemNotice());
102-
}
60+
roomService.chat(roomId, getSessionId(message), message.getPayload().getMessage());
10361
}
10462

10563
@MessageMapping("/room/ready/{roomId}")
10664
public void playerReady(@DestinationVariable Long roomId, Message<?> message) {
10765

108-
PlayerListResponse playerListResponse =
109-
roomService.handlePlayerReady(roomId, getSessionId(message));
110-
111-
messageSender.send(getDestination(roomId), MessageType.PLAYER_LIST, playerListResponse);
66+
roomService.handlePlayerReady(roomId, getSessionId(message));
11267
}
11368

69+
// todo 삭제
11470
private String getDestination(Long roomId) {
11571
return "/sub/room/" + roomId;
11672
}

backend/src/test/java/io/f1/backend/domain/game/app/RoomServiceTests.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package io.f1.backend.domain.game.app;
22

33
import static org.assertj.core.api.Assertions.assertThat;
4-
import static org.mockito.Mockito.doNothing;
54
import static org.mockito.Mockito.when;
65

76
import io.f1.backend.domain.game.dto.request.RoomValidationRequest;
@@ -10,6 +9,7 @@
109
import io.f1.backend.domain.game.model.Room;
1110
import io.f1.backend.domain.game.model.RoomSetting;
1211
import io.f1.backend.domain.game.store.RoomRepository;
12+
import io.f1.backend.domain.game.websocket.MessageSender;
1313
import io.f1.backend.domain.quiz.app.QuizService;
1414
import io.f1.backend.domain.user.dto.UserPrincipal;
1515
import io.f1.backend.domain.user.entity.User;
@@ -46,11 +46,12 @@ class RoomServiceTests {
4646
@Mock private RoomRepository roomRepository;
4747
@Mock private QuizService quizService;
4848
@Mock private ApplicationEventPublisher eventPublisher;
49+
@Mock private MessageSender messageSender;
4950

5051
@BeforeEach
5152
void setUp() {
5253
MockitoAnnotations.openMocks(this); // @Mock 어노테이션이 붙은 필드들을 초기화합니다.
53-
roomService = new RoomService(quizService, roomRepository, eventPublisher);
54+
roomService = new RoomService(quizService, roomRepository, eventPublisher, messageSender);
5455

5556
SecurityContextHolder.clearContext();
5657
}
@@ -133,7 +134,6 @@ void exitRoom_synchronized() throws Exception {
133134
log.info("room.getPlayerSessionMap().size() = {}", room.getPlayerSessionMap().size());
134135

135136
when(roomRepository.findRoom(roomId)).thenReturn(Optional.of(room));
136-
doNothing().when(roomRepository).removeRoom(roomId);
137137

138138
ExecutorService executorService = Executors.newFixedThreadPool(threadCount);
139139
CountDownLatch countDownLatch = new CountDownLatch(threadCount);

0 commit comments

Comments
 (0)