Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@
import io.f1.backend.domain.game.app.RoomService;
import io.f1.backend.domain.game.dto.request.RoomCreateRequest;
import io.f1.backend.domain.game.dto.response.RoomCreateResponse;
import io.f1.backend.domain.game.dto.response.RoomListResponse;

import jakarta.validation.Valid;

import lombok.RequiredArgsConstructor;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
Expand All @@ -35,4 +37,9 @@ public RoomCreateResponse saveRoom(@RequestBody @Valid RoomCreateRequest request

return roomService.saveRoom(request, loginUser);
}

@GetMapping
public RoomListResponse getAllRooms() {
return roomService.getAllRooms();
}
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,24 @@
package io.f1.backend.domain.game.app;

import static io.f1.backend.domain.game.mapper.RoomMapper.toRoomSetting;
import static io.f1.backend.domain.game.mapper.RoomMapper.*;

import io.f1.backend.domain.game.dto.request.RoomCreateRequest;
import io.f1.backend.domain.game.dto.response.RoomCreateResponse;
import io.f1.backend.domain.game.dto.response.RoomListResponse;
import io.f1.backend.domain.game.dto.response.RoomResponse;
import io.f1.backend.domain.game.model.GameSetting;
import io.f1.backend.domain.game.model.Player;
import io.f1.backend.domain.game.model.Room;
import io.f1.backend.domain.game.model.RoomSetting;
import io.f1.backend.domain.game.store.RoomRepository;
import io.f1.backend.domain.quiz.entity.Quiz;
import io.f1.backend.domain.user.entity.User;

import lombok.RequiredArgsConstructor;

import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;

Expand All @@ -38,4 +43,27 @@ public RoomCreateResponse saveRoom(RoomCreateRequest request, Map<String, Object

return new RoomCreateResponse(newId);
}

// todo quizService에서 퀴즈 조회 메서드로 변경
public RoomListResponse getAllRooms() {
Copy link
Collaborator

@jiwon1217 jiwon1217 Jul 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[L4-변경제안]
transactional readonly를 명시하면 좋다고 생각합니다 !

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

인메모리 리포지토리라 트랜잭션이 실질적으로 동작하진 않지만, 의도 전달 목적으로 명시하는 걸 말씀하시는 걸까요?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아 인메모리 레포지토리란걸 잊고 있었네요. 수정 없이 이대로 하시면 될 것 같습니다 !

List<Room> rooms = roomRepository.findAll();
List<RoomResponse> roomResponses =
rooms.stream()
.map(
room -> {
User user = new User(); // 임시 유저 객체
user.setNickname("임시 유저 닉네임");

Quiz quiz = new Quiz(); // 임시 퀴즈 객체
quiz.setTitle("임시 퀴즈 제목");
quiz.setDescription("임시 퀴즈 설명");
quiz.setThumbnailUrl("임시 이미지");
quiz.setQuestions(List.of());
quiz.setCreator(user);

return toRoomResponse(room, quiz);
})
.toList();
return new RoomListResponse(roomResponses);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package io.f1.backend.domain.game.dto.response;

import java.util.List;

public record RoomListResponse(List<RoomResponse> rooms) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package io.f1.backend.domain.game.dto.response;

public record RoomResponse(
Long roomId,
String roomName,
int maxUserCount,
int currentUserCount,
boolean locked,
String roomState,
String quizTitle,
String description,
String creator,
int numberOfQuestions,
String thumbnailUrl) {}
Original file line number Diff line number Diff line change
@@ -1,12 +1,30 @@
package io.f1.backend.domain.game.mapper;

import io.f1.backend.domain.game.dto.request.RoomCreateRequest;
import io.f1.backend.domain.game.dto.response.RoomResponse;
import io.f1.backend.domain.game.model.Room;
import io.f1.backend.domain.game.model.RoomSetting;
import io.f1.backend.domain.quiz.entity.Quiz;

public class RoomMapper {

public static RoomSetting toRoomSetting(RoomCreateRequest request) {
return new RoomSetting(
request.roomName(), request.maxUserCount(), request.locked(), request.password());
}

public static RoomResponse toRoomResponse(Room room, Quiz quiz) {
return new RoomResponse(
room.getId(),
room.getRoomSetting().roomName(),
room.getRoomSetting().maxUserCount(),
room.getPlayerSessionMap().size(),
room.getRoomSetting().locked(),
room.getState().name(),
quiz.getTitle(),
quiz.getDescription(),
quiz.getCreator().getNickname(),
quiz.getQuestions().size(),
quiz.getThumbnailUrl());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@

import io.f1.backend.domain.game.model.Room;

import java.util.List;

public interface RoomRepository {

void saveRoom(Room room);

List<Room> findAll();
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

Expand All @@ -17,6 +19,11 @@ public void saveRoom(Room room) {
roomMap.put(room.getId(), room);
}

@Override
public List<Room> findAll() {
return new ArrayList<>(roomMap.values());
}

// 테스트 전용 메소드
public Room getRoomForTest(Long roomId) {
return roomMap.get(roomId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,14 @@
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;

import lombok.Getter;
import lombok.Setter;

import java.util.ArrayList;
import java.util.List;

@Getter
@Setter // quizService의 퀴즈 조회 메서드 구현 시까지 임시 사용
@Entity
public class Quiz extends BaseEntity {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,13 @@
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;

import lombok.Getter;
import lombok.Setter;

import java.time.LocalDateTime;

@Getter
@Setter // quizService의 퀴즈 조회 메서드 구현 시까지 임시 사용
@Entity
@Table(name = "`user`")
public class User extends BaseEntity {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import org.junit.jupiter.api.Test;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

class RoomRepositoryTests {
Expand Down Expand Up @@ -61,4 +62,47 @@ void saveRoom_test() {
assertThat(savedRoom.getRoomSetting().locked()).isEqualTo(request.locked());
assertThat(savedRoom.getRoomSetting().password()).isEqualTo(request.password());
}

@Test
@DisplayName("게임 방 전체 조회 테스트")
void findAll_test() throws Exception {

// given: 테스트를 위한 방 2개 생성 및 저장
RoomCreateRequest request1 = new RoomCreateRequest("방이름_1", 3, "password1", true);
RoomCreateRequest request2 = new RoomCreateRequest("방이름_2", 5, "", false);

Player host1 = new Player(1L, "방장 1");
Player host2 = new Player(2L, "호스트2");

GameSetting gameSetting = new GameSetting(1L, 10, 60);

RoomSetting roomSetting1 =
new RoomSetting(
request1.roomName(),
request1.maxUserCount(),
request1.locked(),
request1.password());
RoomSetting roomSetting2 =
new RoomSetting(
request2.roomName(),
request2.maxUserCount(),
request2.locked(),
request2.password());

Room room1 = new Room(1L, roomSetting1, gameSetting, host1);
Room room2 = new Room(2L, roomSetting2, gameSetting, host2);

roomRepository.saveRoom(room1);
roomRepository.saveRoom(room2);

// when: 방 전체 조회 메서드로 전체 방 리스트 조회
List<Room> allRooms = roomRepository.findAll();

// then: 저장한 방 2개가 모두 조회되어야하고
assertThat(allRooms).hasSize(2);
assertThat(allRooms).extracting("id").containsExactlyInAnyOrder(1L, 2L);
assertThat(allRooms)
.extracting(room -> room.getRoomSetting().roomName())
.containsExactlyInAnyOrder("방이름_1", "방이름_2");
}
}