Codex 실전 가이드 5편에서는 ChatGPT 대화형 앱 개발, 30분 SwiftUI iOS 앱 구축, 그리고 브라우저 Canvas/WebGL 멀티모달 게임 제작을 다룹니다.
1. ChatGPT 안에서 앱을 만드는 실제 순서 (ChatGPT Canvas App)
ChatGPT 앱은 웹 화면의 단순 축소가 아니라 **"도구를 안전하게 대화형으로 호출하는 인터랙티브 제품"**입니다.
ChatGPT 앱 4대 핵심 아키텍처
User Chat Request ──> ChatGPT App ──> Tool Metadata ──> Custom MCP API
OpenAPI / MCP 도구 스키마 명세 예시
{
"name": "get_user_schedule",
"description": "사용자의 이번 주 스터디 및 수업 일정을 조회합니다.",
"parameters": {
"type": "object",
"properties": {
"user_id": { "type": "string", "description": "사용자 식별 ID" },
"start_date": { "type": "string", "format": "date", "description": "조회 시작일" }
},
"required": ["user_id"]
}
}
- 도구 계약 (Tool Contract): 대화 중 언제 어떤 도구(Tool)를 호출할지 메타데이터 명세
- 발견 가능성 (Discovery): 사용자의 자연어 의도에서 도구가 명확히 선택되도록 이름과 설명 정의
- 권한 경계 (Auth Boundary): 데이터 읽기(Read)는 즉시 허용, 쓰기/상태 변경(Write)은 사용자 명시 승인 강제
- 거절 케이스 설계 (Graceful Decline): 처리할 수 없는 요청에 대해 억지로 환각 답변을 내지 않고 명확히 거절 처리
2. SwiftUI로 애플 앱을 세우는 가장 짧은 루프 (30-Min iOS Loop)
macOS/iOS SwiftUI 애플리케이션의 빠른 스캐폴딩과 뷰 컴포넌트 결합 루프입니다.
30분 SwiftUI 메인 대시보드 뷰 코드 구조 예시
import SwiftUI
struct StudyFlowDashboardView: View {
@State private var lessons: [Lesson] = []
var body: some View {
NavigationStack {
ScrollView {
VStack(alignment: .leading, spacing: 16) {
Text("StudyFlow Dashboard")
.font(.largeTitle)
.bold()
ForEach(lessons) { lesson in
LessonCardView(lesson: lesson)
}
}
.padding()
}
.navigationTitle("내 강좌 목록")
}
}
}
- Preview State First:
#Preview마크로 컴포넌트를 즉시 시각적으로 확인하며 뷰 작성 - State & Binding Architecture:
@State,@Binding,@Observable데이터 흐름 구축 - Navigation Stack: iOS 16+
NavigationStack및navigationDestination매핑
3. 브라우저 게임을 멀티모달로 만드는 과정 (WebGL / Canvas Game)
HTML5 Canvas 및 WebGL 기반의 브라우저 미니 게임(예: 벽돌깨기, 슈팅 게임, 퍼즐)을 멀티모달 프롬프트로 시각화하며 구축하는 단계별 방법론입니다.
Canvas 벽돌깨기 게임 루프 예시
const canvas = document.getElementById('gameCanvas');
const ctx = canvas.getContext('2d');
let x = canvas.width / 2;
let y = canvas.height - 30;
let dx = 2;
let dy = -2;
function drawBall() {
ctx.beginPath();
ctx.arc(x, y, 10, 0, Math.PI * 2);
ctx.fillStyle = '#ff6b35';
ctx.fill();
ctx.closePath();
}
function gameLoop() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
drawBall();
x += dx;
y += dy;
requestAnimationFrame(gameLoop);
}
gameLoop();
멀티모달 게임 개발 3단계
- Game Loop & Canvas Context:
requestAnimationFrame기반 프레임 루프 및 2D Canvas 컨텍스트 초기화 - Physics & Collision Detection: AABB 박스 충돌 판정 및 속도 벡터 연산 구현
- Asset & UI Overlay: 점수판, 게임오버 모달 및 사운드 효과 결합