오늘은 Socket 을 다루며 생겼던 의문에 대해 생각해보는 시간을 가졌다.

 

🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 

Chapter.4 의 Dino -run 과   Tower Defence 를 진행하고 들었던 의문이 있다.

🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔 🤔

dino run 의 스테이지 점수 검증 과정

 

위는 dino run 에서, 서버가 클라이언트의 데이터를 검증하는 과정이다.

 

유저가 일정 점수를 만족하여 스테이지를 넘어갈 때, 

당시의 점수가 정상적인 값인지 서버에서 확인하는 과정이다.

 

 

클라이언트에서 점수 획득 과정

클라이언트는 클라이언트 나름대로의 계산을 통해서 

스코어를 계산해서 반영하고 있다.

 

 

여기서 생긴 의문은

어차피, 각자 점수 계산을 할꺼면 그냥 서버가 점수를 관리하여 결과만 보내주는게 낫지 않을까? 

하는 의문이었다.

 

 

쉽게 말해,

서버도 10의 일을 하고

클라이언트도 10의 일을 할 바에는

 

서버만 10의 일을 해서 클라이언트는 그 결과를 받아서 표기만 하게 하는것이 낫지 않겠나 하는 것이었다.

 

이렇게 하면 클라이언트에서 점수를 조작하는것도 어려워지고, 

 

서버에서는 검증을 하던지 데이터 자체를 관리하던지 로직 복잡도는 크게 다르지 않을것이고,

패킷은 검증만 해도 오가야 하니 패킷의 양 또한 비슷할 것이다.

 

 

 

쉽게 말해, 검증을 위해 서버가 예상한 점수를 그냥 클라이언트로 보내버리는 것이다. 

 

그걸 받아서 현재 점수를 갱신하게 만들면, 일종의 동기화가 진행된 것이기 때문에

 

유저는 보다 정확한 값을 확인할 수 있고, 클라이언트는 딱히 계산할 것도 없어지게 된다.

 

 

얼핏 보면 크게 오류가 없어보이는 논리이다.

그렇기 때문에,

왜 그렇게 하고 있지 않은지를 찾아보기로 했다.

 

 

지금 생각해보면 대단히 고민 할 필요도 없는 문제...

 

자잘한 문제를 다 치워 두고 위에 저 두 상황을 봤을 때,

 

아래의 케이스는 결국,

 

 

클라이언트가 서버의 패킷을 받을 때 까지 데이터 변화를 적용 할 수 없다는 것 !!!!

이 부분이 가장 큰 차이점이다.

 

만약 서버의 응답이 느려지거나, 적당히 빠르다 할지라도 빈도가 너무 많은 과정이라면

 

그 때마다, 클라이언트는 서버가 데이터를 보내줄 때 까지 손가락만 빨고 있어야 한다.

아무리 짧다고 하더라도 클라이언트가 직접 수정하는 것보다는 느릴 수 밖에 없다는 것이다.

 

 

결과적으로, 유저 경험적인 측면에서

순간이지만, 일단 클라이언트 마음대로 하게 두고,

선을 넘으면 그 때  =검거= 하러 가는 검증 방식을 사용하는 것이다.

 

결론은 케바케 !!

 

 

결론 

 

총 세 가지 케이스로 요약할 수 있다.

 

1. 서버가 데이터를 관리하고 계산하여 클라이언트로 쏴줌

 

게임의 재화같은 경우, 중요하게 관리되어야 하는 만큼 서버에서 데이터를 관리하는 경우가 많다.

서버가 계산한 내용으로 클라이언트에 반영하려면 위에서 말한것 처럼,

서버가 보내는 명세서를 클라이언트가 받을 때 까지 갱신이 지연되는 문제가 생길 수 있다.

 

 

2. Dino run 의 점수 계산

 

위에서 본 Dino run 의 스코어 계산의 경우, 

프레임 단위로 이루어지도록 설계가 되어있다.

만약 서버가 해당 스코어를 관리하려면 프레임 단위로 데이터 갱신하고,

프레임 단위로 패킷으로 보내줘야 하는 상황이다.

 

스코어의 경우 최종 스코어만 정확하게 계산이 가능하다면

굳이 매 순간 엄격하게 정확 할 필요까진 없는 데이터이기 때문에, 

 

결과적으로 클라이언트에서 관리하되, 적절한 타이밍마다 서버가 검증하는 방식이 되었다.

 

 

3. 그 외 ...?

 

여기까지 써야 하나 싶긴하지만, 마무리를 위해 작성해 보았다.

클라이언트에 그려지는 '점수' 라는 텍스트가 'white' 색상이 맞는지, '점수' 라는 텍스트가 맞는지는 

전혀 검증 할 필요성이 없다.

 

따라서 해당 부분은 따로 검증이 진행되지 않고 클라이언트 독단으로 실행되게 되어 있다.

 

 

 

결국, 개발자가 데이터를 어떻게 설계 하는지에 달려있다고 볼 수 있다 !

+ Recent posts