diff --git a/backend/src/main/java/ddangkong/domain/room/RoomRepository.java b/backend/src/main/java/ddangkong/domain/room/RoomRepository.java index 96282c357..7528681d2 100644 --- a/backend/src/main/java/ddangkong/domain/room/RoomRepository.java +++ b/backend/src/main/java/ddangkong/domain/room/RoomRepository.java @@ -12,6 +12,8 @@ public interface RoomRepository extends JpaRepository { + Optional findByUuid(String uuid); + @Lock(LockModeType.PESSIMISTIC_WRITE) @QueryHints(@QueryHint(name = "jakarta.persistence.lock.timeout", value = "5000")) @Query("SELECT r FROM Room r WHERE r.uuid = :uuid") diff --git a/backend/src/main/java/ddangkong/facade/room/RoomFacade.java b/backend/src/main/java/ddangkong/facade/room/RoomFacade.java index 302cfb622..2f7662132 100644 --- a/backend/src/main/java/ddangkong/facade/room/RoomFacade.java +++ b/backend/src/main/java/ddangkong/facade/room/RoomFacade.java @@ -6,9 +6,9 @@ import ddangkong.domain.room.member.RoomMembers; import ddangkong.facade.room.dto.InitialRoomResponse; import ddangkong.facade.room.dto.RoomInfoResponse; -import ddangkong.facade.room.dto.RoomStatusResponse; import ddangkong.facade.room.dto.RoomJoinResponse; import ddangkong.facade.room.dto.RoomSettingRequest; +import ddangkong.facade.room.dto.RoomStatusResponse; import ddangkong.facade.room.dto.RoundFinishedResponse; import ddangkong.facade.room.member.dto.MemberResponse; import ddangkong.service.balance.content.BalanceContentService; @@ -18,6 +18,7 @@ import ddangkong.service.room.member.MemberService; import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -144,7 +145,11 @@ private void delete(Room room) { @Transactional(readOnly = true) public RoomStatusResponse getRoomStatus(String uuid) { - Room room = roomService.getRoomWithLock(uuid); + Optional roomOptional = roomService.getRoom(uuid); + if (roomOptional.isEmpty()) { + return new RoomStatusResponse(false); + } + Room room = roomOptional.get(); return new RoomStatusResponse(room.isGameReady()); } diff --git a/backend/src/main/java/ddangkong/service/room/RoomService.java b/backend/src/main/java/ddangkong/service/room/RoomService.java index 58d37b5c3..8d5d6f4ec 100644 --- a/backend/src/main/java/ddangkong/service/room/RoomService.java +++ b/backend/src/main/java/ddangkong/service/room/RoomService.java @@ -6,6 +6,7 @@ import ddangkong.exception.room.NotFoundRoomException; import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -33,6 +34,11 @@ public Room getRoomWithLock(String uuid) { .orElseThrow(NotFoundRoomException::new); } + @Transactional(readOnly = true) + public Optional getRoom(String uuid) { + return roomRepository.findByUuid(uuid); + } + @Transactional(readOnly = true) public List findRoomsBefore(LocalDateTime modifiedAt) { return roomRepository.findAllByLastModifiedAtBefore(modifiedAt); diff --git a/backend/src/main/java/ddangkong/service/room/balance/roomcontent/RoomContentService.java b/backend/src/main/java/ddangkong/service/room/balance/roomcontent/RoomContentService.java index 253b8ec66..d1f25c4fd 100644 --- a/backend/src/main/java/ddangkong/service/room/balance/roomcontent/RoomContentService.java +++ b/backend/src/main/java/ddangkong/service/room/balance/roomcontent/RoomContentService.java @@ -50,11 +50,6 @@ private void startRound(RoomContent roomContent, int timeLimit) { public void deleteRoomContents(Room room) { List roomContents = roomContentRepository.findAllByRoom(room); roomContentRepository.deleteAllInBatch(roomContents); - - if (room.getTotalRound() != roomContents.size()) { - log.error("방의 총 라운드와 방 컨텐츠 개수가 일치하지 않습니다. roomId: {}, totalRound: {}, roomContent 개수: {}", - room.getId(), room.getTotalRound(), roomContents.size()); - } } @Transactional(readOnly = true) diff --git a/backend/src/test/java/ddangkong/facade/room/RoomFacadeTest.java b/backend/src/test/java/ddangkong/facade/room/RoomFacadeTest.java index 333c33bc7..9a4c8ba05 100644 --- a/backend/src/test/java/ddangkong/facade/room/RoomFacadeTest.java +++ b/backend/src/test/java/ddangkong/facade/room/RoomFacadeTest.java @@ -649,10 +649,12 @@ class 방에_참여_가능_여부 { } @Test - void 존재하지_않는_방에_참여_가능_여부를_조회하면_예외가_발생한다() { - // when & then - assertThatThrownBy(() -> roomFacade.getRoomStatus("NotExist")) - .isExactlyInstanceOf(NotFoundRoomException.class); + void 존재하지_않는_방에_참여할_수_없다() { + // when + RoomStatusResponse actual = roomFacade.getRoomStatus("NotExistUuid"); + + // then + assertThat(actual.isJoinable()).isFalse(); } } } diff --git a/frontend/src/apis/room.ts b/frontend/src/apis/room.ts index 214c3621e..2b65f1071 100644 --- a/frontend/src/apis/room.ts +++ b/frontend/src/apis/room.ts @@ -3,6 +3,7 @@ import fetcher from './fetcher'; import { API_URL } from '@/constants/url'; import { RoomInfo, CreateOrEnterRoomResponse, Category, RoomSettingApply } from '@/types/room'; + interface CategoryResponse { categories: Category[]; } diff --git a/frontend/src/pages/NicknamePage/NicknamePage.styled.ts b/frontend/src/pages/NicknamePage/NicknamePage.styled.ts index fc9de6073..ba430df72 100644 --- a/frontend/src/pages/NicknamePage/NicknamePage.styled.ts +++ b/frontend/src/pages/NicknamePage/NicknamePage.styled.ts @@ -44,7 +44,6 @@ export const nicknameInput = css` background-color: ${Theme.color.gray200}; outline: none; `; - export const noVoteTextContainer = css` display: flex; flex-direction: column; @@ -62,4 +61,4 @@ export const noVoteText = css` export const angryImage = css` width: 16rem; height: 14rem; -`; +`; \ No newline at end of file diff --git a/frontend/src/pages/NicknamePage/NicknamePage.tsx b/frontend/src/pages/NicknamePage/NicknamePage.tsx index 475ff1fc7..8c2dd70c4 100644 --- a/frontend/src/pages/NicknamePage/NicknamePage.tsx +++ b/frontend/src/pages/NicknamePage/NicknamePage.tsx @@ -1,3 +1,4 @@ + import { useQuery } from '@tanstack/react-query'; import { useEffect } from 'react'; import { useParams } from 'react-router-dom';