Loading the catalog…
Loading the catalog…
1. LobbyState 기반 매칭 상태 관리 매칭 과정에서 UI 오브젝트를 개별적으로 켜고 끄는 방식 대신, 현재 로비 상태를 기준으로 UI와 사용자 입력을 제어하도록 구성했습니다. Lobby ↓ MatchRequesting ↓ MatchWaiting ├─ MatchCancelling ├─ MatchFound ├─ EnteringGame └─ Error 이를 통해 다음과 같은 상황에서 중복 입력이나 잘못된 상태 전환이 발생하지 않도록 했습니다. 매칭 버튼 연타 매칭 중 재요청 취소 버튼 연타 매칭 취소 도중 성공 이벤트 수신 중복 MatchFound 처리 Scene 중복 전환 특히 매칭 요청과 서버 응답을 별개의 상태로 구분하여, 실제 서버 연동 시 비동기 응답 지연에도 대응할 수 있도록 설계했습니다. 2. 패킷 설계서 기반 Mock Matchmaking 구현 기존의 임의적인 “몇 초 후 성공/실패” Mock 대신 팀의 WebSocket 패킷 설계서와 동일한 흐름을 따르도록 Mock을 재구성했습니다. 실제 매칭 프로토콜은 다음 흐름을 따릅니다. MATCH_JOIN ↓ MATCH_QUEUED ↓ ├─ MATCH_CANCEL │ ↓ │ MATCH_CANCELLED │ └─ MATCH_FOUND MATCH_QUEUED 에서는 서버의 큐 등록 시각과 제한 시간을 받아 대기 시간을 표시하고, 매칭 대기 제한은 현재 60초로 정의되어 있습니다. :chatgpt-content-reference{index="0"} 이를 Mock에서도 동일하게 재현하기 위해 다음 데이터를 구성했습니다. MatchQueuedInfo - QueuedAt - TimeoutSec MatchInfo - GameId - Opponent - ReadyTimeoutSec Mock과 실제 서버 구현 사이에 MatchmakingClientBase 라는 최소한의 연결 경계를 두어, 이후 실제 WebSocket 연동 시 LobbyManager 와 UI 로직을 다시 작성하지 않도록 했습니다. 현재 LobbyManager ↓ MockMatchmakingClient 실제 서버 연동 이후 LobbyManager ↓ Network Matchmaking 구현 ↓ PacketRouter / Dispatcher ↓ WebSocket 3. 서버 기준 매칭 취소 사유 처리 패킷 명세의 매칭 취소 사유를 클라이언트에서도 구분했습니다. USER_REQUEST TIMEOUT READY_TIMEOUT OPPONENT_DISCONNECTED 이를 통해 단순히 “매칭 실패” 하나로 처리하지 않고 상황에 따라 다른 UI 메시지와 상태 복귀 처리가 가능하도록 했습니다. 예를 들어: TIMEOUT → "매칭 시간이 초과되었습니다." READY_TIMEOUT → "게임 준비 시간이 초과되어 매칭이 취소되었습니다." OPPONENT_DISCONNECTED → "상대방의 연결이 종료되어 매칭이 취소되었습니다." 패킷 설계에서도 매칭 대기 중 취소뿐 아니라 게임 준비 단계 실패까지 MATCH_CANCELLED 의 사유로 구분하도록 정의되어 있습니다. :chatgpt-content-reference{index="1"} 4. 매칭 취소와 MatchFound 경합 처리 오늘 구현에서 가장 중요하게 검증한 예외 상황 중 하나입니다. 사용자가 취소 버튼을 눌렀더라도 서버에서 이미 매칭이 먼저 확정된 경우 다음과 같은 상황이 발생할 수 있습니다. MATCH_CANCEL 전송 ↓ MATCH_FOUND 수신 이 경우 클라이언트가 “취소 버튼을 눌렀으니 성공 이벤트를 무시”하도록 만들면 서버와 클라이언트 상태가 달라질 수 있습니다. 따라서 MatchCancelling 상태에서도 MATCH_FOUND 를 정상적으로 받아들이도록 처리했습니다. MatchWaiting → 취소 버튼 → MatchCancelling → MATCH_FOUND → MatchFound 현재 패킷 설계에서도 취소 요청과 매칭 성사가 동시에 발생하면 서버가 먼저 처리한 결과를 따르며, 클라이언트가 MATCH_CANCEL 을 보낸 뒤라도 MATCH_FOUND 를 수신하면 게임 진입을 계속하도록 정의되어 있습니다. :chatgpt-content-reference{index="2"} Mock에서 응답 시간을 조절하여 실제 경합 상황도 테스트했습니다. 5. 매칭 대기 UI 및 타이머 구현 Lobby UI를 일반 로비 상태와 매칭 상태로 나누었습니다. LobbyContent ├─ Nickname ├─ Rating └─ MatchButton MatchingContent ├─ MatchingStatusText ├─ WaitingTimeText └─ CancelButton 매칭 상태에 따라 다음과 같이 화면을 갱신합니다. MatchRequesting → 매칭을 요청하는 중입니다... MatchWaiting → 상대를 찾는 중입니다... MatchCancelling → 매칭을 취소하는 중입니다... MatchFound → 매칭 성공! 타이머 역시 클라이언트가 임의로 시작 시간을 정하는 대신 MATCH_QUEUED 에서 전달되는 queuedAt 을 기준으로 계산하도록 구성했습니다. 이는 실제 서버와 클라이언트의 대기 시간 표시가 어긋나는 문제를 줄이기 위한 구조입니다. :chatgpt-content-reference{index="3"} 6. MatchFound 이후 Game Scene 전환 구현 매칭 성공 이후 인게임 진입에 필요한 MatchInfo 를 MatchSession 에 저장한 뒤 Game Scene으로 전환하도록 구현했습니다. MATCH_FOUND ↓ MatchInfo 저장 ↓ MatchFound 상태 ↓ Game Scene Load 저장되는 정보는 현재 패킷 명세에 맞춰 다음과 같이 구성했습니다. GameId Opponent Profile ReadyTimeoutSec MATCH_FOUND 패킷에는 상대 정보와 함께 게임 준비 제한 시간이 전달되며, 현재 준비 제한은 15초입니다. :chatgpt-content-reference{index="4"} Scene Index에 의존하지 않고 Scene 이름으로 전환하도록 구현하여 팀원들이 Scene을 추가하거나 순서를 변경하더라도 코드 영향이 최소화되도록 했습니다. 7. Scene 로드 완료 후 GAME_READY 처리 매칭 성공 즉시 서버에 준비 완료를 보내는 것이 아니라, 인게임 Scene이 실제로 로드된 후 GAME_READY 를 보내도록 구성했습니다. MATCH_FOUND ↓ Game Scene Load ↓ GameEntryController.Start() ↓ GAME_READY 이를 위해 다음 구조를 추가했습니다. GameEntryClientBase └─ MockGameEntryClient GameEntryController 현재 Mock에서는: [MOCK] GAME_READY 전송 - gameId: ... 로그를 통해 정상 전송 여부를 검증합니다. 실제 서버 연동 후에는 Mock 구현만 네트워크 송신 코드로 교체할 수 있습니다. GAME_READY 는 Scene 로드 완료 후 전송해야 하며, 서버는 두 플레이어 모두 준비된 후에만 GAME_START 를 전달하도록 설계되어 있습니다. 이는 Scene 로드 이전에 인게임 패킷이 도착하는 문제를 방지하기 위한 구조입니다. :chatgpt-content-reference{index="5"} 8. PlayerProfile 서버 명세 반영 초기에는 닉네임과 레이팅만 사용하던 PlayerProfile 을 최신 패킷 설계에 맞춰 확장했습니다. UserId Nickname Wins Losses Rating 현재 로그인 Mock 코드와의 호환성을 유지하기 위해 기존 생성 방식도 그대로 사용할 수 있도록 구성했습니다. 패킷 설계서의 공통 PlayerProfile 역시 동일한 데이터를 기준으로 합니다. :chatgpt-content-reference{index="6"} 테스트한 주요 시나리오 오늘 구현 후 다음 흐름을 직접 검증했습니다. 1. 정상 매칭 Lobby → MatchRequesting → MatchWaiting → MatchFound 2. 사용자 매칭 취소 MatchWaiting → MatchCancelling → MATCH_CANCELLED(USER_REQUEST) → Lobby 3. 매칭 Timeout MatchWaiting → MATCH_CANCELLED(TIMEOUT) → Lobby 4. 취소 / 성공 경합 MatchWaiting → Cancel → MatchCancelling → MATCH_FOUND → MatchFound 5. 게임 Scene 진입 MATCH_FOUND → MatchInfo 저장 → Game Scene → GAME_READY 테스트 과정에서 Scene 이름과 로드 대상 문자열이 일치하지 않아 Scene 로드가 실패하는 문제도 확인했으며, 실제 Scene 이름으로 수정하여 정상 동작을 검증했습니다. 현재까지 완성된 전체 흐름 현재 클라이언트에서는 서버 없이 다음 흐름까지 검증할 수 있습니다. Login ↓ PlayerProfile 생성 ↓ Lobby ↓ MATCH_JOIN Mock ↓ MATCH_QUEUED ↓ 매칭 대기 ├─ 사용자 취소 ├─ Timeout └─ MATCH_FOUND ↓ MatchInfo 저장 ↓ Game Scene Load ↓ GAME_READY 즉, 로그인부터 서버의 게임 시작 직전까지 로비/매칭 클라이언트의 주요 사용자 흐름을 Mock 환경에서 독립적으로 실행할 수 있는 상태 까지 구현했습니다.
What RADAR observed and classified to build this opportunity. It is what the source published, not a verification that the offer is still active.
최종프로젝트 2일차. 1. LobbyState 기반 매칭 상태 관리 매칭 과정에서 UI 오브젝트를 개별적으로 켜고 끄는 방식 대신, 현재 로비 상태를 기준으로 UI와 사용자 입력을 제어하도록 구성했습니다. Lobby ↓ MatchRequesting ↓ MatchWaiting ├─ MatchCancelling ├─ MatchFound ├─ EnteringGame └─ Error 이를 통해 다음과 같은 상황에서 중복 입력이나 잘못된 상태 전환이 발생하지 않도록 했습니다. 매칭 버튼 연타 매칭 중 재요청 취소 버튼 연타 매칭 취소 도중 성공 이벤트 수신 중복 MatchFound 처리 Scene 중복 전환 특히 매칭 요청과 서버 응답을 별개의 상태로 구분하여, 실제 서버 연동 시 비동기 응답 지연에도 대응할 수…
Open source