테마 선택

📚 지식 노트

AI·하드웨어·주변기기·게임·컴퓨터 시스템·이론 컴퓨터 과학·수학·개발과 운영·보안·응용 분야에 대해 알아 두면 좋은 내용을 정리한 노트다. 위에서 분야를 고르고 아래에서 노트를 고른다.

게임 배포와 서빙

완성한 게임을 플랫폼에 올리고, 패치를 빠르게 내려보내고, 운영 중에 설정을 바꾸는 법이다. 클라우드 게이밍도 다룬다.

목차 (7)
  1. 플랫폼 스토어와 요구 사항
  2. 빌드 파이프라인과 브랜치
  3. 패치 크기: 조각으로 나눠 바뀐 것만
  4. 패치를 내려보내는 길: 매니페스트, CDN, 런처
  5. 라이브 옵스: 원격 설정, 기능 플래그, 단계적 출시
  6. 버전 호환과 강제 업데이트
  7. 클라우드 게이밍: 화면을 스트리밍한다

플랫폼 스토어와 요구 사항

게임은 대부분 남의 가게에서 판다. PC는 Steam·Epic Games Store, 콘솔은 PlayStation Store·Microsoft Store·Nintendo eShop, 모바일은 App Store·Google Play다. 가게마다 들어가는 문이 다르고, 그 문이 배포 일정과 패치 속도를 정한다. 서버 쪽 설계도 이 문을 전제로 해야 한다. 예를 들어 서버 버그를 고쳤는데 클라이언트 패치가 심사에 묶여 있으면 며칠 동안 두 버전이 함께 돈다.

플랫폼별 출시 길: Steam은 첫 출시 때 스토어 페이지와 빌드를 한 번 검토받고 이후 업데이트는 개발사가 바로 올린다. 콘솔은 개발 키트 빌드를 인증에 제출해 통과해야 하며 패치도 매번 인증을 받는다. 모바일은 서명한 빌드를 매번 앱 심사에 내고 통과하면 일부 사용자부터 단계적으로 출시한다PC · Steam스토어 페이지·빌드첫 출시 때 검토 1회출시 버튼개발사가 직접업데이트검토 없이 바로콘솔개발 키트 빌드플랫폼 SDK·NDA인증 제출TRC·XR·Lotcheck통과 → 출시패치도 매번 인증모바일서명한 빌드App Store·Play앱 심사빌드마다단계적 출시일부 사용자부터
플랫폼별 출시 길. Steam은 첫 출시 때만 검토하고 업데이트는 개발사가 바로 올린다. 콘솔은 패치마다 인증을 통과해야 하고, 모바일은 빌드마다 심사를 거친 뒤 단계적으로 내보낼 수 있다.
  • Steam: Steamworks의 검토 절차 문서에 따르면 출시 전에 스토어 페이지와 빌드를 각각 검토받는데 보통 3~5영업일이 걸리니 7영업일 이상 여유를 두라고 한다. 한 번 승인되면 이후 업데이트는 다시 검토받지 않는다. 그래서 PC는 하루에 몇 번이라도 패치할 수 있다.
  • 콘솔: 소니의 TRC, 마이크로소프트의 Xbox Requirements(XR), 닌텐도의 Lotcheck처럼 플랫폼마다 기술 요구 사항 목록이 있고, 제출한 빌드가 이를 지키는지 플랫폼이 검사한다(인증, certification). 저장 데이터 손상 처리, 네트워크 끊김 안내, 계정 전환, 용어와 버튼 표기 같은 항목이다. 목록은 비밀 유지 계약 아래 개발사에게만 공개된다. 패치도 인증을 받아야 해서 콘솔 패치는 PC보다 며칠 늦게 나가는 일이 흔하다. 그래서 고칠 수 있는 것은 서버 설정으로 고치도록 미리 빼 둔다(아래 라이브 옵스).
  • 모바일: 모든 빌드가 심사를 거친다. Apple의 App Review 가이드라인은 인앱 구매, 확률형 아이템의 확률 공개, 원격으로 받은 코드로 앱의 기능을 바꾸는 것에 대한 규칙을 담고 있다. 서버에서 받는 것은 데이터와 설정이어야지, 심사를 피해 기능을 바꾸는 코드여서는 안 된다.
  • 나이 등급과 지역: 출시하려는 나라마다 등급(ESRB, PEGI, 게임물관리위원회 등)이 필요하고, 확률 공개·결제 한도·개인 정보 같은 지역 법이 서버 기능(결제, 텔레메트리)에 직접 걸린다.

빌드 파이프라인과 브랜치

게임 빌드는 웹 앱보다 훨씬 크고 느리다. 코드 컴파일보다 에셋 쿠킹(텍스처 압축, 셰이더 컴파일, 레벨 패키징)이 오래 걸리고, 결과물은 수십~수백 GB가 된다. 그래서 CI는 에셋 캐시를 적극적으로 쓰고, 플랫폼마다 따로 빌드하며, 클라이언트와 전용 서버를 같은 커밋에서 같은 버전 번호로 만든다. 둘이 다른 커밋에서 나오면 프로토콜이 어긋난다.

빌드 파이프라인과 Steam 브랜치: CI가 커밋을 클라이언트와 서버 빌드로 만든다. 클라이언트는 Windows, macOS·Linux, 공용 데이터 디포로 올라가 빌드 id 하나가 되고, 같은 빌드를 internal, beta, default 브랜치 순서로 올린다. 서버 빌드는 같은 버전으로 플릿에 올라간다CI 빌드커밋 → 테스트버전 1.8.0Steam 빌드 #21894Windows 디포macOS·Linux 디포공용 데이터 디포internal비밀번호 · 사내 QAbeta공개 베타 · 선택 참여default모든 사용자차례로 Set Live서버 빌드 1.8.0새 플릿클라이언트와 같은 버전
빌드 파이프라인과 Steam 브랜치. CI가 같은 커밋에서 클라이언트와 서버 빌드를 만든다. 클라이언트는 운영체제별 디포로 올라가 빌드 하나가 되고, 내부 → 베타 → 기본 브랜치 순으로 올라간다. 서버 빌드는 같은 버전의 새 플릿이 된다.
  • 디포(depot): Steam에서 파일 묶음의 단위다. 운영체제별 실행 파일, 언어별 음성, 공용 데이터를 디포로 나누면 사용자는 필요한 디포만 받는다. 디포 여럿을 묶어 올린 것이 빌드 하나다.
  • 브랜치: Steamworks의 브랜치 문서처럼 같은 게임에 여러 빌드를 동시에 걸어 둘 수 있다. 기본(default) 브랜치가 모두가 받는 버전이고, 비밀번호를 건 브랜치는 사내 QA나 외부 테스터용, 공개 베타 브랜치는 원하는 사람이 라이브러리의 속성에서 골라 참여한다. 빌드를 올린다고 바로 나가지 않고, 어느 브랜치에 걸지(Set Live)를 따로 정한다. 같은 빌드를 내부 → 베타 → 기본으로 차례로 걸면 다시 빌드하지 않고 출시하고, 문제가 생기면 기본 브랜치를 이전 빌드로 되돌린다.
  • 서버 빌드: 전용 서버는 컨테이너 이미지나 서버 빌드로 만들어 새 플릿에 올린다(서버 설계 노트의 플릿). 클라이언트 출시와 서버 플릿 교체의 순서를 정해 둔다. 대개 새 서버를 먼저 띄워 두고, 클라이언트를 열고, 옛 플릿은 옛 클라이언트가 사라질 때까지 남긴다.
  • 심볼과 크래시: 빌드마다 디버그 심볼을 보관해 두어야 출시 뒤 크래시 덤프를 읽을 수 있다. 크래시율은 출시 직후 가장 먼저 보는 숫자다.

패치 크기: 조각으로 나눠 바뀐 것만

100GB 게임의 패치가 100GB면 아무도 견디지 못한다. 그래서 배포 시스템은 파일을 조각(chunk)으로 자르고 조각마다 내용 해시로 이름을 붙인다(내용 주소 지정, content-addressed). 새 빌드를 올리면 이미 있는 조각은 다시 저장하지 않고, 사용자도 가진 조각은 다시 받지 않는다. Steam의 업로드 문서는 SteamPipe가 파일을 약 1MB 조각으로 나누고, 새 빌드에서 이미 아는 조각을 찾아 재사용한다고 설명한다.

함정은 큰 팩 파일이다. 에셋 수천 개를 파일 하나에 이어 붙여 두면, 앞쪽 에셋 하나가 몇 바이트만 커져도 그 뒤 모든 바이트가 밀려 조각 경계가 전부 어긋난다. 아래 예에서 에셋 B가 한 칸 커지자 그냥 이어 붙인 팩은 조각 4개 중 4개를 모두 새로 받는다. 에셋마다 조각 경계에서 시작하도록 빈칸을 채워 두면 B가 든 조각 1개만 바뀐다. Steam 문서도 팩 파일 안의 에셋을 1MB 경계에 맞추라고 권한다.

팩 파일 델타 패치: 에셋 다섯 개를 담은 팩 파일을 네 칸짜리 조각으로 자른다. 에셋 B가 한 칸 커지면, 그냥 이어 붙인 팩은 뒤가 모두 밀려 조각 네 개를 모두 새로 받고, 에셋마다 조각 경계에 맞춘 팩은 B가 든 조각 하나만 새로 받는다그냥 이어 붙인 팩새로 받을 조각 4 / 4이전AAABBCCCCDDDEEE이후AAABBBCCCCDDDEEE에셋을 조각 경계에 맞춘 팩새로 받을 조각 1 / 5이전AAABBCCCCDDDEEE이후AAABBBCCCCDDDEEE칸 = 데이터 한 덩이, 조각 = 네 칸(SteamPipe는 약 1MB), 점선 = 맞춤용 빈칸
에셋 다섯 개를 담은 팩 파일을 네 칸짜리 조각으로 자른 모습. 위는 그냥 이어 붙여 B가 커지자 모든 조각이 바뀌고, 아래는 에셋을 조각 경계에 맞춰 B의 조각 하나만 바뀐다. 빈칸만큼 파일은 조금 커진다.
  • 순서를 지킨다: 빌드할 때마다 팩 안의 에셋 순서가 바뀌면 위의 정렬도 소용없다. 빌드 도구가 같은 입력에 같은 순서·같은 바이트를 내도록(결정적 빌드) 만든다.
  • 압축과 암호화는 조각 단위로: 팩 전체를 한 번에 압축하면 작은 변경이 압축 결과 전체를 바꾼다. 에셋이나 블록 단위로 압축해야 델타가 산다.
  • 자주 바뀌는 것은 따로: 밸런스 표, 문자열, 이벤트 데이터는 작은 파일로 떼어 두거나 아예 서버 설정으로 뺀다. 수치 하나 고치려고 수 GB 패치를 내지 않는다.

패치를 내려보내는 길: 매니페스트, CDN, 런처

조각을 실제로 사용자에게 옮기는 것은 CDN이다. 대형 업데이트 날에는 수백만 명이 몇 시간 안에 같은 조각을 받으므로, 원본 저장소가 직접 받으면 버티지 못한다. 조각은 내용 해시가 이름이라 한 번 만들면 바뀌지 않으니 캐시하기에 가장 좋은 데이터다. 엣지 캐시에 오래 두어도 틀릴 일이 없다. CDN과 오브젝트 저장소의 일반 구조는 미디어와 파일 사례 노트에 있다.

패치 받기 단계 그림: 런처가 매니페스트를 받아 가진 조각과 비교하고, 없는 조각만 CDN 엣지에서 받는다. 엣지는 없는 조각을 원본에서 가져온다. 런처는 조각 해시를 검증해 임시 폴더에 조립한 뒤 한 번에 교체한다런처Steam·자체 런처콘텐츠 서버매니페스트(조각 목록)CDN 엣지가까운 캐시원본 저장소조각 = 내용 해시로컬 디스크설치된 빌드 21803매니페스트 비교 전필요한 조각 37개나머지 9,375개는 그대로받는 중 22 / 37끊기면 이어 받기조각 해시 검증임시 폴더에 새 파일 조립한 번에 교체이제 빌드 21894없을 때만
1 / 5

런처가 콘텐츠 서버에서 새 빌드의 매니페스트를 받는다. 파일마다 어떤 조각(내용 해시)으로 이뤄졌는지 적힌 목록이다.

패치 받기. 매니페스트로 무엇이 바뀌었는지 알고, 없는 조각만 CDN에서 받아, 검증하고 조립한 뒤 한 번에 바꾼다.
  • 매니페스트: 빌드 하나는 "어떤 파일이 어떤 조각들로 이뤄졌는지"의 목록이다. 런처는 이것만 받아 비교하면 무엇을 받아야 할지 안다. 매니페스트는 서명해 두어 중간에서 바꿔치기할 수 없게 한다.
  • 미리 받기: 출시 며칠 전에 암호화된 조각을 미리 내려보내고(preload), 출시 시각에 키만 풀면 몰림이 출시 순간에 몰리지 않는다.
  • 런처: Steam 같은 스토어 클라이언트가 이 일을 대신하지만, 자체 런처를 쓰는 게임은 위 과정을 직접 만든다. 런처는 게임 실행 전에 버전을 맞추고, 손상된 파일을 해시로 검사해 다시 받는(파일 검증) 기능도 맡는다.
  • 콘솔·모바일: 패치 배포는 플랫폼의 시스템이 하고, 개발사는 패키지를 올린다. 모바일 게임은 앱 크기 제한과 셀룰러 다운로드 경고 때문에 앱은 작게 내고, 큰 에셋은 첫 실행 때 자체 CDN에서 받는 구조가 흔하다.

라이브 옵스: 원격 설정, 기능 플래그, 단계적 출시

출시한 게임을 바꾸는 가장 빠른 길은 빌드가 아니라 설정이다. 클라이언트와 서버가 시작할 때(그리고 주기적으로) 원격 설정을 받아, 이벤트 일정, 드롭률, 상점 진열, 새 기능의 켜짐 여부를 그 값으로 정한다. Firebase Remote Config 문서처럼 관리형 서비스도 많고, 게임 백엔드 대부분이 같은 기능을 준다. 설정이 곧 배포이므로 웹 서비스의 배포 원칙을 그대로 적용한다.

단계적 출시 단계 그림: 사용자 버킷 100칸 중 켜진 칸이 1%, 10%, 50%로 늘다가 오류율이 뛰자 킬 스위치로 0%가 되고, 고친 뒤 100%로 열린다새 상점 화면 플래그: 1% 켜짐오류율 0.3%새 상점 화면 플래그: 10% 켜짐오류율 0.3%새 상점 화면 플래그: 50% 켜짐오류율 2.4% ↑새 상점 화면 플래그: 0% 켜짐오류율 0.3%킬 스위치: 원격 설정 shop_v2 = 0새 상점 화면 플래그: 100% 켜짐오류율 0.3%칸 하나 = 사용자 1% (버킷)
1 / 5

새 상점 화면을 버킷 0번, 곧 사용자의 1%에게만 켠다. 버킷은 사용자 id를 해시해 정하므로 같은 사람은 늘 같은 화면을 본다.

단계적 출시와 킬 스위치. 사용자를 100개 버킷으로 나눠 조금씩 켜고, 지표가 나빠지면 원격 설정 한 줄로 모두 끈다.
  • 기능 플래그: 새 기능을 코드에 넣되 꺼 둔 채 출시하고, 설정으로 켠다. Pete Hodgson의 Feature Toggles 글은 출시용, 실험용, 운영용(킬 스위치), 권한용 플래그를 나누고, 출시용 플래그는 짧게 쓰고 지우라고 권한다. 플래그가 쌓이면 조합이 늘어 테스트가 어려워진다.
  • 단계적 출시: 사용자 id를 해시해 0~99 버킷에 고정 배정하고, 켜는 비율을 1% → 10% → 50% → 100%로 넓힌다. 같은 사람은 늘 같은 쪽에 있어 경험이 흔들리지 않는다. 스토어도 같은 기능을 준다. Google Play는 단계적 출시로 일부 사용자에게만 새 버전을 내보내고, Apple은 단계별 출시로 자동 업데이트를 7일에 걸쳐 나눠 보낸다.
  • 킬 스위치: 문제가 생기면 끌 수 있는 스위치를 미리 만들어 둔다. 콘솔·모바일 패치는 인증과 심사에 며칠이 걸리니, 새 상점, 새 모드, 무거운 기능에는 서버 쪽 끄기를 반드시 단다.
  • A/B 테스트: 같은 버킷 방식으로 그룹을 나눠 다른 값을 주고, 텔레메트리로 재방문율이나 전환율을 비교한다(게임 백엔드 노트의 텔레메트리 절). 경쟁 게임에서는 밸런스처럼 공정성에 걸리는 값은 실험하지 않는다.
  • 설정도 검증한다: 잘못된 설정 한 줄(드롭률 100배)이 서버 버그보다 크게 터진다. 스키마 검사, 리뷰, 단계적 적용, 되돌릴 수 있는 버전 기록을 코드 배포처럼 둔다.

버전 호환과 강제 업데이트

출시 순간 모든 사용자가 새 버전을 쓰지는 않는다. 업데이트를 미룬 사람, 콘솔 패치가 아직 인증 중인 플랫폼, 단계적 출시로 아직 못 받은 사람이 섞인다. 그래서 백엔드와 경기 서버는 한동안 여러 클라이언트 버전을 함께 상대한다. 어디까지 받아 줄지를 정하는 것이 버전 관문이다.

버전 관문: 최소 지원 버전이 1.7, 최신이 1.8이다. 1.5와 1.6 클라이언트는 로그인 때 막고 업데이트로 보낸다. 1.7은 들이되 업데이트를 권하고, 1.8은 그대로 들인다백엔드 설정: min_version = 1.7, latest = 1.8← 지원 끝지원 →클라이언트 1.5막고 업데이트클라이언트 1.6막고 업데이트클라이언트 1.7들이고 권장 안내클라이언트 1.8그대로 들임로그인할 때 클라이언트가 버전과 프로토콜 번호를 보내고 백엔드가 비교한다.매치메이커는 같은 프로토콜 번호끼리만 묶고, 경기 서버도 그 번호의 플릿에서 고른다.
버전 관문. 백엔드가 최소 지원 버전과 최신 버전을 들고 로그인한 클라이언트를 가른다. 최소보다 낮으면 막고 업데이트로 보내고, 그 위면 들이되 최신이 아니면 업데이트를 권한다.
  • 프로토콜 번호: 클라이언트 버전과 별도로 "서버와 말이 통하는가"를 나타내는 번호를 둔다. 문구 수정 같은 패치는 프로토콜이 그대로라 옛 클라이언트와 새 클라이언트가 같은 경기에 들어갈 수 있다. 번호가 바뀌면 매치메이커가 같은 번호끼리만 묶고, 경기 서버도 그 번호의 플릿에서 고른다.
  • 백엔드 API는 넓게 받는다: 새 필드는 선택으로 더하고, 옛 필드는 바로 지우지 않는다. API에 버전을 달고 옛 버전을 지원 기간 동안 유지한다. 데이터 형식 진화의 일반 원칙은 데이터 모델과 인코딩 노트와 같다.
  • 강제 업데이트: 보안 구멍, 경제를 무너뜨리는 버그, 프로토콜 변경이 있으면 최소 지원 버전을 올린다. 모바일은 스토어 심사와 단계적 출시가 끝난 뒤에 올려야 한다. 아직 새 버전을 받을 수 없는 사람까지 막지 않도록, 플랫폼별로 최소 버전을 따로 둔다.
  • 점검: 데이터베이스 구조를 크게 바꾸는 업데이트는 서버를 잠시 닫는 점검으로 처리하기도 한다. 점검 공지·로그인 차단·대기열도 같은 관문에서 한다. 점검 없이 하려면 옛 형식과 새 형식을 함께 읽는 기간을 두고 데이터를 뒤에서 옮긴다.

클라우드 게이밍: 화면을 스트리밍한다

클라우드 게이밍은 배포를 거꾸로 뒤집는다. 게임을 내려보내지 않고 데이터센터의 GPU 서버에서 돌린 뒤, 화면을 영상으로 인코딩해 보낸다. 기기는 입력을 올려 보내고 영상을 디코딩해 보여 주기만 하니, 설치도 패치도 없고 성능 낮은 기기에서도 무거운 게임이 돈다. 대가는 지연과 대역폭, 그리고 GPU 서버 비용이다.

클라우드 게이밍 구조와 지연 예산: 기기가 입력을 데이터센터의 GPU 서버로 보내면 서버가 게임을 한 프레임 돌리고 화면을 캡처해 영상으로 인코딩해 내려보내고, 기기는 디코딩해 보여 준다. 아래 막대는 입력 읽기 4, 올라감 10, 게임 프레임 16, 인코딩 6, 내려옴 10, 지터 버퍼 8, 디코딩과 표시 12, 합계 66밀리초의 예시다플레이어 기기TV·폰·브라우저영상 디코딩만데이터센터 GPU 서버게임 실행 → 화면 캡처→ 하드웨어 인코딩입력 (수십 바이트)영상 스트림 (1080p60에 수~수십 Mbps)입력에서 화면까지 지연 예산 (예: 합계 66ms)41016610812기기네트워크서버순서: 입력 → 올라감 → 게임 프레임 → 인코딩 → 내려옴 → 지터 버퍼 → 디코딩·표시
클라우드 게이밍의 구조와 지연 예산(예시 값). 입력이 올라가고, 서버가 한 프레임을 돌려 인코딩하고, 영상이 내려와 디코딩될 때까지 합계 약 66ms다. 네트워크 왕복만이 아니라 인코딩·버퍼·디코딩이 모두 예산을 쓴다.
  • 지연 예산: 콘솔을 TV에 연결해 해도 입력에서 화면까지 수십 ms가 걸린다. 클라우드는 여기에 네트워크 왕복과 인코딩·디코딩이 더해진다. 그래서 데이터센터를 사용자 가까이 많이 두고, 지터 버퍼를 최소로 잡고, 하드웨어 인코더와 낮은 지연 설정을 쓴다. 왕복 시간이 늘면 바로 체감되니 네트워크 노트의 유선 연결·와이파이 대역 이야기가 그대로 중요하다.
  • 멀티플레이와 함께: 클라우드에서 도는 게임도 온라인 경기라면 여전히 경기 서버에 접속한다. 스트리밍 서버와 경기 서버가 같은 데이터센터에 있으면 그 구간의 지연이 거의 사라져, 오히려 집에서 하는 것보다 서버와 가까워질 수 있다.
  • 서비스 현황(2026년): Google Stadia는 Google의 발표대로 2023년 1월에 문을 닫았다. NVIDIA GeForce NOW는 사용자가 이미 산 PC 게임(Steam 등)을 스트리밍하는 방식으로 운영 중이며 2025년부터 RTX 5080급(Blackwell) 서버를 들였다. Xbox Cloud Gaming은 오랜 베타를 거쳐 2025년 10월 Game Pass 개편과 함께 정식 서비스가 됐다.
  • 개발사가 직접: 플랫폼 구독 서비스 밖에서 자기 게임을 스트리밍으로 내보낼 수도 있다. AWS는 2025년에 Amazon GameLift Streams를 내놓아, 게임을 올리면 브라우저로 스트리밍하는 데모·체험판·즉시 플레이를 만들 수 있게 했다.