
개발자 커뮤니티에는 유서 깊은 전통이 하나 있어요. “되긴 되는데 왜 하는지는 묻지 마세요” 류의 프로젝트요. 핑(ping) 패킷이 네트워크를 떠도는 시간을 이용해 데이터를 저장한다든가, 유튜브 영상의 픽셀에 파일을 인코딩해서 무한 클라우드 저장소를 만든다든가 하는 것들이요. 이번에 소개할 'Sulfur'도 그 계보를 당당히 잇는 프로젝트예요. 임의의 파일을 마인크래프트 월드로 변환해서 저장하는 도구거든요. 그러니까 여러분의 PDF나 사진이 블록으로 지어진 세계가 되고, 그 세계를 다시 원래 파일로 복원할 수 있다는 거예요.
마인크래프트 월드가 원래 어떻게 생겼냐면요
이 장난이 성립하는 이유를 알려면 마인크래프트가 세계를 저장하는 방식을 먼저 봐야 해요. 마인크래프트 세계는 '청크(chunk)'라는 단위로 쪼개져 있어요. 가로세로 16×16 블록짜리 기둥 하나가 청크고, 이 청크들이 모여서 리전(region) 파일에 저장돼요. 확장자 .mca를 쓰는 '앤빌(Anvil) 포맷' 파일이죠. 그리고 그 안의 데이터는 NBT(Named Binary Tag)라는 마인크래프트 고유의 바이너리 직렬화 포맷으로 기록돼요. NBT가 뭐냐면, JSON처럼 이름 붙은 값들을 중첩 구조로 담되 텍스트가 아니라 바이너리로 꽉꽉 눌러 담는 포맷이라고 생각하면 돼요. 즉 마인크래프트 월드라는 건 결국 구조가 잘 정의된 바이너리 파일 덩어리라는 거예요. 구조가 명확하다는 건, 그 안에 우리가 원하는 데이터를 규칙에 맞게 심을 수 있다는 뜻이고요.
파일이 블록이 되는 원리
아이디어의 뼈대는 의외로 단순해요. 파일은 결국 바이트의 나열이잖아요. 바이트 하나는 0부터 255까지 256가지 값을 가질 수 있는데, 마인크래프트에는 블록 종류가 수백 가지나 있거든요. 그러면 블록 256종을 골라서 각각에 0부터 255까지 값을 하나씩 배정하면, 블록 하나가 정확히 1바이트를 표현할 수 있어요. 돌은 0x00, 흙은 0x01, 이런 식으로요. 파일을 바이트 단위로 읽으면서 해당하는 블록을 세계에 차곡차곡 쌓으면 인코딩이 되고, 반대로 세계를 정해진 순서로 순회하며 블록을 바이트로 되돌리면 디코딩이 되는 거죠. 청크 하나의 높이를 256으로 잡으면 16×16×256, 즉 65,536개의 블록이 들어가니까 청크 하나에 64KB를 담을 수 있는 셈이에요.
물론 실제로 만들려면 고민할 게 많아요. 파일 이름과 크기 같은 메타데이터를 어디에 둘지, 데이터 손상을 확인할 체크섬은 어떻게 넣을지, 블록을 어떤 순서로 순회할지 같은 것들이요. 게다가 최신 마인크래프트는 청크 안의 블록 종류를 '팔레트' 방식으로 압축해서 저장하기 때문에, 이 포맷을 정확히 따라야 게임이 월드를 깨진 파일로 인식하지 않고 실제로 열어서 걸어다닐 수 있어요. 이 지점이 이런 프로젝트의 진짜 재미이자 난이도예요. 그냥 데이터를 욱여넣는 게 아니라, 마인크래프트가 '합법적인 세계'로 읽어주는 파일을 만들어야 하거든요.
이런 뻘짓의 계보와 진짜 가치
앞서 말한 핑 스토리지나 유튜브 스토리지 같은 프로젝트들과 마찬가지로, 이런 작업의 진짜 가치는 실용성이 아니라 학습에 있어요. 이걸 만들려면 남의 파일 포맷을 리버스 엔지니어링하듯 뜯어봐야 하고, 바이너리 인코딩과 압축, 직렬화를 손으로 직접 다뤄야 하고, 온갖 엣지 케이스와 싸워야 하거든요. 평소 JSON API만 주고받던 개발자에게는 바이트 레벨에서 데이터를 바라보는 감각을 길러주는 최고의 훈련이에요. 데이터를 전혀 다른 매체 안에 숨긴다는 점에서 스테가노그래피(정보 은닉 기술)의 개념과도 자연스럽게 맞닿아 있고요.
한국 개발자에게는요
거창하게 시작할 필요 없어요. 마인크래프트 NBT 파서는 여러 언어로 라이브러리가 나와 있어서, 주말 프로젝트로 세이브 파일을 읽고 쓰는 것부터 해볼 수 있거든요. 게임 파일 포맷 분석은 파싱, 인코딩, 파일 입출력을 한 번에 연습할 수 있는 재미있는 소재고, 사이드 프로젝트 포트폴리오로도 확실히 눈에 띄는 주제예요.
정리하면, 파일을 마인크래프트 세계로 바꾸는 유쾌한 프로젝트지만 그 밑바닥에는 바이너리 포맷과 직렬화라는 알짜 기본기가 깔려 있다는 이야기예요. 여러분이라면 어떤 엉뚱한 매체에 데이터를 저장해보고 싶으세요?
🔗 출처: Hacker News