์ธ์ ๋, ์ด๋์๋ ํ๊ฒฝ์ ๊ตฌ์ ๋ฐ์ง ์๊ณ ์ฐ์ฃผ๋ฅผ ํํํ ์ ์๋ ์ฝ์ค๋ฏน ์ด๋๋ฒค์ฒ์ ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค!
- ์ฃผ์ ๊ธฐ๋ฅ ์๊ฐ
- ๊ฐ๋ฐ ํ๊ฒฝ ๋ฐ ๋ฒ์ ์ ๋ณด
- ํ๋ก์ ํธ ๊ตฌ์กฐ
- ๊ธฐ์ ์คํ ๋ฐ ๋์ ์ด์
- ๋ฌธ์ ํด๊ฒฐ ๊ธฐ๋ก
- ํ๋ก์ ํธ ์งํ ๋ฐฉ์
- Development
| ์ฌ์ฉ ๊ถํ ์ค์ | ํ๋กํ ์ค์ |
|---|---|
![]() |
![]() |
| ์นด๋ฉ๋ผ / ๊ทผ๊ฑฐ๋ฆฌ ํต์ / ์๋ฆผ ๊ถํ ์๋ด ๋ฐ ์ค์ | ๋๋ค์ + ์บ๋ฆญํฐ ์ ํ์ผ๋ก ๋๋ง์ ๋์๋์์ค ์์ฑ |
| ํ๊ฒฝ ์ค์ ๋ทฐ |
|---|
![]() |
| - ๊ฐ๋ ์กฐ์ - PIP ํฌ๊ธฐ ์กฐ์ - ์ฌ์ด๋ ๋ณผ๋ฅจ ์กฐ์ - ํ ์คํธ ๋ทฐ(๊ฒ์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ) ย ย ย ย - ์ค์ ๊ฐ์ด ์ค์ ํ๋ ์ด์ ์ด๋ป๊ฒ ์ ์ฉ๋๋์ง ์ฆ์ ํ์ธ |
โโโ iOS/
โ โโโ App/
โ โ โโโ Sources/
โ โ โโโ Resources/
โ โ โโโ Tests/
โ โโโ Modules/
โ โ โโโ GameEngineCore/
โ โ โโโ InputSystem/
โ โ โโโ NetworkKit/
โ โ โโโ VideoKit/
โ โ โโโ StorageKit/
โ โ โโโ Games/
โ โโโ Tuist/
โโโ backend/
โ โโโ Sources/
โ โโโ Tests/
โ โโโ Public/
โโโ fastlane/
โโโ docs/
โโโ Project.swift
โโโ cosmic-adventure.xcworkspace
๊ณ ๋ํ๋ ๊ฒ์ ๊ฒฝํ๊ณผ ์ ์ง๋ณด์์ ํจ์จ์ฑ์ ๊ทน๋ํํ๊ธฐ ์ํด ๊ตฌ์กฐ๋ฅผ ๋ชจ๋ํ ํ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋จ์ํ ์ฝ๋๋ฅผ ๋๋๋ ๊ฒ์ ๋์ด, SOLID ์์น์ ๊ธฐ๋ฐ์ผ๋ก ์ง์ ๊ฐ๋ฅํ ํ์ฅ์ฑ์ ํ๋ณดํ๋ ๋ฐ ์ด์ ์ ๋ง์ถ์์ต๋๋ค
SRP(Single Responsibility Principle): ๊ฐ ๋ชจ๋์ ๋ฌผ๋ฆฌ ์์ง, ๋คํธ์ํฌ, UI ๋ฑ ๋ ๋ฆฝ์ ์ธ ํ๋์ ์ฑ ์๋ง์ ์ํํ์ฌ ์ฝ๋์ ์์ง๋๋ฅผ ๋์์ต๋๋ค.DIP(Dependency Inversion Principle): ์์ ๋ชจ๋์ ํ์์ ๊ตฌ์ฒด ๊ธฐ์ ์ด ์๋ Protocol ์ ์์กดํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ค๋ฅธ ๋ชจ๋์ ์์ ์์ด ์ ์ฐํ๊ฒ ๋์ํฉ๋๋ค.OCP(Open-Closed Principle): ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ํ๋กํ ์ฝ ํ์ฅ์ ํตํด ๊ธฐ๋ฅ์ ๋ํ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถํ์์ต๋๋ค.
App: ํ๋ก์ ํธ์ ์ง์ ์ ์ผ๋ก, ์ ์ฒด ์ฑ์ ์๋ช ์ฃผ๊ธฐ์ ์ ์ญ ์ค์ ์ ๊ด๋ฆฌํฉ๋๋ค.Presentation: SwiftUI ๊ธฐ๋ฐ์ UI์ ViewModel์ ํฌํจํ๋ฉฐ, ์ํ ๊ด๋ฆฌ์ ๋ชจ๋ ๊ฐ์ ์์กด์ฑ์ ์ฃผ์ (DI)ํ๋ ์ญํ ์ ์ํํฉ๋๋ค.
Domain: ๊ฒ์์ ๊ท์น ๋ฐ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ํฌํจํฉ๋๋ค. ํน์ ๊ธฐ์ ์คํ์ ์ข ์๋์ง ์๋ ์์ ๋ก์ง์ผ๋ก ์ ์ง๋ฉ๋๋ค.Games: ๊ฒ์์ ๊ตฌ์ฒด์ ์ธ ๋ฃฐ์ ์ ์ํ๋ ๋ชจ๋์ ๋๋ค.
InputSystem: ARKit ๊ธฐ๋ฐ์ ์ผ๊ตด ํ์ ํธ๋ํน ๋ฐ ์ ๋ ฅ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ์ฌ ์ค์๊ฐ ์ํธ์์ฉ์ ๊ธฐ๋ฐ์ ๋ง๋ จํฉ๋๋ค.GameEngineCore: ๊ฒ์ ๋ฌผ๋ฆฌ ์ฐ์ฐ ๋ฐ ์์ง์ ํต์ฌ ๊ธฐ๋ฅ์ ๋ด๋นํ์ฌ ์์ ์ ์ธ ๊ฒ์ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค.NetworkKit: P2P(Local) ๋ฐ WebSocket(Remote) ํต์ ์ ์ถ์ํํ์ฌ ๋ฉํฐํ๋ ์ด ํ๊ฒฝ์ ๊ตฌ์ถํฉ๋๋ค.VideoKit: ์์ ๋ฐ์ดํฐ์ ๊ณ ํจ์จ ์ธ์ฝ๋ฉ/๋์ฝ๋ฉ ๋ฐ ์ค์๊ฐ ์ ์ก์ ์ต์ ํํฉ๋๋ค.StorageKit: SwiftData๋ฅผ ํ์ฉํ ๋ก์ปฌ ๋ฐ์ดํฐ ์์์ฑ ๊ด๋ฆฌ๋ฅผ ๋ด๋นํ๋ฉฐ ์ ํํ๋ ๋ฐ์ดํฐ ์ ์ฅ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- Network.framework
- ๋์
์ด์ :
URLSession๋ณด๋ค ๋ฎ์ ์์ค(Low-level)์์ TCP/UDP ๋ฐ TLS ์ฐ๊ฒฐ์ ์ง์ ์ ์ดํ์ฌ ์ค๋ฒํค๋๋ฅผ ์ค์ด๊ณ , ์ ์ง์ฐ ์ค์๊ฐ P2P ํต์ ์ ๊ตฌํํ๊ธฐ ์ํด ์ฑํํ์ต๋๋ค. - ํ์ฉ:
Bonjour๋ฅผ ํตํ ์ฃผ๋ณ ๊ธฐ๊ธฐ ํ์๊ณผ TCP ์ฐ๊ฒฐ์ ํตํด ๋ณ๋์ ์ค์ ์๋ฒ ์์ด ๋ก์ปฌ ํ๊ฒฝ์์ ๋ฉํฐํ๋ ์ด์ด ํ๊ฒฝ์ ๊ตฌ์ถํฉ๋๋ค.
- ๋์
์ด์ :
- WebSocket
- ๋์ ์ด์ : ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์๋ฐฉํฅ ์ค์๊ฐ ๋ฐ์ดํฐ ๊ตํ์ ์ํด ์ฑํํ์ต๋๋ค.
- ํ์ฉ: Vapor ๋ฐฑ์๋ ์๋ฒ์ ์ฐ๊ฒฐ๋์ด ์ค์๊ฐ ์ฌ์ฉ์ ์ํ ๋๊ธฐํ, ๋งค์นญ ์์คํ ๋ฐ ๊ฒ์ ๋ฐ์ดํฐ ์ค๊ณ๋ฅผ ๋ด๋นํฉ๋๋ค.
- VideoToolbox
- ๋์ ์ด์ : ํ๋์จ์ด ๊ฐ์์ ํ์ฉํด ๋น๋์ค๋ฅผ ์ธ์ฝ๋ฉ/๋์ฝ๋ฉํจ์ผ๋ก์จ CPU ๋ถํ์ ๊ธฐ๊ธฐ ๋ฐ์ด์ ์ต์ํํ๊ณ , ๊ณ ํด์๋ ์์์ ๋งค๋๋ฝ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ ํํ์ต๋๋ค.
- ํ์ฉ: H.264 ์ฝ๋ฑ์ ์ฌ์ฉํ์ฌ ์ค์๊ฐ ๋น๋์ค ์คํธ๋ฆผ์ ์์ถํ๊ณ ์ ์กํจ์ผ๋ก์จ ๋คํธ์ํฌ ๋์ญํญ ํจ์จ์ ๋์ด๊ณ ์ง์ฐ ์๊ฐ์ ์ต์ํํฉ๋๋ค.
- SpriteKit & ARKit
- ๋์ ์ด์ : ํ์ค ์ธ๊ณ์ ์ํธ์์ฉํ๋ ์ฆ๊ฐํ์ค(AR) ํ๊ฒฝ์ ๊ตฌ์ถํ๊ณ , 2D ๊ทธ๋ํฝ ์์๋ฅผ ๊ฐ๋ณ๊ณ ์ง๊ด์ ์ผ๋ก ๋ ๋๋งํ๊ธฐ ์ํด ๋ ํ๋ ์์ํฌ๋ฅผ ํจ๊ป ์ฌ์ฉํ์ต๋๋ค.
- ํ์ฉ:
ARKit์ Face Tracking ๊ธฐ์ ๋ก ์ฌ์ฉ์์ ํ์ ๊ณผ ์์ง์์ ์ถ์ ํด ์ค์๊ฐ ๊ฒ์ ์ปจํธ๋กค๋ฌ๋ก ๋ณํํ๋ฉฐ,SpriteKit๊ธฐ๋ฐ์ ๋ฌผ๋ฆฌ ์์ง๊ณผ ์ ๋๋ฉ์ด์ ์ผ๋ก ๋ชฐ์ ๊ฐ ์๋ ๊ฒ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
- Tuist
- ๋์
์ด์ : Xcode ํ๋ก์ ํธ ํ์ผ(
.xcodeproj)์ ์ถฉ๋์ ๋ฐฉ์งํ๊ณ , ๋ชจ๋ํ ์ํคํ ์ฒ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ๋์ ํ์ต๋๋ค. - ํ์ฉ:
Project.swift์ ์๋ฅผ ํตํด ์ฌ๋ฌ ๋ชจ๋(NetworkKit, VideoKit, Games ๋ฑ) ๊ฐ์ ์์กด์ฑ์ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ํ์ ๊ฐ ์ผ๊ด๋ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ ์งํฉ๋๋ค.
- ๋์
์ด์ : Xcode ํ๋ก์ ํธ ํ์ผ(
- Fastlane
- ๋์ ์ด์ : ๋น๋, ํ ์คํธ, ๋ฐฐํฌ ๊ณผ์ ์ ์๋ํํ์ฌ ๊ฐ๋ฐ ํจ์จ์ฑ์ ๋์ด๊ณ ๋ฐ๋ณต์ ์ธ ์ค์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋์ ํ์ต๋๋ค.
- ํ์ฉ:
Match๋ฅผ ํตํ ์ธ์ฆ์ ๊ด๋ฆฌ์ TestFlight ์ ๋ก๋ ํ๋ก์ธ์ค๋ฅผ ์๋ํํ์ฌ ์ง์์ ์ธ ๋ฐฐํฌ(CD) ํ๊ฒฝ์ ๊ตฌ์ถํ์ต๋๋ค.
ํ๋ก์ ํธ๋ ๊ทผ๊ฑฐ๋ฆฌ P2P(Network.framework) ์ ์๊ฑฐ๋ฆฌ ์๋ฒ ํต์ (WebSocket) ์ ๋ชจ๋ ์ง์ํฉ๋๋ค.
๋ค๋ง ๋ ๋ฐฉ์์ ์ ์ก ๋ฐฉ์๊ณผ ๋ฐ์ดํฐ ํฌ๋งท์ด ๋ฌ๋ผ(์: P2P๋ Data, WebSocket์ String/JSON) ๋ค์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
- ๋์ผ ๊ธฐ๋ฅ(์ด๋/์ ๋ ฅ/์์)์ ๋ชจ๋๋ณ๋ก ๋ฐ๋ก ๊ตฌํํ๋ฉฐ ์ฝ๋ ์ค๋ณต ์ฆ๊ฐ
- ViewModel/UI๊ฐ โํ์ฌ ํต์ ๋ฐฉ์โ์ ์์์ผ ํด์ UI ๋ก์ง์ด ๋คํธ์ํฌ ๊ตฌํ์ ์ข ์
- ์ ์ก ํฌ๋งท ๋ณํ ๋ก์ง์ด ๊ณณ๊ณณ์ ํผ์ ธ ์ ์ง๋ณด์ ๋ฐ ํ ์คํธ ๋น์ฉ ์ฆ๊ฐ
- ํต์ ๋ฐฉ์๋ณ API๊ฐ ๋ฌ๋ผ ์์ ๋ ์ด์ด์์ ๋ถ๊ธฐ ์ฒ๋ฆฌ(์๋ฒ ๋ชจ๋/P2P ๋ชจ๋)๊ฐ ํ์ํ์ต๋๋ค.
- ์ ์ก ๋จ์๊ฐ ๋ค๋ฆ(Binary
Datavs JSONString) โ ๋ณํ ์ฑ ์์ด ์์ ๋ ์ด์ด๋ก ์์ด ๋์์ต๋๋ค.
1) ํ๋กํ ์ฝ ์ถ์ํ๋ก ์ธํฐํ์ด์ค ํ์คํ
์์ ๋ ์ด์ด๊ฐ ๊ตฌ์ฒด ๊ตฌํ์ด ์๋๋ผ ์ธํฐํ์ด์ค์๋ง ์์กดํ๋๋ก ์ต์์ ํ๋กํ ์ฝ์ ์ ์ํ์ต๋๋ค.
ConnectionSessionManaging- ์ฐ๊ฒฐ ๊ด๋ฆฌ:
activate,deactivate - ์ด๋ฒคํธ ์์ (๊ตฌ๋
):
onInviteReceived,onInputReceived,onVideoReceived - ์ก์
๋ฐ์ :
sendInvite(),sendInput(),sendVideo()
- ์ฐ๊ฒฐ ๊ด๋ฆฌ:
๋ํ ๋ชจ๋๋ณ ์ ์ฉ ๊ธฐ๋ฅ์ ํ์ ํ๋กํ ์ฝ๋ก ๋ถ๋ฆฌํ์ต๋๋ค.
NetworkSessionManaging(P2P ์ ์ฉ)WebSocketSessionManaging(์๋ฒ ์ ์ฉ)
๊ฒฐ๊ณผ์ ์ผ๋ก ViewModel์ P2P/์๋ฒ ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋์ผํ API๋ก ๋์ํ๋๋ก ์ ๋ฆฌํ์ต๋๋ค.
2) ์ด๋ํฐ ํจํด์ผ๋ก ๋ฐ์ดํฐ ํ์
๋จ์ผํ(Data)
์์ ๋ ์ด์ด์์๋ ์ ์ก ๋จ์๋ฅผ Data๋ก ํต์ผํ์ต๋๋ค.

- P2P:
Data๊ธฐ๋ฐ โ ๊ทธ๋๋ก ์ฌ์ฉ - WebSocket: ๋ด๋ถ์์
String โ Data๋ณํ์ ์ํํ๋ ์ด๋ํฐ ์ญํ ๋ด๋น
์ ์ก ํฌ๋งท ์ฐจ์ด๋ฅผ ํ์ ๋ ์ด์ด๋ก ์จ๊ฒจ, ์์ ๋ก์ง์ ๋ณต์ก๋๋ฅผ ๋ฎ์ถ๊ณ ๋ณํ ์ฑ ์์ ํ ๊ณณ์ผ๋ก ๋ชจ์์ต๋๋ค.
- ๋ชจ๋(P2P/์๋ฒ)์ ๊ด๊ณ์์ด ์ด๋/์ ๋ ฅ/์์ ํ๋ฆ์ ๋์ผ ์ฝ๋๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ ๋์์ต๋๋ค.
- UI/ViewModel์ด ํต์ ๋ฐฉ์์ ์ข ์๋์ง ์์ ๊ด์ฌ์ฌ๊ฐ ๋ถ๋ฆฌ๋์์ต๋๋ค.
- ์ธํฐํ์ด์ค ๊ธฐ๋ฐ์ด๋ผ Mock ์ฃผ์ ์ด ์ฌ์์ ธ ๋คํธ์ํฌ ์์ด๋ ํ ์คํธ ๊ฐ๋ฅํ ๊ตฌ์กฐ๋ฅผ ํ๋ณดํ์ต๋๋ค.
๊ด๋ จ ๋ฌธ์: ํตํฉ ๋คํธ์ํฌ ๋ ์ด์ด
๋ฉํฐํ๋ ์ด์์ ํ๋ซํผ ์ถฉ๋ ํ์ฑ ์ฌ๋ถ๊ฐ ๋ก์ปฌ ์บ๋ฆญํฐ ๊ธฐ์ค์ผ๋ก๋ง ํ๋จ๋๋ฉด์,
์๊ฒฉ ์บ๋ฆญํฐ๊ฐ ๋ก์ปฌ ๊ธฐ์ค์ผ๋ก ๋นํ์ฑํ๋ ํ๋ซํผ์ ๋ฐ์ง ๋ชปํ๊ฑฐ๋(์ฐฉ์ง ์คํจ),
๋ก์ปฌ/์๊ฒฉ ๊ฐ ์ถฉ๋ ์ํ๊ฐ ๋ฌ๋ผ ์ฐฉ์ง ๋์์ด ๋ถ์ผ์นํ๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
๋ํ ํ๋ซํผ์ ์์น ์ ํต๊ณผ / ํ๊ฐ ์ ์ฐฉ์ง(One-Way)๋ก ๋์์ํค๋ ๊ณผ์ ์์,
๋น ๋ฅธ ๋ํ ์ ์ถฉ๋ ํ์ฑ ํ์ด๋ฐ์ ๋์ณ ๊ดํต์ด ๋ฐ์ํ ์ ์์์ต๋๋ค.
- ๋ก์ปฌ/์๊ฒฉ์ด ๊ณต์ ํ๋ ๋จ์ผ ์ถฉ๋ ํ๋จ ๋ก์ง์ผ๋ก ์ธํด ์บ๋ฆญํฐ๋ณ ์ถฉ๋ ์ํ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ์ ์ดํ๊ธฐ ์ด๋ ค์ ์ต๋๋ค.
- One-Way ํ๋ซํผ ๊ตฌํ ์, ํ๋ ์ ์ฌ์ด ์ด๋๋์ด ํฐ ๊ฒฝ์ฐ(๋น ๋ฅธ ๋ํ) ํ์ฑ ์กฐ๊ฑด์ ๋์ณ ๊ดํต์ด ๋ฐ์ํ ์ ์์์ต๋๋ค.
1) ๋ก์ปฌ/์๊ฒฉ ์ถฉ๋ ์นดํ ๊ณ ๋ฆฌ ๋ถ๋ฆฌ ํ๋ซํผ ์ถฉ๋ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ์บ๋ฆญํฐ ํ์ ๋ณ๋ก ๋ถ๋ฆฌํ์ฌ, ๋์ผ ํ๋ซํผ์ด๋ผ๋ ๋ก์ปฌ/์๊ฒฉ์ด ์๋ก ๋ค๋ฅธ ์ถฉ๋ ์ํ๋ฅผ ๊ฐ์ง ์ ์๋๋ก ๊ฐ์ ํ์ต๋๋ค.
groundMe: ๋ก์ปฌ ์ ์ฉgroundOther: ์๊ฒฉ ์ ์ฉ
2) ํ๊ฐ ์ค์๋ง ์ฐฉ์ง(One-Way Platform)
collisionBitMask๋ ํญ์ ํ๋ ์ด์ด์์ ์ถฉ๋ ๊ด๊ณ๋ฅผ ์ ์งํ๊ณ ,
์ค์ ์ฐฉ์ง ์ฌ๋ถ๋ categoryBitMask๋ฅผ ํ๋ ์ ๋จ์๋ก ON/OFF ํ์ฌ ์ ์ดํ์ต๋๋ค.

- ํ๊ฐ ์(
dy <= 0): category ON โ ์ฐฉ์ง - ์์น ์(
dy > 0): category OFF โ ํต๊ณผ
์ ์ ์ด์
collisionBitMask๋ฅผ ๋งค ํ๋ ์ ๋ณ๊ฒฝํ๋ฉด ๋ฌผ๋ฆฌ ๋์ ์์ธก์ด ์ด๋ ค์์ง ์ ์์ด,
์ถฉ๋ ๊ด๊ณ๋ ๊ณ ์ ํ ์ฑcategoryBitMask๋ง ํ ๊ธํ์ฌ โ์ฐฉ์ง ๊ฐ๋ฅํ ํ๋ซํผโ์ ์ ํํ๋ ๋ฐฉ์์ผ๋ก ์ ๋ฆฌํ์ต๋๋ค.
3) ๋น ๋ฅธ ๋ํ ๊ดํต ๋ฐฉ์ง(Fall Buffer) ๋น ๋ฅธ ๋ํ๋ก ํ๋ ์ ์ฌ์ด ๊ดํต์ด ๋ฐ์ํ์ง ์๋๋ก ๋ํ ์๋์ ๋น๋กํด buffer๋ฅผ ํ์ฅํ์ต๋๋ค.
buffer = min(200, 20 + |dy| * dt * 1.5)(ํ๊ฐ ์์๋ง)
- ๋ก์ปฌ/์๊ฒฉ ์บ๋ฆญํฐ์ ํ๋ซํผ ์ถฉ๋์ ๋ ๋ฆฝ์ ์ผ๋ก ์ ์ดํ ์ ์๊ฒ ๋์์ต๋๋ค.
- ๋ฉํฐํ๋ ์ด์์ ๋ฐ์ํ๋ ์ฐฉ์ง ๋ถ์ผ์น์ ์ฒด๊ฐ ์ด์ง๊ฐ์ด ๊ฐ์ํ์ต๋๋ค.
- One-Way ๋์(์์น ํต๊ณผ/ํ๊ฐ ์ฐฉ์ง)์ ์์ ์ ์ผ๋ก ๋ณด์ฅํ๊ณ , ๋น ๋ฅธ ๋ํ ์ํฉ์์์ ๊ดํต ํ์์ ์ ์๋ฏธํ๊ฒ ์ค์์ต๋๋ค.
๋คํธ์ํฌ ์ง์ฐ์ผ๋ก ์๊ฒฉ ์ ํ ์
๋ ฅ์ด ๋๋ฝ/์ง์ฐ๋ ์ ์์ด,
์๊ฒฉ ์ ํ๋ฅผ โ์
๋ ฅโ์ด ์๋ ํ์ ์ด๋ฒคํธ(jumpTriggered) ๋ก ์ ์กยท์ ์ฉํ๋ ๋ฐฉ์์ผ๋ก ๋ณด์ํ์ต๋๋ค.

NetworkGameInputDTO.Kind.jumpTriggeredGameplayManager.applyJumpTriggeredMultiplayerNetworkIO.installLocalJumpTriggeredSender
๊ด๋ จ ๋ฌธ์: ํ๋ซํผ ์ถฉ๋ ๋ถ๋ฆฌ ๋ฉํฐํ๋ ์ด ๋ฆฌ์คํฐ ๋๊ธฐํ
| ๋น๊ต ํญ๋ชฉ | 1. MJPEG (๊ธฐ์กด POC) | 2. WebRTC (์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ) | 3. Native H.264 (์ ์) |
|---|---|---|---|
| ์์ถ ๋ฐฉ์ | ๋งค ํ๋ ์ ์ ์ฒด ์ ์ก (I-Frame Only) | ์ฐจ์ด๊ฐ ์ ์ก (Inter-frame) | ์ฐจ์ด๊ฐ ์ ์ก (Inter-frame) |
| ๋์ญํญ (30fps) | ๋งค์ฐ ๋์ (~1.5 MB/s) | ๋ฎ์ (~0.1 MB/s) | ๋ฎ์ (~0.1 MB/s) |
| ์ฑ ์ฉ๋ ์ฆ๊ฐ | ์์ (0 MB) | ํผ (+50~100 MB) โ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ธํด ๋น๋ ์๋ ์ ํ ๋ฐ ์์กด์ฑ ์ฆ๊ฐ |
์์ (0 MB) |
| ๋คํธ์ํฌ ํตํฉ | ์ฌ์ | ๋ณ๋ ์ฑ๋ ํ์ | ๊ธฐ์กด ํจํท ํ์ฉ โ ping/pong ์๊ทธ๋๋ง ํ์ฉ |
| ํ๋์จ์ด ๊ฐ์ | ์ง์ ์ ํจ (CPU ๋ถํ ํผ) | ์ง์ํจ | ์ง์ํจ (OS ๋ ๋ฒจ ์ต์ ํ) |
| ๊ฒฐ๋ก | โ ๋นํจ์จ์ (ํ๊ธฐ) | โ Best Fit (์ต์ ) |
๊ฒฐ๋ก : Native H.264 VideoToolbox ์ฌ์ฉ
๋จ์ํ ๊ธฐ๋ฅ ๊ตฌํ์ ๋์ด ์ฑ์ ํต์ฌ ์๋น์ค๋ฅผ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ด ๋ค์ดํฐ๋ธ ํ๊ฒฝ์์ ์ง์ ๊ตฌ์ถํจ์ผ๋ก์จ ํ๋ก์ ํธ ์ต์ ํ์ ๊ธฐ์ ์ ์ฑ์ฅ์ ๋์์ ๋๋ชจํ๊ธฐ๋ก ํ์ต๋๋ค. ํ๋ก์ ํธ์ ๋ฌด๊ฑฐ์ด WebRTC ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋์ , ์ ํ์ **VideoToolbox**๋ฅผ ์ง์ ์ ์ดํ์ฌ ํ๋์จ์ด ๊ฐ์ ๊ธฐ๋ฐ์ H.264 ์์ถ์ ๊ตฌํํ๋ ๋ฐฉํฅ์ ํํ์ต๋๋ค.
์ด๋ฅผ ํตํด MJPEG ๋๋น ๋ฐ์ดํฐ ์๋ชจ๋์ 1/30 ์์ค์ผ๋ก ์ ๊ฐํ์ฌ ๋คํธ์ํฌ ํจ์จ์ ๊ทน๋ํํ๊ณ , ์ ์์ค(Low-level) API๋ฅผ ๋ฅ๋์ ์ผ๋ก ์ค๊ณํจ์ผ๋ก์จ ๊ธฐ๊ธฐ ๋ฐ์ด ์ต์ํ์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ง์ ์ด๋์ด๋ด๊ณ ์ ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ๋ค ์ฐ๋ ํธ๋ฆฌํจ ๋์ , ์๋น์ค์ ๊ฐ์ฅ ์ ํฉํ ์ค๊ณ๋ฅผ ํตํด ๊ธฐ์ ์ ์์ฑ๋๋ฅผ ๋์ด๋ ค๊ณ ํ์ต๋๋ค.
๊ด๋ จ๋ฌธ์: VideoToolbox ์ฌ์ฉ ์ด์
์ฝ์ค๋ฏน ์ด๋๋ฒค์ฒ๋ โ์์ฑ๋๋ฅผ ๋น ๋ฅด๊ฒ ๋์ด์ฌ๋ฆฌ๋, ๋ฆฌ์คํฌ๋ ์๊ฒโ ๊ฐ์ ธ๊ฐ๋ ๋ฐฉ์์ผ๋ก ์งํํ์ต๋๋ค.
์๋ 3๊ฐ์ง๋ฅผ ์ค์ฌ์ผ๋ก ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ฅผ ์ค๊ณํ๊ณ ์ด์ํ์ต๋๋ค.
์ ํฌ๋ TestFlight/๋ฐ๋ชจ ํผ๋๋ฐฑ ๋ฃจํ๋ฅผ ์งง๊ฒ ๊ฐ์ ธ๊ฐ๋ฉฐ, ์์ ๋จ์๋ก ๋ฐฐํฌโ๊ด์ฐฐโ๊ฐ์ ์ ๋ฐ๋ณตํ์ต๋๋ค.
ํนํ AR ์
๋ ฅ/๋ฉํฐํ๋ ์ด์ฒ๋ผ ํ๋์ด ์ค์ํ ์์ญ์ ์ฒด๊ฐ ํ์ง(์ค์๋ยท์ง์ฐยท๋ชฐ์
๊ฐ) ๊ธฐ์ค์ผ๋ก ์ฐ์ ์์๋ฅผ ์กฐ์ ํ์ต๋๋ค.
- ํผ๋๋ฐฑ: โ์คํ๋ผ์ธ/๊ทผ๊ฑฐ๋ฆฌโ ์ค์ฌ์ผ๋ก ์ค๋ช ํ์ง๋ง, ์๋น์ค ๊ฒฝํ์ ๊ทผ๊ฑฐ๋ฆฌ๋ก๋ง ์ ํํ ํ์๋ ์๊ฒ ๋ค๋ ์๊ฒฌ์ด ์์์ต๋๋ค.
- ๊ฐ์ : ๋ฉ์์ง๋ฅผ โ์ด๋์๋/์ด๋ ํ๊ฒฝ์์๋ ํจ๊ปโ ๋ก ํ์ฅํ๊ณ ,
์ธํฐ๋ท์ด ๋๋ ํ๊ฒฝ์์๋ ์๋ฒ ๊ธฐ๋ฐ ์ฑ๋ ๋งค์นญ์ผ๋ก ์ฅ๊ฑฐ๋ฆฌ ํ๋ ์ด,
๋ถ์์ /๋จ์ ํ๊ฒฝ์์๋ ๊ทผ๊ฑฐ๋ฆฌ P2P๋ก ์ฆ์ ์ฐ๊ฒฐ์ด ๊ฐ๋ฅํ๋๋ก ๋ฐฉํฅ์ ์ ๋ฆฌํ์ต๋๋ค.
-
ํผ๋๋ฐฑ: ํ๋ ์ด ์ค ํ๋ฉด ์๋ ๊บผ์ง(ํ๋ฉด๋ณดํธ๊ธฐ๋ฅ), ๋๋ฃ ์ ํ ํด์ , ์ฌ์ฉ๋ฒ ์๋ด(๋ค์๋ณด์ง ์๊ธฐ), ํค๋ณด๋ ํฌ์ปค์ค ํด์ , PIP ํฌ๊ธฐ/์์น, ์บ /์ ์ ๋ ์ด์์, ๊ฐ๋ก๋ชจ๋, โ๋ ๋จผ ์ํโ ๋ค์ด๋ฐ/๋ค๋ก๊ฐ๊ธฐ ํผ๋, ๊ถํ ์ฌ์์ฒญ ๋ฑ์ด ๋ถํธ ์์๋ก ๋์์ต๋๋ค.
-
๊ฐ์ : ๊ฒ์ ํ๋ฆ์ ์ง์ ๋๋ ์ด์(๊ถํ/ํ์ , ํ๋ฆ/๋ค์ด๋ฐ)๋ฅผ ์ฐ์ ์์ ์๋จ์ผ๋ก ๋๊ณ , ์ ํ/์ ๋ ฅ/์๋ด UX๋ฅผ ๋ฌถ์ด ๋ฉ์นซํ๋ ์ง์ ์ ์์ฐจ์ ์ผ๋ก ์ ๊ฑฐํ์ต๋๋ค.
- ํผ๋๋ฐฑ: ์๋ฆผ ๋ฒํผ์ ๋๋ฌ ํ์ธํ๋ ๋ฐฉ์์ ๊ฒ์ ์ค ์ด๋๋ฅผ ๋์น๊ธฐ ์ฝ๋ค๋ ์๊ฒฌ์ด ์์์ต๋๋ค.
- ๊ฐ์ : ์ฑ๊ธ ํ๋ ์ด ๋์ค์๋ ์ด๋๋ฅผ ์ฆ์ ์ธ์งํ๊ณ ์ฒ๋ฆฌํ ์ ์๋๋ก Local Notification + ์ธ์ฑ Top Modal ๋ฐฉํฅ์ ๊ฒํ /์ ์ฉํ์ต๋๋ค.
PR: #168
- Linear ๊ธฐ๋ฐ ์ด์ ํธ๋ํน์ผ๋ก ์์ ์ ์ชผ๊ฐ๊ณ , ๊ฐ ํ์คํฌ์ ๋ด๋น์(Owner)์ ์๋ฃ ์กฐ๊ฑด(DoD) ์ ๋ช ํํ ์ ์ํ์ต๋๋ค.
- ํ๋ก์ ํธ ์์ ์ , ๊ธฐ์ ๊ฒฝํ์ ๋น ๋ฅด๊ฒ ๋ง์ถ๊ธฐ ์ํด PoC ์ ์ฉ ๋ธ๋์น๋ฅผ ์ด์ํ์ต๋๋ค.
ํ์๋ค์ดSpriteKit / Network.framework / Video(H.264)ํต์ฌ ์์ญ์ ๊ฐ๊ฐ ํ๋กํ ํ์ ์ผ๋ก ๊ตฌํํด๋ณด๊ณ , ์ดํ ๋ณธ ๊ฐ๋ฐ์ ๋ค์ด๊ฐ ์ ์๋๋ก ๊ณตํต ์ดํด๋๋ฅผ ํ๋ณดํ์ต๋๋ค. - ๋ณธ ๊ฐ๋ฐ ๋จ๊ณ์์๋ ๋ชจ๋ ๊ตฌ์กฐ(App / GameEngineCore / Games / InputSystem / NetworkKit / StorageKit / VideoKit`)์ ๋ง์ถฐ
๊ฒฝ๊ณ๊ฐ ๊นจ์ง์ง ์๋๋ก ํ์คํฌ๋ฅผ ๋ถ๋ฐฐํด ๋ณ๋ ฌ ๊ฐ๋ฐ ํจ์จ์ ๋์์ต๋๋ค. - ๋ํ ํน์ ์ฌ๋์๊ฒ ์ง์์ด ์ ๋ฆฌ์ง ์๋๋ก, ํ์ ๋ชจ๋๊ฐ ๊ฐ ๋ชจ๋์ ์ดํดํ ์ ์๊ฒ
๋ด๋นํ์ง ์์๋ ์์ญ๋ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ๊ฐ์ /์์ ํ๋ ๋ฐฉ์์ผ๋ก ์ด์ํ์ต๋๋ค(๋ฒ์ค ํฉํฐ ๊ฐ์). - PR์ โ๋ฆฌ๋ทฐ ๊ฐ๋ฅํ ํฌ๊ธฐโ๋ฅผ ์ ์งํ๊ณ , ๋ณํฉ ํ์๋ ๋ณ๊ฒฝ ์ํฅ ๋ฒ์๋ฅผ ๊ณต์ ํด ๋ฆฌ๊ทธ๋ ์ ์ ์ต์ํํ์ต๋๋ค.
- ๋ฐ๋ณต์ ์ผ๋ก ๋์น๊ธฐ ์ฌ์ด ๋ถ๋ถ(๋ค์ด๋ฐ/๋ฌธ์ํ/์ปจ๋ฒค์
/์ ์ฌ ๋ฒ๊ทธ)์ ๋ณด์ํ๊ธฐ ์ํด
CodeRabbit ๊ธฐ๋ฐ AI ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ CI ํ๋ฆ์ ํฌํจํ์ต๋๋ค. - ์ฌ๋ ๋ฆฌ๋ทฐ๋ ์ค๊ณ/๊ฒฝ๊ณ/์๋(Why) ์ค์ฌ์ผ๋ก, AI ๋ฆฌ๋ทฐ๋ ์ธ๋ถ ํ์ง(์ผ๊ด์ฑ/์์ ์ฑ/๋๋ฝ) ์ ๋ณด์กฐํ๋ ๋ฐฉ์์ผ๋ก ์ญํ ์ ๋ถ๋ฆฌํ์ต๋๋ค.
- ์ฌ๋ ๋ฆฌ๋ทฐ ์ฝ๋ฉํธ๋ P1 / P2๋ก ๋ถ๋ฆฌํด ๊ธฐ๋กํ์ต๋๋ค.
- P1: ๊ผญ ์์ ์ด ํ์ํ ์ฌํญ(๋ฒ๊ทธ ๊ฐ๋ฅ์ฑ, ์ค๊ณ/๊ฒฝ๊ณ ์๋ฐ, ์์ ์ฑ/๋์์ฑ ์ด์ ๋ฑ)
- P2: ์ฌ์ํ์ง๋ง ๊ฐ์ ํ๋ฉด ์ข์ ์ฌํญ(์คํ์ผ, ๋ค์ด๋ฐ, ์ฃผ์/๋ฌธ์ํ, ๋ฏธ์ธํ ๋ฆฌํฉํฐ๋ง ๋ฑ)
- ๋ฐ์ ๋ฐฉ์๋ ๊ตฌ๋ถํ์ต๋๋ค.
- P1 ์์ ์ ๋ณ๋ ์ปค๋ฐ์ผ๋ก ๋จ๊ฒจ ๋ณ๊ฒฝ ์๋์ ์ํฅ์ ๋ช ํํ ์ถ์ ๊ฐ๋ฅํ๊ฒ ํ์ต๋๋ค.
- P2๋ ๊ธฐ์กด ์ปค๋ฐ์ ์ ๋ฆฌ(reword/fixup)ํ๋ ๋ฐฉ์์ผ๋ก ํ์คํ ๋ฆฌ๋ฅผ ๊น๋ํ๊ฒ ์ ์งํ์ต๋๋ค.
- PR์์ ๋์น๊ธฐ ์ฌ์ด ๋ฌธ์/๋ค์ด๋ฐ/์ปจ๋ฒค์ ๋๋ฝ์ ์๋์ผ๋ก ์ก์์ค, ๊ธฐ๋ณธ ํ์ง์ ์์ ์ ์ผ๋ก ๋์ด์ฌ๋ ธ์ต๋๋ค.
- ๋์์ฑ/์์ ์ฑ ๊ด์ ์ ์ ์ฌ ๋ฆฌ์คํฌ๋ฅผ ์กฐ๊ธฐ์ ๋ฐ๊ฒฌํด, ์์ ๋น์ฉ์ด ๋ฎ์ ๋ ๋น ๋ฅด๊ฒ ๋์ํ ์ ์์์ต๋๋ค.
- ์ฌ๋ ๋ฆฌ๋ทฐ๋ โ์ค์ํ ๋
ผ์ (P1)โ์ ์ง์คํ๊ณ , AI๊ฐ โ์์ํ ํ์ง(P2)โ์ ๋ณด์กฐํ๋ฉด์
๋ฆฌ๋ทฐ ์๋์ ๋ฐ๋๊ฐ ํจ๊ป ์ข์์ก๊ณ , ๋ฐ๋ณต ํผ๋๋ฐฑ(์ปจ๋ฒค์ /์คํ์ผ)์ ์ปค๋ฎค๋์ผ์ด์ ๋น์ฉ์ด ์ค์์ต๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก, PR ๋น ๋ฆฌ๋ทฐ ์ฌ์ดํด์ด ๋ ์์ธก ๊ฐ๋ฅํด์ก๊ณ , ํ์ง ๊ธฐ์ค์ ํ ์ ์ฒด์ ์ผ๊ด๋๊ฒ ์ ์ฉํ ์ ์์์ต๋๋ค.
brew install tuistmake setupmake ios # iOS ์ฑ ์คํ
make backend # ๋ฐฑ์๋ ์๋ฒ ์คํmake generate # ๋ง์ด๊ทธ๋ ์ด์
ํ์ผ ์์ฑ
make migrate # DB์ ์ ์ฉ
make db-reset # DB ์ด๊ธฐํmake test # ํ
์คํธ ์คํ
make clean # ์ ๋ฆฌ








