diff --git a/backend/src/main/java/io/f1/backend/domain/game/app/GameService.java b/backend/src/main/java/io/f1/backend/domain/game/app/GameService.java index fe2d99e2..6e74acc4 100644 --- a/backend/src/main/java/io/f1/backend/domain/game/app/GameService.java +++ b/backend/src/main/java/io/f1/backend/domain/game/app/GameService.java @@ -219,16 +219,9 @@ public void changeGameSetting( if (!request.change(room, quizService)) { return; } - request.afterChange(room, messageSender); + request.afterChange(room, messageSender, eventPublisher, quizService); broadcastGameSetting(room); - - RoomUpdatedEvent roomUpdatedEvent = - new RoomUpdatedEvent( - room, - quizService.getQuizWithQuestionsById(room.getGameSetting().getQuizId())); - - eventPublisher.publishEvent(roomUpdatedEvent); } private void validateRoomStart(Room room, UserPrincipal principal) { diff --git a/backend/src/main/java/io/f1/backend/domain/game/app/RoomService.java b/backend/src/main/java/io/f1/backend/domain/game/app/RoomService.java index 418dbfbe..9596159e 100644 --- a/backend/src/main/java/io/f1/backend/domain/game/app/RoomService.java +++ b/backend/src/main/java/io/f1/backend/domain/game/app/RoomService.java @@ -26,6 +26,7 @@ import io.f1.backend.domain.game.dto.response.RoomSettingResponse; import io.f1.backend.domain.game.dto.response.SystemNoticeResponse; import io.f1.backend.domain.game.event.RoomCreatedEvent; +import io.f1.backend.domain.game.event.RoomDeletedEvent; import io.f1.backend.domain.game.model.ConnectionState; import io.f1.backend.domain.game.model.GameSetting; import io.f1.backend.domain.game.model.Player; @@ -349,6 +350,8 @@ private void cleanRoom(Room room, String sessionId, Player player) { /* 방 삭제 */ if (room.isLastPlayer(sessionId)) { removeRoom(room); + Long roomId = room.getId(); + eventPublisher.publishEvent(new RoomDeletedEvent(roomId)); return; } diff --git a/backend/src/main/java/io/f1/backend/domain/game/dto/request/GameSettingChanger.java b/backend/src/main/java/io/f1/backend/domain/game/dto/request/GameSettingChanger.java index fa3a4981..e8b2c65f 100644 --- a/backend/src/main/java/io/f1/backend/domain/game/dto/request/GameSettingChanger.java +++ b/backend/src/main/java/io/f1/backend/domain/game/dto/request/GameSettingChanger.java @@ -4,9 +4,15 @@ import io.f1.backend.domain.game.websocket.MessageSender; import io.f1.backend.domain.quiz.app.QuizService; +import org.springframework.context.ApplicationEventPublisher; + public interface GameSettingChanger { boolean change(Room room, QuizService quizService); - void afterChange(Room room, MessageSender messageSender); + default void afterChange( + Room room, + MessageSender messageSender, + ApplicationEventPublisher eventPublisher, + QuizService quizService) {} } diff --git a/backend/src/main/java/io/f1/backend/domain/game/dto/request/QuizChangeRequest.java b/backend/src/main/java/io/f1/backend/domain/game/dto/request/QuizChangeRequest.java index 1237a44c..cfb4e5f9 100644 --- a/backend/src/main/java/io/f1/backend/domain/game/dto/request/QuizChangeRequest.java +++ b/backend/src/main/java/io/f1/backend/domain/game/dto/request/QuizChangeRequest.java @@ -5,12 +5,15 @@ import io.f1.backend.domain.game.dto.MessageType; import io.f1.backend.domain.game.dto.response.PlayerListResponse; +import io.f1.backend.domain.game.event.RoomUpdatedEvent; import io.f1.backend.domain.game.model.Room; import io.f1.backend.domain.game.websocket.MessageSender; import io.f1.backend.domain.quiz.app.QuizService; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationEventPublisher; + @Slf4j public record QuizChangeRequest(long quizId) implements GameSettingChanger { @@ -21,17 +24,28 @@ public boolean change(Room room, QuizService quizService) { } Long questionsCount = quizService.getQuestionsCount(quizId); room.changeQuiz(quizId, questionsCount.intValue()); + room.resetAllPlayerReadyStates(); return true; } @Override - public void afterChange(Room room, MessageSender messageSender) { - room.resetAllPlayerReadyStates(); + public void afterChange( + Room room, + MessageSender messageSender, + ApplicationEventPublisher eventPublisher, + QuizService quizService) { String destination = getDestination(room.getId()); PlayerListResponse response = toPlayerListResponse(room); log.info(response.toString()); messageSender.sendBroadcast(destination, MessageType.PLAYER_LIST, response); + + RoomUpdatedEvent roomUpdatedEvent = + new RoomUpdatedEvent( + room, + quizService.getQuizWithQuestionsById(room.getGameSetting().getQuizId())); + + eventPublisher.publishEvent(roomUpdatedEvent); } } diff --git a/backend/src/main/java/io/f1/backend/domain/game/dto/request/RoundChangeRequest.java b/backend/src/main/java/io/f1/backend/domain/game/dto/request/RoundChangeRequest.java index b44cb72a..76244ffd 100644 --- a/backend/src/main/java/io/f1/backend/domain/game/dto/request/RoundChangeRequest.java +++ b/backend/src/main/java/io/f1/backend/domain/game/dto/request/RoundChangeRequest.java @@ -1,7 +1,6 @@ package io.f1.backend.domain.game.dto.request; import io.f1.backend.domain.game.model.Room; -import io.f1.backend.domain.game.websocket.MessageSender; import io.f1.backend.domain.quiz.app.QuizService; public record RoundChangeRequest(int round) implements GameSettingChanger { @@ -17,9 +16,4 @@ public boolean change(Room room, QuizService quizService) { room.changeRound(round, questionsCount.intValue()); return true; } - - @Override - public void afterChange(Room room, MessageSender messageSender) { - // 고유한 후처리 동작 없음 - } } diff --git a/backend/src/main/java/io/f1/backend/domain/game/dto/request/TimeLimitChangeRequest.java b/backend/src/main/java/io/f1/backend/domain/game/dto/request/TimeLimitChangeRequest.java index aa088c7d..2e58f679 100644 --- a/backend/src/main/java/io/f1/backend/domain/game/dto/request/TimeLimitChangeRequest.java +++ b/backend/src/main/java/io/f1/backend/domain/game/dto/request/TimeLimitChangeRequest.java @@ -1,7 +1,6 @@ package io.f1.backend.domain.game.dto.request; import io.f1.backend.domain.game.model.Room; -import io.f1.backend.domain.game.websocket.MessageSender; import io.f1.backend.domain.quiz.app.QuizService; public record TimeLimitChangeRequest(int timeLimit) implements GameSettingChanger { @@ -14,9 +13,4 @@ public boolean change(Room room, QuizService quizService) { room.changeTimeLimit(TimeLimit.from(timeLimit)); return true; } - - @Override - public void afterChange(Room room, MessageSender messageSender) { - // 고유한 후처리 동작 없음 - } } diff --git a/backend/src/main/java/io/f1/backend/domain/game/mapper/RoomMapper.java b/backend/src/main/java/io/f1/backend/domain/game/mapper/RoomMapper.java index cb662875..48b76ad6 100644 --- a/backend/src/main/java/io/f1/backend/domain/game/mapper/RoomMapper.java +++ b/backend/src/main/java/io/f1/backend/domain/game/mapper/RoomMapper.java @@ -48,6 +48,7 @@ public static RoomSettingResponse toRoomSettingResponse(Room room) { return new RoomSettingResponse( room.getRoomSetting().roomName(), room.getRoomSetting().maxUserCount(), + room.getCurrentUserCnt(), room.getRoomSetting().locked()); } @@ -71,7 +72,7 @@ public static RoomResponse toRoomResponse(Room room, Quiz quiz) { room.getId(), room.getRoomSetting().roomName(), room.getRoomSetting().maxUserCount(), - room.getPlayerSessionMap().size(), + room.getCurrentUserCnt(), room.getRoomSetting().locked(), room.getState().name(), quiz.getTitle(), @@ -111,9 +112,9 @@ public static QuestionStartResponse toQuestionStartResponse(Room room, int delay room.getCurrentQuestion().getId(), room.getCurrentRound(), Instant.now().plusSeconds(delay), - room.getGameSetting().getTimeLimit(), + room.getTimeLimit(), Instant.now(), - room.getGameSetting().getRound()); + room.getRound()); } public static GameResultResponse toGameResultResponse( diff --git a/backend/src/main/java/io/f1/backend/domain/game/sse/mapper/SseMapper.java b/backend/src/main/java/io/f1/backend/domain/game/sse/mapper/SseMapper.java index efdd94c8..869e0219 100644 --- a/backend/src/main/java/io/f1/backend/domain/game/sse/mapper/SseMapper.java +++ b/backend/src/main/java/io/f1/backend/domain/game/sse/mapper/SseMapper.java @@ -21,7 +21,7 @@ public static LobbySseEvent fromRoomCreated(RoomCreatedEvent room.getId(), room.getRoomSetting().roomName(), room.getRoomSetting().maxUserCount(), - room.getPlayerSessionMap().size(), + room.getCurrentUserCnt(), room.getRoomSetting().locked(), room.getState().name(), quiz.getTitle(), @@ -38,7 +38,7 @@ public static LobbySseEvent fromRoomUpdated(RoomUpdatedEvent RoomUpdatedPayload payload = new RoomUpdatedPayload( room.getId(), - room.getPlayerSessionMap().size(), + room.getCurrentUserCnt(), room.getState().name(), quiz.getTitle(), quiz.getDescription(),