Unite'17 Seoul 아이펀팩토리 발표자료
1. 강연주제: 클라이언트 개발자, 서버 개발 시작하기
2. 강연자: 박근환 TD
3. 강연소개: 이 세션은 주로 게임 클라이언트 개발자로 경력을 쌓아오던 개발자가 게임 서버 솔루션 회사에서 일하면서 알게된 사실들을 바탕으로, 클라이언트 개발자가 서버 개발을 시작하려면 필요한 것들이 무엇인지, 어떻게 시작해야 하는지에 대하여 이야기합니다.
4. 서버도 개발하고 싶은 클라이언트
개발자를 위한 세션입니다.
• 옛날 이야기
• 엔진이 가져온 개발 효율 향상
• 게임 서버도 솔루션으로
• 클라이언트 개발과 서버 개발, 환경과 철학의 차이
• 클라이언트 개발과 서버 개발, 기술의 차이
• 컨텐츠 개발이 끝났다! 하지만 그 이후 작업이..
• 서버를 개발하면서 생기는 추가 작업들
• 대박이 나면 어떡하지?
• 정리
5. 옛날 옛적에..
• Brew, WIPI, MIDP..
• C (++?), Java subset
• 밑바닥부터 한땀 한땀
• 사실 Android SDK나 iOS SDK도 마찬가지
6. 게임 엔진의 대중화와 개발 환경 변화
• 게임의 구현 목표에 맞는 엔진을 선택하는 것이 개발의 시작
• 프로토타입 개발은 기획자, 디자이너도 가능
• 개발자의 역할 변화
• 더 빨라진 개발 = 더 많아진 컨텐츠
7. 서버 개발의 현재 상황
웹 서버를
활용해서
개발
41%
자체 소켓 서버를
만들어서 개발
29%
외부 엔진을
도입해서 개발
17%
무응답
13%
(출처: 아이펀팩토리 데브데이 설문조사, 2017.03)
9. 개발 환경과 철학의 차이 1 – 예외처리
• 안정성 추구
public void LevelUp(ref int level)
{
level++;
}
private object characterInfoLock;
public const int MAXIMUM_LEVEL = 99;
public void LevelUp(ref int level)
{
lock (characterInfoLock)
{
if (level <= 0)
throw new Exception(“레벨이 0 이하입니다.”);
level++;
}
if (level > MAXIMUM_LEVEL)
throw new Exception(“레벨이 최대치를 초과했습니다.“);
LOG(LogLevel.INFO, string.Format(“레벨이 상승했습니다. {0}”, level));
}
클라이언트
서버
10. 개발 환경과 철학의 차이 2 - 비동기
• 가능한 모든 코드는 비동기로 구현
• 모든 IO 관련 코드
• 데이터베이스, 파일, 네트워크
• 즉시 응답을 얻을 수 없는 기능
• 매치메이킹, 사용자 검색, 랭킹 등
• 외부 서비스 연동
(출처: MSDN, Writing an Asynchronous Method)
11. 개발 환경과 철학의 차이 3 - 최적화
• 최적화 성공 = 비용 감소
• 클라이언트의 화려한 그래픽, 입체적 사운드 = 핸드폰이 뜨거워요 + @
• 서버의 복잡한 로직, 많은 IO = 관리 서버 증가 = 서버 비용 증가
12. 개발 환경과 철학의 차이 3 - 최적화
• 최적화 성공 = 비용 감소
• 클라이언트의 화려한 그래픽, 입체적 사운드 = 핸드폰이 뜨거워요 + @
• 서버의 복잡한 로직, 많은 IO = 관리 서버 증가 = 서버 비용 증가
• 서버 다운 = 매출 감소 & 비용 대비 이익 급감
13. 개발 환경과 철학의 차이 4
• 다양한 환경 유지
• 소규모 팀에서는 주로 서버 개발자의 업무
• 개발
• 테스트
• 라이브
14. 개발 환경과 철학의 차이 4
• 다양한 환경 유지
• 소규모 팀에서는 주로 서버 개발자의 업무
• 개발: 지속적인 코드 수정 및 개발
• 테스트
• 라이브
15. 개발 환경과 철학의 차이 4
• 다양한 환경 유지
• 소규모 팀에서는 주로 서버 개발자의 업무
• 개발: 지속적인 코드 수정 및 개발
• 테스트
• 팀내 테스트
• 사내 테스트
• 외부 테스트
• 라이브
16. 개발 환경과 철학의 차이 4
• 다양한 환경 유지
• 소규모 팀에서는 주로 서버 개발자의 업무
• 개발: 지속적인 코드 수정 및 개발
• 테스트
• 팀내 테스트: 팀원 테스트, 기획 데이터 변경 테스트(밸런싱 등)
• 사내 테스트
• 외부 테스트
• 라이브
17. 개발 환경과 철학의 차이 4
• 다양한 환경 유지
• 소규모 팀에서는 주로 서버 개발자의 업무
• 개발: 지속적인 코드 수정 및 개발
• 테스트
• 팀내 테스트: 팀원 테스트, 기획 데이터 변경 테스트(밸런싱 등)
• 사내 테스트: QA, 사업팀 협업
• 외부 테스트
• 라이브
18. 개발 환경과 철학의 차이 4
• 다양한 환경 유지
• 소규모 팀에서는 주로 서버 개발자의 업무
• 개발: 지속적인 코드 수정 및 개발
• 테스트
• 팀내 테스트: 팀원 테스트, 기획 데이터 변경 테스트(밸런싱 등)
• 사내 테스트: QA, 사업팀 협업
• 외부 테스트: 퍼블리셔 공개, 외부 홍보, 스트레스 테스트
• 라이브
19. 개발 환경과 철학의 차이 4
• 다양한 환경 유지
• 소규모 팀에서는 주로 서버 개발자의 업무
• 개발: 지속적인 코드 수정 및 개발
• 테스트
• 팀내 테스트: 팀원 테스트, 기획 데이터 변경 테스트(밸런싱 등)
• 사내 테스트: QA, 사업팀 협업
• 외부 테스트: 퍼블리셔 공개, 외부 홍보, 스트레스 테스트
• 라이브: 채널, 리전 분리
20. 개발 기술의 차이 1 - 네트워크
• 네트워크
• 버그의 원천
• 끊길 때 예외처리
• 느릴 때 예외처리
• 서버와 클라이언트의 상태 동기화
• 게임 중 전화가 오면?
• 클라이언트 프로세스를 정리해버리면?
• 클라이언트는 해킹 당하기 마련이다 = 메시지는 믿을 수 없다
21. 개발 기술의 차이 2 – 분산처리
• 대부분의 경우 한 대의 서버만 가지고 서비스할 수는 없음
• 기존 서버의 동작을 나누는 난이도 >>넘사벽>> 미리 나눠 놓은 서버를 확장하는 난이
도
• 로그인, 로비, 게임, 채팅..
• 데이터베이스, 캐시, 서비스 검색..
22. 개발 기술의 차이 2 - 분산처리
• 분산처리: 다수의 인스턴스를 하나의 서버처럼 + 여러 서버간 데이터 정합성 보장
로그인
서버
인스턴스
로그인 서버
로비 서버
인스턴스
로비 서버
게임 서버
인스턴스
게임 서버클라이언트
• 어떤 서버 인스턴스가 어디에 있는가 (논리적, 물리적)
• 각 인스턴스의 현재 상태 공유
• 전체 서버 동일한 데이터를 공유
23. 개발 기술의 차이 3 - 데이터베이스
• 데이터베이스
• 트랜잭션은 서버 병목의 원천
• 적게 쓸수록 좋지만 많이 쓸 수밖에 없다
• 비동기 코드 + 분산처리 + 데이터베이스 트랜잭션 = 최적화 난이도 상승 주범
• 스키마 잘 구성하기, DBA의 조언(가능하다면)
• 데이터베이스 접근 최소화, 데이터베이스 접근 레이어
• 서버간 통신 활용
• 요청 처리 롤백, 혹은 실패에 대한 예외처리
24. 개발 기술의 차이 3 - 데이터베이스
• ORM
• 데이터베이스 Query를 클래스 Get, Set으로 사용
• 내부의 복잡한 처리를 숨김 = 마음이 편하다
(출처: 위키피디아, https://en.wikipedia.org/wiki/Object-relational_mapping)
25. 개발 기술의 차이 4 – 외부 서비스 연동
방식
• 외부서비스 연동
• 인증: 카카오, 페이스북, 구글, 트위터..
• 결제: 스토어별 결제 검증
• 친구 리스트, 개인 정보, 업적 관리 등
• 주로 외부 REST API를 호출
• 다수의 요청을 동시에 처리하기 위해 비동기 방식으로 구현 필수
26. 개발 기술의 차이와 엔진
• 새로운 기술을 배워야하는 것은 사실, 하지만 엔진을 사용하면 좀 ‘덜’ 배워도 됨
Your Games Server
N o n e t w o r k i n g c o d e ! N o d a t a b a s e c o d e !
Time
Savings
Network
Event/Timer
Distribution Subsystem
ORM (w/sharding+caching)
Network
Event/Timer
ManagementAPI
UserActivityLog
JSON/protobuf over
TCP/UDP/HTTP(S) using
reliable session+encryption
Processes a large stream of
concurrent events/messages
Scales with multiple servers
Built in ORM with
sharding and cashing
Database
Database
Database
Database
RESTful
API(JASON)
Logs
important
userevents
27. 컨텐츠 개발 이후의 작업 1
• 보안
• 전 세계의 IP가 당신의 서버를 좋아합니다.
• 서버 접속 관련 보안 설정
• 패킷 암호화, 리플레이 공격 차단, 클라이언트 보안 등등
• 이 모든 걸 적용했더라도, 클라이언트 메시지는 믿을 수 없음
• 서버 내부 통신, 외부 통신의 NIC을 다르게: 클라우드 비용 절감 효과는 덤
• 서버 프로세스 실행 계정 권한 조정: 서버 프로세스 자체 취약점이 있을 수 있음
• 배포용 서버 빌드 환경 구성: 치트, 메시지 리스트, 디버그 코드 제거
30. 컨텐츠 개발 이후의 작업 4
• 통계
• 사용자의 행동 분석
• 게임의 성공을 극대화하기 위한 필수 장치
• 클라이언트 데이터 수집, 서버 데이터 수집
• 하기 싫어도 어차피 퍼블리셔가 요구함
31. 서버를 개발하면 생기는 추가 작업
• 서버 패키지 배포: 라이브 테스트를 통해 동일한 동작을 보장
• 유지보수, 버전 관리: 테스트 서버에 치트 추가해 주세요, 미국 서버 버전은 따로 나눠서..
• 로그 분석, 처리: 리텐션, 결제 비율.. 이탈한 유저의 당일 플레이 내역과 승률
• 운영: 운영툴 만드는데 2주면 되나요? (안됩니다)
• 모니터링: CPU, 메모리, 디스크 공간 등 경고
• 추가 다운로드 서버 유지
32. 대박이 나면 어떡하지?
• 서버 확장
• 부하가 걸리는 타입의 서버 추가 < 어떤 서버에 부하가 걸리는가
• 서버 추가 (동일한 하드웨어 추가, 데이터베이스 샤딩)
• 더 좋은 하드웨어로 교체
• 새로운 월드 생성 (배포 패키지, 여러 월드의 버전 관리 필요)
• 퍼블리싱 확장, 채널링
• 해외 진출
• 리전 추가, 필연적으로 한번은 이야기가 나오는 ‘원 월드 서버’
• 그리고 이전 페이지로 돌아가시오
33. 서버 개발 시작을 위한 정리
• 서버 개발을 위한 엔진을 선택
• 개발, 테스트 서버 환경을 구축, 버전 관리
• 코드에는 항상 최대한의 예외처리, 언제나 비동기로
• 컨텐츠 이외의 작업 일정을 확보
• 통계는 게임의 성공을 위해 꼭 필요
• 서버 성능의 한계를 미리 테스트, 확장 대비
• 모니터링 툴, 운영 툴 준비
34. 예제 프로젝트 소스코드 (C#)
유니티 클라이언트: https://github.com/iFunFactory/game-pong
서버: https://github.com/iFunFactory/game-pong-server-csharp