SlideShare a Scribd company logo
1 of 73
Download to read offline
분산 환경을 위한 ORM
개발 경험 공유
아이펀팩토리 / 엔진 개발팀
남승현
2018 iFunFactory Dev Day
Contents. 01 발표 소개
02 분산 환경을 위한 ORM
04 구현: 코드 자동 생성
05 구현: 이벤트 시스템
06 구현: 비동기 I/O
07 구현: 캐시
08 구현: 잠금(Lock)
09 구현: 분산 환경 – 캐시와 잠금
03 구현: 일반화된 오브젝트
2018 iFunFactory Dev Day
발표 소개
01
2018 iFunFactory Dev Day
• 흔치 않은 개발 사례
• 게임 서버 개발 기간 단축
• 구현된 ORM 소개
• 주요 구현을 방법론 수준으로 소개
발표 소개
2018 iFunFactory Dev Day
분산 환경을 위한 ORM
02 구현된 시스템 소개
2018 iFunFactory Dev Day
ORM 이란?
데이터베이스를 SQL 이 아니라 프로그래밍
언어의 객체로 다룰 수 있게 해주는 기술
분산 환경을 위한 ORM
2018 iFunFactory Dev Day
SQL 사용 예
ORM 사용 예
출처 - Wikipedia
출처 - Wikipedia
2018 iFunFactory Dev Day
개발 동기
• 단순 반복 Database 작업
1. Table
2. Stored Procedure/SQL
3. SQL 호출 코드
게임 콘텐츠 로직만 구현할 수 없을까?
• 게임 서버 개발 생산성 향상
분산 환경을 위한 ORM
2018 iFunFactory Dev Day
개발 목표
• SQL 작업 제거
• 분산 환경
• 충분한 성능
분산 환경을 위한 ORM
2018 iFunFactory Dev Day
구현된 시스템 소개 – 주요 기능
• SQL 처리 자동화
• 잠금(Lock)
• 캐시
• 분산 환경에서 동일한 작동
분산 환경을 위한 ORM
2018 iFunFactory Dev Day
구현된 시스템 소개 – 구조도
이벤트 시스템
오브젝트
캐시
오브젝트
잠금
오브젝트
저널
오브젝트 인터페이스(자동 생성)
오브젝트
DB/RPC
서비스
분산 환경을 위한 ORM
2018 iFunFactory Dev Day
구현된 시스템 소개 – 사용 방법
1. JSON 으로 모델 정의
예)
분산 환경을 위한 ORM
2018 iFunFactory Dev Day
구현된 시스템 소개 – 사용 방법
2. 빌드
코드 생성 프로그램이 모델을 이용해 코드 생성
분산 환경을 위한 ORM
2018 iFunFactory Dev Day
구현된 시스템 소개 – 사용 방법
3. 자동 생성된 인터페이스 Class 사용
분산 환경을 위한 ORM
2018 iFunFactory Dev Day
자동 생성된 인터페이스 Class 예)
2018 iFunFactory Dev Day
자동 생성된 인터페이스 Class 사용 예)
2018 iFunFactory Dev Day
구현: 일반화된 오브젝트
03
2018 iFunFactory Dev Day
class Objectclass Character 참조
• 모든 타입의 오브젝트를 표현
• 자동 생성된 인터페이스 Class 는 단순 Wrapper
class Object
구현: 일반화된 오브젝트
2018 iFunFactory Dev Day
자동 생성된 class Character 예)
구현: 일반화된 오브젝트
2018 iFunFactory Dev Day
class Model
JSON 으로 기술된 모델을 C++ 코드로 표현
구현: 일반화된 오브젝트
2018 iFunFactory Dev Day
class Model
2018 iFunFactory Dev Day
class Model
SQL 을 런타임에 자동 생성 가능하게 함
CREATE TABLE {object-name}
{attribute-name} {type},
{attribute-name} {type},
…
“Character”
“Name CHAR(12)”
“Level INT”
UPDATE {object-name} SET {attribute-name} = {value} WHERE object_id = {object-id}
구현: 일반화된 오브젝트
2018 iFunFactory Dev Day
class Model
SQL 을 런타임에 자동 생성 가능하게 함
구현: 일반화된 오브젝트
CREATE TABLE {object-name}
{attribute-name} {type},
{attribute-name} {type},
…
UPDATE {object-name} SET {attribute-name} = {value} WHERE object_id = {object-id}
“Character”
“Level INT”
“Name CHAR(12)”
2018 iFunFactory Dev Day
class Object, class Model 은 자동 생성되는 코드에서 사용
구현: 일반화된 오브젝트
2018 iFunFactory Dev Day
04 SQL 작업 자동화
SQL 처리 자동화 코드 및
인터페이스 코드 생성
구현: 일반화된 오브젝트
2018 iFunFactory Dev Day
코드 자동 생성
코드 생성 스크립트
모델(JSON) 을 입력 받아 C++ 코드 생성
JSON
코드 생성기
(Python)
Model 생성
인터페이스
Class
<입력>
<출력>
2018 iFunFactory Dev Day
• JSON 으로 표현
• 오브젝트 이름
• 오브젝트의 어트리뷰트와 타입
• Key 라고 부르는 특별한 어트리뷰트 존재
• Key 는 SQL 의 PRIMARY KEY 와 같다
• Key 를 이용하여 오브젝트를 읽을 수 있다
코드 자동 생성
입력: 모델 정의
2018 iFunFactory Dev Day
입력: 모델 정의
코드 자동 생성
예)
2018 iFunFactory Dev Day
출력: C++ 코드
서버 프로그램 빌드 시 실행
• Model 생성 및 등록 코드
• 인터페이스 Class 코드
코드 자동 생성
2018 iFunFactory Dev Day
코드 자동 생성
출력: C++ 코드 – Model 생성 및 등록
• class Model 의 인스턴스를 생성하여 시스템에 등록
• 등록된 모델 정보를 이용하여 런타임에 SQL 생성 가능
2018 iFunFactory Dev Day
코드 자동 생성
출력: C++ 코드 – Model 생성 및 등록
예)
2018 iFunFactory Dev Day
코드 자동 생성
출력: C++ 코드 - 인터페이스 Class
• 프로그래머 사용하는 유일한 인터페이스
• 오브젝트 생성 함수 – Create()
• 오브젝트를 불러오는 함수 – Fetch()
DB I/O, 잠금, 캐시 등의 처리를 내부에서 수행
• 오브젝트의 각 어트리뷰트를 읽고, 쓰는 함수 – Get()/Set()
SQL 쿼리 생성 및 호출을 내부에서 수행
2018 iFunFactory Dev Day
출력: 인터페이스 Class
예)
2018 iFunFactory Dev Day
코드 자동 생성
출력된 코드 사용 예) DB, 잠금, 캐시 등 자동으로 처리
2018 iFunFactory Dev Day
구현: 이벤트 시스템
05 트랜잭션 구현을 위한
이벤트 시스템
2018 iFunFactory Dev Day
구현: 이벤트 시스템
• 함수를 실행하는 스레드 풀
• 트랜잭션 구현을 위해 필요
2018 iFunFactory Dev Day
구현: 이벤트 시스템
이벤트 상태
• 실행 준비: 실행하기 위해 스레드를 기다림
• 실행: 스레드를 할당 받아 실행 중
• 중단(롤백): 오브젝트를 즉시 사용할 수 없는 경우 대기
• DB 에서 읽어와야 할 때
• 잠금을 얻을 수 없을 때
2018 iFunFactory Dev Day
구현: 이벤트 시스템
중단(롤백) 구현
C++ Exception Throw
오브젝트를 사용할 수 있을 때 다시 실행
2018 iFunFactory Dev Day
구현: 이벤트 시스템
1
2
3
중단(롤백) 구현
2018 iFunFactory Dev Day
구현: 이벤트 시스템
오브젝트 저널
• 이벤트 함수 안에서 오브젝트 수정은 임시 저장
• 중단(롤백) 시 임시 저장 내용 삭제
• 완료(완료) 시 캐시 및 Database 에 반영
2018 iFunFactory Dev Day
구현: 이벤트 시스템
단점
중단 전 코드 2번 이상 실행
2018 iFunFactory Dev Day
구현: 비동기 I/O
06 이벤트 시스템의 트랜잭션 활용
2018 iFunFactory Dev Day
구현: 비동기 I/O
비동기 I/O 발생
• 오브젝트를 접근할 때 Database 에서 읽어와야 할 때
• I/O 를 블록킹 방식으로 구현하면 처리량 급감
2018 iFunFactory Dev Day
구현: 비동기 I/O
비동기 I/O 구현
• C++ Exception 을 Throw 하여 이벤트 중단(롤백)
• Exception 객체에 I/O 작업을 저장
• I/O 완료 후 이벤트 함수 재실행
이벤트 시스템으로 구현됨
2018 iFunFactory Dev Day
구현: 비동기 I/O
문제
• 오브젝트를 접근하려면 매번 중단(롤백) 발생
• Exception Throw
• I/O 처리
-> 캐시로 해결
2018 iFunFactory Dev Day
구현: 캐시
07
2018 iFunFactory Dev Day
구현: 캐시
• 매번 Database 에서 읽는 것은 비효율
• I/O 처리 비용
• 이벤트 중단을 위한 Exception Throw 비용
• 일정 시간 동안 메모리에 보관
2018 iFunFactory Dev Day
구현: 캐시
캐시의 주요 구현
• 오브젝트 보관
• Key Attribute 에 대한 Index
• 제거 타이머
2018 iFunFactory Dev Day
구현: 캐시
자료구조
시간 복잡도: O(1)
2018 iFunFactory Dev Day
캐시에 오브젝트 입력 구현 예)
Character 오브젝트(Name: “devday”, Object-Id: 1234)
Key 로 지정된 “Name” 어트리뷰트
Name 이 “devday” 인 오브젝트의 Object ID
2018 iFunFactory Dev Day
캐시에 검색 구현 예)
Character 오브젝트(Name: “devday”, Object-Id: 1234)
Key 로 지정된 “Name” 어트리뷰트
Name 이 “devday” 인 오브젝트의 Object ID
2018 iFunFactory Dev Day
구현: 캐시
자료구조 - 단점
범위 검색 불가능
-> ordered_map(std::map) 으로 해결 가능
성능 하락
2018 iFunFactory Dev Day
구현: 캐시
제거 타이머
• 오브젝트를 캐시에서 접근 시 타이머 설정
• 모든 오브젝트에 타이머를 두면 성능 문제 발생
• 일정 시간 모아서 처리
2018 iFunFactory Dev Day
구현: 잠금(Lock)
08
2018 iFunFactory Dev Day
구현: 잠금
잠금 구현이 필요한 이유
• 한 오브젝트를 여러 이벤트에서 동시 수정 발생
• 캐시에 로드된 오브젝트는 SQL 의 잠금(Lock) 불가
• SQL 잠금은 DB 에 로직 구현 필요
• Database 샤딩 시 SQL 잠금 사용 어려움
2018 iFunFactory Dev Day
구현: 잠금
잠금의 종류
잠금은 이벤트 함수가 끝날 때까지 유효
• 복사본 읽기
• 읽기
• 쓰기
잠금을 획득할 수 없으면 이벤트 중단(롤백)
2018 iFunFactory Dev Day
구현: 잠금
문제: 데드락
각 이벤트에서 서로 다른 순서로 오브젝트에 접근
2018 iFunFactory Dev Day
구현: 잠금
다음 4 조건이 모두 만족되면 데드락 발생
• 상호배제
프로세스들이 필요로 하는 자원에 대해 배타적인 통제권을 요구한다.
• 점유대기
프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다린다.
• 비선점
프로세스가 어떤 자원의 사용을 끝낼 때까지 그 자원을 뺏을 수 없다.
• 순환대기
각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있다.
2018 iFunFactory Dev Day
구현: 잠금
데드락 회피를 위해 두 가지 방법 시도
• 타이머 이용 – 점유대기 방지
• 선점형 잠금 – 비선점 방지
2018 iFunFactory Dev Day
구현: 잠금
타이머 이용
데드락 조건 4 가지 중 점유 대기(Hold and wait) 방지
잠금을 획득할 수 없는 경우
• 획득한 모든 잠금 해제하고 이벤트 중단
• 일정시간 후 잠금이 풀렸기를 기대하며 이벤트 재호출
일정시간 = Exponental backoff 알고리즘
2018 iFunFactory Dev Day
구현: 잠금
타이머 이용 - 장점
구현이 쉬움
타이머 이용 - 단점
경합하는 오브젝트 수가 많으면 해결 불가
2018 iFunFactory Dev Day
구현: 잠금
섬점형 잠금
데드락 조건 4 가지 중 비선점(No preemption) 방지
• 모든 이벤트는 발생 시간에 의한 우선순위를 갖는다
• 먼저 발생된 이벤트는 늦게 발생된 이벤트가 중단 상태이면
잠금을 해제할 수 있다
2018 iFunFactory Dev Day
구현: 잠금
섬점형 잠금 – 데드락 회피 예)
이벤트1, 2 가 Object A, B 를 교차하여 쓰기 잠금 획득
2018 iFunFactory Dev Day
0
1
2
3
4
5
6
7
Time
이벤트1 생성 및 실행
ObjectA 잠금 획득 시도: 성공
Sleep 1
ObjectB 잠금 획득 시도: 실패
-> 이벤트2 의 ObjectB 잠금 해제 요청
중단(롤백)
재실행, ObjectA, B 잠금 획득 시도: 성공
처리 완료
이벤트2 생성 및 실행
ObjectB 잠금 획득 시도: 성공
Sleep 1
ObjectA 잠금 획득 시도: 실패
-> 잠금 해제 불가
중단(롤백), ObjectB 잠금 해제
재실행, ObjectB, A 잠금 획득 시도: 성공, 처리 완료
이벤트1 이벤트2
이벤트1, 2 가 Object A, B 를 교차하여 쓰기 잠금 획득
2018 iFunFactory Dev Day
구현: 잠금
선점형 잠금 - 장점
경합 빈도에 상관 없이 빠르고 일정한 성능
선점형 잠금 - 단점
경합이 없을 땐 타이머 방식 보다 느리다
상대적으로 구현이 어렵다
2018 iFunFactory Dev Day
구현: 분산환경 – 캐시와 잠금
09
2018 iFunFactory Dev Day
구현: 분산환경 – 캐시와 잠금
Zookeeper
• 오픈소스 분산 코디네이션 서버
• 클러스터를 구성하여 SPoF(Single point of failure) 를
만들지 않음
• 파일 시스템처럼 사용
경로를 지정하여 데이터 저장
• 오브젝트 소유권 관리
2018 iFunFactory Dev Day
구현: 분산환경 – 캐시와 잠금
Zookeeper 를 이용한 오브젝트 소유권 관리
오브젝트 소유권 = 캐싱
오브젝트를 캐시에 입력하기 전
/objects/{object-id} 파일에 서버ID 저장
해당 경로에 이미 파일이 있으면 해당 서버의 캐시와 잠금 기능을
RPC 로 접근
2018 iFunFactory Dev Day
구현: 분산환경 – 캐시와 잠금
Lease RPC
빌려올 오브젝트 ID 를 인자로 전달
수신한 서버는
• 해당 오브젝트 잠금 처리 + 타임아웃 설정
• 해당 오브젝트를 캐시에서 읽어 응답으로 전달
• 반납 RPC 수신 시 변경 사항이 있으면 반영
2018 iFunFactory Dev Day
구현: 분산환경 – 캐시와 잠금
/objects/
┗1234 => “ServerA”
ID: 1234
Name: “devday”
Zookeeper
ServerA
Cache
ServerA 가 Character(Name:”devday”, Object-Id:1234) 캐싱
2018 iFunFactory Dev Day
구현: 분산환경 – 캐시와 잠금
소유 확인
Lease RPC
Return RPC
/objects/
┗1234 => “ServerA”
Zookeeper
ID: 1234
Name: “devday”
ServerA
Cache
ServerB
Cache
1
2
3
2018 iFunFactory Dev Day
구현: 분산환경 – 캐시와 잠금
캐시 적중률 문제
• Lease RPC 는 무겁다
• 오브젝트는 최대한 많이 접근하는 서버가 소유
해결
• 캐시는 각 오브젝트의 서버 별 접근 빈도 계산
• 더 높은 빈도의 서버 발견 시 타이머와 상관 없이 캐시에서 내린다
Q&A
2018 iFunFactory Dev Day
2018 iFunFactory Dev Day
Thank You!
경기도 성남시 분당구 대왕판교로 660, 유스페이스1 B동 606호 아이펀팩토리
info@ifunfactory.com +82-70-4923-6566 www.ifunfactory.com

More Related Content

What's hot

웹 IDE 비교
웹 IDE 비교웹 IDE 비교
웹 IDE 비교Junyoung Lee
 
iFun Engine plugin 만들기 (for Stingray)
iFun Engine plugin 만들기 (for Stingray) iFun Engine plugin 만들기 (for Stingray)
iFun Engine plugin 만들기 (for Stingray) iFunFactory Inc.
 
[네이버오픈소스세미나] Next Generation Spring Security OAuth2.0 - 이명현
[네이버오픈소스세미나] Next Generation Spring Security OAuth2.0 - 이명현[네이버오픈소스세미나] Next Generation Spring Security OAuth2.0 - 이명현
[네이버오픈소스세미나] Next Generation Spring Security OAuth2.0 - 이명현NAVER Engineering
 
[123] electron 김성훈
[123] electron 김성훈[123] electron 김성훈
[123] electron 김성훈NAVER D2
 
20170813 django api server unit test and remote debugging
20170813 django api server unit test and remote debugging20170813 django api server unit test and remote debugging
20170813 django api server unit test and remote debuggingJongwon Han
 
C++ GUI 라이브러리 소개: Qt & Nana
C++ GUI 라이브러리 소개: Qt & NanaC++ GUI 라이브러리 소개: Qt & Nana
C++ GUI 라이브러리 소개: Qt & NanaLazy Ahasil
 
bamboo 로 PHP 프로젝트 지속적인 배포
bamboo 로 PHP 프로젝트 지속적인 배포bamboo 로 PHP 프로젝트 지속적인 배포
bamboo 로 PHP 프로젝트 지속적인 배포KwangSeob Jeong
 
Cloud ide를 이용한_모바일_개발의_가능성과_전망
Cloud ide를 이용한_모바일_개발의_가능성과_전망Cloud ide를 이용한_모바일_개발의_가능성과_전망
Cloud ide를 이용한_모바일_개발의_가능성과_전망Sung-tae Ryu
 
[ Pycon Korea 2017 ] Infrastructure as Code를위한 Ansible 활용
[ Pycon Korea 2017 ] Infrastructure as Code를위한 Ansible 활용[ Pycon Korea 2017 ] Infrastructure as Code를위한 Ansible 활용
[ Pycon Korea 2017 ] Infrastructure as Code를위한 Ansible 활용Jihyung Song
 
[145]5년간의네이버웹엔진개발삽질기그리고 김효
[145]5년간의네이버웹엔진개발삽질기그리고 김효[145]5년간의네이버웹엔진개발삽질기그리고 김효
[145]5년간의네이버웹엔진개발삽질기그리고 김효NAVER D2
 
파이콘 2017 그만퇴근합시다_이지호
파이콘 2017 그만퇴근합시다_이지호파이콘 2017 그만퇴근합시다_이지호
파이콘 2017 그만퇴근합시다_이지호Jiho Lee
 
이클립스 플랫폼
이클립스 플랫폼이클립스 플랫폼
이클립스 플랫폼Kenu, GwangNam Heo
 
[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱NAVER D2
 
[113]apache zeppelin 이문수
[113]apache zeppelin 이문수[113]apache zeppelin 이문수
[113]apache zeppelin 이문수NAVER D2
 
오픈소스 프로젝트 따라잡기_공개
오픈소스 프로젝트 따라잡기_공개오픈소스 프로젝트 따라잡기_공개
오픈소스 프로젝트 따라잡기_공개Hyoungjun Kim
 
swig를 이용한 C++ 랩핑
swig를 이용한 C++ 랩핑swig를 이용한 C++ 랩핑
swig를 이용한 C++ 랩핑NAVER D2
 
[Open-infradays 2019 Korea] jabayo on Kubeflow
[Open-infradays 2019 Korea] jabayo on Kubeflow[Open-infradays 2019 Korea] jabayo on Kubeflow
[Open-infradays 2019 Korea] jabayo on Kubeflow석환 홍
 
Laravel로 스타트업 기술 스택 구성하기
Laravel로 스타트업 기술 스택 구성하기Laravel로 스타트업 기술 스택 구성하기
Laravel로 스타트업 기술 스택 구성하기KwangSeob Jeong
 
Open infradays 2019_msa_k8s
Open infradays 2019_msa_k8sOpen infradays 2019_msa_k8s
Open infradays 2019_msa_k8sHyoungjun Kim
 

What's hot (20)

웹 IDE 비교
웹 IDE 비교웹 IDE 비교
웹 IDE 비교
 
iFun Engine plugin 만들기 (for Stingray)
iFun Engine plugin 만들기 (for Stingray) iFun Engine plugin 만들기 (for Stingray)
iFun Engine plugin 만들기 (for Stingray)
 
[네이버오픈소스세미나] Next Generation Spring Security OAuth2.0 - 이명현
[네이버오픈소스세미나] Next Generation Spring Security OAuth2.0 - 이명현[네이버오픈소스세미나] Next Generation Spring Security OAuth2.0 - 이명현
[네이버오픈소스세미나] Next Generation Spring Security OAuth2.0 - 이명현
 
[123] electron 김성훈
[123] electron 김성훈[123] electron 김성훈
[123] electron 김성훈
 
20170813 django api server unit test and remote debugging
20170813 django api server unit test and remote debugging20170813 django api server unit test and remote debugging
20170813 django api server unit test and remote debugging
 
C++ GUI 라이브러리 소개: Qt & Nana
C++ GUI 라이브러리 소개: Qt & NanaC++ GUI 라이브러리 소개: Qt & Nana
C++ GUI 라이브러리 소개: Qt & Nana
 
bamboo 로 PHP 프로젝트 지속적인 배포
bamboo 로 PHP 프로젝트 지속적인 배포bamboo 로 PHP 프로젝트 지속적인 배포
bamboo 로 PHP 프로젝트 지속적인 배포
 
Cloud ide를 이용한_모바일_개발의_가능성과_전망
Cloud ide를 이용한_모바일_개발의_가능성과_전망Cloud ide를 이용한_모바일_개발의_가능성과_전망
Cloud ide를 이용한_모바일_개발의_가능성과_전망
 
[ Pycon Korea 2017 ] Infrastructure as Code를위한 Ansible 활용
[ Pycon Korea 2017 ] Infrastructure as Code를위한 Ansible 활용[ Pycon Korea 2017 ] Infrastructure as Code를위한 Ansible 활용
[ Pycon Korea 2017 ] Infrastructure as Code를위한 Ansible 활용
 
[145]5년간의네이버웹엔진개발삽질기그리고 김효
[145]5년간의네이버웹엔진개발삽질기그리고 김효[145]5년간의네이버웹엔진개발삽질기그리고 김효
[145]5년간의네이버웹엔진개발삽질기그리고 김효
 
파이콘 2017 그만퇴근합시다_이지호
파이콘 2017 그만퇴근합시다_이지호파이콘 2017 그만퇴근합시다_이지호
파이콘 2017 그만퇴근합시다_이지호
 
이클립스 플랫폼
이클립스 플랫폼이클립스 플랫폼
이클립스 플랫폼
 
[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱
 
[113]apache zeppelin 이문수
[113]apache zeppelin 이문수[113]apache zeppelin 이문수
[113]apache zeppelin 이문수
 
Goorm소개
Goorm소개Goorm소개
Goorm소개
 
오픈소스 프로젝트 따라잡기_공개
오픈소스 프로젝트 따라잡기_공개오픈소스 프로젝트 따라잡기_공개
오픈소스 프로젝트 따라잡기_공개
 
swig를 이용한 C++ 랩핑
swig를 이용한 C++ 랩핑swig를 이용한 C++ 랩핑
swig를 이용한 C++ 랩핑
 
[Open-infradays 2019 Korea] jabayo on Kubeflow
[Open-infradays 2019 Korea] jabayo on Kubeflow[Open-infradays 2019 Korea] jabayo on Kubeflow
[Open-infradays 2019 Korea] jabayo on Kubeflow
 
Laravel로 스타트업 기술 스택 구성하기
Laravel로 스타트업 기술 스택 구성하기Laravel로 스타트업 기술 스택 구성하기
Laravel로 스타트업 기술 스택 구성하기
 
Open infradays 2019_msa_k8s
Open infradays 2019_msa_k8sOpen infradays 2019_msa_k8s
Open infradays 2019_msa_k8s
 

Similar to [아이펀팩토리] 2018 데브데이 서버위더스 _02 분산 환경을 위한 ORM 개발 경험 공유

iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)
iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)
iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)Changwon National University
 
2019 아이펀팩토리 Dev Day 세션2 아이펀엔진 개발 환경 설정하기 (Linux + VS Code) - 김진욱
2019 아이펀팩토리 Dev Day 세션2 아이펀엔진 개발 환경 설정하기 (Linux + VS Code) - 김진욱2019 아이펀팩토리 Dev Day 세션2 아이펀엔진 개발 환경 설정하기 (Linux + VS Code) - 김진욱
2019 아이펀팩토리 Dev Day 세션2 아이펀엔진 개발 환경 설정하기 (Linux + VS Code) - 김진욱iFunFactory Inc.
 
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서Jeongmin Cha
 
windows via c++ Ch 5. Job
windows via c++ Ch 5. Jobwindows via c++ Ch 5. Job
windows via c++ Ch 5. JobHyosung Jeon
 
장고로 웹서비스 만들기 기초
장고로 웹서비스 만들기   기초장고로 웹서비스 만들기   기초
장고로 웹서비스 만들기 기초Kwangyoun Jung
 
Java script의 이해
Java script의 이해Java script의 이해
Java script의 이해seungkyu park
 
REST API Development with Spring
REST API Development with SpringREST API Development with Spring
REST API Development with SpringKeesun Baik
 
[MeetUp][3rd] Prometheus 와 함께하는 모니터링 및 시각화
[MeetUp][3rd] Prometheus 와 함께하는 모니터링 및 시각화[MeetUp][3rd] Prometheus 와 함께하는 모니터링 및 시각화
[MeetUp][3rd] Prometheus 와 함께하는 모니터링 및 시각화InfraEngineer
 
Spring di chapter2
Spring di chapter2Spring di chapter2
Spring di chapter2흥래 김
 
[ 2015 SOSCON ]오픈스택 swift로 시작하는 오픈소스 분석 삽질기
[ 2015 SOSCON ]오픈스택 swift로 시작하는 오픈소스 분석 삽질기[ 2015 SOSCON ]오픈스택 swift로 시작하는 오픈소스 분석 삽질기
[ 2015 SOSCON ]오픈스택 swift로 시작하는 오픈소스 분석 삽질기nexusz99
 
Cep 소개 - for developers
Cep 소개 - for developersCep 소개 - for developers
Cep 소개 - for developersJuhyeon Lee
 
Springcamp spring boot intro
Springcamp spring boot introSpringcamp spring boot intro
Springcamp spring boot introJae-il Lee
 
2019 아이펀팩토리 Dev Day 세션4 아이펀엔진에 MO 게임 콘텐츠 채워 넣기 - 남승현
2019 아이펀팩토리 Dev Day 세션4 아이펀엔진에 MO 게임 콘텐츠 채워 넣기 - 남승현2019 아이펀팩토리 Dev Day 세션4 아이펀엔진에 MO 게임 콘텐츠 채워 넣기 - 남승현
2019 아이펀팩토리 Dev Day 세션4 아이펀엔진에 MO 게임 콘텐츠 채워 넣기 - 남승현iFunFactory Inc.
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019devCAT Studio, NEXON
 
2015 SW마에스트로 100+ 컨퍼런스_오픈스택 Swift로 시작하는 오픈소스 분석 삽질기
2015 SW마에스트로 100+ 컨퍼런스_오픈스택 Swift로 시작하는 오픈소스 분석 삽질기2015 SW마에스트로 100+ 컨퍼런스_오픈스택 Swift로 시작하는 오픈소스 분석 삽질기
2015 SW마에스트로 100+ 컨퍼런스_오픈스택 Swift로 시작하는 오픈소스 분석 삽질기2015 SW마에스트로 100+ 컨퍼런스
 
2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축
2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축
2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축Youngil Cho
 
[부스트캠프 Tech Talk] 이정현_Github Workflow 활용하기
[부스트캠프 Tech Talk] 이정현_Github Workflow 활용하기[부스트캠프 Tech Talk] 이정현_Github Workflow 활용하기
[부스트캠프 Tech Talk] 이정현_Github Workflow 활용하기CONNECT FOUNDATION
 
11 윈도우스레드풀
11 윈도우스레드풀11 윈도우스레드풀
11 윈도우스레드풀ssuser0c2478
 

Similar to [아이펀팩토리] 2018 데브데이 서버위더스 _02 분산 환경을 위한 ORM 개발 경험 공유 (20)

iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)
iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)
iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)
 
2019 아이펀팩토리 Dev Day 세션2 아이펀엔진 개발 환경 설정하기 (Linux + VS Code) - 김진욱
2019 아이펀팩토리 Dev Day 세션2 아이펀엔진 개발 환경 설정하기 (Linux + VS Code) - 김진욱2019 아이펀팩토리 Dev Day 세션2 아이펀엔진 개발 환경 설정하기 (Linux + VS Code) - 김진욱
2019 아이펀팩토리 Dev Day 세션2 아이펀엔진 개발 환경 설정하기 (Linux + VS Code) - 김진욱
 
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
 
windows via c++ Ch 5. Job
windows via c++ Ch 5. Jobwindows via c++ Ch 5. Job
windows via c++ Ch 5. Job
 
7. html5 api
7. html5 api7. html5 api
7. html5 api
 
장고로 웹서비스 만들기 기초
장고로 웹서비스 만들기   기초장고로 웹서비스 만들기   기초
장고로 웹서비스 만들기 기초
 
Java script의 이해
Java script의 이해Java script의 이해
Java script의 이해
 
REST API Development with Spring
REST API Development with SpringREST API Development with Spring
REST API Development with Spring
 
[MeetUp][3rd] Prometheus 와 함께하는 모니터링 및 시각화
[MeetUp][3rd] Prometheus 와 함께하는 모니터링 및 시각화[MeetUp][3rd] Prometheus 와 함께하는 모니터링 및 시각화
[MeetUp][3rd] Prometheus 와 함께하는 모니터링 및 시각화
 
Spring di chapter2
Spring di chapter2Spring di chapter2
Spring di chapter2
 
[ 2015 SOSCON ]오픈스택 swift로 시작하는 오픈소스 분석 삽질기
[ 2015 SOSCON ]오픈스택 swift로 시작하는 오픈소스 분석 삽질기[ 2015 SOSCON ]오픈스택 swift로 시작하는 오픈소스 분석 삽질기
[ 2015 SOSCON ]오픈스택 swift로 시작하는 오픈소스 분석 삽질기
 
Cep 소개 - for developers
Cep 소개 - for developersCep 소개 - for developers
Cep 소개 - for developers
 
Springcamp spring boot intro
Springcamp spring boot introSpringcamp spring boot intro
Springcamp spring boot intro
 
2019 아이펀팩토리 Dev Day 세션4 아이펀엔진에 MO 게임 콘텐츠 채워 넣기 - 남승현
2019 아이펀팩토리 Dev Day 세션4 아이펀엔진에 MO 게임 콘텐츠 채워 넣기 - 남승현2019 아이펀팩토리 Dev Day 세션4 아이펀엔진에 MO 게임 콘텐츠 채워 넣기 - 남승현
2019 아이펀팩토리 Dev Day 세션4 아이펀엔진에 MO 게임 콘텐츠 채워 넣기 - 남승현
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
 
2015 SW마에스트로 100+ 컨퍼런스_오픈스택 Swift로 시작하는 오픈소스 분석 삽질기
2015 SW마에스트로 100+ 컨퍼런스_오픈스택 Swift로 시작하는 오픈소스 분석 삽질기2015 SW마에스트로 100+ 컨퍼런스_오픈스택 Swift로 시작하는 오픈소스 분석 삽질기
2015 SW마에스트로 100+ 컨퍼런스_오픈스택 Swift로 시작하는 오픈소스 분석 삽질기
 
2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축
2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축
2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축
 
[부스트캠프 Tech Talk] 이정현_Github Workflow 활용하기
[부스트캠프 Tech Talk] 이정현_Github Workflow 활용하기[부스트캠프 Tech Talk] 이정현_Github Workflow 활용하기
[부스트캠프 Tech Talk] 이정현_Github Workflow 활용하기
 
Spring boot DI
Spring boot DISpring boot DI
Spring boot DI
 
11 윈도우스레드풀
11 윈도우스레드풀11 윈도우스레드풀
11 윈도우스레드풀
 

More from iFunFactory Inc.

2019 아이펀팩토리 Dev Day 세션5 아이펀엔진으로 만든 게임 성능 분석 및 디버깅 - 남승현
2019 아이펀팩토리 Dev Day 세션5 아이펀엔진으로 만든 게임 성능 분석 및 디버깅 - 남승현2019 아이펀팩토리 Dev Day 세션5 아이펀엔진으로 만든 게임 성능 분석 및 디버깅 - 남승현
2019 아이펀팩토리 Dev Day 세션5 아이펀엔진으로 만든 게임 성능 분석 및 디버깅 - 남승현iFunFactory Inc.
 
2019 아이펀팩토리 Dev Day 세션3 아이펀엔진 개발 환경 설정하기 (Windows+ VS) - 김진욱
2019 아이펀팩토리 Dev Day 세션3 아이펀엔진 개발 환경 설정하기 (Windows+ VS) - 김진욱2019 아이펀팩토리 Dev Day 세션3 아이펀엔진 개발 환경 설정하기 (Windows+ VS) - 김진욱
2019 아이펀팩토리 Dev Day 세션3 아이펀엔진 개발 환경 설정하기 (Windows+ VS) - 김진욱iFunFactory Inc.
 
2019 아이펀팩토리 Dev Day 세션1 네트워크 프로그래밍 개론 - 문대경 대표
2019 아이펀팩토리 Dev Day 세션1 네트워크 프로그래밍 개론 - 문대경 대표2019 아이펀팩토리 Dev Day 세션1 네트워크 프로그래밍 개론 - 문대경 대표
2019 아이펀팩토리 Dev Day 세션1 네트워크 프로그래밍 개론 - 문대경 대표iFunFactory Inc.
 
[아이펀팩토리] 2018 데브데이 서버위더스 _03 Scalable 한 게임 서버 만들기
[아이펀팩토리] 2018 데브데이 서버위더스 _03 Scalable 한 게임 서버 만들기[아이펀팩토리] 2018 데브데이 서버위더스 _03 Scalable 한 게임 서버 만들기
[아이펀팩토리] 2018 데브데이 서버위더스 _03 Scalable 한 게임 서버 만들기iFunFactory Inc.
 
[아이펀팩토리] 2018 데브데이 서버위더스 _04 리눅스 게임 서버 성능 분석
[아이펀팩토리] 2018 데브데이 서버위더스 _04 리눅스 게임 서버 성능 분석[아이펀팩토리] 2018 데브데이 서버위더스 _04 리눅스 게임 서버 성능 분석
[아이펀팩토리] 2018 데브데이 서버위더스 _04 리눅스 게임 서버 성능 분석iFunFactory Inc.
 
[아이펀팩토리] 클라이언트 개발자, 서버 개발 시작하기
[아이펀팩토리] 클라이언트 개발자, 서버 개발 시작하기 [아이펀팩토리] 클라이언트 개발자, 서버 개발 시작하기
[아이펀팩토리] 클라이언트 개발자, 서버 개발 시작하기 iFunFactory Inc.
 
[아이펀팩토리] 2017 NDCP
[아이펀팩토리] 2017 NDCP [아이펀팩토리] 2017 NDCP
[아이펀팩토리] 2017 NDCP iFunFactory Inc.
 
[아이펀팩토리]2017 NDC 강연 자료_아이펀 엔진 개발 노트
[아이펀팩토리]2017 NDC 강연 자료_아이펀 엔진 개발 노트[아이펀팩토리]2017 NDC 강연 자료_아이펀 엔진 개발 노트
[아이펀팩토리]2017 NDC 강연 자료_아이펀 엔진 개발 노트iFunFactory Inc.
 
게임서버 구축 방법비교 : GBaaS vs. Self-hosting
게임서버 구축 방법비교 : GBaaS vs. Self-hosting게임서버 구축 방법비교 : GBaaS vs. Self-hosting
게임서버 구축 방법비교 : GBaaS vs. Self-hostingiFunFactory Inc.
 
유니티 쉐이더 단기속성
유니티 쉐이더 단기속성유니티 쉐이더 단기속성
유니티 쉐이더 단기속성iFunFactory Inc.
 
게임 서버 성능 분석하기
게임 서버 성능 분석하기게임 서버 성능 분석하기
게임 서버 성능 분석하기iFunFactory Inc.
 
혼자서 만드는 MMO게임 서버
혼자서 만드는 MMO게임 서버혼자서 만드는 MMO게임 서버
혼자서 만드는 MMO게임 서버iFunFactory Inc.
 
Python과 AWS를 이용하여 게임 테스트 환경 구축하기
Python과 AWS를 이용하여 게임 테스트 환경 구축하기Python과 AWS를 이용하여 게임 테스트 환경 구축하기
Python과 AWS를 이용하여 게임 테스트 환경 구축하기iFunFactory Inc.
 
PC 와 모바일에서의 P2P 게임 구현에서의 차이점 비교
PC 와 모바일에서의 P2P 게임 구현에서의 차이점 비교PC 와 모바일에서의 P2P 게임 구현에서의 차이점 비교
PC 와 모바일에서의 P2P 게임 구현에서의 차이점 비교iFunFactory Inc.
 
Docker 로 Linux 없이 Linux 환경에서 개발하기
Docker 로 Linux 없이 Linux 환경에서 개발하기Docker 로 Linux 없이 Linux 환경에서 개발하기
Docker 로 Linux 없이 Linux 환경에서 개발하기iFunFactory Inc.
 
게임 운영에 필요한 로그성 데이터들에 대하여
게임 운영에 필요한 로그성 데이터들에 대하여게임 운영에 필요한 로그성 데이터들에 대하여
게임 운영에 필요한 로그성 데이터들에 대하여iFunFactory Inc.
 
Make "PONG" : 아키텍팅과 동기화 테크닉
Make "PONG" : 아키텍팅과 동기화 테크닉Make "PONG" : 아키텍팅과 동기화 테크닉
Make "PONG" : 아키텍팅과 동기화 테크닉iFunFactory Inc.
 
2016 NDC - 클라우드 시대의 모바일 게임 운영 플랫폼 구현
2016 NDC  - 클라우드 시대의  모바일 게임 운영 플랫폼 구현2016 NDC  - 클라우드 시대의  모바일 게임 운영 플랫폼 구현
2016 NDC - 클라우드 시대의 모바일 게임 운영 플랫폼 구현iFunFactory Inc.
 
2016 NDC - 모바일 게임 서버 엔진 개발 후기
2016 NDC - 모바일 게임 서버 엔진 개발 후기2016 NDC - 모바일 게임 서버 엔진 개발 후기
2016 NDC - 모바일 게임 서버 엔진 개발 후기iFunFactory Inc.
 

More from iFunFactory Inc. (20)

2019 아이펀팩토리 Dev Day 세션5 아이펀엔진으로 만든 게임 성능 분석 및 디버깅 - 남승현
2019 아이펀팩토리 Dev Day 세션5 아이펀엔진으로 만든 게임 성능 분석 및 디버깅 - 남승현2019 아이펀팩토리 Dev Day 세션5 아이펀엔진으로 만든 게임 성능 분석 및 디버깅 - 남승현
2019 아이펀팩토리 Dev Day 세션5 아이펀엔진으로 만든 게임 성능 분석 및 디버깅 - 남승현
 
2019 아이펀팩토리 Dev Day 세션3 아이펀엔진 개발 환경 설정하기 (Windows+ VS) - 김진욱
2019 아이펀팩토리 Dev Day 세션3 아이펀엔진 개발 환경 설정하기 (Windows+ VS) - 김진욱2019 아이펀팩토리 Dev Day 세션3 아이펀엔진 개발 환경 설정하기 (Windows+ VS) - 김진욱
2019 아이펀팩토리 Dev Day 세션3 아이펀엔진 개발 환경 설정하기 (Windows+ VS) - 김진욱
 
2019 아이펀팩토리 Dev Day 세션1 네트워크 프로그래밍 개론 - 문대경 대표
2019 아이펀팩토리 Dev Day 세션1 네트워크 프로그래밍 개론 - 문대경 대표2019 아이펀팩토리 Dev Day 세션1 네트워크 프로그래밍 개론 - 문대경 대표
2019 아이펀팩토리 Dev Day 세션1 네트워크 프로그래밍 개론 - 문대경 대표
 
[아이펀팩토리] 2018 데브데이 서버위더스 _03 Scalable 한 게임 서버 만들기
[아이펀팩토리] 2018 데브데이 서버위더스 _03 Scalable 한 게임 서버 만들기[아이펀팩토리] 2018 데브데이 서버위더스 _03 Scalable 한 게임 서버 만들기
[아이펀팩토리] 2018 데브데이 서버위더스 _03 Scalable 한 게임 서버 만들기
 
[아이펀팩토리] 2018 데브데이 서버위더스 _04 리눅스 게임 서버 성능 분석
[아이펀팩토리] 2018 데브데이 서버위더스 _04 리눅스 게임 서버 성능 분석[아이펀팩토리] 2018 데브데이 서버위더스 _04 리눅스 게임 서버 성능 분석
[아이펀팩토리] 2018 데브데이 서버위더스 _04 리눅스 게임 서버 성능 분석
 
[아이펀팩토리] 클라이언트 개발자, 서버 개발 시작하기
[아이펀팩토리] 클라이언트 개발자, 서버 개발 시작하기 [아이펀팩토리] 클라이언트 개발자, 서버 개발 시작하기
[아이펀팩토리] 클라이언트 개발자, 서버 개발 시작하기
 
[아이펀팩토리] 2017 NDCP
[아이펀팩토리] 2017 NDCP [아이펀팩토리] 2017 NDCP
[아이펀팩토리] 2017 NDCP
 
[아이펀팩토리]2017 NDC 강연 자료_아이펀 엔진 개발 노트
[아이펀팩토리]2017 NDC 강연 자료_아이펀 엔진 개발 노트[아이펀팩토리]2017 NDC 강연 자료_아이펀 엔진 개발 노트
[아이펀팩토리]2017 NDC 강연 자료_아이펀 엔진 개발 노트
 
게임서버 구축 방법비교 : GBaaS vs. Self-hosting
게임서버 구축 방법비교 : GBaaS vs. Self-hosting게임서버 구축 방법비교 : GBaaS vs. Self-hosting
게임서버 구축 방법비교 : GBaaS vs. Self-hosting
 
유니티 쉐이더 단기속성
유니티 쉐이더 단기속성유니티 쉐이더 단기속성
유니티 쉐이더 단기속성
 
게임 서버 성능 분석하기
게임 서버 성능 분석하기게임 서버 성능 분석하기
게임 서버 성능 분석하기
 
혼자서 만드는 MMO게임 서버
혼자서 만드는 MMO게임 서버혼자서 만드는 MMO게임 서버
혼자서 만드는 MMO게임 서버
 
Python과 AWS를 이용하여 게임 테스트 환경 구축하기
Python과 AWS를 이용하여 게임 테스트 환경 구축하기Python과 AWS를 이용하여 게임 테스트 환경 구축하기
Python과 AWS를 이용하여 게임 테스트 환경 구축하기
 
PC 와 모바일에서의 P2P 게임 구현에서의 차이점 비교
PC 와 모바일에서의 P2P 게임 구현에서의 차이점 비교PC 와 모바일에서의 P2P 게임 구현에서의 차이점 비교
PC 와 모바일에서의 P2P 게임 구현에서의 차이점 비교
 
Docker 로 Linux 없이 Linux 환경에서 개발하기
Docker 로 Linux 없이 Linux 환경에서 개발하기Docker 로 Linux 없이 Linux 환경에서 개발하기
Docker 로 Linux 없이 Linux 환경에서 개발하기
 
게임 운영에 필요한 로그성 데이터들에 대하여
게임 운영에 필요한 로그성 데이터들에 대하여게임 운영에 필요한 로그성 데이터들에 대하여
게임 운영에 필요한 로그성 데이터들에 대하여
 
Make "PONG" : 아키텍팅과 동기화 테크닉
Make "PONG" : 아키텍팅과 동기화 테크닉Make "PONG" : 아키텍팅과 동기화 테크닉
Make "PONG" : 아키텍팅과 동기화 테크닉
 
2016 NDC - 클라우드 시대의 모바일 게임 운영 플랫폼 구현
2016 NDC  - 클라우드 시대의  모바일 게임 운영 플랫폼 구현2016 NDC  - 클라우드 시대의  모바일 게임 운영 플랫폼 구현
2016 NDC - 클라우드 시대의 모바일 게임 운영 플랫폼 구현
 
2016 NDC - 모바일 게임 서버 엔진 개발 후기
2016 NDC - 모바일 게임 서버 엔진 개발 후기2016 NDC - 모바일 게임 서버 엔진 개발 후기
2016 NDC - 모바일 게임 서버 엔진 개발 후기
 
iFun Deploy 소개
iFun Deploy 소개iFun Deploy 소개
iFun Deploy 소개
 

Recently uploaded

MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionKim Daeun
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Kim Daeun
 
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'Hyundai Motor Group
 
Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)Wonjun Hwang
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)Tae Young Lee
 
[Terra] Terra Money: Stability and Adoption
[Terra] Terra Money: Stability and Adoption[Terra] Terra Money: Stability and Adoption
[Terra] Terra Money: Stability and AdoptionSeung-chan Baeg
 

Recently uploaded (7)

MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
 
Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 
[Terra] Terra Money: Stability and Adoption
[Terra] Terra Money: Stability and Adoption[Terra] Terra Money: Stability and Adoption
[Terra] Terra Money: Stability and Adoption
 

[아이펀팩토리] 2018 데브데이 서버위더스 _02 분산 환경을 위한 ORM 개발 경험 공유

  • 1. 분산 환경을 위한 ORM 개발 경험 공유 아이펀팩토리 / 엔진 개발팀 남승현
  • 2. 2018 iFunFactory Dev Day Contents. 01 발표 소개 02 분산 환경을 위한 ORM 04 구현: 코드 자동 생성 05 구현: 이벤트 시스템 06 구현: 비동기 I/O 07 구현: 캐시 08 구현: 잠금(Lock) 09 구현: 분산 환경 – 캐시와 잠금 03 구현: 일반화된 오브젝트
  • 3. 2018 iFunFactory Dev Day 발표 소개 01
  • 4. 2018 iFunFactory Dev Day • 흔치 않은 개발 사례 • 게임 서버 개발 기간 단축 • 구현된 ORM 소개 • 주요 구현을 방법론 수준으로 소개 발표 소개
  • 5. 2018 iFunFactory Dev Day 분산 환경을 위한 ORM 02 구현된 시스템 소개
  • 6. 2018 iFunFactory Dev Day ORM 이란? 데이터베이스를 SQL 이 아니라 프로그래밍 언어의 객체로 다룰 수 있게 해주는 기술 분산 환경을 위한 ORM
  • 7. 2018 iFunFactory Dev Day SQL 사용 예 ORM 사용 예 출처 - Wikipedia 출처 - Wikipedia
  • 8. 2018 iFunFactory Dev Day 개발 동기 • 단순 반복 Database 작업 1. Table 2. Stored Procedure/SQL 3. SQL 호출 코드 게임 콘텐츠 로직만 구현할 수 없을까? • 게임 서버 개발 생산성 향상 분산 환경을 위한 ORM
  • 9. 2018 iFunFactory Dev Day 개발 목표 • SQL 작업 제거 • 분산 환경 • 충분한 성능 분산 환경을 위한 ORM
  • 10. 2018 iFunFactory Dev Day 구현된 시스템 소개 – 주요 기능 • SQL 처리 자동화 • 잠금(Lock) • 캐시 • 분산 환경에서 동일한 작동 분산 환경을 위한 ORM
  • 11. 2018 iFunFactory Dev Day 구현된 시스템 소개 – 구조도 이벤트 시스템 오브젝트 캐시 오브젝트 잠금 오브젝트 저널 오브젝트 인터페이스(자동 생성) 오브젝트 DB/RPC 서비스 분산 환경을 위한 ORM
  • 12. 2018 iFunFactory Dev Day 구현된 시스템 소개 – 사용 방법 1. JSON 으로 모델 정의 예) 분산 환경을 위한 ORM
  • 13. 2018 iFunFactory Dev Day 구현된 시스템 소개 – 사용 방법 2. 빌드 코드 생성 프로그램이 모델을 이용해 코드 생성 분산 환경을 위한 ORM
  • 14. 2018 iFunFactory Dev Day 구현된 시스템 소개 – 사용 방법 3. 자동 생성된 인터페이스 Class 사용 분산 환경을 위한 ORM
  • 15. 2018 iFunFactory Dev Day 자동 생성된 인터페이스 Class 예)
  • 16. 2018 iFunFactory Dev Day 자동 생성된 인터페이스 Class 사용 예)
  • 17. 2018 iFunFactory Dev Day 구현: 일반화된 오브젝트 03
  • 18. 2018 iFunFactory Dev Day class Objectclass Character 참조 • 모든 타입의 오브젝트를 표현 • 자동 생성된 인터페이스 Class 는 단순 Wrapper class Object 구현: 일반화된 오브젝트
  • 19. 2018 iFunFactory Dev Day 자동 생성된 class Character 예) 구현: 일반화된 오브젝트
  • 20. 2018 iFunFactory Dev Day class Model JSON 으로 기술된 모델을 C++ 코드로 표현 구현: 일반화된 오브젝트
  • 21. 2018 iFunFactory Dev Day class Model
  • 22. 2018 iFunFactory Dev Day class Model SQL 을 런타임에 자동 생성 가능하게 함 CREATE TABLE {object-name} {attribute-name} {type}, {attribute-name} {type}, … “Character” “Name CHAR(12)” “Level INT” UPDATE {object-name} SET {attribute-name} = {value} WHERE object_id = {object-id} 구현: 일반화된 오브젝트
  • 23. 2018 iFunFactory Dev Day class Model SQL 을 런타임에 자동 생성 가능하게 함 구현: 일반화된 오브젝트 CREATE TABLE {object-name} {attribute-name} {type}, {attribute-name} {type}, … UPDATE {object-name} SET {attribute-name} = {value} WHERE object_id = {object-id} “Character” “Level INT” “Name CHAR(12)”
  • 24. 2018 iFunFactory Dev Day class Object, class Model 은 자동 생성되는 코드에서 사용 구현: 일반화된 오브젝트
  • 25. 2018 iFunFactory Dev Day 04 SQL 작업 자동화 SQL 처리 자동화 코드 및 인터페이스 코드 생성 구현: 일반화된 오브젝트
  • 26. 2018 iFunFactory Dev Day 코드 자동 생성 코드 생성 스크립트 모델(JSON) 을 입력 받아 C++ 코드 생성 JSON 코드 생성기 (Python) Model 생성 인터페이스 Class <입력> <출력>
  • 27. 2018 iFunFactory Dev Day • JSON 으로 표현 • 오브젝트 이름 • 오브젝트의 어트리뷰트와 타입 • Key 라고 부르는 특별한 어트리뷰트 존재 • Key 는 SQL 의 PRIMARY KEY 와 같다 • Key 를 이용하여 오브젝트를 읽을 수 있다 코드 자동 생성 입력: 모델 정의
  • 28. 2018 iFunFactory Dev Day 입력: 모델 정의 코드 자동 생성 예)
  • 29. 2018 iFunFactory Dev Day 출력: C++ 코드 서버 프로그램 빌드 시 실행 • Model 생성 및 등록 코드 • 인터페이스 Class 코드 코드 자동 생성
  • 30. 2018 iFunFactory Dev Day 코드 자동 생성 출력: C++ 코드 – Model 생성 및 등록 • class Model 의 인스턴스를 생성하여 시스템에 등록 • 등록된 모델 정보를 이용하여 런타임에 SQL 생성 가능
  • 31. 2018 iFunFactory Dev Day 코드 자동 생성 출력: C++ 코드 – Model 생성 및 등록 예)
  • 32. 2018 iFunFactory Dev Day 코드 자동 생성 출력: C++ 코드 - 인터페이스 Class • 프로그래머 사용하는 유일한 인터페이스 • 오브젝트 생성 함수 – Create() • 오브젝트를 불러오는 함수 – Fetch() DB I/O, 잠금, 캐시 등의 처리를 내부에서 수행 • 오브젝트의 각 어트리뷰트를 읽고, 쓰는 함수 – Get()/Set() SQL 쿼리 생성 및 호출을 내부에서 수행
  • 33. 2018 iFunFactory Dev Day 출력: 인터페이스 Class 예)
  • 34. 2018 iFunFactory Dev Day 코드 자동 생성 출력된 코드 사용 예) DB, 잠금, 캐시 등 자동으로 처리
  • 35. 2018 iFunFactory Dev Day 구현: 이벤트 시스템 05 트랜잭션 구현을 위한 이벤트 시스템
  • 36. 2018 iFunFactory Dev Day 구현: 이벤트 시스템 • 함수를 실행하는 스레드 풀 • 트랜잭션 구현을 위해 필요
  • 37. 2018 iFunFactory Dev Day 구현: 이벤트 시스템 이벤트 상태 • 실행 준비: 실행하기 위해 스레드를 기다림 • 실행: 스레드를 할당 받아 실행 중 • 중단(롤백): 오브젝트를 즉시 사용할 수 없는 경우 대기 • DB 에서 읽어와야 할 때 • 잠금을 얻을 수 없을 때
  • 38. 2018 iFunFactory Dev Day 구현: 이벤트 시스템 중단(롤백) 구현 C++ Exception Throw 오브젝트를 사용할 수 있을 때 다시 실행
  • 39. 2018 iFunFactory Dev Day 구현: 이벤트 시스템 1 2 3 중단(롤백) 구현
  • 40. 2018 iFunFactory Dev Day 구현: 이벤트 시스템 오브젝트 저널 • 이벤트 함수 안에서 오브젝트 수정은 임시 저장 • 중단(롤백) 시 임시 저장 내용 삭제 • 완료(완료) 시 캐시 및 Database 에 반영
  • 41. 2018 iFunFactory Dev Day 구현: 이벤트 시스템 단점 중단 전 코드 2번 이상 실행
  • 42. 2018 iFunFactory Dev Day 구현: 비동기 I/O 06 이벤트 시스템의 트랜잭션 활용
  • 43. 2018 iFunFactory Dev Day 구현: 비동기 I/O 비동기 I/O 발생 • 오브젝트를 접근할 때 Database 에서 읽어와야 할 때 • I/O 를 블록킹 방식으로 구현하면 처리량 급감
  • 44. 2018 iFunFactory Dev Day 구현: 비동기 I/O 비동기 I/O 구현 • C++ Exception 을 Throw 하여 이벤트 중단(롤백) • Exception 객체에 I/O 작업을 저장 • I/O 완료 후 이벤트 함수 재실행 이벤트 시스템으로 구현됨
  • 45. 2018 iFunFactory Dev Day 구현: 비동기 I/O 문제 • 오브젝트를 접근하려면 매번 중단(롤백) 발생 • Exception Throw • I/O 처리 -> 캐시로 해결
  • 46. 2018 iFunFactory Dev Day 구현: 캐시 07
  • 47. 2018 iFunFactory Dev Day 구현: 캐시 • 매번 Database 에서 읽는 것은 비효율 • I/O 처리 비용 • 이벤트 중단을 위한 Exception Throw 비용 • 일정 시간 동안 메모리에 보관
  • 48. 2018 iFunFactory Dev Day 구현: 캐시 캐시의 주요 구현 • 오브젝트 보관 • Key Attribute 에 대한 Index • 제거 타이머
  • 49. 2018 iFunFactory Dev Day 구현: 캐시 자료구조 시간 복잡도: O(1)
  • 50. 2018 iFunFactory Dev Day 캐시에 오브젝트 입력 구현 예) Character 오브젝트(Name: “devday”, Object-Id: 1234) Key 로 지정된 “Name” 어트리뷰트 Name 이 “devday” 인 오브젝트의 Object ID
  • 51. 2018 iFunFactory Dev Day 캐시에 검색 구현 예) Character 오브젝트(Name: “devday”, Object-Id: 1234) Key 로 지정된 “Name” 어트리뷰트 Name 이 “devday” 인 오브젝트의 Object ID
  • 52. 2018 iFunFactory Dev Day 구현: 캐시 자료구조 - 단점 범위 검색 불가능 -> ordered_map(std::map) 으로 해결 가능 성능 하락
  • 53. 2018 iFunFactory Dev Day 구현: 캐시 제거 타이머 • 오브젝트를 캐시에서 접근 시 타이머 설정 • 모든 오브젝트에 타이머를 두면 성능 문제 발생 • 일정 시간 모아서 처리
  • 54. 2018 iFunFactory Dev Day 구현: 잠금(Lock) 08
  • 55. 2018 iFunFactory Dev Day 구현: 잠금 잠금 구현이 필요한 이유 • 한 오브젝트를 여러 이벤트에서 동시 수정 발생 • 캐시에 로드된 오브젝트는 SQL 의 잠금(Lock) 불가 • SQL 잠금은 DB 에 로직 구현 필요 • Database 샤딩 시 SQL 잠금 사용 어려움
  • 56. 2018 iFunFactory Dev Day 구현: 잠금 잠금의 종류 잠금은 이벤트 함수가 끝날 때까지 유효 • 복사본 읽기 • 읽기 • 쓰기 잠금을 획득할 수 없으면 이벤트 중단(롤백)
  • 57. 2018 iFunFactory Dev Day 구현: 잠금 문제: 데드락 각 이벤트에서 서로 다른 순서로 오브젝트에 접근
  • 58. 2018 iFunFactory Dev Day 구현: 잠금 다음 4 조건이 모두 만족되면 데드락 발생 • 상호배제 프로세스들이 필요로 하는 자원에 대해 배타적인 통제권을 요구한다. • 점유대기 프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다린다. • 비선점 프로세스가 어떤 자원의 사용을 끝낼 때까지 그 자원을 뺏을 수 없다. • 순환대기 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있다.
  • 59. 2018 iFunFactory Dev Day 구현: 잠금 데드락 회피를 위해 두 가지 방법 시도 • 타이머 이용 – 점유대기 방지 • 선점형 잠금 – 비선점 방지
  • 60. 2018 iFunFactory Dev Day 구현: 잠금 타이머 이용 데드락 조건 4 가지 중 점유 대기(Hold and wait) 방지 잠금을 획득할 수 없는 경우 • 획득한 모든 잠금 해제하고 이벤트 중단 • 일정시간 후 잠금이 풀렸기를 기대하며 이벤트 재호출 일정시간 = Exponental backoff 알고리즘
  • 61. 2018 iFunFactory Dev Day 구현: 잠금 타이머 이용 - 장점 구현이 쉬움 타이머 이용 - 단점 경합하는 오브젝트 수가 많으면 해결 불가
  • 62. 2018 iFunFactory Dev Day 구현: 잠금 섬점형 잠금 데드락 조건 4 가지 중 비선점(No preemption) 방지 • 모든 이벤트는 발생 시간에 의한 우선순위를 갖는다 • 먼저 발생된 이벤트는 늦게 발생된 이벤트가 중단 상태이면 잠금을 해제할 수 있다
  • 63. 2018 iFunFactory Dev Day 구현: 잠금 섬점형 잠금 – 데드락 회피 예) 이벤트1, 2 가 Object A, B 를 교차하여 쓰기 잠금 획득
  • 64. 2018 iFunFactory Dev Day 0 1 2 3 4 5 6 7 Time 이벤트1 생성 및 실행 ObjectA 잠금 획득 시도: 성공 Sleep 1 ObjectB 잠금 획득 시도: 실패 -> 이벤트2 의 ObjectB 잠금 해제 요청 중단(롤백) 재실행, ObjectA, B 잠금 획득 시도: 성공 처리 완료 이벤트2 생성 및 실행 ObjectB 잠금 획득 시도: 성공 Sleep 1 ObjectA 잠금 획득 시도: 실패 -> 잠금 해제 불가 중단(롤백), ObjectB 잠금 해제 재실행, ObjectB, A 잠금 획득 시도: 성공, 처리 완료 이벤트1 이벤트2 이벤트1, 2 가 Object A, B 를 교차하여 쓰기 잠금 획득
  • 65. 2018 iFunFactory Dev Day 구현: 잠금 선점형 잠금 - 장점 경합 빈도에 상관 없이 빠르고 일정한 성능 선점형 잠금 - 단점 경합이 없을 땐 타이머 방식 보다 느리다 상대적으로 구현이 어렵다
  • 66. 2018 iFunFactory Dev Day 구현: 분산환경 – 캐시와 잠금 09
  • 67. 2018 iFunFactory Dev Day 구현: 분산환경 – 캐시와 잠금 Zookeeper • 오픈소스 분산 코디네이션 서버 • 클러스터를 구성하여 SPoF(Single point of failure) 를 만들지 않음 • 파일 시스템처럼 사용 경로를 지정하여 데이터 저장 • 오브젝트 소유권 관리
  • 68. 2018 iFunFactory Dev Day 구현: 분산환경 – 캐시와 잠금 Zookeeper 를 이용한 오브젝트 소유권 관리 오브젝트 소유권 = 캐싱 오브젝트를 캐시에 입력하기 전 /objects/{object-id} 파일에 서버ID 저장 해당 경로에 이미 파일이 있으면 해당 서버의 캐시와 잠금 기능을 RPC 로 접근
  • 69. 2018 iFunFactory Dev Day 구현: 분산환경 – 캐시와 잠금 Lease RPC 빌려올 오브젝트 ID 를 인자로 전달 수신한 서버는 • 해당 오브젝트 잠금 처리 + 타임아웃 설정 • 해당 오브젝트를 캐시에서 읽어 응답으로 전달 • 반납 RPC 수신 시 변경 사항이 있으면 반영
  • 70. 2018 iFunFactory Dev Day 구현: 분산환경 – 캐시와 잠금 /objects/ ┗1234 => “ServerA” ID: 1234 Name: “devday” Zookeeper ServerA Cache ServerA 가 Character(Name:”devday”, Object-Id:1234) 캐싱
  • 71. 2018 iFunFactory Dev Day 구현: 분산환경 – 캐시와 잠금 소유 확인 Lease RPC Return RPC /objects/ ┗1234 => “ServerA” Zookeeper ID: 1234 Name: “devday” ServerA Cache ServerB Cache 1 2 3
  • 72. 2018 iFunFactory Dev Day 구현: 분산환경 – 캐시와 잠금 캐시 적중률 문제 • Lease RPC 는 무겁다 • 오브젝트는 최대한 많이 접근하는 서버가 소유 해결 • 캐시는 각 오브젝트의 서버 별 접근 빈도 계산 • 더 높은 빈도의 서버 발견 시 타이머와 상관 없이 캐시에서 내린다
  • 73. Q&A 2018 iFunFactory Dev Day 2018 iFunFactory Dev Day Thank You! 경기도 성남시 분당구 대왕판교로 660, 유스페이스1 B동 606호 아이펀팩토리 info@ifunfactory.com +82-70-4923-6566 www.ifunfactory.com