각 과정을 설명하면 다음과 같습니다.
➊ 클라이언트가 서버에 “내 캐릭터를 만들어라.”라고 요청합니다.
➋ 서버는 데이터베이스에 “새 캐릭터에 대한 데이터 개체, 즉 레코드를 만들어라.”라고 요청합니다.
➌ 데이터베이스는 이에 대한 응답을 합니다. 여기서는 “성공했다.”라는 응답을 받았다고 하겠습니다.
➍ 서버는 클라이언트에 “캐릭터를 만드는 것이 성공했다.”라고 알려 줍니다.
➎ 클라이언트는 서버에 “내 캐릭터 중 OOO를 선택하겠다.”라고 요청합니다.
➏ 서버는 데이터베이스에 “캐릭터 OOO를 선택했다고 기록하자.”라고 요청합니다.
➐ 서버는 클라이언트에 “캐릭터 OOO를 성공적으로 선택했다.”라고 알려 줍니다.
이름이 같은 캐릭터가 있을 경우 ➌은 실패할 수도 있습니다. 반면 캐릭터 선택은 게임 서버 메모리에 이미 있는 정보를 토대로 하는 것이므로 즉시 성공합니다. 따라서 데이터베이스에 변화를 기록하는 것은 그냥 일방적인 통보 형태로 진행해도 됩니다.
데이터베이스에 기록하되 그 결과를 기다릴 필요가 없을 때는 다음 코드와 같이 데이터베이스에 기록하는 함수를 별도의 스레드나 비동기 함수 호출로 처리해도 됩니다.
func() { data.change(xxx); thread.doAsync(() = > { db.write(xxx); }); }