버전간 모드 호환이 안 되는 이유 (by Vazkii)
사설/사설모드 마인크래프트의 세계에 오신 것을 환영합니다. 새로 버전 업이 된 마인크래프트와 모드간의 호환성이 개발살나는 데에는 두가지 정도의이유가 있어요. 가급적 코딩과 관계 없는 일반인이 이해할 수 있는 말로 설명해 볼까요.
1. 소프트웨어 난독화 (Obfuscation)
마인크래프트 코드를 대충 프로그램 하나 사용해서 열어 보면 말도 안 되고 이해도 불가능한 온갖 잡다한 문자열이 튀어나옵니다. 자바로 만들어진 프로그램들이 이런 경향이 아주 심해요. 마인크래프트는 자바로 만들어졌고, 자바로 만들어진 프로그램들은 열어서 코드를 들춰 보는게정말 쉽기 때문이죠. 이렇게 코드를 열어보는걸 '디컴파일링' 이라 하고, 이렇게 열어 봐도 뭐가 뭔지 이해할 수 없게 코드를 개발살내 놓는 걸 '난독화' (obfuscation) 이라고 합니다. 단, 인간은 읽을 수 없어도 기계들은 이걸 제대로 이해할 수 있죠.
예를 들어 볼까요. 크리퍼의 클래스 (class가 뭔지 모르는 사람들은 그냥 코드 조각이라 생각하세요) 는 MCP, 즉 마인크래프트 코더 팩을 사용하면 EntityCreeper.class 라 나와 있습니다. 하지만 마인크래프트 코드를 그냥 열어 보면 이 크리퍼는 마인크래프트 1.7.10에서 wl.class 로나와요. 도저히 이해할 수가 없는 거죠.
이런 걸론 작업을 할수 없습니다. 모드를 만드는 모더들은 수백에서 수천개의 마인크래프트 파일과 작업을 해야 하죠. 거기에 함수랑 필드도더해서. 이걸 전부 다 외우려고 한다고 생각해 보세요.
여기서 MCP, 즉 마인크래프트 코더 팩이 중요한 겁니다. 이제는 모장 직원이 된 Searge가 개발하고 아직도 유지 중인 것으로, 모더들의 커뮤니티를 통해 이 이해불가능한 코드들을 모더들이 읽을수 있는 코드로 바꿔 주는 겁니다. 코드를 찾고, 분류하고, 이해하는것에 필수적이기에모더들은 이 MCP랑 떨어져 살 수가 없어요. 또한 MCP는 양방향이라, 모더들이 작성하는 코드를 다시 마인크래프트가 사용하는 난독 코드로바꿔주는 역활을 합니다. MCP가 있기 때문에 여러분이 모드를 받아다가 모드 폴더에 넣고 마인크래프트를 실행하면 마인크래프트가 새로 추가된 그 모드를 감지하고 게임에서 보여줄 수 있는 거지요.
여기서 발생하는 문제가 있는데, 바로 이 난독화가 자주 바뀐다는 겁니다. 모장이 뭔가 새로운 걸 집어 넣을 때마다 난독화가 바뀌고, 기존의이해 불가능한 코드들이 전혀 다른 이름을 가진 이해 불가능한 코드들고 바뀝니다. 예를들어 1.7.10 버전에서 크리퍼가 wl.class 였다면, 1.8에서는 크리퍼가 sz.class 로 바뀔 수도 있다는 거에요. 그럼 마인크래프트 코더 팩이 이걸 해석할 수가 없죠. 그래서 버전이 바뀔 때마다 MCP 메인 개발자인 Searge, 웨일라와 OPIS의 개발자 뫼비우스, IngisKahn, Fesh0r, ZeuX, R4wk 이 여섯 명이 중노동을 해야 하는 겁니다. 물론 모장의 도움이 있지만 (Searge는 이제 현직 모장 직원이기도 하고) 아무래도 여가 시간에 하는 거니까 시간이 걸릴 수 밖에 없어요.
또한 MCP가 바뀌면 MCP를 통해 마인크래프트와 상호교환을 하는 모드들도 당연히 망가지게 됩니다. 예를들어 모드가 EntityCreeper.class를 어떻게 바꾸는 걸 한다고 해 봐요. 그럼 이걸 1.7.10버전의 MCP를 통해 wl.class를 찾게 되는데, 크리퍼는 이제 wl.class가 아닌 sz.class 니까 해당 명령은 길을 잃어버리게 되죠. 그리고 마인크래프트는 크래시를 냅니다. 이게 첫번째 이유.
2. 코드가 바뀌었다!
위에 '모든 컨텐츠가 다 남아 있다는 가정 하에, 왜 모드들이 이후 버전의 마인크래프트와 호환이 안 되는 거죠?' 라고 물어보셨죠. 간단합니다. 이 가정 자체가 틀리기 때문이에요. 마인크래프트를 구성하는 코드는 매 버전마다 바뀌고, 삭제되고, 옮겨지고, 추가되고, 이름이 바뀌고, 복제됩니다. 버전이 바뀔 때마다 항상 무언가가 바뀌어요. 바뀌지 않는다면 새 버전이 나올 필요가 없겠죠. 그리고 뭔가 바뀔 때마다, 그 바뀐 내용을 참조하던 모든 모드가 망가집니다.
예제를 좀 들어 보죠. 마인크래프트가 1.5에서 1.6으로 올라가면서, 엔티티 (블럭이 아닌 모든 것 – 크리퍼, 좀비, 그림, 아이템 떨군 것들, 경험치 구슬 등등)가 작동하는 방식을 모장이 바꿨습니다. 어트리뷰트 (Attribute) 시스템의 등장이죠. 만약에 1.5 버전에서 몹의 체력을 참조하는 모드가 있었다면, 그 모드는 1.6 버전에서도 똑같이 몹의 체력을 참조하려고 할 겁니다. 하지만 몹의 체력을 담당하는 시스템이 어트리뷰트시스템으로 새로 개선됨에 따라 기존 시스템을 참조하려는 모드는 자신이 찾는 것을 찾을 수 없어 그대로 크래시를 내게 되죠.
마인크래프트 1.6에서 1.7 사이에는 블럭ID 시스템이 완전히 바뀌었습니다. 다들 아시다시피, 이제까지 마인크래프트의 모든 블럭은 번호를가지고 있었습니다. 베드록은 0번, 돌은 1번, 흙은 2번 등등. 하지만 1.7 이후로는 이것들이 이런 번호 대신 String, 즉 문자열로 바뀌었습니다. 즉 돌(stone) 은 이제 1번 대신 stone 이란 string을 가지고 있고, 나무 판자들은 planks를 가지고 있죠. 그래서 1.7 이전의 방식대로 '블럭ID 배분으로 블럭을 추가하려는 모드' 가 있다면, 해당 모드는 1.7에서 사용할 수가 없죠. 블럭ID 번호라는 개념이 완전히 사라졌으니까요. 그 외에도 정말 많지만 이 둘이 일단은 최근의 변경점입니다.
대부분의 마인크래프트 모드들은 '플랫폼' 위에서 돌아가도록 설계되어 있습니다. 일단 현재 가장 유명한 플랫폼을 두개 꼽으라면 마인크래프트 포지와 라이트로더가 있겠죠. 들어 본적 있어요? 이것들 위에서 모드들이 돌아가기에, 마인크래프트 버전이 올라가면 이 플랫폼들도 같이버전 업이 되어야 합니다. 그리고 버전이 바뀔 때마다 항상 무언가는 바뀌게 되죠.
물론 항상 예외가 있습니다. 모드들이 마인크래프트 자체에서 돌아가는게 아니라, 이 플랫폼들 위에서 돌아가기에 가끔 버전이 달라도 호환이 되는 경우가 생겨요. 다들 아시겠지만 몇몇 모드는 1.7.2와 1.7.10에서 동일하게 작동합니다. 하지만 마인크래프트 포지 자체는 1.7.2 버전을 마인크래프트 1.7.10버전에서 써 보면 폭발해 버리죠. 이는 포지는 마인크래프트 자체와 직접 상호작용을 하는 반면, 포지 위에서 돌아가는 모드들은 단순히 포지가 제공하는 기능을 사용하기 때문입니다. 해당 모드가 사용하는 포지의 코드가 1.7.2와 1.7.10버전의 포지에서 동일하고, 해당 모드가 바꾸는 마인크래프트의 특정 부분이 1.7.2버전과 1.7.10버전의 마인크래프트 사이에서 바뀌지 않았다면, 그 모드는 양쪽 버전에서 돌아갈 겁니다.
예라고 하긴 뭐하지만, 전 마인크래프트 코드 자체를 하나도 사용하지 않고 오직 포지 코드만 참조하는 마인크래프트 모드를 만들어본 적이있습니다. 그게 가능하냐고요? 가능합니다. 당연히 이 모드는 마인크래프트에 새로운 컨텐츠를 추가한다던가 하는 기능이 전혀 없어요. 하지만전 이 모드를 마인크래프트 1.3 때 만들었고, 1.7.10이 된 지금도 이 모드는 돌아갑니다. 즉 모드의 버전간 호환성은 해당 모드가 무엇을 바꾸는지, 무엇을 참조하는지, 무엇이 바뀌었는지에 따라 결정 된다는 뜻입니다. 대부분의 경우 무언가는 바뀌기에 호환이 불가능한 것이죠.
길어서 안 읽은 글러먹은 게으름뱅이들을 위한 요약: 마인크래프트는 자기 코드가 어떻게 보이는지를 매 버전마다 바꿉니다. 덕분에 버전이 올라갈 때마다 이전 버전처럼 생긴 마인크래프트를 생각하는 모든 모드들이 망가진다는 거죠.
짝짝! 마지막이 바즈키다운 표현이지만 정말로 훌륭한 답안이군요. 이걸 번역하신 세렌님에게 경의를...
바즈키에 의하면 모장은 어른좀비 걸어가는 속도보다 느리게 모딩 API를 향해 나아가고 있습니다. 무려 1.3(!)에서 시작된 변화인데, 1.3에선 서버와 클라이언트가 통하되었고 1.5에선 스프라이트가 바뀌었으며, 1.6에선 어트리뷰트와 텍스쳐 시스템이 등장했고 런쳐가 변화했습니다. 1.7에선 블럭ID가 삭제되었으며 1.8에선 메타데이터가 삭제되고 코드에 대격변이 일어났습니다. 즉, 1.8도 1.7만큼의, 혹은 그 이상의 대격변을 가져올 거라는 말. "세상을 바꾼 업데이트"라는 1.7.2 업데이트는 2013년 10월 25일에 나왔고 2014년 7월은 되어서야 대부분의 모드들이 1.7로 업데이트되기 시작했으니(아직 써멀 등은 나오지 않았고), 1.8로 모드들이 포팅되려면 적어도 2015년 여름은 되야 할 것 같습니다... cpw가 빠져나간 후 포지 팀도 인력난에 처해 있고...
* 예전에 제가 우마공에 올렸던 글입니다. 사진이 없어서 옮기기도 쉽고 내용도 좋기에 옮겨 봤습니다. 2015년 봄이 시작되려는, 거의 모든 모드들이 1.7.10으로 올라온 현재에 있어서도 매우 좋은 글일 듯 하군요. 다시 한 번 세렌님께 경의를
'사설 > 사설' 카테고리의 다른 글
HAYO ~ 인사 ~ (4) | 2015.02.25 |
---|---|
저도 이제 솔로를 떠나 커플이네요 (4) | 2015.02.25 |
COC 현황-01 고블린 러쉬 (26) | 2015.02.22 |
으아아아아아 (6) | 2015.02.21 |
당분(Sucre)이 팀블로그에 가입했습니다! (18) | 2015.02.11 |