Skip to content

Commit d6061d0

Browse files
committed
Merge remote-tracking branch 'origin/dev' into refactor/96
# Conflicts: # backend/src/main/resources/application.yml
2 parents 6ec049f + 53d8d35 commit d6061d0

File tree

22 files changed

+191
-47
lines changed

22 files changed

+191
-47
lines changed

backend/build.gradle

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,22 @@ repositories {
2424
}
2525

2626
dependencies {
27+
/* SPRING BOOT STARTER */
2728
implementation 'org.springframework.boot:spring-boot-starter-validation'
2829
implementation 'org.springframework.boot:spring-boot-starter-web'
2930
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
3031
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
3132
implementation 'org.springframework.boot:spring-boot-starter-websocket'
3233
implementation 'org.springframework.boot:spring-boot-starter-security'
3334
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
35+
implementation 'org.springframework.boot:spring-boot-starter-actuator'
3436

3537
/* DATABASE */
3638
runtimeOnly 'com.mysql:mysql-connector-j'
3739

40+
/* MONITORING */
41+
implementation 'io.micrometer:micrometer-registry-prometheus'
42+
3843
/* TEST */
3944
testImplementation 'org.springframework.boot:spring-boot-starter-test'
4045
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

backend/src/main/java/io/f1/backend/domain/game/dto/request/QuizChangeRequest.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import io.f1.backend.domain.game.model.Room;
99
import io.f1.backend.domain.game.websocket.MessageSender;
1010
import io.f1.backend.domain.quiz.app.QuizService;
11-
import io.f1.backend.domain.quiz.entity.Quiz;
1211

1312
import lombok.extern.slf4j.Slf4j;
1413

@@ -20,11 +19,8 @@ public boolean change(Room room, QuizService quizService) {
2019
if (room.getQuizId() == quizId) {
2120
return false; // 동일하면 무시
2221
}
23-
Quiz quiz = quizService.getQuizWithQuestionsById(quizId);
24-
int questionSize = quiz.getQuestions().size();
25-
room.changeQuiz(quiz);
26-
// 퀴즈의 문제 갯수로 변경
27-
room.changeRound(questionSize, questionSize);
22+
Long questionsCount = quizService.getQuestionsCount(quizId);
23+
room.changeQuiz(quizId, questionsCount.intValue());
2824
return true;
2925
}
3026

backend/src/main/java/io/f1/backend/domain/game/dto/request/RoundChangeRequest.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import io.f1.backend.domain.game.model.Room;
44
import io.f1.backend.domain.game.websocket.MessageSender;
55
import io.f1.backend.domain.quiz.app.QuizService;
6-
import io.f1.backend.domain.quiz.entity.Quiz;
76

87
public record RoundChangeRequest(int round) implements GameSettingChanger {
98

@@ -13,10 +12,9 @@ public boolean change(Room room, QuizService quizService) {
1312
return false; // 동일하면 무시
1413
}
1514

16-
Quiz quiz = quizService.findQuizById(room.getQuizId());
17-
int questionSize = quiz.getQuestions().size();
15+
Long questionsCount = quizService.getQuestionsCount(room.getQuizId());
1816

19-
room.changeRound(round, questionSize);
17+
room.changeRound(round, questionsCount.intValue());
2018
return true;
2119
}
2220

backend/src/main/java/io/f1/backend/domain/game/model/GameSetting.java

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

33
import io.f1.backend.domain.game.dto.request.TimeLimit;
4-
import io.f1.backend.domain.quiz.entity.Quiz;
54
import io.f1.backend.global.exception.CustomException;
65
import io.f1.backend.global.exception.errorcode.GameErrorCode;
76

@@ -16,9 +15,9 @@ public class GameSetting {
1615
private Integer round;
1716
private int timeLimit;
1817

19-
public void changeQuiz(Quiz quiz) {
20-
quizId = quiz.getId();
21-
round = quiz.getQuestions().size(); // 라운드를 바꾼 퀴즈의 문제 수로 동기화
18+
public void changeQuiz(Long quizId, int questionsCount) {
19+
this.quizId = quizId;
20+
round = questionsCount; // 라운드를 바꾼 퀴즈의 문제 수로 동기화
2221
}
2322

2423
public void changeTimeLimit(TimeLimit timeLimit) {

backend/src/main/java/io/f1/backend/domain/game/model/Room.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import io.f1.backend.domain.game.dto.request.TimeLimit;
44
import io.f1.backend.domain.question.entity.Question;
5-
import io.f1.backend.domain.quiz.entity.Quiz;
65
import io.f1.backend.global.exception.CustomException;
76
import io.f1.backend.global.exception.errorcode.RoomErrorCode;
87

@@ -158,8 +157,8 @@ public void resetAllPlayerReadyStates() {
158157
}
159158
}
160159

161-
public void changeQuiz(Quiz quiz) {
162-
gameSetting.changeQuiz(quiz);
160+
public void changeQuiz(Long quizId, int questionsCount) {
161+
gameSetting.changeQuiz(quizId, questionsCount);
163162
}
164163

165164
public void changeTimeLimit(TimeLimit timeLimit) {

backend/src/main/java/io/f1/backend/domain/game/store/RoomRepositoryImpl.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,4 @@ public List<Room> findAll() {
3434
public void removeRoom(Long roomId) {
3535
roomMap.remove(roomId);
3636
}
37-
38-
// 테스트 전용 메소드
39-
public Room getRoomForTest(Long roomId) {
40-
return roomMap.get(roomId);
41-
}
4237
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,4 +284,9 @@ public Quiz findQuizById(Long quizId) {
284284
.findById(quizId)
285285
.orElseThrow(() -> new CustomException(QuizErrorCode.QUIZ_NOT_FOUND));
286286
}
287+
288+
@Transactional(readOnly = true)
289+
public Long getQuestionsCount(Long quizId) {
290+
return quizRepository.countQuestionsByQuizId(quizId);
291+
}
287292
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ public interface QuizRepository extends JpaRepository<Quiz, Long> {
2121
@Query("SELECT q FROM Quiz q LEFT JOIN FETCH q.questions WHERE q.id = :quizId")
2222
Optional<Quiz> findQuizWithQuestionsById(Long quizId);
2323

24+
@Query("SELECT COUNT(qst) FROM Quiz q JOIN q.questions qst WHERE q.id = :quizId")
25+
Long countQuestionsByQuizId(Long quizId);
26+
2427
@Query(
2528
"""
2629
SELECT new io.f1.backend.domain.quiz.dto.QuizMinData (q.id, COUNT(qs.id))

backend/src/main/java/io/f1/backend/domain/stat/dao/StatJpaRepository.java

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

33
import io.f1.backend.domain.stat.dto.StatWithNickname;
4-
import io.f1.backend.domain.stat.dto.StatWithNicknameAndUserId;
4+
import io.f1.backend.domain.stat.dto.StatWithUserSummary;
55
import io.f1.backend.domain.stat.entity.Stat;
66

77
import org.springframework.data.domain.Page;
@@ -33,12 +33,12 @@ public interface StatJpaRepository extends JpaRepository<Stat, Long> {
3333
@Query(
3434
"""
3535
SELECT
36-
new io.f1.backend.domain.stat.dto.StatWithNicknameAndUserId
36+
new io.f1.backend.domain.stat.dto.StatWithUserSummary
3737
(u.id, u.nickname, s.totalGames, s.winningGames, s.score)
3838
FROM
3939
Stat s JOIN s.user u
4040
""")
41-
List<StatWithNicknameAndUserId> findAllStatWithNicknameAndUserId();
41+
List<StatWithUserSummary> findAllStatWithUserSummary();
4242

4343
@Modifying
4444
@Query(
@@ -63,4 +63,14 @@ public interface StatJpaRepository extends JpaRepository<Stat, Long> {
6363
s.user.id = :userId
6464
""")
6565
void updateStatByUserIdCaseLose(long deltaScore, long userId);
66+
67+
@Query(
68+
"""
69+
SELECT new io.f1.backend.domain.stat.dto.StatWithUserSummary(
70+
u.id, u.nickname, s.totalGames, s.winningGames, s.score
71+
)
72+
FROM Stat s JOIN s.user u
73+
WHERE u.id = :userId
74+
""")
75+
Optional<StatWithUserSummary> findStatWithUserSummary(long userId);
6676
}

backend/src/main/java/io/f1/backend/domain/stat/dao/StatRedisRepository.java

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
import io.f1.backend.domain.stat.dto.StatPageResponse;
66
import io.f1.backend.domain.stat.dto.StatResponse;
7-
import io.f1.backend.domain.stat.dto.StatWithNicknameAndUserId;
7+
import io.f1.backend.domain.stat.dto.StatWithUserSummary;
8+
import io.f1.backend.domain.user.dto.MyPageInfo;
89

910
import lombok.RequiredArgsConstructor;
1011

@@ -27,6 +28,7 @@
2728
@Repository
2829
@RequiredArgsConstructor
2930
public class StatRedisRepository {
31+
3032
private static final String STAT_RANK = "stat:rank";
3133
private static final String STAT_USER = "stat:user:%d";
3234
private static final String STAT_NICKNAME = "stat:%s";
@@ -42,7 +44,7 @@ public void setup() {
4244
valueOps = redisTemplate.opsForValue();
4345
}
4446

45-
public void initialize(StatWithNicknameAndUserId stat) {
47+
public void initialize(StatWithUserSummary stat) {
4648
String statUserKey = getStatUserKey(stat.userId());
4749
String statNicknameKey = getStatNickname(stat.nickname());
4850

@@ -149,4 +151,23 @@ private static String getStatNickname(String nickname) {
149151
private long getUserIdFromNickname(String nickname) {
150152
return ((Number) requireNonNull(valueOps.get(getStatNickname(nickname)))).longValue();
151153
}
154+
155+
public MyPageInfo getStatByUserId(long userId) {
156+
String statUserKey = getStatUserKey(userId);
157+
158+
Long rank = zSetOps.reverseRank(STAT_RANK, userId);
159+
Double score = zSetOps.score(STAT_RANK, userId);
160+
Map<Object, Object> statMap = hashOps.entries(statUserKey);
161+
162+
if (rank == null || score == null || statMap.isEmpty()) {
163+
throw new IllegalStateException("User not found in Redis: " + userId);
164+
}
165+
166+
return new MyPageInfo(
167+
(String) statMap.get("nickname"),
168+
rank + 1,
169+
(long) statMap.get("totalGames"),
170+
(long) statMap.get("winningGames"),
171+
score.longValue());
172+
}
152173
}

0 commit comments

Comments
 (0)