Skip to content

Commit 0c3ff2b

Browse files
committed
✨ 게임 시작 상태 SSE로 이벤트 퍼블리시
1 parent b975a3c commit 0c3ff2b

File tree

4 files changed

+34
-21
lines changed

4 files changed

+34
-21
lines changed

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

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,18 @@
22

33
import io.f1.backend.domain.game.dto.GameStartData;
44
import io.f1.backend.domain.game.dto.response.GameStartResponse;
5+
import io.f1.backend.domain.game.event.RoomUpdatedEvent;
56
import io.f1.backend.domain.game.model.GameSetting;
67
import io.f1.backend.domain.game.model.Player;
78
import io.f1.backend.domain.game.model.Room;
89
import io.f1.backend.domain.game.model.RoomState;
910
import io.f1.backend.domain.game.store.RoomRepository;
1011
import io.f1.backend.domain.quiz.app.QuizService;
1112

13+
import io.f1.backend.domain.quiz.entity.Quiz;
1214
import lombok.RequiredArgsConstructor;
1315

16+
import org.springframework.context.ApplicationEventPublisher;
1417
import org.springframework.stereotype.Service;
1518

1619
import java.util.Map;
@@ -21,26 +24,15 @@ public class GameService {
2124

2225
private final QuizService quizService;
2326
private final RoomRepository roomRepository;
27+
private final ApplicationEventPublisher eventPublisher;
2428

25-
private Integer checkGameSetting(Room room, Long quizId) {
26-
27-
GameSetting gameSetting = room.getGameSetting();
28-
29-
Long roomQuizId = gameSetting.getQuizId();
30-
31-
if (!roomQuizId.equals(quizId)) {
32-
throw new IllegalArgumentException("E409002 : 게임 설정이 다릅니다. (게임을 시작할 수 없습니다.)");
33-
}
34-
35-
return gameSetting.getRound();
36-
}
3729

3830
public GameStartData gameStart(Long roomId, Long quizId) {
3931

4032
Room room =
41-
roomRepository
42-
.findRoom(roomId)
43-
.orElseThrow(() -> new IllegalArgumentException("404 존재하지 않는 방입니다."));
33+
roomRepository
34+
.findRoom(roomId)
35+
.orElseThrow(() -> new IllegalArgumentException("404 존재하지 않는 방입니다."));
4436

4537
if (!validateReadyStatus(room)) {
4638
throw new IllegalArgumentException("E403004 : 레디 상태가 아닙니다.");
@@ -49,15 +41,32 @@ public GameStartData gameStart(Long roomId, Long quizId) {
4941
// 방의 gameSetting에 설정된 퀴즈랑 요청 퀴즈랑 같은지 체크 후 GameSetting에서 라운드 가져오기
5042
Integer round = checkGameSetting(room, quizId);
5143

44+
Quiz quiz = quizService.getQuizWithQuestionsById(quizId);
45+
5246
// 라운드 수만큼 랜덤 Question 추출
5347
GameStartResponse questions = quizService.getRandomQuestionsWithoutAnswer(quizId, round);
5448

5549
// 방 정보 게임 중으로 변경
5650
room.updateRoomState(RoomState.PLAYING);
5751

52+
eventPublisher.publishEvent(new RoomUpdatedEvent(room, quiz));
53+
5854
return new GameStartData(getDestination(roomId), questions);
5955
}
6056

57+
private Integer checkGameSetting(Room room, Long quizId) {
58+
59+
GameSetting gameSetting = room.getGameSetting();
60+
61+
Long roomQuizId = gameSetting.getQuizId();
62+
63+
if (!roomQuizId.equals(quizId)) {
64+
throw new IllegalArgumentException("E409002 : 게임 설정이 다릅니다. (게임을 시작할 수 없습니다.)");
65+
}
66+
67+
return gameSetting.getRound();
68+
}
69+
6170
private boolean validateReadyStatus(Room room) {
6271

6372
Map<String, Player> playerSessionMap = room.getPlayerSessionMap();

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public class RoomService {
6060
public RoomCreateResponse saveRoom(RoomCreateRequest request) {
6161

6262
Long quizMinId = quizService.getQuizMinId();
63-
Quiz quiz = quizService.getQuizById(quizMinId);
63+
Quiz quiz = quizService.getQuizWithQuestionsById(quizMinId);
6464

6565
GameSetting gameSetting = toGameSetting(quiz);
6666

@@ -132,7 +132,7 @@ public RoomInitialData initializeRoomSocket(Long roomId, String sessionId) {
132132
RoomSettingResponse roomSettingResponse = toRoomSettingResponse(room);
133133

134134
Long quizId = room.getGameSetting().getQuizId();
135-
Quiz quiz = quizService.getQuizById(quizId);
135+
Quiz quiz = quizService.getQuizWithQuestionsById(quizId);
136136

137137
GameSettingResponse gameSettingResponse =
138138
toGameSettingResponse(room.getGameSetting(), quiz);
@@ -189,7 +189,7 @@ public RoomListResponse getAllRooms() {
189189
.map(
190190
room -> {
191191
Long quizId = room.getGameSetting().getQuizId();
192-
Quiz quiz = quizService.getQuizById(quizId);
192+
Quiz quiz = quizService.getQuizWithQuestionsById(quizId);
193193

194194
return toRoomResponse(room, quiz);
195195
})

backend/src/main/java/io/f1/backend/domain/quiz/app/QuizService.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -216,12 +216,11 @@ public QuizListPageResponse getQuizzes(String title, String creator, Pageable pa
216216
}
217217

218218
@Transactional(readOnly = true)
219-
public Quiz getQuizById(Long quizId) {
219+
public Quiz getQuizWithQuestionsById(Long quizId) {
220220
Quiz quiz =
221221
quizRepository
222-
.findById(quizId)
222+
.findQuizWithQuestionsById(quizId)
223223
.orElseThrow(() -> new RuntimeException("E404002: 존재하지 않는 퀴즈입니다."));
224-
quiz.getQuestions().size();
225224
return quiz;
226225
}
227226

backend/src/main/java/io/f1/backend/domain/quiz/dao/QuizRepository.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,24 @@
33
import io.f1.backend.domain.question.entity.Question;
44
import io.f1.backend.domain.quiz.entity.Quiz;
55

6+
import java.util.Optional;
67
import org.springframework.data.domain.Page;
78
import org.springframework.data.domain.Pageable;
89
import org.springframework.data.jpa.repository.JpaRepository;
910
import org.springframework.data.jpa.repository.Query;
1011

1112
import java.util.List;
13+
import org.springframework.data.repository.query.Param;
1214

1315
public interface QuizRepository extends JpaRepository<Quiz, Long> {
1416

1517
Page<Quiz> findQuizzesByTitleContaining(String title, Pageable pageable);
1618

1719
Page<Quiz> findQuizzesByCreator_NicknameContaining(String creator, Pageable pageable);
1820

21+
@Query("SELECT q FROM Quiz q LEFT JOIN FETCH q.questions WHERE q.id = :quizId")
22+
Optional<Quiz> findQuizWithQuestionsById(Long quizId);
23+
1924
@Query("SELECT MIN(q.id) FROM Quiz q")
2025
Long getQuizMinId();
2126

0 commit comments

Comments
 (0)