๋ชจ๋ฐ์ผยท์น ์ ๋ฐ์ ๋ค๋ฃจ๋ฉฐ, AI๋ฅผ ๊ฐ๋ฐ ๋๊ตฌ๋ฅผ ์ ๊ทน ํ์ฉํด ๋น ๋ฅด๊ฒ ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋๋ ํ์คํ ๊ฐ๋ฐ์์ ๋๋ค.
- ๐ 400+ ์ค์ฌ์ฉ์ ์บ ํผ์ค ์๋น์ค ์ด์ ๊ฒฝํ
- ๐บ๏ธ QuadTree๊ธฐ๋ฐ ๋ง์ปค ํด๋ฌ์คํฐ๋ง์ผ๋ก ์ง๋ ๋ง์ปค ๋ ๋๋ง 20fps โ 60fps ์ต์ ํ
- ๐ 5ํ ์์ (์ ํ์ํ ํด์ปคํค ๋์ ํฌํจ)
- ๐ค AI ๋ณด์กฐ ๊ฐ๋ฐ๋ก ๋ฏ์ ๊ธฐ์ ์คํ๋ ๋น ๋ฅด๊ฒ ํ๋ก๋์ ์ ์ ์ฉ
| ๋ ์ง | ๋ํ / ํ์ฌ | ์์๊ธฐ๊ด | ์์ | ํ๋ก์ ํธ |
|---|---|---|---|---|
| 2025.11 | ์ผ์ฑ ์ฒญ๋ SWยทAI ์์นด๋ฐ๋ฏธ ์์จ ํ๋ก์ ํธ | ์ผ์ฑ์ ์์ฃผ์ํ์ฌ | ๐ฅ ์ฐ์์ (2์) | GUI ์ธํ๋ผ ๋ฐฐํฌ ์๋ํ ํ๋ซํผ ARFNI |
| 2025.09 | ์ผ์ฑ ์ฒญ๋ SWยทAI ์์นด๋ฐ๋ฏธ ํนํ ํ๋ก์ ํธ | ์ผ์ฑ์ ์์ฃผ์ํ์ฌ | ๐ฅ ์ฐ์์ (1์) | ๋น ๋ฐ์ดํฐ ๊ธฐ๋ฐ ๋ ผ๋ฌธ ํ์ ํ๋ซํผ RSP |
| 2025.08 | [Shinhan with SSAFY] ํด์ปคํค (663๋ช ์ฐธ๊ฐ) | ์ฃผ์ํ์ฌ์ ํ์ํ | ๐ ๋์ | ์์น๊ธฐ๋ฐ ์บ ํผ์ค ์ปค๋ฎค๋ํฐ CAMPUNG |
| 2024.12 | ์ปดํจํฐ์ตํฉ์ํํธ์จ์ดํ๊ณผ ํ์ ์ | ๊ณ ๋ ค๋ํ๊ต ์ธ์ข ์บ ํผ์ค | ๐ฅ 3์ | ์จ๋ผ์ธ ๋ ์ ํ ๋ก ํ๋ซํผ ๋ชฝ๋น๋ถ |
| 2024.08 | ์ธ์ข ์ตํฉํด๋ฌ์คํฐ 2.0 DX ํด์ปคํค | ์ธ์ข ์ฐํํ๋ ฅ๋จ | ๐ ์ธ์ฌ์ | ๊ฐ์ธ ๋ง์ถคํ ๊ฑด๊ฐ ๊ด๋ฆฌ ์น์ฑ ์นํ ๋ฐ์ด |
[Shinhan with SSAFY] ํด์ปคํค ๋์ ๐ | ์์น๊ธฐ๋ฐ ์บ ํผ์ค ์ปค๋ฎค๋ํฐ ์ฑ
๐ ์ฃผ์ ์ฑ๊ณผ ๋ฐ ๊ธฐ์
๋ชจ๋ฐ์ผ(Android) + ๋ฐฑ์๋(Spring Boot)
- ์ง๋ ๋ง์ปค ์ต์ ํ: QuadTree ์๊ณ ๋ฆฌ์ฆ + MarkerPool ๊ฐ์ฒด ์ฌ์ฌ์ฉ์ผ๋ก 200๊ฐ ๋ง์ปค์์ ์ฌ๊ฐํ ํ๋ ์ ๋๋กญ โ 500๊ฐ์์ 60fps ์ ์ง
- ์ค์๊ฐ ์์น ์๋ฆผ: Geohash-8๋ก ์์น ์ธ๋ฑ์ฑ, STOMP/WebSocket์ผ๋ก ์ค์ฌ ์ + ์ฃผ๋ณ 8๊ฐ ์ ์ ๋ธ๋ก๋์บ์คํ (์ฝ 100m ๋ฐ๊ฒฝ)
- STOMP ํด๋ผ์ด์ธํธ: raw WebSocket ์์ STOMP ํ๋ ์(CONNECT, SUBSCRIBE, MESSAGE) ์๋ ๊ตฌํ ๋ฐ ์๋ฒ ์๋ต ํ์ฑ
- REST API ์ค๊ณ: ERD ์ค๊ณ, Swagger ๋ฌธ์ํ, ์ปจํ ์ธ /์์น/์น๊ตฌ/์๋ฆผ ์ ์ฒด API ๊ฐ๋ฐ
Android Kotlin Jetpack Compose Spring Boot WebSocket STOMP Geohash QuadTree
์ผ์ฑ ์ฒญ๋ SWยทAI ์์นด๋ฐ๋ฏธ ํนํ ํ๋ก์ ํธ ์ฐ์์ ๐ฅ | AI ๋ ผ๋ฌธ ๊ฒ์ ๋ฐ ์ถ์ฒ ์์คํ
๐ ์ฃผ์ ์ฑ๊ณผ ๋ฐ ๊ธฐ์
๋น ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ ๊ฐ๋ฐ
- ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์ ์์ง: OpenSearch BM25(ํค์๋) + Sentence Transformers(์๋ฏธ๋ก ์ ) 3๋จ๊ณ ํ์ดํ๋ผ์ธ, ์ฝ 250ms ์๋ต ๋ฌ์ฑ
- BM25 1,000๊ฐ ์ถ์ถ โ 768์ฐจ์ ์๋ฒ ๋ฉ ์ ์ฌ๋ ๊ณ์ฐ โ ํค์๋(40%) + ์๋ฏธ(40%) + ์ธ์ฉ์(20%) ์ต์ข ๋ญํน
- ๋ ผ๋ฌธ ์ ์ฌ๋ ์ฌ์ ๊ณ์ฐ: PySpark๋ก ์ ์ฒด ๋ ผ๋ฌธ ์ ์ฝ์ฌ์ธ ์ ์ฌ๋ ๋ฐฐ์น ๊ณ์ฐ, HBase์ ์ ์ฅ, HashMap O(1) ์ค๋ณต ์ ๊ฑฐ๋ก N+1 ํด๊ฒฐ
- E2E ํ์ดํ๋ผ์ธ ์๋ํ: OpenAlex API ์์ง โ GROBID PDF ์ถ์ถ โ Sentence Transformers ์๋ฒ ๋ฉ ์์ฑ
- ์ฑ๋ฅ ์ต์ ํ: ์ฐ๊ฒฐ ํ๋ง, asyncio ๋ณ๋ ฌ ์ฒ๋ฆฌ, ๋ฐฐ์น ์ฒ๋ฆฌ(50๊ฐ ๋จ์), Redis ์บ์ฑ
Python FastAPI OpenSearch PySpark HBase Sentence Transformers Redis asyncio
์ผ์ฑ ์ฒญ๋ SWยทAI ์์นด๋ฐ๋ฏธ ์์จ ํ๋ก์ ํธ ์ฐ์์ ๐ฅ | GUI ๊ธฐ๋ฐ ์ธํ๋ผ ๋ฐฐํฌ ์๋ํ ํ๋ซํผ
๐ ์ฃผ์ ์ฑ๊ณผ ๋ฐ ๊ธฐ์
ํ์คํ ๊ฐ๋ฐ (ํ๋ฌ๊ทธ์ธ ์์คํ , CI/CD)
- ํ๋ฌ๊ทธ์ธ ์์คํ : ํ๋์ฝ๋ฉ๋ ํ๋ ์์ํฌ ์ค์ ์ YAML ๊ธฐ๋ฐ ์ ์ธํ ์ํคํ ์ฒ๋ก ์ ํ, Tauri IPC๋ก ๋์ ๋ก๋
- stack.yaml ์์ฑ ์์ง: ์บ๋ฒ์ค ๋ ธ๋/์ฃ์ง ๋ถ์ โ DATABASE_URL ํ๊ฒฝ๋ณ์ ์๋ ์ฃผ์ โ ํฌํธ/ํฌ์ค์ฒดํฌ ์๋ ์์ฑ
- GitHub CI/CD: ํ๋ ์์ํฌ ์๋ ๊ฐ์ง(Spring Boot, FastAPI, React) โ GitHub Actions ์ํฌํ๋ก์ฐ ์๋ ์์ฑ
- ํ๋ฌ๊ทธ์ธ ๋ ์ง์คํธ๋ฆฌ: PR ์ GitHub Actions ์๋ ๊ฒ์ฆ, ์ปค๋ฎค๋ํฐ ํ๋ฌ๊ทธ์ธ ์ํ๊ณ ๊ตฌ์ถ
- ๋ชจ๋ํฐ๋ง ํตํฉ: Prometheus + Grafana ํ๋ฌ๊ทธ์ธํ, 3๊ฐ์ง ๋ฐฐํฌ ๋ชจ๋ ์ง์
React TypeScript Redux Toolkit React Flow Tauri Rust Go Docker GitHub Actions
์ผ์ฑ ์ฒญ๋ SWยทAI ์์นด๋ฐ๋ฏธ ๊ต์ก์ ์บ ํผ์ค ์ค๊ณ ๊ฑฐ๋ ํ๋ซํผ
๐ ์ฃผ์ ์ฑ๊ณผ ๋ฐ ๊ธฐ์
ํ๋ก ํธ์๋ ๊ฐ๋ฐ
- ํ๋ก์ ํธ ์ํคํ ์ฒ: React 18 + TypeScript + Vite, TanStack Query(์๋ฒ ์ํ) + Zustand(ํด๋ผ์ด์ธํธ ์ํ) ๋ถ๋ฆฌ ์ค๊ณ
- ์ค์๊ฐ ์ฑํ : WebSocket(STOMP) ๊ธฐ๋ฐ, ์ฝ์ง ์์ ๋ฉ์์ง Badge, React Query โ Zustand ์๋ฐฉํฅ ๋๊ธฐํ
- ๋ฐ์ํ ๋์์ธ: ๋ชจ๋ฐ์ผ ๋ฆฌ์คํธํ / ๋ฐ์คํฌํ ๊ทธ๋ฆฌ๋ํ ๋ ์ด์์ ๋์ ์ ํ
- ์ต์ ํ: URL ๊ธฐ๋ฐ ์ํ ๊ด๋ฆฌ, ๋๊ด์ ์ ๋ฐ์ดํธ, ์ด๋ฏธ์ง ๋๋๊ทธ์ค๋๋กญ
React TypeScript TanStack Query Zustand WebSocket STOMP Tailwind CSS
(์ฃผ)๋ก์จ์ธ Flutter ์ธํด | ์ค๋งํธํ ์์ก ๋ชจ๋ํฐ๋ง ์์คํ
๐ ์ฃผ์ ์ฑ๊ณผ ๋ฐ ๊ธฐ์
ํ๋ก ํธ์๋(Flutter)
- ์ค์๊ฐ ์ผ์ ์๊ฐํ: Syncfusion ๊ฒ์ด์ง๋ก ์จ๋/pH/EC ๋ฐ์ํ ๋ฐ์ํ ๊ฒ์ด์ง, LayoutBuilder ๊ธฐ๋ฐ ๋์ ํฌ๊ธฐ ์กฐ์
- ์๊ณ์ด ์ฐจํธ: FL Chart๋ก ์ผ์๊ฐ ์ถ์ด ๋ผ์ธ ์ฐจํธ, ์ผ์๋ณ ์ต์ Y์ถ ๋ฒ์ ์ค์
- Clean Architecture: Presentation/Domain/Data ๊ณ์ธต ๋ถ๋ฆฌ, Cubit ์ํ ๊ด๋ฆฌ
Flutter Dart Syncfusion FL Chart Clean Architecture




