박근환
클라이언트 개발자, 서버 개발 시작하기
아이펀팩토리
서버도 개발하고 싶은 클라이
언트
개발자를 위한 세션입니다.
서버도 개발하고 싶은 클라이언트
개발자를 위한 세션입니다.
• 옛날 이야기
• 엔진이 가져온 개발 효율 향상
• 게임 서버도 솔루션으로
• 클라이언트 개발과 서버 개발, 환경과 철학의 차이
• 클라이언트 개발과 서버 개발, 기술의 차이
• 컨텐츠 개발이 끝났다! 하지만 그 이후 작업이..
• 서버를 개발하면서 생기는 추가 작업들
• 대박이 나면 어떡하지?
• 정리
옛날 옛적에..
• Brew, WIPI, MIDP..
• C (++?), Java subset
• 밑바닥부터 한땀 한땀
• 사실 Android SDK나 iOS SDK도 마찬가지
게임 엔진의 대중화와 개발 환경 변화
• 게임의 구현 목표에 맞는 엔진을 선택하는 것이 개발의 시작
• 프로토타입 개발은 기획자, 디자이너도 가능
• 개발자의 역할 변화
• 더 빨라진 개발 = 더 많아진 컨텐츠
서버 개발의 현재 상황
웹 서버를
활용해서
개발
41%
자체 소켓 서버를
만들어서 개발
29%
외부 엔진을
도입해서 개발
17%
무응답
13%
(출처: 아이펀팩토리 데브데이 설문조사, 2017.03)
게임 서버 솔루션
개발 환경과 철학의 차이 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));
}
클라이언트
서버
개발 환경과 철학의 차이 2 - 비동기
• 가능한 모든 코드는 비동기로 구현
• 모든 IO 관련 코드
• 데이터베이스, 파일, 네트워크
• 즉시 응답을 얻을 수 없는 기능
• 매치메이킹, 사용자 검색, 랭킹 등
• 외부 서비스 연동
(출처: MSDN, Writing an Asynchronous Method)
개발 환경과 철학의 차이 3 - 최적화
• 최적화 성공 = 비용 감소
• 클라이언트의 화려한 그래픽, 입체적 사운드 = 핸드폰이 뜨거워요 + @
• 서버의 복잡한 로직, 많은 IO = 관리 서버 증가 = 서버 비용 증가
개발 환경과 철학의 차이 3 - 최적화
• 최적화 성공 = 비용 감소
• 클라이언트의 화려한 그래픽, 입체적 사운드 = 핸드폰이 뜨거워요 + @
• 서버의 복잡한 로직, 많은 IO = 관리 서버 증가 = 서버 비용 증가
• 서버 다운 = 매출 감소 & 비용 대비 이익 급감
개발 환경과 철학의 차이 4
• 다양한 환경 유지
• 소규모 팀에서는 주로 서버 개발자의 업무
• 개발
• 테스트
• 라이브
개발 환경과 철학의 차이 4
• 다양한 환경 유지
• 소규모 팀에서는 주로 서버 개발자의 업무
• 개발: 지속적인 코드 수정 및 개발
• 테스트
• 라이브
개발 환경과 철학의 차이 4
• 다양한 환경 유지
• 소규모 팀에서는 주로 서버 개발자의 업무
• 개발: 지속적인 코드 수정 및 개발
• 테스트
• 팀내 테스트
• 사내 테스트
• 외부 테스트
• 라이브
개발 환경과 철학의 차이 4
• 다양한 환경 유지
• 소규모 팀에서는 주로 서버 개발자의 업무
• 개발: 지속적인 코드 수정 및 개발
• 테스트
• 팀내 테스트: 팀원 테스트, 기획 데이터 변경 테스트(밸런싱 등)
• 사내 테스트
• 외부 테스트
• 라이브
개발 환경과 철학의 차이 4
• 다양한 환경 유지
• 소규모 팀에서는 주로 서버 개발자의 업무
• 개발: 지속적인 코드 수정 및 개발
• 테스트
• 팀내 테스트: 팀원 테스트, 기획 데이터 변경 테스트(밸런싱 등)
• 사내 테스트: QA, 사업팀 협업
• 외부 테스트
• 라이브
개발 환경과 철학의 차이 4
• 다양한 환경 유지
• 소규모 팀에서는 주로 서버 개발자의 업무
• 개발: 지속적인 코드 수정 및 개발
• 테스트
• 팀내 테스트: 팀원 테스트, 기획 데이터 변경 테스트(밸런싱 등)
• 사내 테스트: QA, 사업팀 협업
• 외부 테스트: 퍼블리셔 공개, 외부 홍보, 스트레스 테스트
• 라이브
개발 환경과 철학의 차이 4
• 다양한 환경 유지
• 소규모 팀에서는 주로 서버 개발자의 업무
• 개발: 지속적인 코드 수정 및 개발
• 테스트
• 팀내 테스트: 팀원 테스트, 기획 데이터 변경 테스트(밸런싱 등)
• 사내 테스트: QA, 사업팀 협업
• 외부 테스트: 퍼블리셔 공개, 외부 홍보, 스트레스 테스트
• 라이브: 채널, 리전 분리
개발 기술의 차이 1 - 네트워크
• 네트워크
• 버그의 원천
• 끊길 때 예외처리
• 느릴 때 예외처리
• 서버와 클라이언트의 상태 동기화
• 게임 중 전화가 오면?
• 클라이언트 프로세스를 정리해버리면?
• 클라이언트는 해킹 당하기 마련이다 = 메시지는 믿을 수 없다
개발 기술의 차이 2 – 분산처리
• 대부분의 경우 한 대의 서버만 가지고 서비스할 수는 없음
• 기존 서버의 동작을 나누는 난이도 >>넘사벽>> 미리 나눠 놓은 서버를 확장하는 난이
도
• 로그인, 로비, 게임, 채팅..
• 데이터베이스, 캐시, 서비스 검색..
개발 기술의 차이 2 - 분산처리
• 분산처리: 다수의 인스턴스를 하나의 서버처럼 + 여러 서버간 데이터 정합성 보장
로그인
서버
인스턴스
로그인 서버
로비 서버
인스턴스
로비 서버
게임 서버
인스턴스
게임 서버클라이언트
• 어떤 서버 인스턴스가 어디에 있는가 (논리적, 물리적)
• 각 인스턴스의 현재 상태 공유
• 전체 서버 동일한 데이터를 공유
개발 기술의 차이 3 - 데이터베이스
• 데이터베이스
• 트랜잭션은 서버 병목의 원천
• 적게 쓸수록 좋지만 많이 쓸 수밖에 없다
• 비동기 코드 + 분산처리 + 데이터베이스 트랜잭션 = 최적화 난이도 상승 주범
• 스키마 잘 구성하기, DBA의 조언(가능하다면)
• 데이터베이스 접근 최소화, 데이터베이스 접근 레이어
• 서버간 통신 활용
• 요청 처리 롤백, 혹은 실패에 대한 예외처리
개발 기술의 차이 3 - 데이터베이스
• ORM
• 데이터베이스 Query를 클래스 Get, Set으로 사용
• 내부의 복잡한 처리를 숨김 = 마음이 편하다
(출처: 위키피디아, https://en.wikipedia.org/wiki/Object-relational_mapping)
개발 기술의 차이 4 – 외부 서비스 연동
방식
• 외부서비스 연동
• 인증: 카카오, 페이스북, 구글, 트위터..
• 결제: 스토어별 결제 검증
• 친구 리스트, 개인 정보, 업적 관리 등
• 주로 외부 REST API를 호출
• 다수의 요청을 동시에 처리하기 위해 비동기 방식으로 구현 필수
개발 기술의 차이와 엔진
• 새로운 기술을 배워야하는 것은 사실, 하지만 엔진을 사용하면 좀 ‘덜’ 배워도 됨
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
컨텐츠 개발 이후의 작업 1
• 보안
• 전 세계의 IP가 당신의 서버를 좋아합니다.
• 서버 접속 관련 보안 설정
• 패킷 암호화, 리플레이 공격 차단, 클라이언트 보안 등등
• 이 모든 걸 적용했더라도, 클라이언트 메시지는 믿을 수 없음
• 서버 내부 통신, 외부 통신의 NIC을 다르게: 클라우드 비용 절감 효과는 덤
• 서버 프로세스 실행 계정 권한 조정: 서버 프로세스 자체 취약점이 있을 수 있음
• 배포용 서버 빌드 환경 구성: 치트, 메시지 리스트, 디버그 코드 제거
컨텐츠 개발 이후의 작업 2
• 스트레스 테스트
(출처, 아이펀팩토리 홈페이지)
컨텐츠 개발 이후의 작업 3
• 성능 최적화
(출처, 아이펀팩토리 홈페이지)
컨텐츠 개발 이후의 작업 4
• 통계
• 사용자의 행동 분석
• 게임의 성공을 극대화하기 위한 필수 장치
• 클라이언트 데이터 수집, 서버 데이터 수집
• 하기 싫어도 어차피 퍼블리셔가 요구함
서버를 개발하면 생기는 추가 작업
• 서버 패키지 배포: 라이브 테스트를 통해 동일한 동작을 보장
• 유지보수, 버전 관리: 테스트 서버에 치트 추가해 주세요, 미국 서버 버전은 따로 나눠서..
• 로그 분석, 처리: 리텐션, 결제 비율.. 이탈한 유저의 당일 플레이 내역과 승률
• 운영: 운영툴 만드는데 2주면 되나요? (안됩니다)
• 모니터링: CPU, 메모리, 디스크 공간 등 경고
• 추가 다운로드 서버 유지
대박이 나면 어떡하지?
• 서버 확장
• 부하가 걸리는 타입의 서버 추가 < 어떤 서버에 부하가 걸리는가
• 서버 추가 (동일한 하드웨어 추가, 데이터베이스 샤딩)
• 더 좋은 하드웨어로 교체
• 새로운 월드 생성 (배포 패키지, 여러 월드의 버전 관리 필요)
• 퍼블리싱 확장, 채널링
• 해외 진출
• 리전 추가, 필연적으로 한번은 이야기가 나오는 ‘원 월드 서버’
• 그리고 이전 페이지로 돌아가시오
서버 개발 시작을 위한 정리
• 서버 개발을 위한 엔진을 선택
• 개발, 테스트 서버 환경을 구축, 버전 관리
• 코드에는 항상 최대한의 예외처리, 언제나 비동기로
• 컨텐츠 이외의 작업 일정을 확보
• 통계는 게임의 성공을 위해 꼭 필요
• 서버 성능의 한계를 미리 테스트, 확장 대비
• 모니터링 툴, 운영 툴 준비
예제 프로젝트 소스코드 (C#)
유니티 클라이언트: https://github.com/iFunFactory/game-pong
서버: https://github.com/iFunFactory/game-pong-server-csharp
Thank you!

[아이펀팩토리] 클라이언트 개발자, 서버 개발 시작하기

  • 2.
    박근환 클라이언트 개발자, 서버개발 시작하기 아이펀팩토리
  • 3.
    서버도 개발하고 싶은클라이 언트 개발자를 위한 세션입니다.
  • 4.
    서버도 개발하고 싶은클라이언트 개발자를 위한 세션입니다. • 옛날 이야기 • 엔진이 가져온 개발 효율 향상 • 게임 서버도 솔루션으로 • 클라이언트 개발과 서버 개발, 환경과 철학의 차이 • 클라이언트 개발과 서버 개발, 기술의 차이 • 컨텐츠 개발이 끝났다! 하지만 그 이후 작업이.. • 서버를 개발하면서 생기는 추가 작업들 • 대박이 나면 어떡하지? • 정리
  • 5.
    옛날 옛적에.. • Brew,WIPI, MIDP.. • C (++?), Java subset • 밑바닥부터 한땀 한땀 • 사실 Android SDK나 iOS SDK도 마찬가지
  • 6.
    게임 엔진의 대중화와개발 환경 변화 • 게임의 구현 목표에 맞는 엔진을 선택하는 것이 개발의 시작 • 프로토타입 개발은 기획자, 디자이너도 가능 • 개발자의 역할 변화 • 더 빨라진 개발 = 더 많아진 컨텐츠
  • 7.
    서버 개발의 현재상황 웹 서버를 활용해서 개발 41% 자체 소켓 서버를 만들어서 개발 29% 외부 엔진을 도입해서 개발 17% 무응답 13% (출처: 아이펀팩토리 데브데이 설문조사, 2017.03)
  • 8.
  • 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을 다르게: 클라우드 비용 절감 효과는 덤 • 서버 프로세스 실행 계정 권한 조정: 서버 프로세스 자체 취약점이 있을 수 있음 • 배포용 서버 빌드 환경 구성: 치트, 메시지 리스트, 디버그 코드 제거
  • 28.
    컨텐츠 개발 이후의작업 2 • 스트레스 테스트 (출처, 아이펀팩토리 홈페이지)
  • 29.
    컨텐츠 개발 이후의작업 3 • 성능 최적화 (출처, 아이펀팩토리 홈페이지)
  • 30.
    컨텐츠 개발 이후의작업 4 • 통계 • 사용자의 행동 분석 • 게임의 성공을 극대화하기 위한 필수 장치 • 클라이언트 데이터 수집, 서버 데이터 수집 • 하기 싫어도 어차피 퍼블리셔가 요구함
  • 31.
    서버를 개발하면 생기는추가 작업 • 서버 패키지 배포: 라이브 테스트를 통해 동일한 동작을 보장 • 유지보수, 버전 관리: 테스트 서버에 치트 추가해 주세요, 미국 서버 버전은 따로 나눠서.. • 로그 분석, 처리: 리텐션, 결제 비율.. 이탈한 유저의 당일 플레이 내역과 승률 • 운영: 운영툴 만드는데 2주면 되나요? (안됩니다) • 모니터링: CPU, 메모리, 디스크 공간 등 경고 • 추가 다운로드 서버 유지
  • 32.
    대박이 나면 어떡하지? •서버 확장 • 부하가 걸리는 타입의 서버 추가 < 어떤 서버에 부하가 걸리는가 • 서버 추가 (동일한 하드웨어 추가, 데이터베이스 샤딩) • 더 좋은 하드웨어로 교체 • 새로운 월드 생성 (배포 패키지, 여러 월드의 버전 관리 필요) • 퍼블리싱 확장, 채널링 • 해외 진출 • 리전 추가, 필연적으로 한번은 이야기가 나오는 ‘원 월드 서버’ • 그리고 이전 페이지로 돌아가시오
  • 33.
    서버 개발 시작을위한 정리 • 서버 개발을 위한 엔진을 선택 • 개발, 테스트 서버 환경을 구축, 버전 관리 • 코드에는 항상 최대한의 예외처리, 언제나 비동기로 • 컨텐츠 이외의 작업 일정을 확보 • 통계는 게임의 성공을 위해 꼭 필요 • 서버 성능의 한계를 미리 테스트, 확장 대비 • 모니터링 툴, 운영 툴 준비
  • 34.
    예제 프로젝트 소스코드(C#) 유니티 클라이언트: https://github.com/iFunFactory/game-pong 서버: https://github.com/iFunFactory/game-pong-server-csharp
  • 35.