트러블슈팅

두주·2025년 8월 22일
    @Transactional
    fun createGameRoom(req: CreateGameRoomRequest, session: HttpSession): Int {

        val nickname = getCurrentUserNickname(session)
        validateExistingOwner(session)

        val nextRoomNumber = findNextAvailableRoomNumber()
        val newGame = req.to(nextRoomNumber, nickname)

        val selectedSubjects = selectSubjectsForGameRoom(req)
        if (selectedSubjects.isNotEmpty()) {
            val citizenSubject = selectedSubjects.first()
            newGame.citizenSubject = citizenSubject

            val liarSubject = if (selectedSubjects.size > 1) selectedSubjects[1] else citizenSubject
            newGame.liarSubject = liarSubject
        }

        val savedGame = gameRepository.save(newGame)

        selectedSubjects.forEach { subject ->
            val gameSubject = GameSubjectEntity(
                game = savedGame,
                subject = subject
            )
            gameSubjectRepository.save(gameSubject)
        }

        joinGame(savedGame, getCurrentUserId(session), nickname)

        return savedGame.gameNumber
    }

게임 방을 개설하는 코드를 실행하면 IllegalStateException 이 발생했음.

방 생성을 하게 되면 방장이란 뜻이고,
방장은 자동으로 게임에 참여해야 하기 때문에 joinGame을 통해 생성한 방으로 자동 입장하는 구조

    @Transactional
    fun joinGame(req: JoinGameRequest, session: HttpSession): GameStateResponse {

GameService의 createRoom 메소드 트랜잭션이 끝나기 전에
내부적으로 joinGame을 호출하는 구조로 인해 인해 createRoom에서 설정한
citizenSubject가 데이터베이스에 커밋되지 않은 상태였고
joinGame에서는 null로 조회되어 예외가 발생했던 것.

@Transactional
    fun createGameRoom(req: CreateGameRoomRequest, session: HttpSession): Int {

        val nickname = getCurrentUserNickname(session)
        validateExistingOwner(session)

        val nextRoomNumber = findNextAvailableRoomNumber()
        val newGame = req.to(nextRoomNumber, nickname)

        val selectedSubjects = selectSubjectsForGameRoom(req)
        if (selectedSubjects.isNotEmpty()) {
            val citizenSubject = selectedSubjects.first()
            newGame.citizenSubject = citizenSubject

            val liarSubject = if (selectedSubjects.size > 1) selectedSubjects[1] else citizenSubject
            newGame.liarSubject = liarSubject
        }

        val savedGame = gameRepository.save(newGame)

        selectedSubjects.forEach { subject ->
            val gameSubject = GameSubjectEntity(
                game = savedGame,
                subject = subject
            )
            gameSubjectRepository.save(gameSubject)
        }

        return savedGame.gameNumber
    }

createRoom 호출 후 방장이 joinRoom API를 명시적으로 호출하도록 수정하여
트랜젝션 관련 문제가 해결되었음.

profile
야옹.

0개의 댓글