SlideShare a Scribd company logo
MongoDB를 모바일
게임 개발에 사용
티쓰리엔터테인먼트
모바일 1팀
공통 기술 개발팀
최흥배 과장
 일본의 사이버에이전트 사의 사례
http://www.cyberagent.co.jp/
http://ameblo.jp/principia-ca/entry-10983188853.html
 아메바 블로그로 유명 http://www.ameba.jp/
MongoDB를 사용한 이유
 개발 효율 향상
모바일 게임은 단 기간에 개발해야 한다.
그러나 게임은 특성상 자주 변경이 발생한다.
스키마레스의 MongoDB는 데이터 구조 변경에 유연하게 대응 할 수 있다.
 신기능, 변경 릴리스 대응
모바일 게임은 주에 3,4회 릴리즈 하는 경우가 대다수이다.
그러나 컬럼 추가나 인덱스 추가를 온라인 상태에서 할 수 없으므로 점검이 필
요하게 된다.
MongoDB를 사용하면 점검이 하지 않고 추가가 가능하다.
 유연한 쿼리, 인덱스
계층 구조화한 문서 내부에도 인덱스를 확장할 수 있다.
KVS로도 이용 할 수 있어서 유연한 쿼리 검색을 할 수 있어서 매력적이다.
 초기 비용이 작고, 확장성을 보장
ReplicaSets(비동기 레플리케이션)과 Sharding(자동 데이터 분산)을 제공하고 있
음.
시스템 구성
서버 구성은 Web-App 서버 2대, token이나 정보 캐시용 memcached 2대, Mon
goDB 3대로 총 7대.
MongoDB는 ReplicaSets 구성으로 primary에 쓰기를 하고, 2대의 secondary에
서 읽기.
Sharding을 하지 않은 이유
 서버 대수가 필요하게 되어 비용이 증가하기 때문
 ReplicaSets을 3세스(3X3대), mongos 서버, config 서버가 필요하기 때문에 총
11대 필요하게 된다
만약 여유분까지 생각하면 더 필요하다
 미리 준비하는 것 보다 상황을 봐서 필요하게 될 때 투입하는 것이 좋다고 판단
문서 설계
 RDBMS와 달리 NoSQL에서는 정규화는 추천 되지 않는다
 데이터를 분할하지 않고 문서로 보존하는 쪽이 데이터가 같은 장소에 보존 되어
서버간 통신 횟수도 줄여준다
 문서 설계가 가장 중요하고, 가장 힘들다
 문서 설계에서는 'modifier 오퍼레이션'과 '데이터 배열에 의한 유지'를 유효하게
사용할 수 있는 설계로 변경한다
 또 이미지 바이너리 데이터의 캐시를 MongoDB에 하여 데이터 획득과 캐시 획
득을 한번 하도록 한다
modifier 오퍼레이션
 모바일 게임에서는 레벨업이나 경험치 증가 등 increment 조작이 빈번하게 일어
난다
 이것을 modifier 오퍼레이션을 이용하여 쉽게 대응할 수 있다
db.userStatus.findOne({"userId" : 2013001})
{
"_id" : ObjectId("4d82e95a7a92571409f258dd"),
"battery" : 80,
"point" : 10000,
"smile" : 82,
"sumModel" : 41,
"sumPicture" : 22451,
"sumSales" : 1250,
"userId" : 2013001
}
db.userStatus.findOne({"userId" : 2013001})
{
"_id" : ObjectId("4d82e95a7a92571409f258dd"),
"battery" : 70,
"point" : 10000,
"smile" : 82,
"sumModel" : 41,
"sumPicture" : 22452,
"sumSales" : 1250,
"userId" : 2013001
}
밧데리를 10 소비하고 사진 촬영을 한 경우
-> db.userStatus.update({"userId" : 2013001},{$inc : {"battery" : -
10,"sumPicture":1}})
modifier 오퍼레이션은 계층구조라도 atomic한 조작을 할 수 있다
area2의 퀘스트를 완료하여 레벨이 올라가서 'questlevel'과 'area2'의 숫자를 증
가하는 경우는 아래와 같다
db.user.quest.findOne()
{
"_id" : ObjectId("4e42208e97ed78c7a7f2f738"),
"userId" : 2013001,
"questLevel" : 4,
"quest" : {
"area1" : 3,
"area2" : 1,
"area3" : 2
}
}
db.user.quest.update({userId:2013001},{$inc : {questLevel:1,"quest.area2":1}})
db.user.quest.findOne()
{
"_id" : ObjectId("4e42208e97ed78c7a7f2f738"),
"userId" : 2013001,
"questLevel" : 5,
"quest" : {
"area1" : 3,
"area2" : 2,
"area3" : 2
}
}
데이터를 배열로 유지
 유저가 모델 촬영을 한 정보를 가지는 컬렉션을 만든다
 1명의 모델(modelId)가 복수의 area에 출현하기 때문에 모델의 상태(mcId)에 의
해 컴플리트 한지(compFlg), 거들떠 보았는지(talkFlg)를 배열로 유지한다
 이 데이터는 참조가 많기 때문에 userId와modelId를 key로서 얻을 수 있는 것이
장점이 된다
새로운 area에서 modelId:180 이라는 사람과 만난 경우 modelDetails 배열에 데
이터를 추가한다
db.user.model.update({"userId" : 1022962,"modelId" : 180},{$push :
{"modelDetails" : {"compFlg" : 0,"talkFlg" : 0,"mcId" : 200}}})
{
"_id" : ObjectId("4d7dcbe97ccbb19ad8ac09b9"),
"modelId" : 180,
"modelDetails" : [
{
"compFlg" : 0,
"talkFlg" : 1,
"mcId" : 188
},
{
"compFlg" : 0,
"talkFlg" : 1,
"mcId" : 189
},
{
"compFlg" : 0,
"talkFlg" : 0,
"mcId" : 200
}
],
"userId" : 1022962,
"telFlg" : 0,
"status" : 0
}
이미지 바이너리 데이터 보존
 게임 내에서 만들어진 잡지는 유저가 조작한 타이틀 이미지와 촬영한 모델 이미
지를 합성하여 만든다
 이미지를 읽을 때 발생하는 오버헤드를 줄이기 위해서 MongoDB에 이미지 바
이너리 데이터를 보존한다.
한번의 요청으로 필요한 데이터를 얻을 수 있다
db.user.edit.find({userId:3})
{
"_id" : ObjectId("4d8c77694ca814174e7e3854"),
"color" : "RED",
"companyDetailId" : NumberLong(0),
"companyId" : NumberLong(0),
"coverId" : "4d8c7ebd4ca85714cc7e3854",
"font" : 1,
"imgData" : BinData(2,"AAAAAA=="),
"mcId" : 184,
"nextVolImgData" : BinData(2,"YgYAAIlQTkc--省略--
AAElFTkSuQmCC"),
"picId" : 7,
"scl" : 100,
"status" : 2,
"time" : "Thu Jan 01 1970 09:00:00 GMT+0900 (JST)",
"titleImg" : BinData(2,"CwoAAIlQTkcNChoKA--省略--
AAAAAABJRU5ErkJggg=="),
"userEditDetailList" : [ ],
"userId" : 3,
"x" : 0,
"y" : 0
}

More Related Content

What's hot

이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
devCAT Studio, NEXON
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013devCAT Studio, NEXON
 
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
Heungsub Lee
 
Massive service basic
Massive service basicMassive service basic
Massive service basic
DaeMyung Kang
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
QooJuice
 
Mongo db 최범균
Mongo db 최범균Mongo db 최범균
Mongo db 최범균
beom kyun choi
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theorem
Seungmo Koo
 
How to build massive service for advance
How to build massive service for advanceHow to build massive service for advance
How to build massive service for advance
DaeMyung Kang
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019min woog kim
 
Mongo DB 성능최적화 전략
Mongo DB 성능최적화 전략Mongo DB 성능최적화 전략
Mongo DB 성능최적화 전략
Jin wook
 
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
KWON JUNHYEOK
 
liftIO 2022 quasiquote
liftIO 2022 quasiquoteliftIO 2022 quasiquote
liftIO 2022 quasiquote
Hyunseok Cho
 
파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)
Heungsub Lee
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
Heungsub Lee
 
Quic을 이용한 네트워크 성능 개선
 Quic을 이용한 네트워크 성능 개선 Quic을 이용한 네트워크 성능 개선
Quic을 이용한 네트워크 성능 개선
NAVER D2
 
Python 게임서버 안녕하십니까 : RPC framework 편
Python 게임서버 안녕하십니까 : RPC framework 편Python 게임서버 안녕하십니까 : RPC framework 편
Python 게임서버 안녕하십니까 : RPC framework 편
준철 박
 
elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리
Junyi Song
 
mongodb와 mysql의 CRUD 연산의 성능 비교
mongodb와 mysql의 CRUD 연산의 성능 비교mongodb와 mysql의 CRUD 연산의 성능 비교
mongodb와 mysql의 CRUD 연산의 성능 비교Woo Yeong Choi
 
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
Seungmo Koo
 
온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기Seungjae Lee
 

What's hot (20)

이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
 
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
 
Massive service basic
Massive service basicMassive service basic
Massive service basic
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
 
Mongo db 최범균
Mongo db 최범균Mongo db 최범균
Mongo db 최범균
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theorem
 
How to build massive service for advance
How to build massive service for advanceHow to build massive service for advance
How to build massive service for advance
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
 
Mongo DB 성능최적화 전략
Mongo DB 성능최적화 전략Mongo DB 성능최적화 전략
Mongo DB 성능최적화 전략
 
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
 
liftIO 2022 quasiquote
liftIO 2022 quasiquoteliftIO 2022 quasiquote
liftIO 2022 quasiquote
 
파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
 
Quic을 이용한 네트워크 성능 개선
 Quic을 이용한 네트워크 성능 개선 Quic을 이용한 네트워크 성능 개선
Quic을 이용한 네트워크 성능 개선
 
Python 게임서버 안녕하십니까 : RPC framework 편
Python 게임서버 안녕하십니까 : RPC framework 편Python 게임서버 안녕하십니까 : RPC framework 편
Python 게임서버 안녕하십니까 : RPC framework 편
 
elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리
 
mongodb와 mysql의 CRUD 연산의 성능 비교
mongodb와 mysql의 CRUD 연산의 성능 비교mongodb와 mysql의 CRUD 연산의 성능 비교
mongodb와 mysql의 CRUD 연산의 성능 비교
 
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
 
온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기
 

Viewers also liked

MongoDB World 2015 - A Technical Introduction to WiredTiger
MongoDB World 2015 - A Technical Introduction to WiredTigerMongoDB World 2015 - A Technical Introduction to WiredTiger
MongoDB World 2015 - A Technical Introduction to WiredTiger
WiredTiger
 
Go web framework 비교[번역 정리]
Go web framework 비교[번역 정리]Go web framework 비교[번역 정리]
Go web framework 비교[번역 정리]
흥배 최
 
Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개
흥배 최
 
iFunEngine: 30분 만에 게임 서버 만들기
iFunEngine: 30분 만에 게임 서버 만들기iFunEngine: 30분 만에 게임 서버 만들기
iFunEngine: 30분 만에 게임 서버 만들기
iFunFactory Inc.
 
ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임흥배 최
 
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다
Dae Kim
 
Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용
흥배 최
 
RESTful API 제대로 만들기
RESTful API 제대로 만들기RESTful API 제대로 만들기
RESTful API 제대로 만들기
Juwon Kim
 

Viewers also liked (9)

MongoDB World 2015 - A Technical Introduction to WiredTiger
MongoDB World 2015 - A Technical Introduction to WiredTigerMongoDB World 2015 - A Technical Introduction to WiredTiger
MongoDB World 2015 - A Technical Introduction to WiredTiger
 
Go web framework 비교[번역 정리]
Go web framework 비교[번역 정리]Go web framework 비교[번역 정리]
Go web framework 비교[번역 정리]
 
NLog 소개
NLog 소개NLog 소개
NLog 소개
 
Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개
 
iFunEngine: 30분 만에 게임 서버 만들기
iFunEngine: 30분 만에 게임 서버 만들기iFunEngine: 30분 만에 게임 서버 만들기
iFunEngine: 30분 만에 게임 서버 만들기
 
ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임
 
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다
 
Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용
 
RESTful API 제대로 만들기
RESTful API 제대로 만들기RESTful API 제대로 만들기
RESTful API 제대로 만들기
 

Similar to MongoDB 모바일 게임 개발에 사용

[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
현철 조
 
CoreDot TechSeminar 2018 - Session2 Ji Donghyun
CoreDot TechSeminar 2018 - Session2 Ji DonghyunCoreDot TechSeminar 2018 - Session2 Ji Donghyun
CoreDot TechSeminar 2018 - Session2 Ji Donghyun
Core.Today
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계
Leonardo YongUk Kim
 
200819 NAVER TECH CONCERT 01_100만 달러짜리 빠른 앱을 만드는 비법 전수
200819 NAVER TECH CONCERT 01_100만 달러짜리 빠른 앱을 만드는 비법 전수200819 NAVER TECH CONCERT 01_100만 달러짜리 빠른 앱을 만드는 비법 전수
200819 NAVER TECH CONCERT 01_100만 달러짜리 빠른 앱을 만드는 비법 전수
NAVER Engineering
 
100만 달러짜리 빠른앱 만드는 비법
100만 달러짜리 빠른앱 만드는 비법100만 달러짜리 빠른앱 만드는 비법
100만 달러짜리 빠른앱 만드는 비법
SooHwan Ok
 
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
Dae Kim
 
What's new in IE11
What's new in IE11What's new in IE11
What's new in IE11
Jae Sung Park
 
[E-commerce & Retail Day] 인공지능서비스 활용방안
[E-commerce & Retail Day] 인공지능서비스 활용방안[E-commerce & Retail Day] 인공지능서비스 활용방안
[E-commerce & Retail Day] 인공지능서비스 활용방안
Amazon Web Services Korea
 
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...
JinKwon Lee
 
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
cranbe95
 
Meteor IoT
Meteor IoTMeteor IoT
Meteor IoT
Jaeho Lee
 
[AWSKRUG] 모바일게임 하이브 런칭기 (2018)
[AWSKRUG] 모바일게임 하이브 런칭기 (2018)[AWSKRUG] 모바일게임 하이브 런칭기 (2018)
[AWSKRUG] 모바일게임 하이브 런칭기 (2018)
용호 최
 
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드Jeongsang Baek
 
MEAN Stack 기반 모바일 서비스 개발 overview
MEAN Stack 기반 모바일 서비스 개발 overviewMEAN Stack 기반 모바일 서비스 개발 overview
MEAN Stack 기반 모바일 서비스 개발 overview
민태 김
 
[스마트스터디]MongoDB 의 역습
[스마트스터디]MongoDB 의 역습[스마트스터디]MongoDB 의 역습
[스마트스터디]MongoDB 의 역습
smartstudy_official
 
프론트엔드 개발자의 자바스크립트
프론트엔드 개발자의 자바스크립트 프론트엔드 개발자의 자바스크립트
프론트엔드 개발자의 자바스크립트
jeong seok yang
 
GraphQL in Action - REST와 이별할 때 생각해야 하는 것들
GraphQL in Action - REST와 이별할 때 생각해야 하는 것들GraphQL in Action - REST와 이별할 때 생각해야 하는 것들
GraphQL in Action - REST와 이별할 때 생각해야 하는 것들
Kivol
 
[Pgday.Seoul 2019] Advanced FDW
[Pgday.Seoul 2019] Advanced FDW[Pgday.Seoul 2019] Advanced FDW
[Pgday.Seoul 2019] Advanced FDW
PgDay.Seoul
 
iOS 모바일에서 한글 손글씨 인식하기(with Keras)
iOS 모바일에서 한글 손글씨 인식하기(with Keras) iOS 모바일에서 한글 손글씨 인식하기(with Keras)
iOS 모바일에서 한글 손글씨 인식하기(with Keras)
Mijeong Jeon
 

Similar to MongoDB 모바일 게임 개발에 사용 (20)

[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
 
CoreDot TechSeminar 2018 - Session2 Ji Donghyun
CoreDot TechSeminar 2018 - Session2 Ji DonghyunCoreDot TechSeminar 2018 - Session2 Ji Donghyun
CoreDot TechSeminar 2018 - Session2 Ji Donghyun
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계
 
200819 NAVER TECH CONCERT 01_100만 달러짜리 빠른 앱을 만드는 비법 전수
200819 NAVER TECH CONCERT 01_100만 달러짜리 빠른 앱을 만드는 비법 전수200819 NAVER TECH CONCERT 01_100만 달러짜리 빠른 앱을 만드는 비법 전수
200819 NAVER TECH CONCERT 01_100만 달러짜리 빠른 앱을 만드는 비법 전수
 
100만 달러짜리 빠른앱 만드는 비법
100만 달러짜리 빠른앱 만드는 비법100만 달러짜리 빠른앱 만드는 비법
100만 달러짜리 빠른앱 만드는 비법
 
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
 
What's new in IE11
What's new in IE11What's new in IE11
What's new in IE11
 
[E-commerce & Retail Day] 인공지능서비스 활용방안
[E-commerce & Retail Day] 인공지능서비스 활용방안[E-commerce & Retail Day] 인공지능서비스 활용방안
[E-commerce & Retail Day] 인공지능서비스 활용방안
 
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...
 
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
 
Meteor IoT
Meteor IoTMeteor IoT
Meteor IoT
 
[AWSKRUG] 모바일게임 하이브 런칭기 (2018)
[AWSKRUG] 모바일게임 하이브 런칭기 (2018)[AWSKRUG] 모바일게임 하이브 런칭기 (2018)
[AWSKRUG] 모바일게임 하이브 런칭기 (2018)
 
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
 
MEAN Stack 기반 모바일 서비스 개발 overview
MEAN Stack 기반 모바일 서비스 개발 overviewMEAN Stack 기반 모바일 서비스 개발 overview
MEAN Stack 기반 모바일 서비스 개발 overview
 
[스마트스터디]MongoDB 의 역습
[스마트스터디]MongoDB 의 역습[스마트스터디]MongoDB 의 역습
[스마트스터디]MongoDB 의 역습
 
프론트엔드 개발자의 자바스크립트
프론트엔드 개발자의 자바스크립트 프론트엔드 개발자의 자바스크립트
프론트엔드 개발자의 자바스크립트
 
Redis
RedisRedis
Redis
 
GraphQL in Action - REST와 이별할 때 생각해야 하는 것들
GraphQL in Action - REST와 이별할 때 생각해야 하는 것들GraphQL in Action - REST와 이별할 때 생각해야 하는 것들
GraphQL in Action - REST와 이별할 때 생각해야 하는 것들
 
[Pgday.Seoul 2019] Advanced FDW
[Pgday.Seoul 2019] Advanced FDW[Pgday.Seoul 2019] Advanced FDW
[Pgday.Seoul 2019] Advanced FDW
 
iOS 모바일에서 한글 손글씨 인식하기(with Keras)
iOS 모바일에서 한글 손글씨 인식하기(with Keras) iOS 모바일에서 한글 손글씨 인식하기(with Keras)
iOS 모바일에서 한글 손글씨 인식하기(with Keras)
 

More from 흥배 최

Bash on Ubuntu on Windows
Bash on Ubuntu on WindowsBash on Ubuntu on Windows
Bash on Ubuntu on Windows
흥배 최
 
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
흥배 최
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
흥배 최
 
Wtl 개요와 설치
Wtl 개요와 설치Wtl 개요와 설치
Wtl 개요와 설치
흥배 최
 
KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발
KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발
KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발
흥배 최
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심흥배 최
 
닷넷 Apache avro
닷넷 Apache avro닷넷 Apache avro
닷넷 Apache avro
흥배 최
 
Mongodb 관리
Mongodb 관리Mongodb 관리
Mongodb 관리
흥배 최
 
Mongodb 개발 포인트
Mongodb 개발 포인트Mongodb 개발 포인트
Mongodb 개발 포인트
흥배 최
 
NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션
흥배 최
 
닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기흥배 최
 
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서흥배 최
 
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템흥배 최
 
Tdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalabilityTdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalability흥배 최
 
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
흥배 최
 
[Sdc 3rd] Boost multi_index
[Sdc 3rd] Boost multi_index[Sdc 3rd] Boost multi_index
[Sdc 3rd] Boost multi_index흥배 최
 
[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11흥배 최
 
[0602 박민근] Direct2D
[0602 박민근] Direct2D[0602 박민근] Direct2D
[0602 박민근] Direct2D
흥배 최
 
[Final]조진현 direct write
[Final]조진현 direct write[Final]조진현 direct write
[Final]조진현 direct write
흥배 최
 
MinWin에 대해서
MinWin에 대해서MinWin에 대해서
MinWin에 대해서흥배 최
 

More from 흥배 최 (20)

Bash on Ubuntu on Windows
Bash on Ubuntu on WindowsBash on Ubuntu on Windows
Bash on Ubuntu on Windows
 
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
 
Wtl 개요와 설치
Wtl 개요와 설치Wtl 개요와 설치
Wtl 개요와 설치
 
KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발
KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발
KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
 
닷넷 Apache avro
닷넷 Apache avro닷넷 Apache avro
닷넷 Apache avro
 
Mongodb 관리
Mongodb 관리Mongodb 관리
Mongodb 관리
 
Mongodb 개발 포인트
Mongodb 개발 포인트Mongodb 개발 포인트
Mongodb 개발 포인트
 
NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션
 
닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기
 
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
 
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
 
Tdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalabilityTdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalability
 
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
 
[Sdc 3rd] Boost multi_index
[Sdc 3rd] Boost multi_index[Sdc 3rd] Boost multi_index
[Sdc 3rd] Boost multi_index
 
[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11
 
[0602 박민근] Direct2D
[0602 박민근] Direct2D[0602 박민근] Direct2D
[0602 박민근] Direct2D
 
[Final]조진현 direct write
[Final]조진현 direct write[Final]조진현 direct write
[Final]조진현 direct write
 
MinWin에 대해서
MinWin에 대해서MinWin에 대해서
MinWin에 대해서
 

MongoDB 모바일 게임 개발에 사용

  • 1. MongoDB를 모바일 게임 개발에 사용 티쓰리엔터테인먼트 모바일 1팀 공통 기술 개발팀 최흥배 과장
  • 2.  일본의 사이버에이전트 사의 사례 http://www.cyberagent.co.jp/ http://ameblo.jp/principia-ca/entry-10983188853.html  아메바 블로그로 유명 http://www.ameba.jp/
  • 3. MongoDB를 사용한 이유  개발 효율 향상 모바일 게임은 단 기간에 개발해야 한다. 그러나 게임은 특성상 자주 변경이 발생한다. 스키마레스의 MongoDB는 데이터 구조 변경에 유연하게 대응 할 수 있다.  신기능, 변경 릴리스 대응 모바일 게임은 주에 3,4회 릴리즈 하는 경우가 대다수이다. 그러나 컬럼 추가나 인덱스 추가를 온라인 상태에서 할 수 없으므로 점검이 필 요하게 된다. MongoDB를 사용하면 점검이 하지 않고 추가가 가능하다.  유연한 쿼리, 인덱스 계층 구조화한 문서 내부에도 인덱스를 확장할 수 있다. KVS로도 이용 할 수 있어서 유연한 쿼리 검색을 할 수 있어서 매력적이다.  초기 비용이 작고, 확장성을 보장 ReplicaSets(비동기 레플리케이션)과 Sharding(자동 데이터 분산)을 제공하고 있 음.
  • 4. 시스템 구성 서버 구성은 Web-App 서버 2대, token이나 정보 캐시용 memcached 2대, Mon goDB 3대로 총 7대. MongoDB는 ReplicaSets 구성으로 primary에 쓰기를 하고, 2대의 secondary에 서 읽기.
  • 5. Sharding을 하지 않은 이유  서버 대수가 필요하게 되어 비용이 증가하기 때문  ReplicaSets을 3세스(3X3대), mongos 서버, config 서버가 필요하기 때문에 총 11대 필요하게 된다 만약 여유분까지 생각하면 더 필요하다  미리 준비하는 것 보다 상황을 봐서 필요하게 될 때 투입하는 것이 좋다고 판단
  • 6. 문서 설계  RDBMS와 달리 NoSQL에서는 정규화는 추천 되지 않는다  데이터를 분할하지 않고 문서로 보존하는 쪽이 데이터가 같은 장소에 보존 되어 서버간 통신 횟수도 줄여준다  문서 설계가 가장 중요하고, 가장 힘들다  문서 설계에서는 'modifier 오퍼레이션'과 '데이터 배열에 의한 유지'를 유효하게 사용할 수 있는 설계로 변경한다  또 이미지 바이너리 데이터의 캐시를 MongoDB에 하여 데이터 획득과 캐시 획 득을 한번 하도록 한다
  • 7. modifier 오퍼레이션  모바일 게임에서는 레벨업이나 경험치 증가 등 increment 조작이 빈번하게 일어 난다  이것을 modifier 오퍼레이션을 이용하여 쉽게 대응할 수 있다
  • 8. db.userStatus.findOne({"userId" : 2013001}) { "_id" : ObjectId("4d82e95a7a92571409f258dd"), "battery" : 80, "point" : 10000, "smile" : 82, "sumModel" : 41, "sumPicture" : 22451, "sumSales" : 1250, "userId" : 2013001 }
  • 9. db.userStatus.findOne({"userId" : 2013001}) { "_id" : ObjectId("4d82e95a7a92571409f258dd"), "battery" : 70, "point" : 10000, "smile" : 82, "sumModel" : 41, "sumPicture" : 22452, "sumSales" : 1250, "userId" : 2013001 } 밧데리를 10 소비하고 사진 촬영을 한 경우 -> db.userStatus.update({"userId" : 2013001},{$inc : {"battery" : - 10,"sumPicture":1}})
  • 10. modifier 오퍼레이션은 계층구조라도 atomic한 조작을 할 수 있다 area2의 퀘스트를 완료하여 레벨이 올라가서 'questlevel'과 'area2'의 숫자를 증 가하는 경우는 아래와 같다 db.user.quest.findOne() { "_id" : ObjectId("4e42208e97ed78c7a7f2f738"), "userId" : 2013001, "questLevel" : 4, "quest" : { "area1" : 3, "area2" : 1, "area3" : 2 } } db.user.quest.update({userId:2013001},{$inc : {questLevel:1,"quest.area2":1}}) db.user.quest.findOne() { "_id" : ObjectId("4e42208e97ed78c7a7f2f738"), "userId" : 2013001, "questLevel" : 5, "quest" : { "area1" : 3, "area2" : 2, "area3" : 2 } }
  • 11. 데이터를 배열로 유지  유저가 모델 촬영을 한 정보를 가지는 컬렉션을 만든다  1명의 모델(modelId)가 복수의 area에 출현하기 때문에 모델의 상태(mcId)에 의 해 컴플리트 한지(compFlg), 거들떠 보았는지(talkFlg)를 배열로 유지한다  이 데이터는 참조가 많기 때문에 userId와modelId를 key로서 얻을 수 있는 것이 장점이 된다
  • 12. 새로운 area에서 modelId:180 이라는 사람과 만난 경우 modelDetails 배열에 데 이터를 추가한다 db.user.model.update({"userId" : 1022962,"modelId" : 180},{$push : {"modelDetails" : {"compFlg" : 0,"talkFlg" : 0,"mcId" : 200}}}) { "_id" : ObjectId("4d7dcbe97ccbb19ad8ac09b9"), "modelId" : 180, "modelDetails" : [ { "compFlg" : 0, "talkFlg" : 1, "mcId" : 188 }, { "compFlg" : 0, "talkFlg" : 1, "mcId" : 189 }, { "compFlg" : 0, "talkFlg" : 0, "mcId" : 200 } ], "userId" : 1022962, "telFlg" : 0, "status" : 0 }
  • 13. 이미지 바이너리 데이터 보존  게임 내에서 만들어진 잡지는 유저가 조작한 타이틀 이미지와 촬영한 모델 이미 지를 합성하여 만든다  이미지를 읽을 때 발생하는 오버헤드를 줄이기 위해서 MongoDB에 이미지 바 이너리 데이터를 보존한다. 한번의 요청으로 필요한 데이터를 얻을 수 있다
  • 14. db.user.edit.find({userId:3}) { "_id" : ObjectId("4d8c77694ca814174e7e3854"), "color" : "RED", "companyDetailId" : NumberLong(0), "companyId" : NumberLong(0), "coverId" : "4d8c7ebd4ca85714cc7e3854", "font" : 1, "imgData" : BinData(2,"AAAAAA=="), "mcId" : 184, "nextVolImgData" : BinData(2,"YgYAAIlQTkc--省略-- AAElFTkSuQmCC"), "picId" : 7, "scl" : 100, "status" : 2, "time" : "Thu Jan 01 1970 09:00:00 GMT+0900 (JST)", "titleImg" : BinData(2,"CwoAAIlQTkcNChoKA--省略-- AAAAAABJRU5ErkJggg=="), "userEditDetailList" : [ ], "userId" : 3, "x" : 0, "y" : 0 }