플레이어 데이터를 디스크 같은 통상적인 파일 시스템에 저장하는 방법도 있지만, 데이터베이스 소프트웨어를 이용해서 저장할 때가 더 많습니다. 이유는 다음과 같습니다.
1. 데이터 관리와 분석을 빠르게 할 수 있습니다. 데이터베이스는 특정 조건을 만족하는 데이터들을 그 양에 무관할 정도의 빠른 속도로 찾아낼 수 있습니다. 예를 들어 ‘엘프족 남성 캐릭터 중에서 직업이 사냥꾼이고 레벨이 30~35 사이인 캐릭터 목록’을 매우 빠르게 검색할 수 있습니다.
2. 강력한 데이터 복원 기능이 있습니다. 데이터 변경 사항을 1개 이상의 사본 저장소에 보관할 수 있습니다. 따라서 고장에 대응하기가 쉽습니다.
3. ‘전부 아니면 전무’로 데이터를 변경할 수 있습니다. 은행을 예로 들어 볼까요? 사용자 1에게 있는 100만 원을 사용자 2에게 송금한다고 가정합시다. 그러면 사용자 1의 잔금에서 100만 원이 차감되고(➊) 사용자 2의 잔금에 100만 원이 추가되어야 합니다(➋). 어떤 함수에서 이를 수행하는 과정에서 예외가 발생하여 ➊은 했지만 ➋는 못하고 프로그램이 중단되었다면 어떻게 될까요? 난리가 나겠죠. 데이터베이스는 트랜잭션(transaction)이라는 기능을 제공하는데, 이러한 상황이 발생할 경우 ➊을 원상 복구해서 없던 일로 만들 수 있습니다. 이를 원자성(atomicity)이라고 합니다.
4. 데이터 일관성을 유지시켜 줍니다. 예를 들어 플레이어의 경험치 값은 절대 음수가 될 수 없다는 제약 사항을 미리 데이터베이스에 넣을 수 있습니다. 그러면 플레이어 데이터는 설령 서버에 버그가 있어서 음수를 넣으려고 하더라도 데이터베이스가 들어가지 못하게 강제합니다. MMORPG 게임에서 플레이어 이름이 중복되지 않게 하고 싶을 때도 데이터베이스는 “같은 이름의 데이터는 둘 이상 있으면 안 돼!”라는 제약으로 절대 중복되는 이름이 존재하지 않음을 보장해 줍니다.
5. 데이터베이스는 처리가 2개 이상 동시에 실행될 때 한 데이터가 동시에 여러 데이터를 액세스하면서 이상한 결과가 나오는 문제를 막아 주는 기능이 있습니다. 바로 lock 구문을 이용하는 것입니다. 보통 파일에 데이터를 기록한다면 이를 구현하는 것은 까다로울 수 있습니다.
6. 장애에 대한 내성이 강합니다. 데이터베이스는 데이터를 기록하기 전에 로그 버퍼(log buffer)라는 별도 파일에 ‘할 일을 미리 기록’한 후 이를 실제 데이터베이스에 적용하면서 로그 버퍼를 지워 나갑니다. 그런데 데이터베이스가 중간에 죽어 버린 후 재시작을 하면 로그 버퍼에서 ‘아직 안 한 일’을 마저 찾아서 복원합니다.