SlideShare une entreprise Scribd logo
1  sur  72
<마비노기 듀얼> 패치 시스템
김 재석
우리는 바퀴를 다시 만들게 될 것이다. 늘 그랬듯이
㈜넥슨코리아 데브캣스튜디오 데브캣개발실 듀얼팀 서버파트
김 재석
E1 (전문연구원)
2014/현재 마비노기 듀얼
2014/2014 링토스 세계여행
2010/2013 마비노기2: 아레나
2006/2009 마비노기 영웅전
2004/2005 마비노기
2003/2004 프로젝트 T2
2001/2013 오즈
강연의 목적
• 패치 (자동 업데이트) 시스템의 기본 구성 요소를 설명하고
• 모바일 OS에서 어떻게 구성해야 하는지
• 마비노기 듀얼 프로젝트에서 적용한 사례를 바탕으로
• 공유하려고 합니다.
자동 업데이트 시스템
• 현재 버전이 최신인지를 감지하고
• 최신 버전을 받아
• 프로그램을 최신 상태로 갱신한다
자동 업데이트 시스템
• 현재 버전이 최신인지를 감지하고
• 최신 버전을 받아
• 프로그램을 최신 상태로 갱신한다
버전 제어 체계 (VCS)
콘텐트 배달망 (CDN)
파일 체계 (FS)
그런데, 왜 하죠?
온라인 게임 회사가 20년이나 되었으면 준비된 것이 있지 않나요?
Lucky Louie, HBO, 2006
불행히도 (1)
• 모바일에서는 데스크톱에서 만든 환경을 그대로 가져다 쓸 수 없다
• 사용자가 처한 환경이 데스크톱 때와 많이 달라졌다
• 개발 환경도 많이 달라졌다
• 당장 운영체제부터 다르다
불행히도 (2)
• 모바일에서는 데스크톱에서 만든 환경을 그대로 가져다 쓸 수 없다
• 배포 플랫폼 (App Store, Google Play, Windows Store)
• 단순하지만 긴급한 업데이트가 통과되지 않아 치명적인 문제가 계속된다든가
• 통제할 수 없지만 예측할 수 있다
• 모바일에서는 데스크톱에서 만든 환경을 그대로 가져다 쓸 수 없다
• 배포 플랫폼 (App Store, Google Play, Windows Store)
• ∴ 일부는 배포 플랫폼을 활용하고 일부는 만들어 구성한다.
• 모바일에서는 데스크톱에서 만든 환경을 그대로 가져다 쓸 수 없다
• 배포 플랫폼 (App Store, Google Play, Windows Store)
• ∴ 일부는 배포 플랫폼을 활용하고 일부는 만들어 구성한다.
무엇을? 어떻게? 왜? 가 이제 할 이야기
다시 돌아와서
• 버전 제어 체계 (Version Control System)
• 콘텐트 배달망 (Content Delivery Network)
• 파일 체계 (File System)



각각 어떻게 구현할 지 결정해야 하는데
다시 돌아와서
• 버전 제어 체계 (Version Control System)
• 콘텐트 배달망 (Content Delivery Network)
• 파일 체계 (File System)



각각 어떻게 구현할 지 결정해야 하는데
외부 요인에 의해
정해지는 부분부터 해결
콘텐트 배달망
콘텐트 배달망
• 자체 프로토콜?
• 데이터 센터를 보유하고 있지 않는 한 (아마도) 해서는 안 될 선택
• 선택해야만하는 장점이 있기 전까지는 보류한다
콘텐트 배달망
• 자체 프로토콜
• 잘 알려진 프로토콜
• BitTorrent
콘텐트 배달망
• 자체 프로토콜
• 잘 알려진 프로토콜
• BitTorrent
단점
• 사용자의 패킷 사용량을 증가시킨다
• 대기 중에도 자원을 소모한다
• 상대적으로 구현하기도 복잡하다
BitTorrent
장점
• CDN 비용이 싸게 든다
• 빠를 수도 있다
단점
• 사용자의 패킷 사용량을 증가시킨다
• 대기 중에도 자원을 소모한다
• 상대적으로 구현하기도 복잡하다
BitTorrent
모든 장점을 상쇄하고도 남을 단점 (1)
모바일 데이터 요금제는 사용량 기반
단점
• 사용자의 패킷 사용량을 증가시킨다
• 대기 중에도 자원을 소모한다
• 상대적으로 구현하기도 복잡하다
BitTorrent
모든 장점을 상쇄하고도 남을 단점 (2)
배터리 기술 발전은 더디다
콘텐트 배달망
• 자체 프로토콜
• 잘 알려진 프로토콜
• BitTorrent
• HTTP
복잡도가 커진다
HTTP
• 대부분의 콘텐트 배달망 회사가 지원한다
• 부하 분산을 예비할 수 있다
• 모바일 운영체제는 웹 시대 이후에 발전했다
• 라이브러리가 기본적으로 제공된다
• 캐시
콘텐트 배달망
• 자체 프로토콜
• 잘 알려진 프로토콜
• BitTorrent
• HTTP CDN
• Akamai, CloudFlare, CloudFront, ucloud biz, …
선정 해야 할 경우 고려 사항
• 명령줄 인터페이스 (CLI) 또는

응용 프로그램 인터페이스 (API) 를 제공하는가?
• 자동화를 할 수 없으면 매우 곤란하다
• 안정성
• 응답 시간 / 배포 시간 (글로벌 배포 고려)
Amazon CloudFront
아마존 웹 서비스를 다루는 기술: 실무에서 필요한 AWS 클라우드의 모든 것! 참고
S3/CloudFront 장점
• S3의 API / 라이브러리가 잘 갖춰져 있음
• 일괄 수행 스크립트를 만들기 위한 언어 선택의 폭도 넓음
• 초기 설정 이후에 S3에서 가장자리 (edge) 서버로 배포는 알아서 잘 됨
• 초기 설정은 SE느님께서 잘 챙겨주셔서 개발팀이 신경 쓸 것이 적다
S3 주의점
• 색인 노출이 안 되도록 설정해야 한다
• 웹 기반 서비스 공통의 주의사항이지만
• S3의 경우 개별 경로 색인을 막아도

최상단 경로가 열려 있으면 전체 파일 목록이 보임
• 가상 경로를 사용하는 객체 저장소 구조의 특성
CloudFront 주의점
• 가장자리까지 배포되는 데에는 예열이 필요하다
• 가장자리로 배포된 파일은 1일 정도의 캐시 보관을 한다
• 같은 파일이름으로 배포하면 파일이 지연된다.
• 따라서 캐시 무효화 명령을 내리거나,
• 항상 다른 파일 이름으로 배포해야 한다.
CloudFront 캐시 무효화
• 명령이 전세계 가장자리로 전파되는데 15분 정도
• 배포되면 안 되는 파일을 회수하려는 목적으로는 유용하겠지만

배포 완료 시기를 예측하기에는 적합하지 않아 배포 용도로는 사용하지 않음
항상 다른 파일 이름을 사용
• 가상 경로를 생성하고 버전 제어 체계에 각 파일별 가상 경로를 보관하면

항상 다른 파일 이름으로 접근하는 것이 가능할 것이다
항상 다른 파일 이름을 사용
• 가상 경로를 생성하고 버전 제어 체계에 각 파일별 가상 경로를 보관하면

항상 다른 파일 이름으로 접근하는 것이 가능할 것이다
쓸모 없이 비싸기만 할 것 같다?
버전 제어 체계
버전 제어 체계
• 버전 제어 체계 (Version Control System)
• 분산 버전 제어 체계: Git, Mercurial, Plastic SCM
• 상기한 기술들은 자동 업데이트 용도로 한정하면 초과 사양
• 업데이트에 필요한 기술은 제대로 된 버전 제어 체계가 아니라

브랜치마다 최신 버전을 받을 수 있는 정도면 충분할 것이다
특정 버전을 받기 위해
• (파일 목록, 버전 정보) 목록이 필요하다: 색인 (index)
• 웹으로 주고 받기 위해 JSON 형식 채택

{

“path/filename”:{…}

}
• 경로는 중첩해서 쓰지 않고 전체 경로를 사용: 차분 비교/병합에 유리
비교를 위한 정보들
• 최종 변경 시각
• 파일 크기
• 요약 해시
비교를 위한 정보들
• 최종 변경 시각
• 파일 크기
• 요약 해시
파일 정보 API 호출 한번에 얻을 수 있다
비교를 위한 정보들
• 최종 변경 시각
• 파일 크기
• 요약 해시
파일 정보 API 호출 한번에 얻을 수 있다
파일 전체를 읽고 계산해야 한다
특별한 HTTP 헤더
Content-Length 콘텐트 길이 (바이트 단위)
파일 정합성 검사에 사용
Content-MD5 콘텐트 해시 (MD5, 128b)
Cache-Control
재전송 및 캐시 제어
Pragma
특별한 HTTP 헤더
Last-Modifed 최종 변경일
Expires 만료 기한
ETag 변경 감지
버전을 판단하기 위한 정보
• Content-Length: 해시 계산을 안 해도 명백한 경우를 진단
• Last-Modified: CDN 개별 웹서버 호스트 정책을 신뢰하지 않아 제외
• ETag: Amazon S3의 경우 MD5 요약의 16진수 표현값을 사용
• 주의: 5G가 넘는 파일은 계산 방법이 다르다
다시 색인 파일의 형태
• {

“path1/filename1”:{“length”:123,”md5”:”encoded1”},

…

“pathK/filenameK”:{“length”:789,”md5”:”encodedK”}

}
인코딩 방법
• 바이너리 인코딩은 Base-N Encoding 사용
• base16, base32, base64, base64url 중 선택
• 요약 해시의 길이는 고정이므로 채움 문자는 사용하지 않음
실제 파일의 위치
• 색인 상에서 다음과 같은 정보는

“path/filename”:{”md5”:”digest”}
• 매번 새로 파일 이름을 생성할 수도 있지만

S3 상에서 path/filename/digest 를 사용하는 것으로도 충분하다
• 64b 이내에서 해시 충돌이 발생할 수 있지만

인접 버전에서 발생할 가능성은 (1/264) 무시해도 좋기 때문
파일 이름 생성 규칙
• MD5 대신에 증가하는 숫자 등을 써도 되지 않을까?
• 가능하다: 하지만 S3는 ETag로 MD5를 사용하고,

ETag로 다른 값을 사용하는 CDN에서도 Content-MD5 지정을 할 수 있다
• SHA1와 같은 최신 해시를 사용하지 않는 것도 같은 이유
• 무작위 공격에 대한 방어가 목표가 아닌

관리 상의 충돌만 일어나지 않는 것이 목표
색인 파일의 배포
• 색인 파일도 파일이다: 파일 길이, 요약 해시
• S3 상의 indexpath/digest 경로에 저장하는 것으로 충분
• 최상위 인터페이스에서는 브랜치 이름을 입력받고 색인 파일을 출력
예시 (브랜치)
GET /project/branch HTTP/1.1

Host: example.com

Content-Length: 0



HTTP/1.1 302 Found

Location: https://example.cloundfront.net/indexpath/branchdigest

Content-Length: 0
예시 (색인 파일)
GET /indexpath/branchdigest HTTP/1.1

Host: example.cloundfront.net

Content-Length: 0



HTTP/1.1 200 OK

Content-Type: application/json; charset=UTF-8



{

“empty”:{“length”:0,”md5”:“1B2M2Y8AsgTpgAmY7PhCfg”},

“dir/filename.txt”:{“length”:4,”md5”:“CY9rzUYh03PK3k6DJie09g”}

}
예시 (1)
GET /projectroot/empty/1B2M2Y8AsgTpgAmY7PhCfg HTTP/1.1

Host: example.cloundfront.net

Content-Length: 0



HTTP/1.1 200 OK

Content-Length: 0

ETag: “d41d8cd98f00b204e9800998ecf8427e"



예시 (2)
GET /projectroot/dir/filename.txt/CY9rzUYh03PK3k6DJie09g HTTP/1.1

Host: example.cloundfront.net

Content-Length: 0



HTTP/1.1 200 OK

Content-Type: plain/text; charset=UTF-8

Content-Length: 4

ETag: “098f6bcd4621d373cade4e832627b4f6"



test

개발팀 내부에서 색인 생성은
• 일괄 처리 스크립트로 생성
• 로컬 혹은 공유 경로에 원본 파일을 넣고,

일괄 처리 스크립트가 파일을 읽으면서 저장소에 저장하고

색인 파일을 로컬에 생성
• 로컬에 생성된 색인 파일은 따로 버전 관리
개발팀 내부에서 버전 관리는
• 색인 파일은 JSON 파일이므로 배포 시마다 기존 버전 제어 체계에 (git) 제출
• 저장소에 (S3) 올라간 실제 파일들은 여러 버전이 섞여 있음

색인 파일로부터 접근하기 때문
• 저장 비용 절감을 위해서는: 색인 파일을 저장소에서 삭제할 때

모든 색인파일에서 접근할 수 없는 버전을 찾아 지운다

(일종의 쓰레기 수거)
배포 관리는
• 각 배포판마다 색인 파일을 비교해서 병합
• 텍스트 파일이고, 파일 하나의 정보가 한 줄이므로 기존 도구 활용이 용이하다
• 파일 정보로부터 실제 리소스 파일을 확인할 수 있는 도구는 필요
• 문자열 생성 후 웹브라우저 열기가 전부
만들고 보니
• 기존 버전 제어 체계와 웹 저장소를 조합한

분산 색인 + 리소스 중앙집중식 버전 제어 체계
• 색인만 기존 버전 제어 체계를 사용하기 때문에 분산해도

모든 대형 리소스를 보관하지 않음
• 리소스 저장소는 중앙 집중식이지만 전세계에서 빠르게 접근 가능
• 구현 난이도도 높지 않음
파일 체계
고려 사항
• 파일 묶음 (archive)
• 압축
• 암호화
– Richard Hill, Hewlett-Packard S.A., Geneva, Switzerland
“Don't write a new program if one already does more or less what you want.

And if you must write a program, use existing code to do as much of the work as possible.”
안 만드는 이유: 묶음 처리
• 데스크톱에서는 디스크 헤드 이동을 줄여 파일 입출력 시간을 빠르게 하기 위해
• 모바일에서는 디스크가 아닌 메모리 사용
안 만드는 이유: 파일 보안
• 모바일 OS에서 응용 데이터 경로는 기본적으로 막혀 있음
• 안드로이드의 경우 미디어 검색에서 제외: .nomedia
• 대부분의 경우 민감한 파일도 없다
• 있다면 민감한 파일만 모아 압축하고 암호화
지역화 리소스 업데이트
지역화 리소스
• 언어-국가 별로 다른 리소스가 필요하다
• 저장 용량, 네트워크 사용량의 문제로 분리해서 관리할 필요가 있음
• 번체 지역에 간체, 간체 지역에 번체 폰트가 배포돼도 사용되지 않음
지역화 리소스의 특징 (1)
• 선택 우선 순위가 명백하다 (좁은 로케일에서 넓은 로케일 순)
• 사용자 정의 로케일 (ko-KR-x-private)
• 언어-국가 로케일 (ko-KR)
• 언어 로케일 공통 (ko)
• 불변 로케일 (invariant)
지역화 리소스의 특징 (2)
• 사용자에 의해 쓰기가 발생하지 않는다
• 업데이트할 때를 빼고는 사실상 읽기 전용
• 잘 분류된 경우 로케일별로 겹치는 파일은 거의 없다
• ∴ 모두 받고 우선 순위에 따라 읽는다

저장소가 여러 개가 있는 것처럼 처리
개발 리소스 배포 제한
문제
• 개발 중인 리소스가 실수로 배포되지 않아야 한다
• 관리하기 비교적 편하게
배포를 막는 방법
• 발효 시각-만료 시각을 기록하는 방법
배포를 막는 방법
• 발효 시각-만료 시각을 기록하는 방법
• (업데이트 일정 등의) 시각은 예상하기 어려움
• 종속성 설정을 만들고 특정 목록만 받도록 하는 방법
• 스프레드시트 파일로부터 생성한다면 (VBA) 관리할만하다
종속성 설정
• 색인 파일과 달리 저장소 공통으로 사용 (상대 경로가 동일한 파일이 많으므로)
• JSON 형식 사용

{

“#main”:{“dependsOn”:[”#card”,”#portrait”]},

“cardpath/card1.png”:{“affects”:”#card”},

“imagepath/npc1.png”:{“affects”:”#portrait”}

}
• URL에 사용되지 않는 문자를 태깅에 이용
종속성 적용
• 각각의 종속성 목록은 이행 폐쇄를 (transitive closure) 구해 적용
• 사고를 막기 위해 금지를 허가보다 우선시 한다
• 제외 목록에 있는 파일은 빼고
• 남은 파일 중 포함 목록에 있는 파일만 받는다
• 예: #portrait을 빼고 #main을 받으면 예시에서는 #card만 받음
정리
용도별 업데이트 방법
• 바이너리: 패키지를 배포 플랫폼에 제출해 업데이트 한다
• 리소스: 색인 파일을 배포하고 동기화한다
• 색인은 (경로, 길이, 요약) 정보로 구성한다
지역화 리소스 배포 방법
• 로케일의 우선순위를 정하고
• 로케일마다 색인 파일을 따로 생성해서
• 구동하는데 필요한 모든 로케일의 파일을 받도록 한다
• 파일을 실제로 읽을 때에는 우선순위에 따라 읽는다
개발 리소스 배포를 막는 방법
• 리소스의 종류를 구분해서 미리 표시해 놓고
• 배포에 포함된 것으로 표시된 파일들에 대해서만 받도록 설정한다
Q&A
twitter:@tcaesvk

Contenu connexe

Tendances

오픈소스 프로젝트 따라잡기_공개
오픈소스 프로젝트 따라잡기_공개오픈소스 프로젝트 따라잡기_공개
오픈소스 프로젝트 따라잡기_공개Hyoungjun Kim
 
Massive service basic
Massive service basicMassive service basic
Massive service basicDaeMyung Kang
 
[242]open stack neutron dataplane 구현
[242]open stack neutron   dataplane 구현[242]open stack neutron   dataplane 구현
[242]open stack neutron dataplane 구현NAVER D2
 
[2B5]nBase-ARC Redis Cluster
[2B5]nBase-ARC Redis Cluster[2B5]nBase-ARC Redis Cluster
[2B5]nBase-ARC Redis ClusterNAVER D2
 
3.[d2 오픈세미나]분산시스템 개발 및 교훈 n base arc
3.[d2 오픈세미나]분산시스템 개발 및 교훈 n base arc3.[d2 오픈세미나]분산시스템 개발 및 교훈 n base arc
3.[d2 오픈세미나]분산시스템 개발 및 교훈 n base arcNAVER D2
 
Redis From 2.8 to 4.x
Redis From 2.8 to 4.xRedis From 2.8 to 4.x
Redis From 2.8 to 4.xDaeMyung Kang
 
[D2 COMMUNITY] Open Container Seoul Meetup - 마이크로 서비스 아키텍쳐와 Docker kubernetes
[D2 COMMUNITY] Open Container Seoul Meetup -  마이크로 서비스 아키텍쳐와 Docker kubernetes[D2 COMMUNITY] Open Container Seoul Meetup -  마이크로 서비스 아키텍쳐와 Docker kubernetes
[D2 COMMUNITY] Open Container Seoul Meetup - 마이크로 서비스 아키텍쳐와 Docker kubernetesNAVER D2
 
How to use redis well
How to use redis wellHow to use redis well
How to use redis wellDaeMyung Kang
 
[221] docker orchestration
[221] docker orchestration[221] docker orchestration
[221] docker orchestrationNAVER D2
 

Tendances (10)

오픈소스 프로젝트 따라잡기_공개
오픈소스 프로젝트 따라잡기_공개오픈소스 프로젝트 따라잡기_공개
오픈소스 프로젝트 따라잡기_공개
 
Massive service basic
Massive service basicMassive service basic
Massive service basic
 
[242]open stack neutron dataplane 구현
[242]open stack neutron   dataplane 구현[242]open stack neutron   dataplane 구현
[242]open stack neutron dataplane 구현
 
[2B5]nBase-ARC Redis Cluster
[2B5]nBase-ARC Redis Cluster[2B5]nBase-ARC Redis Cluster
[2B5]nBase-ARC Redis Cluster
 
3.[d2 오픈세미나]분산시스템 개발 및 교훈 n base arc
3.[d2 오픈세미나]분산시스템 개발 및 교훈 n base arc3.[d2 오픈세미나]분산시스템 개발 및 교훈 n base arc
3.[d2 오픈세미나]분산시스템 개발 및 교훈 n base arc
 
Redis From 2.8 to 4.x
Redis From 2.8 to 4.xRedis From 2.8 to 4.x
Redis From 2.8 to 4.x
 
[D2 COMMUNITY] Open Container Seoul Meetup - 마이크로 서비스 아키텍쳐와 Docker kubernetes
[D2 COMMUNITY] Open Container Seoul Meetup -  마이크로 서비스 아키텍쳐와 Docker kubernetes[D2 COMMUNITY] Open Container Seoul Meetup -  마이크로 서비스 아키텍쳐와 Docker kubernetes
[D2 COMMUNITY] Open Container Seoul Meetup - 마이크로 서비스 아키텍쳐와 Docker kubernetes
 
How to use redis well
How to use redis wellHow to use redis well
How to use redis well
 
[221] docker orchestration
[221] docker orchestration[221] docker orchestration
[221] docker orchestration
 
Redis 2017
Redis 2017Redis 2017
Redis 2017
 

En vedette

NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계tcaesvk
 
NDC 2016 마이크로토크 - 프로그래머가 투자하는 법
NDC 2016 마이크로토크 - 프로그래머가 투자하는 법NDC 2016 마이크로토크 - 프로그래머가 투자하는 법
NDC 2016 마이크로토크 - 프로그래머가 투자하는 법Sumin Byeon
 
NDC2012 - 완벽한 MMO 클라이언트 설계에의 도전, Part2
NDC2012 - 완벽한 MMO 클라이언트 설계에의 도전, Part2NDC2012 - 완벽한 MMO 클라이언트 설계에의 도전, Part2
NDC2012 - 완벽한 MMO 클라이언트 설계에의 도전, Part2Jubok Kim
 
월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전 기법 세미나, C++ 게임 개발자를 위한 C# 활용기법
월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전 기법 세미나, C++ 게임 개발자를 위한 C# 활용기법월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전 기법 세미나, C++ 게임 개발자를 위한 C# 활용기법
월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전 기법 세미나, C++ 게임 개발자를 위한 C# 활용기법tcaesvk
 
임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011devCAT Studio, NEXON
 
NDC 2012, Gamification 001: 실전 감량 사례로 알아보는 메카닉
NDC 2012, Gamification 001: 실전 감량 사례로 알아보는 메카닉NDC 2012, Gamification 001: 실전 감량 사례로 알아보는 메카닉
NDC 2012, Gamification 001: 실전 감량 사례로 알아보는 메카닉tcaesvk
 
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서tcaesvk
 
NDC 2010, 패킷 지옥으로부터 탈출
NDC 2010, 패킷 지옥으로부터 탈출NDC 2010, 패킷 지옥으로부터 탈출
NDC 2010, 패킷 지옥으로부터 탈출tcaesvk
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기Sang Heon Lee
 
졸업작품을 앞둔 게임 기획/프로그래밍 전공 교류회
졸업작품을 앞둔 게임 기획/프로그래밍 전공 교류회졸업작품을 앞둔 게임 기획/프로그래밍 전공 교류회
졸업작품을 앞둔 게임 기획/프로그래밍 전공 교류회ChangHyun Won
 
[NDC 2016] 유니티, iOS에서 LINQ 사용하기
[NDC 2016] 유니티, iOS에서 LINQ 사용하기[NDC 2016] 유니티, iOS에서 LINQ 사용하기
[NDC 2016] 유니티, iOS에서 LINQ 사용하기Daehee Kim
 
Cross linking Presentation
Cross linking PresentationCross linking Presentation
Cross linking Presentationperedelcampo
 
NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템
NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템
NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템tcaesvk
 
김동건, 게임팅커가 되자, 2015년 데브캣 스튜디오 워크샵
김동건, 게임팅커가 되자, 2015년 데브캣 스튜디오 워크샵김동건, 게임팅커가 되자, 2015년 데브캣 스튜디오 워크샵
김동건, 게임팅커가 되자, 2015년 데브캣 스튜디오 워크샵devCAT Studio, NEXON
 
NDC 2016, [슈판워] 맨땅에서 데이터 분석 시스템 만들어나가기
NDC 2016, [슈판워] 맨땅에서 데이터 분석 시스템 만들어나가기NDC 2016, [슈판워] 맨땅에서 데이터 분석 시스템 만들어나가기
NDC 2016, [슈판워] 맨땅에서 데이터 분석 시스템 만들어나가기Wonha Ryu
 
[NDC16] Effective Git
[NDC16] Effective Git[NDC16] Effective Git
[NDC16] Effective GitChanwoong Kim
 
NDC 2016 안현석 - 개발자와 디자이너를 이롭게 하는 UI 개발
NDC 2016 안현석 - 개발자와 디자이너를 이롭게 하는 UI 개발NDC 2016 안현석 - 개발자와 디자이너를 이롭게 하는 UI 개발
NDC 2016 안현석 - 개발자와 디자이너를 이롭게 하는 UI 개발Hyunsuk Ahn
 
김찬웅_그룹웨어에 새 에너지를_NDC15
김찬웅_그룹웨어에 새 에너지를_NDC15김찬웅_그룹웨어에 새 에너지를_NDC15
김찬웅_그룹웨어에 새 에너지를_NDC15Chanwoong Kim
 
[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰
[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰
[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰승민 백
 

En vedette (20)

NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계
 
NDC 2016 마이크로토크 - 프로그래머가 투자하는 법
NDC 2016 마이크로토크 - 프로그래머가 투자하는 법NDC 2016 마이크로토크 - 프로그래머가 투자하는 법
NDC 2016 마이크로토크 - 프로그래머가 투자하는 법
 
NDC2012 - 완벽한 MMO 클라이언트 설계에의 도전, Part2
NDC2012 - 완벽한 MMO 클라이언트 설계에의 도전, Part2NDC2012 - 완벽한 MMO 클라이언트 설계에의 도전, Part2
NDC2012 - 완벽한 MMO 클라이언트 설계에의 도전, Part2
 
월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전 기법 세미나, C++ 게임 개발자를 위한 C# 활용기법
월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전 기법 세미나, C++ 게임 개발자를 위한 C# 활용기법월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전 기법 세미나, C++ 게임 개발자를 위한 C# 활용기법
월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전 기법 세미나, C++ 게임 개발자를 위한 C# 활용기법
 
임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011
 
NDC 2012, Gamification 001: 실전 감량 사례로 알아보는 메카닉
NDC 2012, Gamification 001: 실전 감량 사례로 알아보는 메카닉NDC 2012, Gamification 001: 실전 감량 사례로 알아보는 메카닉
NDC 2012, Gamification 001: 실전 감량 사례로 알아보는 메카닉
 
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
 
NDC 2010, 패킷 지옥으로부터 탈출
NDC 2010, 패킷 지옥으로부터 탈출NDC 2010, 패킷 지옥으로부터 탈출
NDC 2010, 패킷 지옥으로부터 탈출
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
 
졸업작품을 앞둔 게임 기획/프로그래밍 전공 교류회
졸업작품을 앞둔 게임 기획/프로그래밍 전공 교류회졸업작품을 앞둔 게임 기획/프로그래밍 전공 교류회
졸업작품을 앞둔 게임 기획/프로그래밍 전공 교류회
 
[NDC 2016] 유니티, iOS에서 LINQ 사용하기
[NDC 2016] 유니티, iOS에서 LINQ 사용하기[NDC 2016] 유니티, iOS에서 LINQ 사용하기
[NDC 2016] 유니티, iOS에서 LINQ 사용하기
 
Cross linking Presentation
Cross linking PresentationCross linking Presentation
Cross linking Presentation
 
NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템
NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템
NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템
 
김동건, 게임팅커가 되자, 2015년 데브캣 스튜디오 워크샵
김동건, 게임팅커가 되자, 2015년 데브캣 스튜디오 워크샵김동건, 게임팅커가 되자, 2015년 데브캣 스튜디오 워크샵
김동건, 게임팅커가 되자, 2015년 데브캣 스튜디오 워크샵
 
NDC 2016, [슈판워] 맨땅에서 데이터 분석 시스템 만들어나가기
NDC 2016, [슈판워] 맨땅에서 데이터 분석 시스템 만들어나가기NDC 2016, [슈판워] 맨땅에서 데이터 분석 시스템 만들어나가기
NDC 2016, [슈판워] 맨땅에서 데이터 분석 시스템 만들어나가기
 
[NDC16] Effective Git
[NDC16] Effective Git[NDC16] Effective Git
[NDC16] Effective Git
 
NDC 2016 안현석 - 개발자와 디자이너를 이롭게 하는 UI 개발
NDC 2016 안현석 - 개발자와 디자이너를 이롭게 하는 UI 개발NDC 2016 안현석 - 개발자와 디자이너를 이롭게 하는 UI 개발
NDC 2016 안현석 - 개발자와 디자이너를 이롭게 하는 UI 개발
 
김찬웅_그룹웨어에 새 에너지를_NDC15
김찬웅_그룹웨어에 새 에너지를_NDC15김찬웅_그룹웨어에 새 에너지를_NDC15
김찬웅_그룹웨어에 새 에너지를_NDC15
 
UPnP 발표자료
UPnP 발표자료UPnP 발표자료
UPnP 발표자료
 
[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰
[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰
[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰
 

Similaire à NDC 2015 마비노기 듀얼 패치 시스템

[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기Sumin Byeon
 
확장가능한 웹 아키텍쳐 구축 방안
확장가능한 웹 아키텍쳐 구축 방안 확장가능한 웹 아키텍쳐 구축 방안
확장가능한 웹 아키텍쳐 구축 방안 IMQA
 
AWSKRUG DS - 데이터 엔지니어가 실무에서 맞닥뜨리는 문제들
AWSKRUG DS - 데이터 엔지니어가 실무에서 맞닥뜨리는 문제들AWSKRUG DS - 데이터 엔지니어가 실무에서 맞닥뜨리는 문제들
AWSKRUG DS - 데이터 엔지니어가 실무에서 맞닥뜨리는 문제들Woong Seok Kang
 
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발Jeongkyu Shin
 
Hadoop distributed file system rev3
Hadoop distributed file system rev3Hadoop distributed file system rev3
Hadoop distributed file system rev3Sung-jae Park
 
AWS 기반의 마이크로 서비스 아키텍쳐 구현 방안 :: 김필중 :: AWS Summit Seoul 20
AWS 기반의 마이크로 서비스 아키텍쳐 구현 방안 :: 김필중 :: AWS Summit Seoul 20AWS 기반의 마이크로 서비스 아키텍쳐 구현 방안 :: 김필중 :: AWS Summit Seoul 20
AWS 기반의 마이크로 서비스 아키텍쳐 구현 방안 :: 김필중 :: AWS Summit Seoul 20Amazon Web Services Korea
 
Open infradays 2019_msa_k8s
Open infradays 2019_msa_k8sOpen infradays 2019_msa_k8s
Open infradays 2019_msa_k8sHyoungjun Kim
 
Glusterfs 구성제안서 v1.0
Glusterfs 구성제안서 v1.0Glusterfs 구성제안서 v1.0
Glusterfs 구성제안서 v1.0sprdd
 
Glusterfs 구성제안 v1.0
Glusterfs 구성제안 v1.0Glusterfs 구성제안 v1.0
Glusterfs 구성제안 v1.0sprdd
 
Glusterfs 구성제안서 v1.0
Glusterfs 구성제안서 v1.0Glusterfs 구성제안서 v1.0
Glusterfs 구성제안서 v1.0sprdd
 
Object storage의 이해와 활용
Object storage의 이해와 활용Object storage의 이해와 활용
Object storage의 이해와 활용Seoro Kim
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019devCAT Studio, NEXON
 
Scalable web architecture and distributed systems
Scalable web architecture and distributed systemsScalable web architecture and distributed systems
Scalable web architecture and distributed systemseva
 
Scalable web architecture and distributed systems
Scalable web architecture and distributed systemsScalable web architecture and distributed systems
Scalable web architecture and distributed systems현종 김
 
실무로 배우는 시스템 성능 최적화 Ch8
실무로 배우는 시스템 성능 최적화 Ch8실무로 배우는 시스템 성능 최적화 Ch8
실무로 배우는 시스템 성능 최적화 Ch8HyeonSeok Choi
 
Glusterfs 파일시스템 구성_및 운영가이드_v2.0
Glusterfs 파일시스템 구성_및 운영가이드_v2.0Glusterfs 파일시스템 구성_및 운영가이드_v2.0
Glusterfs 파일시스템 구성_및 운영가이드_v2.0sprdd
 
Glusterfs 구성제안 및_운영가이드_v2.0
Glusterfs 구성제안 및_운영가이드_v2.0Glusterfs 구성제안 및_운영가이드_v2.0
Glusterfs 구성제안 및_운영가이드_v2.0sprdd
 

Similaire à NDC 2015 마비노기 듀얼 패치 시스템 (20)

[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
 
확장가능한 웹 아키텍쳐 구축 방안
확장가능한 웹 아키텍쳐 구축 방안 확장가능한 웹 아키텍쳐 구축 방안
확장가능한 웹 아키텍쳐 구축 방안
 
AWSKRUG DS - 데이터 엔지니어가 실무에서 맞닥뜨리는 문제들
AWSKRUG DS - 데이터 엔지니어가 실무에서 맞닥뜨리는 문제들AWSKRUG DS - 데이터 엔지니어가 실무에서 맞닥뜨리는 문제들
AWSKRUG DS - 데이터 엔지니어가 실무에서 맞닥뜨리는 문제들
 
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
 
Hadoop distributed file system rev3
Hadoop distributed file system rev3Hadoop distributed file system rev3
Hadoop distributed file system rev3
 
AWS 기반의 마이크로 서비스 아키텍쳐 구현 방안 :: 김필중 :: AWS Summit Seoul 20
AWS 기반의 마이크로 서비스 아키텍쳐 구현 방안 :: 김필중 :: AWS Summit Seoul 20AWS 기반의 마이크로 서비스 아키텍쳐 구현 방안 :: 김필중 :: AWS Summit Seoul 20
AWS 기반의 마이크로 서비스 아키텍쳐 구현 방안 :: 김필중 :: AWS Summit Seoul 20
 
Open infradays 2019_msa_k8s
Open infradays 2019_msa_k8sOpen infradays 2019_msa_k8s
Open infradays 2019_msa_k8s
 
TurboRepo
TurboRepoTurboRepo
TurboRepo
 
Glusterfs 구성제안서 v1.0
Glusterfs 구성제안서 v1.0Glusterfs 구성제안서 v1.0
Glusterfs 구성제안서 v1.0
 
Glusterfs 구성제안 v1.0
Glusterfs 구성제안 v1.0Glusterfs 구성제안 v1.0
Glusterfs 구성제안 v1.0
 
Glusterfs 구성제안서 v1.0
Glusterfs 구성제안서 v1.0Glusterfs 구성제안서 v1.0
Glusterfs 구성제안서 v1.0
 
Object storage의 이해와 활용
Object storage의 이해와 활용Object storage의 이해와 활용
Object storage의 이해와 활용
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
 
Git
Git Git
Git
 
Warp
WarpWarp
Warp
 
Scalable web architecture and distributed systems
Scalable web architecture and distributed systemsScalable web architecture and distributed systems
Scalable web architecture and distributed systems
 
Scalable web architecture and distributed systems
Scalable web architecture and distributed systemsScalable web architecture and distributed systems
Scalable web architecture and distributed systems
 
실무로 배우는 시스템 성능 최적화 Ch8
실무로 배우는 시스템 성능 최적화 Ch8실무로 배우는 시스템 성능 최적화 Ch8
실무로 배우는 시스템 성능 최적화 Ch8
 
Glusterfs 파일시스템 구성_및 운영가이드_v2.0
Glusterfs 파일시스템 구성_및 운영가이드_v2.0Glusterfs 파일시스템 구성_및 운영가이드_v2.0
Glusterfs 파일시스템 구성_및 운영가이드_v2.0
 
Glusterfs 구성제안 및_운영가이드_v2.0
Glusterfs 구성제안 및_운영가이드_v2.0Glusterfs 구성제안 및_운영가이드_v2.0
Glusterfs 구성제안 및_운영가이드_v2.0
 

NDC 2015 마비노기 듀얼 패치 시스템

  • 1. <마비노기 듀얼> 패치 시스템 김 재석 우리는 바퀴를 다시 만들게 될 것이다. 늘 그랬듯이 ㈜넥슨코리아 데브캣스튜디오 데브캣개발실 듀얼팀 서버파트
  • 2. 김 재석 E1 (전문연구원) 2014/현재 마비노기 듀얼 2014/2014 링토스 세계여행 2010/2013 마비노기2: 아레나 2006/2009 마비노기 영웅전 2004/2005 마비노기 2003/2004 프로젝트 T2 2001/2013 오즈
  • 3. 강연의 목적 • 패치 (자동 업데이트) 시스템의 기본 구성 요소를 설명하고 • 모바일 OS에서 어떻게 구성해야 하는지 • 마비노기 듀얼 프로젝트에서 적용한 사례를 바탕으로 • 공유하려고 합니다.
  • 4. 자동 업데이트 시스템 • 현재 버전이 최신인지를 감지하고 • 최신 버전을 받아 • 프로그램을 최신 상태로 갱신한다
  • 5. 자동 업데이트 시스템 • 현재 버전이 최신인지를 감지하고 • 최신 버전을 받아 • 프로그램을 최신 상태로 갱신한다 버전 제어 체계 (VCS) 콘텐트 배달망 (CDN) 파일 체계 (FS)
  • 6. 그런데, 왜 하죠? 온라인 게임 회사가 20년이나 되었으면 준비된 것이 있지 않나요? Lucky Louie, HBO, 2006
  • 7. 불행히도 (1) • 모바일에서는 데스크톱에서 만든 환경을 그대로 가져다 쓸 수 없다 • 사용자가 처한 환경이 데스크톱 때와 많이 달라졌다 • 개발 환경도 많이 달라졌다 • 당장 운영체제부터 다르다
  • 8. 불행히도 (2) • 모바일에서는 데스크톱에서 만든 환경을 그대로 가져다 쓸 수 없다 • 배포 플랫폼 (App Store, Google Play, Windows Store) • 단순하지만 긴급한 업데이트가 통과되지 않아 치명적인 문제가 계속된다든가 • 통제할 수 없지만 예측할 수 있다
  • 9. • 모바일에서는 데스크톱에서 만든 환경을 그대로 가져다 쓸 수 없다 • 배포 플랫폼 (App Store, Google Play, Windows Store) • ∴ 일부는 배포 플랫폼을 활용하고 일부는 만들어 구성한다.
  • 10. • 모바일에서는 데스크톱에서 만든 환경을 그대로 가져다 쓸 수 없다 • 배포 플랫폼 (App Store, Google Play, Windows Store) • ∴ 일부는 배포 플랫폼을 활용하고 일부는 만들어 구성한다. 무엇을? 어떻게? 왜? 가 이제 할 이야기
  • 11. 다시 돌아와서 • 버전 제어 체계 (Version Control System) • 콘텐트 배달망 (Content Delivery Network) • 파일 체계 (File System)
 
 각각 어떻게 구현할 지 결정해야 하는데
  • 12. 다시 돌아와서 • 버전 제어 체계 (Version Control System) • 콘텐트 배달망 (Content Delivery Network) • 파일 체계 (File System)
 
 각각 어떻게 구현할 지 결정해야 하는데 외부 요인에 의해 정해지는 부분부터 해결
  • 14. 콘텐트 배달망 • 자체 프로토콜? • 데이터 센터를 보유하고 있지 않는 한 (아마도) 해서는 안 될 선택 • 선택해야만하는 장점이 있기 전까지는 보류한다
  • 15. 콘텐트 배달망 • 자체 프로토콜 • 잘 알려진 프로토콜 • BitTorrent
  • 16. 콘텐트 배달망 • 자체 프로토콜 • 잘 알려진 프로토콜 • BitTorrent
  • 17. 단점 • 사용자의 패킷 사용량을 증가시킨다 • 대기 중에도 자원을 소모한다 • 상대적으로 구현하기도 복잡하다 BitTorrent 장점 • CDN 비용이 싸게 든다 • 빠를 수도 있다
  • 18. 단점 • 사용자의 패킷 사용량을 증가시킨다 • 대기 중에도 자원을 소모한다 • 상대적으로 구현하기도 복잡하다 BitTorrent 모든 장점을 상쇄하고도 남을 단점 (1) 모바일 데이터 요금제는 사용량 기반
  • 19. 단점 • 사용자의 패킷 사용량을 증가시킨다 • 대기 중에도 자원을 소모한다 • 상대적으로 구현하기도 복잡하다 BitTorrent 모든 장점을 상쇄하고도 남을 단점 (2) 배터리 기술 발전은 더디다
  • 20. 콘텐트 배달망 • 자체 프로토콜 • 잘 알려진 프로토콜 • BitTorrent • HTTP 복잡도가 커진다
  • 21. HTTP • 대부분의 콘텐트 배달망 회사가 지원한다 • 부하 분산을 예비할 수 있다 • 모바일 운영체제는 웹 시대 이후에 발전했다 • 라이브러리가 기본적으로 제공된다 • 캐시
  • 22. 콘텐트 배달망 • 자체 프로토콜 • 잘 알려진 프로토콜 • BitTorrent • HTTP CDN • Akamai, CloudFlare, CloudFront, ucloud biz, …
  • 23. 선정 해야 할 경우 고려 사항 • 명령줄 인터페이스 (CLI) 또는
 응용 프로그램 인터페이스 (API) 를 제공하는가? • 자동화를 할 수 없으면 매우 곤란하다 • 안정성 • 응답 시간 / 배포 시간 (글로벌 배포 고려)
  • 24. Amazon CloudFront 아마존 웹 서비스를 다루는 기술: 실무에서 필요한 AWS 클라우드의 모든 것! 참고
  • 25. S3/CloudFront 장점 • S3의 API / 라이브러리가 잘 갖춰져 있음 • 일괄 수행 스크립트를 만들기 위한 언어 선택의 폭도 넓음 • 초기 설정 이후에 S3에서 가장자리 (edge) 서버로 배포는 알아서 잘 됨 • 초기 설정은 SE느님께서 잘 챙겨주셔서 개발팀이 신경 쓸 것이 적다
  • 26. S3 주의점 • 색인 노출이 안 되도록 설정해야 한다 • 웹 기반 서비스 공통의 주의사항이지만 • S3의 경우 개별 경로 색인을 막아도
 최상단 경로가 열려 있으면 전체 파일 목록이 보임 • 가상 경로를 사용하는 객체 저장소 구조의 특성
  • 27. CloudFront 주의점 • 가장자리까지 배포되는 데에는 예열이 필요하다 • 가장자리로 배포된 파일은 1일 정도의 캐시 보관을 한다 • 같은 파일이름으로 배포하면 파일이 지연된다. • 따라서 캐시 무효화 명령을 내리거나, • 항상 다른 파일 이름으로 배포해야 한다.
  • 28. CloudFront 캐시 무효화 • 명령이 전세계 가장자리로 전파되는데 15분 정도 • 배포되면 안 되는 파일을 회수하려는 목적으로는 유용하겠지만
 배포 완료 시기를 예측하기에는 적합하지 않아 배포 용도로는 사용하지 않음
  • 29. 항상 다른 파일 이름을 사용 • 가상 경로를 생성하고 버전 제어 체계에 각 파일별 가상 경로를 보관하면
 항상 다른 파일 이름으로 접근하는 것이 가능할 것이다
  • 30. 항상 다른 파일 이름을 사용 • 가상 경로를 생성하고 버전 제어 체계에 각 파일별 가상 경로를 보관하면
 항상 다른 파일 이름으로 접근하는 것이 가능할 것이다 쓸모 없이 비싸기만 할 것 같다?
  • 32. 버전 제어 체계 • 버전 제어 체계 (Version Control System) • 분산 버전 제어 체계: Git, Mercurial, Plastic SCM • 상기한 기술들은 자동 업데이트 용도로 한정하면 초과 사양 • 업데이트에 필요한 기술은 제대로 된 버전 제어 체계가 아니라
 브랜치마다 최신 버전을 받을 수 있는 정도면 충분할 것이다
  • 33. 특정 버전을 받기 위해 • (파일 목록, 버전 정보) 목록이 필요하다: 색인 (index) • 웹으로 주고 받기 위해 JSON 형식 채택
 {
 “path/filename”:{…}
 } • 경로는 중첩해서 쓰지 않고 전체 경로를 사용: 차분 비교/병합에 유리
  • 34. 비교를 위한 정보들 • 최종 변경 시각 • 파일 크기 • 요약 해시
  • 35. 비교를 위한 정보들 • 최종 변경 시각 • 파일 크기 • 요약 해시 파일 정보 API 호출 한번에 얻을 수 있다
  • 36. 비교를 위한 정보들 • 최종 변경 시각 • 파일 크기 • 요약 해시 파일 정보 API 호출 한번에 얻을 수 있다 파일 전체를 읽고 계산해야 한다
  • 37. 특별한 HTTP 헤더 Content-Length 콘텐트 길이 (바이트 단위) 파일 정합성 검사에 사용 Content-MD5 콘텐트 해시 (MD5, 128b) Cache-Control 재전송 및 캐시 제어 Pragma
  • 38. 특별한 HTTP 헤더 Last-Modifed 최종 변경일 Expires 만료 기한 ETag 변경 감지
  • 39. 버전을 판단하기 위한 정보 • Content-Length: 해시 계산을 안 해도 명백한 경우를 진단 • Last-Modified: CDN 개별 웹서버 호스트 정책을 신뢰하지 않아 제외 • ETag: Amazon S3의 경우 MD5 요약의 16진수 표현값을 사용 • 주의: 5G가 넘는 파일은 계산 방법이 다르다
  • 40. 다시 색인 파일의 형태 • {
 “path1/filename1”:{“length”:123,”md5”:”encoded1”},
 …
 “pathK/filenameK”:{“length”:789,”md5”:”encodedK”}
 }
  • 41. 인코딩 방법 • 바이너리 인코딩은 Base-N Encoding 사용 • base16, base32, base64, base64url 중 선택 • 요약 해시의 길이는 고정이므로 채움 문자는 사용하지 않음
  • 42. 실제 파일의 위치 • 색인 상에서 다음과 같은 정보는
 “path/filename”:{”md5”:”digest”} • 매번 새로 파일 이름을 생성할 수도 있지만
 S3 상에서 path/filename/digest 를 사용하는 것으로도 충분하다 • 64b 이내에서 해시 충돌이 발생할 수 있지만
 인접 버전에서 발생할 가능성은 (1/264) 무시해도 좋기 때문
  • 43. 파일 이름 생성 규칙 • MD5 대신에 증가하는 숫자 등을 써도 되지 않을까? • 가능하다: 하지만 S3는 ETag로 MD5를 사용하고,
 ETag로 다른 값을 사용하는 CDN에서도 Content-MD5 지정을 할 수 있다 • SHA1와 같은 최신 해시를 사용하지 않는 것도 같은 이유 • 무작위 공격에 대한 방어가 목표가 아닌
 관리 상의 충돌만 일어나지 않는 것이 목표
  • 44. 색인 파일의 배포 • 색인 파일도 파일이다: 파일 길이, 요약 해시 • S3 상의 indexpath/digest 경로에 저장하는 것으로 충분 • 최상위 인터페이스에서는 브랜치 이름을 입력받고 색인 파일을 출력
  • 45. 예시 (브랜치) GET /project/branch HTTP/1.1
 Host: example.com
 Content-Length: 0
 
 HTTP/1.1 302 Found
 Location: https://example.cloundfront.net/indexpath/branchdigest
 Content-Length: 0
  • 46. 예시 (색인 파일) GET /indexpath/branchdigest HTTP/1.1
 Host: example.cloundfront.net
 Content-Length: 0
 
 HTTP/1.1 200 OK
 Content-Type: application/json; charset=UTF-8
 
 {
 “empty”:{“length”:0,”md5”:“1B2M2Y8AsgTpgAmY7PhCfg”},
 “dir/filename.txt”:{“length”:4,”md5”:“CY9rzUYh03PK3k6DJie09g”}
 }
  • 47. 예시 (1) GET /projectroot/empty/1B2M2Y8AsgTpgAmY7PhCfg HTTP/1.1
 Host: example.cloundfront.net
 Content-Length: 0
 
 HTTP/1.1 200 OK
 Content-Length: 0
 ETag: “d41d8cd98f00b204e9800998ecf8427e"
 

  • 48. 예시 (2) GET /projectroot/dir/filename.txt/CY9rzUYh03PK3k6DJie09g HTTP/1.1
 Host: example.cloundfront.net
 Content-Length: 0
 
 HTTP/1.1 200 OK
 Content-Type: plain/text; charset=UTF-8
 Content-Length: 4
 ETag: “098f6bcd4621d373cade4e832627b4f6"
 
 test

  • 49. 개발팀 내부에서 색인 생성은 • 일괄 처리 스크립트로 생성 • 로컬 혹은 공유 경로에 원본 파일을 넣고,
 일괄 처리 스크립트가 파일을 읽으면서 저장소에 저장하고
 색인 파일을 로컬에 생성 • 로컬에 생성된 색인 파일은 따로 버전 관리
  • 50. 개발팀 내부에서 버전 관리는 • 색인 파일은 JSON 파일이므로 배포 시마다 기존 버전 제어 체계에 (git) 제출 • 저장소에 (S3) 올라간 실제 파일들은 여러 버전이 섞여 있음
 색인 파일로부터 접근하기 때문 • 저장 비용 절감을 위해서는: 색인 파일을 저장소에서 삭제할 때
 모든 색인파일에서 접근할 수 없는 버전을 찾아 지운다
 (일종의 쓰레기 수거)
  • 51. 배포 관리는 • 각 배포판마다 색인 파일을 비교해서 병합 • 텍스트 파일이고, 파일 하나의 정보가 한 줄이므로 기존 도구 활용이 용이하다 • 파일 정보로부터 실제 리소스 파일을 확인할 수 있는 도구는 필요 • 문자열 생성 후 웹브라우저 열기가 전부
  • 52. 만들고 보니 • 기존 버전 제어 체계와 웹 저장소를 조합한
 분산 색인 + 리소스 중앙집중식 버전 제어 체계 • 색인만 기존 버전 제어 체계를 사용하기 때문에 분산해도
 모든 대형 리소스를 보관하지 않음 • 리소스 저장소는 중앙 집중식이지만 전세계에서 빠르게 접근 가능 • 구현 난이도도 높지 않음
  • 54. 고려 사항 • 파일 묶음 (archive) • 압축 • 암호화
  • 55. – Richard Hill, Hewlett-Packard S.A., Geneva, Switzerland “Don't write a new program if one already does more or less what you want.
 And if you must write a program, use existing code to do as much of the work as possible.”
  • 56. 안 만드는 이유: 묶음 처리 • 데스크톱에서는 디스크 헤드 이동을 줄여 파일 입출력 시간을 빠르게 하기 위해 • 모바일에서는 디스크가 아닌 메모리 사용
  • 57. 안 만드는 이유: 파일 보안 • 모바일 OS에서 응용 데이터 경로는 기본적으로 막혀 있음 • 안드로이드의 경우 미디어 검색에서 제외: .nomedia • 대부분의 경우 민감한 파일도 없다 • 있다면 민감한 파일만 모아 압축하고 암호화
  • 59. 지역화 리소스 • 언어-국가 별로 다른 리소스가 필요하다 • 저장 용량, 네트워크 사용량의 문제로 분리해서 관리할 필요가 있음 • 번체 지역에 간체, 간체 지역에 번체 폰트가 배포돼도 사용되지 않음
  • 60. 지역화 리소스의 특징 (1) • 선택 우선 순위가 명백하다 (좁은 로케일에서 넓은 로케일 순) • 사용자 정의 로케일 (ko-KR-x-private) • 언어-국가 로케일 (ko-KR) • 언어 로케일 공통 (ko) • 불변 로케일 (invariant)
  • 61. 지역화 리소스의 특징 (2) • 사용자에 의해 쓰기가 발생하지 않는다 • 업데이트할 때를 빼고는 사실상 읽기 전용 • 잘 분류된 경우 로케일별로 겹치는 파일은 거의 없다 • ∴ 모두 받고 우선 순위에 따라 읽는다
 저장소가 여러 개가 있는 것처럼 처리
  • 63. 문제 • 개발 중인 리소스가 실수로 배포되지 않아야 한다 • 관리하기 비교적 편하게
  • 64. 배포를 막는 방법 • 발효 시각-만료 시각을 기록하는 방법
  • 65. 배포를 막는 방법 • 발효 시각-만료 시각을 기록하는 방법 • (업데이트 일정 등의) 시각은 예상하기 어려움 • 종속성 설정을 만들고 특정 목록만 받도록 하는 방법 • 스프레드시트 파일로부터 생성한다면 (VBA) 관리할만하다
  • 66. 종속성 설정 • 색인 파일과 달리 저장소 공통으로 사용 (상대 경로가 동일한 파일이 많으므로) • JSON 형식 사용
 {
 “#main”:{“dependsOn”:[”#card”,”#portrait”]},
 “cardpath/card1.png”:{“affects”:”#card”},
 “imagepath/npc1.png”:{“affects”:”#portrait”}
 } • URL에 사용되지 않는 문자를 태깅에 이용
  • 67. 종속성 적용 • 각각의 종속성 목록은 이행 폐쇄를 (transitive closure) 구해 적용 • 사고를 막기 위해 금지를 허가보다 우선시 한다 • 제외 목록에 있는 파일은 빼고 • 남은 파일 중 포함 목록에 있는 파일만 받는다 • 예: #portrait을 빼고 #main을 받으면 예시에서는 #card만 받음
  • 69. 용도별 업데이트 방법 • 바이너리: 패키지를 배포 플랫폼에 제출해 업데이트 한다 • 리소스: 색인 파일을 배포하고 동기화한다 • 색인은 (경로, 길이, 요약) 정보로 구성한다
  • 70. 지역화 리소스 배포 방법 • 로케일의 우선순위를 정하고 • 로케일마다 색인 파일을 따로 생성해서 • 구동하는데 필요한 모든 로케일의 파일을 받도록 한다 • 파일을 실제로 읽을 때에는 우선순위에 따라 읽는다
  • 71. 개발 리소스 배포를 막는 방법 • 리소스의 종류를 구분해서 미리 표시해 놓고 • 배포에 포함된 것으로 표시된 파일들에 대해서만 받도록 설정한다