서버 없이 여러 폰을 한 방에 — Unity LAN 연결과 방 찾기
외부 서버 없이 같은 Wi-Fi나 방장 폰 핫스팟에서 여러 폰이 한 방에 모이게 만든 과정. 방장 폰의 TCP 47801 서버와 UDP 47800 비콘, 비콘이 안 올 때의 서브넷 스캔, IP 대신 「방 번호」, 그리고 PC에서 시험할 때 막힌 방화벽까지 정리했다.
애드소프트 기술블로그
애드소프트 박재호입니다. IIS·ASP.NET·Docker·메일서버를 직접 운영하며 겪은 문제와 해결 과정을 기록합니다.
외부 서버 없이 같은 Wi-Fi나 방장 폰 핫스팟에서 여러 폰이 한 방에 모이게 만든 과정. 방장 폰의 TCP 47801 서버와 UDP 47800 비콘, 비콘이 안 올 때의 서브넷 스캔, IP 대신 「방 번호」, 그리고 PC에서 시험할 때 막힌 방화벽까지 정리했다.
사다리에 한 명만 걸리던 「오늘 누가 쏘냐?」를 등수대로 커피값을 나눠 내는 방식으로 바꾼 기록. 상위 2명 면제·하위 최대 4명 등차 분담·100원 단위 내림과 꼴등 몫의 나머지를 코드와 손계산으로 확인하고, 게임 15개의 등수 기준과 결과 화면을 정리했다.
실기기 없이 테스트하려고 Unity WebGL 빌드를 개발 PC의 IIS에 올렸다. 브라우저에서는 한글이 전부 빈칸이었고, 폰 LTE에서는 40MB wasm을 받다 끊겼다. 한글 폰트 내장과 Brotli 압축 해제 폴백, 스트리핑으로 해결한 과정과 WebGL의 한계를 정리했다.
32x32 픽셀 캐릭터 8종, 효과음 6종, 배경음악, 한글 폰트 서브셋, 앱 아이콘과 스토어 그래픽까지 「오늘 누가 쏘냐?」의 에셋은 전부 직접 작성한 Python 스크립트로 만든다. 스크립트 코드와 Unity 쪽 임포트 설정, 이 방식의 장단점을 정리했다.
프리팹도 씬 편집도 없이 화면 20여 개를 코드로만 만든 구조. 진입점 Bootstrap, UI 헬퍼 UIFactory, 화면 전환 ScreenBase, 그리고 갤럭시 폴드에서 화면 아래가 잘린 문제를 CanvasScaler 한 줄로 고친 이야기.
커피 내기용 파티게임 「오늘 누가 쏘냐?」를 Unity 6로 만든 기록. 사다리 하나로 시작해 게임 15개, 서버 없는 여러 폰 대전, Play 스토어 비공개 테스트까지 온 과정을 연재 첫 글로 정리했다.
블로그에 방문 통계를 직접 만들었다. IP와 User-Agent는 저장하지 않고 무작위 ID 쿠키 하나로 방문자를 구분한다. 요청 처리 중에는 DB를 건드리지 않도록 메모리 큐에 쌓았다가 5초마다 일괄 저장한다. 수집 대상 거르기, 유입 경로 분류까지 설계를 정리했다.
블로그 디자인을 Bootstrap 5에서 Tailwind CSS v4로 바꿨다. dotnet build에 CSS 빌드를 끼워 넣은 방법과, 마크다운 표의 class="table" 충돌, 코드 블록 이중 배경, 관리자 표의 sr-only 때문에 모바일 폭이 넓어진 문제를 정리했다.
.NET Framework 4.8 MVC 5로 만들어 운영에 올린 블로그를 ASP.NET Core 10으로 옮겼다. URL, 운영 DB, 관리자 비밀번호를 그대로 둔 채 프레임워크만 바꾸기 위해 정한 원칙과, EF6가 만든 기존 스키마를 EF Core 10이 이어받게 한 방법을 정리했다.
디자인 개편을 운영 서버에 배포하다 동기화가 실패했고, 사이트가 2~3분 동안 503을 냈다. Web Deploy의 AppOffline 규칙이 올려 둔 app_offline.htm이 실패한 배포 뒤에 그대로 남은 것이 원인이었다. 동작 원리와 재시도로 바꾼 배포 스크립트를 정리했다.