@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를 명시적으로 호출하도록 수정하여
트랜젝션 관련 문제가 해결되었음.