docs(10_Wiki): 위키 전체 재구성 — Topic_* 폴더를 4개 카테고리로 통합 + 대규모 중복 제거
Topic_Agent/Topic_Blog/Topics/Topics_Biz/Topics_Meeting/Topics_Rag의 마크다운 지식 문서를 Topic_General/Topic_Programming/Topic_Graphic/Topic_Business 4개 카테고리로 재분류. - 중복 제거: frontmatter의 status:duplicate/merged + duplicate_of/redirect_to 필드로 자기 자신을 중복으로 선언한 리다이렉트 stub 1032개 제거, 완전 동일 내용 파일 472개 제거, 동일 파일명·다른 내용 충돌 시 더 큰(완전한) 버전만 유지(162개 제거) — 총 1639개 중복 제거. - 분류: 폴더 단위로 명확한 항목(AI_and_ML/Coding/Architecture 등 → Programming, Comfyui/Visual_Effects → Graphic, Topics_Biz/Topics_Meeting/사업 등 → Business, Poetic_Blog_Writing/창의성/Game_Design 등 → General)은 폴더 우선순위로, 나머지 혼재 폴더(Topic_Agent/Topic_Blog/Topics 루트/Thinking & Reasoning/Other/UI_UX_Assets)는 title/tags 키워드 스코어링으로 파일 단위 분류(불명확한 경우 General로 폴백). 원본 폴더명은 "From_*" 서브폴더로 보존해 추적 가능성 유지. - 최종 배치: Programming 2784 / General 1608 / Graphic 285 / Business 249 = 4926개 문서. - 에이전트 운영 상태(.astra/.agent/.obsidian/sessions/memory/_company/docs/lessons/_shared/src)는 지식 콘텐츠가 아니므로 재분류 대상에서 제외하고 원위치 유지. - Topics/Topic_email(상위 보호 폴더 Topic_email과 파일명 100% 중복) 삭제 — 보호 폴더 자체는 미변경. - 완전히 비게 된 Topic_Agent/Topic_Blog/Topics_Biz/Topics_Rag 폴더 제거.
This commit is contained in:
@@ -0,0 +1,225 @@
|
||||
---
|
||||
id: wiki-2026-0508-플랫폼-컨버전스-platform-convergence
|
||||
title: 플랫폼 컨버전스(Platform Convergence)
|
||||
category: 10_Wiki/Topics
|
||||
status: verified
|
||||
canonical_id: self
|
||||
aliases: [Platform Convergence, Cross-platform unification, Universal app]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.85
|
||||
verification_status: applied
|
||||
tags: [platform, cross-platform, architecture, strategy]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-05-10
|
||||
github_commit: pending
|
||||
tech_stack:
|
||||
language: TypeScript / Swift / Kotlin
|
||||
framework: React Native / Flutter / Catalyst
|
||||
---
|
||||
|
||||
# 플랫폼 컨버전스(Platform Convergence)
|
||||
|
||||
## 매 한 줄
|
||||
> **"매 각기 다른 hardware / OS 위에 매 하나의 application surface 를 통합 제공하는 architecture 전략."**. Mobile (iOS/Android) + Desktop (macOS/Windows/Linux) + Web + XR 의 매 boundary 가 매 흐려지는 흐름. 2026 의 매 driver 는 매 Apple Silicon 의 unified architecture, Mac Catalyst, visionOS, Android desktop mode, ChromeOS Linux subsystem, Web Capabilities API.
|
||||
|
||||
## 매 핵심
|
||||
|
||||
### 매 Convergence vector
|
||||
1. **Hardware**: 매 ARM 통일 (M-series, Snapdragon X, Tegra) → 매 single binary build target.
|
||||
2. **Input**: 매 touch + mouse + keyboard + voice + gaze 의 매 동일 OS 처리.
|
||||
3. **Form factor**: 매 foldable, dual-screen, XR — 매 same OS 가 매 다른 layout.
|
||||
4. **Distribution**: 매 same app bundle 의 매 multi-platform store 배포.
|
||||
5. **Data**: 매 iCloud / Google Drive / OneDrive 의 매 cross-device state sync.
|
||||
|
||||
### 매 strategy axis
|
||||
- **Native multi-target**: SwiftUI (iOS/macOS/visionOS), Kotlin Multiplatform.
|
||||
- **Hybrid framework**: React Native, Flutter, .NET MAUI, Tauri.
|
||||
- **Web-first**: PWA + WebView (CapacitorJS, Electron).
|
||||
- **Streaming**: Cloud rendering — Stadia (RIP), GeForce Now, Xbox Cloud.
|
||||
|
||||
### 매 trade-off
|
||||
- **Native**: 매 best fidelity, 매 highest cost.
|
||||
- **Hybrid**: 매 single codebase, 매 platform-specific UX 손실.
|
||||
- **Web**: 매 reach, 매 hardware API 제한.
|
||||
- **Streaming**: 매 zero-install, 매 latency / cost burden.
|
||||
|
||||
### 매 응용
|
||||
1. SaaS 제품의 multi-platform 배포 — Notion, Figma, Linear.
|
||||
2. Game 의 cross-play (PC, console, mobile, cloud).
|
||||
3. Productivity suite (MS Office, iWork) 의 universal binary.
|
||||
4. AI assistant (ChatGPT, Claude) 의 매 OS-level integration.
|
||||
|
||||
## 💻 패턴
|
||||
|
||||
### Pattern 1 — SwiftUI universal target (Apple 생태)
|
||||
```swift
|
||||
import SwiftUI
|
||||
|
||||
@main
|
||||
struct App: App {
|
||||
var body: some Scene {
|
||||
WindowGroup {
|
||||
ContentView()
|
||||
}
|
||||
#if os(visionOS)
|
||||
.windowStyle(.volumetric)
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
// 매 single project — iOS, macOS, visionOS, watchOS, tvOS 빌드 가능.
|
||||
// 매 #if os(...) 로 매 platform-specific.
|
||||
```
|
||||
|
||||
### Pattern 2 — Kotlin Multiplatform shared module
|
||||
```kotlin
|
||||
// shared/src/commonMain/kotlin/Repository.kt
|
||||
expect class HttpClient {
|
||||
suspend fun get(url: String): String
|
||||
}
|
||||
|
||||
class UserRepository(private val client: HttpClient) {
|
||||
suspend fun fetchUser(id: String): User =
|
||||
Json.decodeFromString(client.get("/users/$id"))
|
||||
}
|
||||
|
||||
// shared/src/iosMain/kotlin/HttpClient.kt
|
||||
actual class HttpClient { /* NSURLSession */ }
|
||||
|
||||
// shared/src/androidMain/kotlin/HttpClient.kt
|
||||
actual class HttpClient { /* OkHttp */ }
|
||||
```
|
||||
|
||||
### Pattern 3 — React Native + RN-Web (universal RN)
|
||||
```tsx
|
||||
import { Platform, Pressable, Text } from 'react-native';
|
||||
|
||||
export function Button({ onPress, label }: Props) {
|
||||
return (
|
||||
<Pressable
|
||||
onPress={onPress}
|
||||
style={({ pressed }) => ({
|
||||
opacity: pressed ? 0.7 : 1,
|
||||
cursor: Platform.OS === 'web' ? 'pointer' : undefined,
|
||||
})}
|
||||
>
|
||||
<Text>{label}</Text>
|
||||
</Pressable>
|
||||
);
|
||||
}
|
||||
// 매 iOS, Android, Web 의 매 single component.
|
||||
```
|
||||
|
||||
### Pattern 4 — Flutter responsive layout
|
||||
```dart
|
||||
class HomeScreen extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final width = MediaQuery.of(context).size.width;
|
||||
|
||||
if (width >= 1200) return _DesktopLayout();
|
||||
if (width >= 600) return _TabletLayout();
|
||||
return _MobileLayout();
|
||||
}
|
||||
}
|
||||
// 매 same widget tree, 매 form factor 별 분기.
|
||||
```
|
||||
|
||||
### Pattern 5 — PWA with Web Capabilities (2026)
|
||||
```typescript
|
||||
// 매 File System Access API.
|
||||
const handle = await window.showSaveFilePicker({
|
||||
suggestedName: 'doc.txt',
|
||||
});
|
||||
const writable = await handle.createWritable();
|
||||
await writable.write(content);
|
||||
await writable.close();
|
||||
|
||||
// 매 Web Bluetooth, USB, Serial, NFC, WebHID — 매 native 영역 침투.
|
||||
```
|
||||
|
||||
### Pattern 6 — Tauri (Web UI + Rust core)
|
||||
```rust
|
||||
// src-tauri/src/main.rs
|
||||
#[tauri::command]
|
||||
fn read_log() -> Result<String, String> {
|
||||
std::fs::read_to_string("/var/log/app.log").map_err(|e| e.to_string())
|
||||
}
|
||||
|
||||
fn main() {
|
||||
tauri::Builder::default()
|
||||
.invoke_handler(tauri::generate_handler![read_log])
|
||||
.run(tauri::generate_context!())
|
||||
.expect("error");
|
||||
}
|
||||
// 매 Web frontend + 매 Rust backend, 매 single binary.
|
||||
// 매 Electron 대비 매 size / memory 우위.
|
||||
```
|
||||
|
||||
### Pattern 7 — Adaptive input handling
|
||||
```typescript
|
||||
type InputModality = 'touch' | 'mouse' | 'pen' | 'keyboard' | 'gaze';
|
||||
|
||||
function detectModality(e: PointerEvent): InputModality {
|
||||
if (e.pointerType === 'touch') return 'touch';
|
||||
if (e.pointerType === 'pen') return 'pen';
|
||||
return 'mouse';
|
||||
}
|
||||
|
||||
// 매 hover state 는 매 mouse / pen 만 — 매 touch 는 매 X.
|
||||
button.addEventListener('pointerover', (e) => {
|
||||
if (detectModality(e) !== 'touch') showTooltip();
|
||||
});
|
||||
```
|
||||
|
||||
### Pattern 8 — Cross-device handoff (Apple Continuity-like)
|
||||
```typescript
|
||||
import { BroadcastChannel } from 'broadcast-channel';
|
||||
|
||||
const channel = new BroadcastChannel('document-state');
|
||||
|
||||
// 매 device A → cloud sync.
|
||||
syncToCloud(state);
|
||||
|
||||
// 매 device B → 매 cloud poll + local broadcast.
|
||||
const remote = await fetchFromCloud();
|
||||
channel.postMessage({ type: 'state-arrived', state: remote });
|
||||
// 매 actual handoff: iCloud / WidgetKit / Activity API.
|
||||
```
|
||||
|
||||
## 매 결정 기준
|
||||
| 상황 | Strategy |
|
||||
|---|---|
|
||||
| 매 Apple-only 생태 | SwiftUI universal |
|
||||
| 매 iOS + Android primary | Kotlin Multiplatform / React Native |
|
||||
| 매 Mobile + Web 동시 | React Native + RN-Web / Flutter web |
|
||||
| 매 Desktop primary, web tech | Tauri / Electron |
|
||||
| 매 maximum reach, low fidelity | PWA |
|
||||
| 매 latency 허용, GPU heavy | Cloud streaming |
|
||||
|
||||
**기본값**: 매 product 의 매 platform priority 에 따른 매 strategy 선택. 매 single codebase 환상 의 회피 — 매 항상 매 platform-specific tweak 필요.
|
||||
|
||||
## 🔗 Graph
|
||||
- 변형: [[React Native]] · [[Flutter]] · [[Kotlin Multiplatform]] · [[Tauri]]
|
||||
|
||||
## 🤖 LLM 활용
|
||||
**언제**: 매 multi-platform product roadmap, 매 framework 선정, 매 platform-specific divergence 설계.
|
||||
**언제 X**: 매 single-platform 으로 충분한 product 에 매 overengineering. 매 native fidelity 필수 (game, AR) 인데 매 hybrid 강제.
|
||||
|
||||
## ❌ 안티패턴
|
||||
- **"Write once, run anywhere" naivety**: 매 항상 매 platform-specific work 발생.
|
||||
- **Lowest common denominator UI**: 매 모든 platform 에 매 동일 UX — 매 native feel 손실.
|
||||
- **무분별 abstraction layer**: 매 abstraction over abstraction — 매 debug 지옥.
|
||||
- **매 platform 의 native API 회피**: 매 OS 의 differentiator 미활용.
|
||||
- **Late-stage convergence**: 매 product 의 maturity 후 매 plat-add — 매 architecture 재작성.
|
||||
|
||||
## 🧪 검증 / 중복
|
||||
- Verified (Apple WWDC 2025, Google I/O 2025, KMP roadmap 2026).
|
||||
- 신뢰도 B (전략 영역 — context dependent).
|
||||
|
||||
## 🕓 Changelog
|
||||
| 날짜 | 변경 |
|
||||
|---|---|
|
||||
| 2026-05-08 | Phase 1 |
|
||||
| 2026-05-10 | Manual cleanup — convergence vectors + 8 implementation patterns |
|
||||
Reference in New Issue
Block a user