top of page

넷코드의 함정: 조용히 사라지는 메시지

작성자 사진: Marcel Dütscher
Marcel Dütscher
6월 21일
1분 분량

멀티플레이 버그는 따로 하나의 종족이에요. 충돌도 없고, 오류 로그도 없고, 그냥 아무 일도 일어나지 않아요. 우리 네트워킹 코드에서 가장 좋아하는(?) 함정 두 가지를 경고도 할 겸 재미 삼아 소개할게요.


함정 1: 등록하지 않은 메시지. 우리 네트워크 프로토콜에는 “블록 변경”, “플레이어 이동”, “채팅” 같은 메시지 클래스가 있어요. 새 메시지 종류는 모두 코덱에 등록해야 ID를 받고 직렬화할 수 있죠. 이걸 잊으면 최악의 일이 벌어져요. 전송 호출은 실패하는데, 하필 오류가 조용히 삼켜지는 곳에서 실패하거든요. 충돌도 로그도 없이 기능이 “그냥 안 돼요”. 우리도 여러 번 디버깅하다가 반사적으로 확인하는 습관이 생겼어요. 새 메시지 클래스? 먼저 물어봐요. 등록했나요?


함정 2: 유령 블록. 예를 들어 스크립트가 지형을 바꾸는 것처럼 서버가 블록을 바꾸면, 접속한 모든 플레이어에게 직접 알려야 해요. 브로드캐스트를 잊으면 유령 블록이 생겨요. 서버는 거기에 블록이 있다고 아는데, 클라이언트에는 공기로 보이는 거죠. 플레이어는 보이지 않는 벽에 부딪히거나, 더 나쁘게는 서버에는 이미 없는 자리에 건물을 지어요. 청크를 다시 불러와야 두 세계가 다시 맞아떨어져요.


공통점은 이거예요. 멀티플레이에는 늘 두 가지 진실, 즉 서버의 진실과 클라이언트의 진실이 있고, 둘을 맞춰야 하는 곳은 모두 함정이 될 수 있어요. 그래서 바로 이 동기화를 확인하는 테스트와 새 메시지용 체크리스트를 만들었어요. 화려하진 않지만, 그 뒤로 유령은 드물어졌어요.

최근 게시물

전체 보기
새 버전이 0.9.2가 아니라 2026.7.19인 이유 🗓️

오늘 업데이트하면 버전 0.9.1에서 2026.7.19로 껑충 뛰어요. 오타처럼 보이지만 의도한 결정이에요. 버전 방식을 “시맨틱” 버전에서 날짜 기반 버전(연.월.순번)으로 바꿨어요. 이유를 설명할게요. 옛 방식은 아무도 묻지 않는 질문에 답했어요. 시맨틱 버전(0.9.1, 1.2.3 …)은 소프트웨어 라이브러리 세계에서 왔어요. 거기서는 훌륭해요. 첫

 
 
대청소 완료: GitHub 캐시를 드디어 제대로 쓰게 됐어요 🧹

지난 기술 글에서 우리 빌드와 검사 파이프라인에 정말로 드는 비용을 재 봤고, 돈이 아니라 기다리는 시간과 저장 공간이 문제라는 걸 알게 됐어요. 그 글은 “정리 작업은 계획했지만 아직 하지 못했다”로 끝났죠. 생각보다 빨리 끝났어요. 오늘 낮부터 메인 브랜치에 들어가 있어요. 숫자를 보여 드릴게요. 결과부터요. 저장소의 캐시 사용량이 항목 63개에 5.3

 
 
한 달에 빌드 천 번 — 그런데 한 번도 돈이 들지 않아요 ⚙️

먼저 정정할 게 있어요. 이 글의 첫 버전은 GitHub 빌드 시간이 다 떨어져서 Pro 계정으로 올릴 수밖에 없었다고 썼어요. 그건 틀렸어요. 문서를 한 번만 봤어도 풀렸을 일이에요. 공개 저장소에서는 GitHub 빌드 시간이 무료예요. 아티팩트와 캐시도요. 저희 저장소는 5월 말부터 공개였으니, 단 1분도 돈을 낸 적이 없고 앞으로도 낼 일이 없어요.

 
 

댓글


더 이상 게시물에 대한 댓글 기능이 지원되지 않습니다. 자세한 사항은 사이트 소유자에게 문의하세요.
bottom of page