추억을 영원히 간직하세요
EVE Evolved 작업의 일환으로 EVE Online의 클라이언트와 서버를 파이썬 2에서 파이썬 3로 지속적으로 업그레이드하고 있습니다. 이 작업은 더욱 탄탄한 게임 기반을 다지기 위함이며, 개발팀이 앞으로도 수년간 개발을 이어갈 수 있도록 하기 위함입니다.
정보기록원
EVE Evolved의 이번 회는 매일 부여되는 약 10만 건의 미션을 추적 관리하는 번거로운 절차를 NPC 에이전트 메모리가 어떻게 관리하는지 살펴볼 것입니다. 또한, 이 메모리가 미래에 플레이어에게 어떤 영향을 미칠지도 함께 말이죠.
본 블로그에서 “에이전트”는 EVE에서 만날 수 있는 NPC 에이전트를 가리킵니다. 이 매력적인 캐릭터들은 보상을 대가로 (때로는 무례하게) 여러분에게 다른 정거장으로 쓰레기를 버리거나, 해적 문제를 해결하거나, 위기에 처한 불쌍한 아가씨를 구하라고 요청하기도 합니다.

가벼운 시작
다들 기술적이고 장황한 설명을 좋아하시니, 이제 곧 더 자세한 설명을 시작하도록 하겠습니다. 하지만 3줄 요약이 필요하신 분들을 위해 간략한 설명을 드리겠습니다.
EVE Online을 파이썬 3를 통해 업그레이드하는 최신화 작업의 일환으로, NPC 에이전트의 데이터가 저장되는 방식에 변화가 필요합니다. 비공개 업그레이드가 미션과 에이전트와의 상호작용 추적 방식에 적용됩니다. 이는 일부 오래된 데이터를 정리하고 남아 있는 데이터를 더 미래지향적인 형식으로 변환하는 작업을 포함합니다.
이 과정은 대부분 은밀하게 진행될 것입니다. 유일하게 눈에 띄는 영향은 2026년 9월 29일 이전에 저장한 오래된 미션 진행 상황에 생길 변화죠.
NPC 평판 기록은 안전합니다. 잠금 해제되어 사용 가능한 에이전트들은 로그인하지 않거나 현재 오메가 상태가 아니더라도 계속 사용할 수 있습니다. 진행 상황은 손실되지 않습니다.
오늘부터 신규 에이전트 미션을 요청하면 (또는 기존 미션을 완료하거나 실패할 경우) 그 미션의 진행 상황이 자동으로 새 메모리에 반영됩니다.
오늘 이전에 에이전트와 상호작용한 적이 있고, 오늘 이후에 그 에이전트와 다시 상호작용하여 진행 상황을 업데이트하지 않는다면, 파이썬 3로의 전환이 완전히 완료될 때 해당 에이전트에게서 받은 미션은 정리되고 삭제될 것입니다.
해당 정리 작업의 일정은 아직 확정되지 않았습니다. 이는 방대한 파이썬 3 이전 과정의 일부일 뿐이기 때문입니다. 이 과정은 며칠이 아니라 몇 달이 걸릴 예정입니다. 그 시점에 가까워질 무렵, 메모리가 삭제되기 전에 여러분께 다시 알려드리겠습니다.
만일 오늘 이전에 제시받았거나 수락한 미션이 있고, 오늘 이후에 해당 에이전트와 상호작용하여 그 미션을 완료하지 않으면 언젠가 미션의 진행 상황이 삭제되는 시점이 올 것입니다.
오늘 이전에 연구 포인트를 생성하도록 연구 에이전트와 계약한 경우, 해당 에이전트를 계속 활성화 상태로 유지하려면 오늘 이후 최소 1회 이상의 미션을 완료해야 합니다. (이 작업은 캐릭터 당 에이전트별로 최초 1회만 수행하면 됩니다) 추후 오늘 이후로 한 번도 진행되지 않은 모든 이전 연구 작업은 일괄 삭제됩니다.
요약하자면, 여러분이 에이전트 미션을 활발히 진행 중이라면 그대로 플레이하시면 됩니다. 아무것도 바뀌지 않습니다. 만일 특별히 아끼는 에이전트가 있다면(특히 연구 에이전트), 이들을 찾아가 미션을 진행하시는 게 좋습니다. 그들이 여러분을 잊지 않게 말이죠
이제 기본적인 내용이 이해가 되셨을까요? 혹시 아직도 에이전트의 저장 습관이나 과거의 비밀에 관해 더 알고 싶으시다면, 이어서 읽으시면 됩니다…
세계 간의 충돌

에이전트 메모리가 무엇인지를 알기 위해서는 먼저 맥락을 살펴봐야 합니다. 전체적인 파이썬 3 프로젝트는 다음과 같이 구분할 수 있습니다.
런타임 - 게임이 작동하게 하는 클라이언트 및 서버 실행 파일입니다.
데이터 - EVE Online의 특별한 경험을 만들어내는 정보의 조각입니다. 이 정보의 조각은 다음과 같이 세분화됩니다.
콘텐츠 데이터 - 모델, 텍스처, 단어, 능력치 등 저희 아티스트, 디자이너, 작가들이 만들어내는 모든 것들입니다. 이 데이터 중 일부는 클라이언트의 일부분으로 전달되며, 일부는 오직 우리 서버 내부에만 존재합니다.
네트워크 데이터 - 인터넷을 통해 여러분의 클라이언트와 게임 서버 간에 전달되는 정보 패킷과, 데이터 센터 내 서버 클러스터의 200개 이상의 노드 간에 전달되는 데이터입니다.
영구 저장 데이터 - 게임에서 20년 넘게 진행된 모든 기록을 저장하는 ‘세이브 파일’이 점점 커지고 있습니다. 이 파일은 EVE의 핵심으로 자리 잡은 방대한 SQL 데이터베이스이며, 이곳에 에이전트의 메모리가 저장되어 있습니다.
개발자 생태계 - 여러분에게 게임을 만들어 드리기 위해 개발자들이 매일 사용하는 도구 및 프로세스입니다.
에이전트 문의
이제 에이전트의 메모리가 어디에 저장되어 있는지 알았으니, 그게 정확히 무엇인지에 대해 확인해 보도록 하죠. 여러분의 캐릭터가 NPC 에이전트와 상호작용할 때마다 이 사실이 데이터베이스에 기록됩니다. 이 상호작용은 새로운 미션 요청이나 이전에 전달된 미션의 완료 (혹은 실패), 연구 작업 시작, 또는 특별한 스토리라인 에이전트를 소개받는 것일 수 있습니다.
모든 에이전트는 이전에 대화한 모든 캐릭터와의 마지막 상호작용을 기억하고 있습니다. 만일 여러분이 20년 전에 한 에이전트를 찾아가서 어떤 수상한 홀로릴을 되찾으라는 미션을 시작했다면, 그 에이전트는 아직도 여러분이 적절한 시간 내에 미션을 완수하지 못해 실패했다고 말할 기회를 기다리고 있을 겁니다!
에이전트가 유지하는 캐릭터에 관한 메모리는 다음과 같이 구성됩니다.
에이전트가 어떤 미션을 제안했는지, 그리고 그 미션의 상태에 관한 메모리(예: 표적 NPC의 사망 여부)
에이전트가 연구 작업을 진행 중이며 그 작업의 상태가 어떠한지
에이전트가 플레이어를 위해 다른 캐릭터를 찾는 미션을 맡았는지
플레이어가 스토리라인을 얼마나 진행했는지
어떤 에픽아크나 커리어 미션을 완료했는지
NPC 캐릭터/코퍼레이션과 여러분의 캐릭터 간의 평판 관계는 이 에이전트 메모리의 일부가 아니란 점을 기억하세요. 평판은 별개의 시스템으로, 자체적으로 그 상태를 추적하는 방식이 있습니다.
데이터 회수
마지막으로 이 블로그 게시물이 작성된 이유인, 어떻게 이 데이터가 저장되고 회수되는지를 확인해 보겠습니다.
2,000년대 초반, 에이전트 메모리 데이터베이스는 EVE Online이 출시를 위해 마지막 힘을 내고 있을 때 만들어졌습니다. 이 데이터베이스는 에이전트와 캐릭터 간의 상호작용을 나타내는 복잡한 상태를 저장해야 했습니다. 일반적으로 데이터베이스 설계에서는 이러한 데이터를 위해 매우 정형화된 테이블과 관계 모델을 구축하려고 합니다. 그러나 에이전트의 메모리 요구 사항은 지저분하고 역동적이었으며, 상호작용마다 매우 다른 변수 집합이 존재했습니다(예를 들어, 배달 미션을 설명하는 것과 스토리라인 추천을 설명하는 것의 차이처럼). 게다가, 게임의 발전에 따라 설계는 빠르게 변화하고 있었습니다.
이 시점은 아직 현대적인 NoSQL 트렌드가 시작되지도 않은 상태였습니다. EVE는 데이터 영구 저장 레이어로 MSSQL을 확고하게 사용하고 있었죠. 그러다 영리한 프로그래머 한 명이 에이전트의 기억을 저장하는 파이썬 객체를 직렬화하여 바이너리 블롭으로 만든 뒤, 그 블롭을 텍스트로 데이터베이스 테이블에 저장할 수 있다는 것을 깨달았습니다.
이후, 에이전트가 캐릭터와의 상호작용으로 깨어날 때 그 반대의 일이 일어납니다. 해당 에이전트의 바이너리 블롭은 데이터베이스에서 불려 와 역으로 직렬화되어 다시 파이썬 객체로 변환되고, 이후 실행 중인 에이전트에 주입되어 기억이 복원됩니다. 파이썬에서는 이 과정을 ‘픽클링(pickling)’과 ‘언픽클링(unpickling)’이라고도 합니다.
이 방법은 당장 직면한 문제를 훌륭하게 해결했지만, 다음과 같은 두 가지 사후 문제를 야기했습니다.
메모리 블롭들을 쉽게 검색할 수 없었습니다. 데이터베이스의 강점은 검색에 있는데, 이는 특정 파라미터가 어떤 값을 갖는 모든 항목을 찾는 것입니다. 하지만 각 메모리가 파이썬 랩핑으로 감싸져 있었기 때문에 내부를 효율적으로 쿼리하는 것이 불가능했습니다. 예를 들어, 앞서 언급한 불쌍한 아가씨(Damsel)와 관련된 모든 메모리를 찾으려면, 각각의 메모리를 하나씩 파이썬에 로드해서 확인해야 했습니다. 이상적이지 않죠.
데이터 포맷이 사용 중인 파이썬 버전과 연동되어 있었습니다. 파이썬언어가발전하면서새로운 기능이 추가되고, 더 이상 사용되지 않거나 결국에는 삭제되는 기능도 생겨났습니다. 이는언젠가그메모리를더는읽을수없게되어사라질것임을의미했습니다. 파이썬 2에서파이썬 3로의전환과함께, 그미래가곧우리앞에다가오고있습니다.
숨겨진 은닉품
일반적인 비유를 예로 들어 문제를 설명해 보자면, 여러분이 이동하는 동안 개인 물건을 창고에 맡긴다고 생각해 보세요. 모든 물건을 커다란 컨테이너에 몰아넣고 창고로 보내버리는 것도 한 방법입니다. (이걸 데이터를 직렬화한다고 말합니다) 이 방법은 유연하고 (컨테이너를 실어 나르는 트럭은 안에 든 음악 컬렉션이 레코드판이든 CD이든 상관하지 않죠) 빠르며, 컨테이너 운송은 이미 표준화된 절차가 되었습니다.
이후에 새로운 집으로 이사할 때가 되면, 컨테이너를 집으로 배송시켜 소중한 물건들을 풀어 놓으면 됩니다. 하지만 여기에는 단점이 있습니다. 창고 측에서 불법적인 물건을 맡긴 건 아닌지 검사하기 위해 안전 점검을 진행해야 하면 컨테이너에 든 모든 물건을 하나하나 손으로 풀어서 확인해야 합니다. 그다지 효율적인 방법은 아니지요.
업무 준비 완료
장기적 관점에서 단점이 있기는 하지만, 어쨌든 성공적이었습니다. EVE Online은 출시를 넘어 계속 이어졌고, 에이전트 메모리 솔루션도 예상보다 훌륭하게 버텼습니다. 하지만 아무것도 영원할 수는 없죠.
기록 삭제
파이썬 3로의 이전은 과거의 잘못을 바로잡을 수 있는 황금 같은 기회를(간과할 수 없는 부분이지요... 정말 말 그대로요) 제공하고 있습니다. 개발팀은 SQL 데이터베이스에 파이썬 블롭을 저장하는 유연성 부족과 내장된 노후화 문제에서 벗어나야 합니다. 동시에, 이번 기회를 활용해 산처럼 쌓인 데이터를 정리하고 정돈하는 작업도 병행하고 있습니다. (에이전트 메모리 테이블은 우리 데이터베이스에서 가장 큰 테이블 중 하나이며, 거의 유일하게 계속해서 커지고 줄어들지 않는 테이블입니다.)
죽음의 듀오
이 작업은 이미 물밑에서 진행되고 있습니다. 에이전트 메모리를 불러오고 저장하는 방식을 업데이트하였습니다. 새로운 메모리를 저장할 때 다음과 같은 두 형식을 동시에 사용합니다.
이전과 같은 불투명한 '레거시' 파이썬 블롭 형식.
특정한 파이썬 형식에 의존하지 않으며, 더 나은 검색 가능성과 미래 적응성을 위해 개방된, 새로운 미래 지향적이고 투명한 형식.
현재 모든 새로 생성되거나 업데이트된 메모리는 두 가지 형태로 저장됩니다. 만일 오늘 어떤 에이전트에게 미션을 요청하면, 그 메모리는 두 가지 형태 모두에 저장됩니다. 이를 통해 에이전트 기억을 불러올 때 어떤 형식을 우선시할지 선택할 수 있습니다. 또한, 이전 방식을 버리기 전에 두 형식이 같은 말을 하고 있는지 확인할 수 있어 위험도 줄어듭니다.
데이터베이스에서 에이전트의 메모리를 불러올 때, 이제는 어떤 소스를 우선순위로 간주할지에 대한 선택지가 몇 가지가 생기게 됩니다. 이 선택지는 세 단계를 거쳐 변경될 예정입니다.
1 단계: 우선, 새로운 형식이 제대로 작동하는 방식이 마음에 들 때까지 레거시 스토리지에서만 메모리를 계속해서 불러옵니다.
2 단계: 그 후, 우선순위를 변경하여 새로운 저장 형식에서 메모리를 우선 찾은 후, 결과가 없다면 이전 형식에서 메모리를 불러옵니다.
3단계: 결과적으로 (모든 것을 파이썬 3로 완전히 이전한 후에) 이전 형식에서 메모리를 불러오는 것을 완전히 멈출 것입니다. 새로운 형식으로 저장된 메모리만이 에이전트에게 적용되며, 데이터베이스에서 업데이트되지 않은 구식 레거시 메모리는 버리게 됩니다. 데이터베이스 관리자가 아주 행복해하겠지요.
오늘 자로 새로운 메모리는 파이썬 3로의 전환 과정에서 계속해서 함께 가져가게 됩니다. 이 전환은 오랜 시간이 걸릴 예정이기 때문에, 여러분은 충분히 시간 여유를 가지고 에이전트와 상호작용하며 새로운 미션을 받거나 기존 미션을 완료하실 수 있습니다. 이 과정은 며칠이 아니라 몇 달에 걸쳐 진행됩니다. 3단계에 가까워지면 여러분께 꼭 알려 드리도록 하겠습니다.
전쟁 준비 자원
반드시 이전해야 하는 메모리가 있습니다. 얼마나 오래되었는지는 상관없습니다. 관련된 캐릭터가 매번 로그인하거나 업데이트된 기억을 생성하지 않더라도 필요한 메모리입니다. 예를 들어, 일부 튜토리얼 또는 에픽아크 미션은 한 번만 수행할 수 있기 때문에, 이를 추적할 필요가 있습니다. 이렇게 일부 경우에는 백그라운드에서 데이터를 자동으로 새로운 형태로 이전할 예정입니다.
캐릭터와 에이전트 간의 관계에서 중요한 부분은 바로 ‘평판’입니다. 이는 1레벨 에이전트에서 4레벨 또는 5레벨로 승진하는 과정에서 신경 써야 할 부분입니다. 캐릭터와 NPC 에이전트, 코퍼레이션, 팩션 간의 모든 평판은 이 변화에 영향을 받지 않고 그대로 유지됩니다. 이 평판은 초기화하거나 삭제하지 않을 예정입니다.
계속 작업 중입니다
파이썬 3로의 이전 작업도 계속됩니다. 클라이언트와 서버 코드를 변환하는 '단순한' 것 외에도, 그 주변의 모든 것을 업데이트하는 작업이 그만큼(혹은 그 이상으로) 많이 필요합니다. 개발자들이 매일 사용하는 다양한 도구들이 있고, 파이썬 프로세스가 네트워크를 통해 다른 구성요소와 통신하는 여러 경계가 있으며, 버튼 하나로 확장 작업을 바로 적용할 수 있게 하는 배포 프로세스도 있습니다.
게다가, 앞서 보셨듯이 데이터베이스 내에 저장된 데이터도 때때로 약간의 리프레시가 필요하기도 합니다.
그러면 안전한 비행 되시길 바라며, 다른 블로그 게시물에서 뵙겠습니다. o7
