더북(TheBook)

플레이어 데이터를 디스크 같은 통상적인 파일 시스템에 저장하는 방법도 있지만, 데이터베이스 소프트웨어를 이용해서 저장할 때가 더 많습니다. 이유는 다음과 같습니다.

1. 데이터 관리와 분석을 빠르게 할 수 있습니다. 데이터베이스는 특정 조건을 만족하는 데이터들을 그 양에 무관할 정도의 빠른 속도로 찾아낼 수 있습니다. 예를 들어 ‘엘프족 남성 캐릭터 중에서 직업이 사냥꾼이고 레벨이 30~35 사이인 캐릭터 목록’을 매우 빠르게 검색할 수 있습니다.

2. 강력한 데이터 복원 기능이 있습니다. 데이터 변경 사항을 1개 이상의 사본 저장소에 보관할 수 있습니다. 따라서 고장에 대응하기가 쉽습니다.

3. ‘전부 아니면 전무’로 데이터를 변경할 수 있습니다. 은행을 예로 들어 볼까요? 사용자 1에게 있는 100만 원을 사용자 2에게 송금한다고 가정합시다. 그러면 사용자 1의 잔금에서 100만 원이 차감되고() 사용자 2의 잔금에 100만 원이 추가되어야 합니다(). 어떤 함수에서 이를 수행하는 과정에서 예외가 발생하여 은 했지만 는 못하고 프로그램이 중단되었다면 어떻게 될까요? 난리가 나겠죠. 데이터베이스는 트랜잭션(transaction)이라는 기능을 제공하는데, 이러한 상황이 발생할 경우 을 원상 복구해서 없던 일로 만들 수 있습니다. 이를 원자성(atomicity)이라고 합니다.

4. 데이터 일관성을 유지시켜 줍니다. 예를 들어 플레이어의 경험치 값은 절대 음수가 될 수 없다는 제약 사항을 미리 데이터베이스에 넣을 수 있습니다. 그러면 플레이어 데이터는 설령 서버에 버그가 있어서 음수를 넣으려고 하더라도 데이터베이스가 들어가지 못하게 강제합니다. MMORPG 게임에서 플레이어 이름이 중복되지 않게 하고 싶을 때도 데이터베이스는 “같은 이름의 데이터는 둘 이상 있으면 안 돼!”라는 제약으로 절대 중복되는 이름이 존재하지 않음을 보장해 줍니다.

5. 데이터베이스는 처리가 2개 이상 동시에 실행될 때 한 데이터가 동시에 여러 데이터를 액세스하면서 이상한 결과가 나오는 문제를 막아 주는 기능이 있습니다. 바로 lock 구문을 이용하는 것입니다. 보통 파일에 데이터를 기록한다면 이를 구현하는 것은 까다로울 수 있습니다.

6. 장애에 대한 내성이 강합니다. 데이터베이스는 데이터를 기록하기 전에 로그 버퍼(log buffer)라는 별도 파일에 ‘할 일을 미리 기록’한 후 이를 실제 데이터베이스에 적용하면서 로그 버퍼를 지워 나갑니다. 그런데 데이터베이스가 중간에 죽어 버린 후 재시작을 하면 로그 버퍼에서 ‘아직 안 한 일’을 마저 찾아서 복원합니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.