1. CAP 이론
온라인 게임에서 '일관성', '가용성', '분할 용인'을 조건 3개를 모두 갖출 수 없다는 이론이다.
1.1 일관성 (Consistency)
일관성은 모든 시스템이 동일한 상태 값을 가지고 있어야 한다.
예를 들어,
A 클라이언트에서 마법을 발사했을 경우
A,B,C 클라이언트가 동시에 마법이 발사되어야 한다.

이는 A클라이언트에서 서버에 "마법 발사!" 요청을 보냈을 경우
서버에서 응답을 처리하고 모든 클라이언트에 브로드캐스트하였을 때
비로소 각 클라이언트마다 마법이 발사되는 경우이다.
장점은 모든 클라이언트가 동일한 데이터를 공유한다는 것이며
단점은 A클라이언트가 마법을 발사하고 일정 시간 뒤에(서버의 응답을 받은 후) 마법이 발사되어 딜레이가 발생한다.
1.2 가용성 (Availability)
가용성은 언제든지 값을 읽고 쓸 수 있음을 의미한다.
예를 들어,
A 클라이언트에서 캐릭터가 이동하였을 경우
서버의 응답없이 그 즉시 이동하는 것을 의미한다.

이는 A클라이언트에서 "캐릭터 이동"을 서버로 보내기 전
먼저 A클라이언트에 업데이트되고 이후 서버에 보내게 된다.
그럼으로 A클라이언트에서 먼저 이동하게되고 B클라이언트에서 조금 늦게 캐릭터가 움직이게 된다.
1.3 분할 용인 (Partition Tolerance)

분할 용인은 하나의 시스템에서 처리하는 것이 아닌
여러 개의 시스템을 두어 네트워크가 끊겨도 서비스가 운용되도록 하는 것을 의미한다.
대표적으로 클러스팅이라는 기술이 있다.
2. 게임 동기화
2.1 가용성 보정

스타크래프트는 가용성 대신 일관성을 유지하는 CP 구조로 설계되어 있다.
이는 플레이어가 어떤 요청이 있으면 클라이언트에 바로 적용되는 것이 아닌
서버를 거쳐 모든 클라이언트에 뿌려지는 구조를 의미한다.
CP 구조의 문제점은 딜레이가 발생한다는 것이다.이러한 딜레이를 잡아주기 위해 스타크래프트에서는 이동 클릭이 되었을 경우사운드를 재생해 플레이어에게 피드백을 한다.이를 통해 딜레이 채감이 감소되도록하는 효과를 줄 수 있다.
2.2 일관성 보정

일관성 대신 가용성을 유지하는 AP 구조는
클라이언트의 요청을 우선 업데이트하고 후에 일관성을 보정하는 방법을 사용한다.
예를 들어,
이동 클릭시 일단 캐릭터를 이동시키고 서버에 요청을 한다. (예측)
그 후 서버의 응답을 받고 그 값이 일치하면 그대로 위치시키되
만약 서버의 응답에서 "이동 불가"로 왔을 경우 이전 위치로 롤백시키도록 하여 일관성을 보정한다.
2.3 클라이언트 보간

서버에서 전달해주는 실시간 데이터의 주기는
평균적으로 골고루 전달되지 않는다.
캐릭터의 이동 위치를 뜨문뜨문 서버로 전달받아 클라이언트에 업데이트하게 되면
캐릭터가 구간 텔레포트하면서 움직이게 될 것이다.
이를 해결하기 위해 클라이언트 보간을 적용한다.
클라이언트는 전달받은 서버 데이터를 버퍼에 저장한다.
그리고 현재 데이터와 다음 데이터를 비교하여 그 중간 값을 적용시켜준다.
예를 들어,
현재 캐릭터의 위치가 (0, 0)이고
전달 받은 다음 캐릭터의 위치가 (5, 5)일 때
이를 렌더링할 때 바로 (5, 5)로 이동하는 것이 아닌 틱마다 계산을 통해 (5, 5)에 서서히 도달하게 한다.
3. 정리
오늘은 클라이언트와 서버가 데이터를 주고 받을 때
어떤 문제점들이 일어나고 그것을 어떻게 해결하는 살펴보았다.
특히 클라이언트는 응답 딜레이를 막기 위해 예측과 서버 보정이 사용된다는 것을 인지하고 가야할 것 같다.
