ํ๋ก์ ํธ๋ช
: AI ์์ ์ ๋ฌธ๊ณ (AI Safety Report System)
์์ฑ์ผ: 2025๋
6์ 21์ผ
๋ฒ์ : v1.0
๋ฌธ์ ๋ชฉ์ : ๊ฐ์ฒด ํ์ง ๊ธฐ๋ฐ ์์ ์ ๋ฌธ๊ณ ์์คํ
์ ์ข
ํฉ์ ์ธ ์ํคํ
์ฒ ์ค๊ณ ๋ฐ ๊ตฌํ ๋ฐฉ์
mindmap
root((AI ์์ ์ ๋ฌธ๊ณ
์์คํ
))
ํ๋ก์ ํธ ๊ฐ์
์๋น์ค ๋ชฉ์
ํต์ฌ ๊ธฐ๋ฅ
๊ธฐ์ ์คํ
์ํคํ
์ฒ ์ค๊ณ
์ ์ฒด ์์คํ
๊ตฌ์กฐ
์๋น์ค ๋ ์ด์ด
๋ฐ์ดํฐ ํ๋ก์ฐ
AI ์์ด์ ํธ & ๋ฐ์ดํฐ์
๊ฐ์ฒด ํ์ง ๋ชจ๋ธ
ํ
์คํธ ๋ถ์ AI
์์น ๊ธฐ๋ฐ ๋ถ์
๊ตฌํ ๊ฐ์ด๋
๊ฐ๋ฐ ๋จ๊ณ
๋ฐฐํฌ ์ ๋ต
๋ชจ๋ํฐ๋ง
UX/UI ๊ฐ์
์ฌ์ฉ์ ๊ฒฝํ ์ค๊ณ
์ ๊ทผ์ฑ ๊ฐํ
๋ณด์ ๊ณ ๋ ค์ฌํญ
๋ฐ์ดํฐ ๋ณด์
๊ฐ์ธ์ ๋ณด ์ฒ๋ฆฌ ๋ฐฉ์นจ
์ฑ๋ฅ ๋ชจ๋ํฐ๋ง
KPI ์ค์
๋์๋ณด๋ ๊ตฌ์ฑ
๊ฐ๋ฐ ๊ฐ์ด๋
์ฝ๋ ๊ตฌ์กฐ
ํ๊ฒฝ ์ค์
์ฐธ๊ณ ์๋ฃ
๊ธฐ์ ๋ฌธ์
ํ์ฅ ๋ก๋๋งต
AI ์์ ์ ๋ฌธ๊ณ ๋ ์๋ฏผ๋ค์ด ์ผ์์์ ๋ง์ฃผํ๋ ๋ค์ํ ์์ ์ํ ์์๋ฅผ AI ๊ธฐ๋ฐ ๊ฐ์ฒด ํ์ง ๊ธฐ์ ์ ํ์ฉํ์ฌ ์ ์ํ๊ณ ์ ํํ๊ฒ ์ ๊ณ ํ ์ ์๋ ํตํฉ ํ๋ซํผ์ ๋๋ค.
graph LR
A[๐ฑ ์๋ฏผ ์ ๊ณ ] --> B[๐ค AI ์๋ ๋ถ์]
B --> C[๐ ์์น ๊ธฐ๋ฐ ๋ถ๋ฅ]
C --> D[๐๏ธ ๊ดํ ๊ธฐ๊ด ์ ์ก]
D --> E[โก ์ ์ ๋์]
style A fill:#e3f2fd
style B fill:#fff3e0
style C fill:#e8f5e8
style D fill:#f3e5f5
style E fill:#fce4ec
| ๐ฏ ํต์ฌ ๊ธฐ๋ฅ | ๐ ์์ธ ์ค๋ช | ๐ก ๊ธฐ์ ์ ๊ฐ์น | ๐ ๊ธฐ๋ ํจ๊ณผ |
|---|---|---|---|
| ๐ ๊ฐ์ฒด ํ์ง ๊ธฐ๋ฐ ์ ๊ณ | ์ฌ์ง/์์ ์ ๋ก๋ ์ AI๊ฐ ์๋์ผ๋ก ์ํ ์์ ์๋ณ | YOLOv8, OpenCV ํ์ฉํ ์ค์๊ฐ ๋ถ์ | ์ ๊ณ ์ ํ๋ 95%+ |
| ๐ ์ง๋ฅํ ์์น ์๋น์ค | GPS ์ขํ๋ฅผ ํ์ ๊ตฌ์ญ/๊ดํ ๊ธฐ๊ด์ผ๋ก ์๋ ๋งคํ | Kakao/Naver Map API ์ฐ๋ | ๋ผ์ฐํ ์๊ฐ 80% ๋จ์ถ |
| ๐ค ์์ฐ์ด ์ฒ๋ฆฌ | ์ ๊ณ ๋ด์ฉ ํ ์คํธ ์๋ ๋ถ๋ฅ ๋ฐ ์์ฝ | Gemini Pro 1.5 ํ์ฉ | ๋ถ๋ฅ ์ ํ๋ 92%+ |
| ๐๏ธ ์ค๋งํธ ๋ผ์ฐํ | ์ ๊ณ ์ ํ์ ๋ฐ๋ฅธ ์ต์ ๋ด๋น ๊ธฐ๊ด ์๋ ๋ฐฐ์ | ๋ฃฐ ๊ธฐ๋ฐ + AI ํ์ด๋ธ๋ฆฌ๋ | ์ฒ๋ฆฌ ์๊ฐ 70% ๋จ์ถ |
| ๐ ์ค์๊ฐ ๋์๋ณด๋ | ์ ๊ณ ํํฉ ๋ฐ ์ฒ๋ฆฌ ์ํ ์๊ฐํ | Chart.js, D3.js ํ์ฉ | ๋ชจ๋ํฐ๋ง ํจ์จ์ฑ 3๋ฐฐ ํฅ์ |
graph TB
subgraph "๐ ๊ฒฝ์ ์ฐ์"
A["๐ธ ๋ฉํฐ๋ชจ๋ฌ AI
์ด๋ฏธ์ง+ํ
์คํธ+์์น
ํตํฉ ๋ถ์"]
B["โก ์ค์๊ฐ ์ฒ๋ฆฌ
ํ๊ท 2์ด ๋ด
๋ถ์ ์๋ฃ"]
C["๐ฏ ๋์ ์ ํ๋
AI ๋ถ๋ฅ 92%+
์์น ๋งคํ 99%+"]
D["๐ฑ ์ง๊ด์ UX
3-ํด๋ฆญ ์ ๊ณ
์ ๊ทผ์ฑ AAA ๋ฑ๊ธ"]
end
subgraph "๐ก ํ์ ๊ธฐ์ "
E["๐ ์๋ ํ์ต
ํผ๋๋ฐฑ ๊ธฐ๋ฐ
๋ชจ๋ธ ๊ฐ์ "]
F["๐ ๋ค๊ตญ์ด ์ง์
ํ/์/์ค/์ผ
์ค์๊ฐ ๋ฒ์ญ"]
G["๐ ํ๋ผ์ด๋ฒ์
์ผ๊ตด/๋ฒํธํ
์๋ ๋ธ๋ฌ ์ฒ๋ฆฌ"]
H["๐ ์์ธก ๋ถ์
์ํ ํจํด
์ ์ ์ ๋์"]
end
A --> E
B --> F
C --> G
D --> H
style A fill:#FF0000,color:#FFFFFF
style B fill:#00FF00,color:#000000
style C fill:#0000FF,color:#FFFFFF
style D fill:#FF6600,color:#FFFFFF
style E fill:#9900FF,color:#FFFFFF
style F fill:#00FFFF,color:#000000
style G fill:#FFFF00,color:#000000
style H fill:#FF00FF,color:#FFFFFF
graph TB
subgraph "Frontend Stack"
A[Next.js 14
App Router]
B[TypeScript]
C[Tailwind CSS]
D[shadcn/ui]
E[React Hook Form]
end
subgraph "Backend & AI Stack"
F[Node.js API Routes]
G[Python FastAPI]
H[YOLOv8]
I[OpenCV]
J[Gemini Pro 1.5]
end
subgraph "Infrastructure Stack"
K[Vercel/Docker]
L[PostgreSQL]
M[Redis Cache]
N[AWS S3]
O[CloudWatch]
end
A --> F
F --> G
G --> H
G --> I
F --> J
style A fill:#61dafb
style G fill:#009688
style H fill:#ff6b35
style L fill:#336791
graph TD
subgraph "๐ฑ Client Layer"
A["Web Browser
(Next.js PWA)"]
B["Mobile App
(React Native)"]
C["Admin Dashboard
(React)"]
end
subgraph "๐ API Gateway Layer"
D["NGINX
Load Balancer"]
E["Rate Limiting"]
F["API Authentication"]
end
subgraph "๐ง Application Layer"
G["Next.js API Routes
(Node.js)"]
H["Python AI Service
(FastAPI)"]
I["Notification Service
(Node.js)"]
end
subgraph "๐ค AI Processing Layer"
J["Object Detection
(YOLOv8)"]
K["Text Analysis
(Gemini Pro)"]
L["Image Processing
(OpenCV)"]
M["Location Analysis
(Geospatial AI)"]
end
subgraph "๐พ Data Layer"
N["PostgreSQL
(Primary DB)"]
O["Redis
(Cache & Session)"]
P["AWS S3
(File Storage)"]
Q["Elasticsearch
(Search & Analytics)"]
end
subgraph "๐ External Services"
R["Kakao Map API"]
S["Naver Map API"]
T["Government API"]
U["SMS/Email Service"]
end
A --> D
B --> D
C --> D
D --> E
E --> F
F --> G
G --> H
G --> I
H --> J
H --> K
H --> L
H --> M
G --> N
G --> O
H --> P
G --> Q
G --> R
G --> S
I --> T
I --> U
style A fill:#FF0000,color:#FFFFFF
style B fill:#FF3333,color:#FFFFFF
style C fill:#FF6666,color:#FFFFFF
style D fill:#0000FF,color:#FFFFFF
style E fill:#3333FF,color:#FFFFFF
style F fill:#6666FF,color:#FFFFFF
style G fill:#00FF00,color:#000000
style H fill:#33FF33,color:#000000
style I fill:#66FF66,color:#000000
style J fill:#FFFF00,color:#000000
style K fill:#FFFF33,color:#000000
style L fill:#FFFF66,color:#000000
style M fill:#FFFF99,color:#000000
style N fill:#FF00FF,color:#FFFFFF
style O fill:#FF33FF,color:#FFFFFF
style P fill:#FF66FF,color:#000000
style Q fill:#FF99FF,color:#000000
style R fill:#00FFFF,color:#000000
style S fill:#33FFFF,color:#000000
style T fill:#66FFFF,color:#000000
style U fill:#99FFFF,color:#000000
์ฒจ๋ถ๋ ๋ค์ด์ด๊ทธ๋จ์ ๊ธฐ๋ฐ์ผ๋ก ํ ์ธ๋ถ์ ์ธ ์๋ฏผ ์ ๊ณ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ๋ฆ์ ๋๋ค.
graph TD
%% ์ ๊ณ ์ ์ ๋จ๊ณ
subgraph "๐ฑ ์ ๊ณ ์ ์ ๋จ๊ณ"
A1["๐ธ ์ฌ์ง/์์ ์ดฌ์"]
A2["๐ GPS ์์น ํ๋"]
A3["๐ ์ํฉ ์ค๋ช
์
๋ ฅ"]
A4["๐ ์ ๊ณ ์ ํ ์ ํ"]
end
%% ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๋จ๊ณ
subgraph "๐ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๋จ๊ณ"
B1["๐ผ๏ธ ์ด๋ฏธ์ง ํ์ง ๊ฒ์ฆ"]
B2["๐ ์ด๋ฏธ์ง ๋ฆฌ์ฌ์ด์ง"]
B3["๐ ๋ฉํ๋ฐ์ดํฐ ์ถ์ถ"]
B4["๐บ๏ธ ์ขํ ์ ํจ์ฑ ๊ฒ์ฆ"]
B5["๐ ํ
์คํธ ์ ์ฒ๋ฆฌ"]
end
%% AI ๋ถ์ ๋จ๊ณ
subgraph "๐ค AI ๋ถ์ ๋จ๊ณ"
C1["๐ฏ ๊ฐ์ฒด ํ์ง
(YOLOv8)"]
C2["๐ ํ
์คํธ ๋ถ์
(Gemini Pro)"]
C3["๐ ์์น ๋ถ์
(Geospatial AI)"]
C4["โ๏ธ ์ํ๋ ํ๊ฐ
(Risk Assessment)"]
end
%% ๋ถ๋ฅ ๋ฐ ๋ผ์ฐํ
๋จ๊ณ
subgraph "๐ฏ ๋ถ๋ฅ ๋ฐ ๋ผ์ฐํ
๋จ๊ณ"
D1["๐ ์นดํ
๊ณ ๋ฆฌ ๋ถ๋ฅ"]
D2["๐จ ๊ธด๊ธ๋ ํ์ "]
D3["๐๏ธ ๊ดํ ๊ธฐ๊ด ๊ฒฐ์ "]
D4["๐ ์ฐ์ ์์ ๋ฐฐ์ "]
end
%% ๋ฐ์ดํฐ ์ ์ฅ ๋จ๊ณ
subgraph "๐พ ๋ฐ์ดํฐ ์ ์ฅ ๋จ๊ณ"
E1["๐๏ธ ์ ๊ณ ๋ฐ์ดํฐ ์ ์ฅ
(PostgreSQL)"]
E2["๐ผ๏ธ ์ด๋ฏธ์ง ํ์ผ ์ ์ฅ
(AWS S3)"]
E3["๐ ๊ฒ์ ์ธ๋ฑ์ค ์์ฑ
(Elasticsearch)"]
E4["๐ ํต๊ณ ๋ฐ์ดํฐ ์์ฑ
(Redis)"]
end
%% ์๋ฆผ ๋ฐ ์ ๋ฌ ๋จ๊ณ
subgraph "๐ข ์๋ฆผ ๋ฐ ์ ๋ฌ ๋จ๊ณ"
F1["๐ฑ ์๋ฏผ ์๋ฆผ
(์ ์ ์๋ฃ)"]
F2["๐๏ธ ๊ดํ ๊ธฐ๊ด ํต๋ณด
(API/์ด๋ฉ์ผ)"]
F3["๐ ๋์๋ณด๋ ์
๋ฐ์ดํธ
(์ค์๊ฐ)"]
F4["๐ ๋ชจ๋ํฐ๋ง ์์คํ
(์ฑ๋ฅ ์ถ์ )"]
end
%% ์ฐ๊ฒฐ ๊ด๊ณ
A1 --> B1
A2 --> B4
A3 --> B5
A4 --> B1
B1 --> B2
B2 --> B3
B3 --> C1
B4 --> C3
B5 --> C2
C1 --> C4
C2 --> C4
C3 --> C4
C4 --> D1
D1 --> D2
D2 --> D3
D3 --> D4
D4 --> E1
C1 --> E2
E1 --> E3
E3 --> E4
E1 --> F1
E1 --> F2
E3 --> F3
E4 --> F4
%% ์์ ์คํ์ผ๋ง (๊ตฌ๋ถ์ด ์ฌ์ด ์์)
style A1 fill:#FF0000,color:#FFFFFF
style A2 fill:#FF3333,color:#FFFFFF
style A3 fill:#FF6666,color:#FFFFFF
style A4 fill:#FF9999,color:#000000
style B1 fill:#0000FF,color:#FFFFFF
style B2 fill:#3333FF,color:#FFFFFF
style B3 fill:#6666FF,color:#FFFFFF
style B4 fill:#9999FF,color:#000000
style B5 fill:#CCCCFF,color:#000000
style C1 fill:#00FF00,color:#000000
style C2 fill:#33FF33,color:#000000
style C3 fill:#66FF66,color:#000000
style C4 fill:#99FF99,color:#000000
style D1 fill:#FFFF00,color:#000000
style D2 fill:#FFFF33,color:#000000
style D3 fill:#FFFF66,color:#000000
style D4 fill:#FFFF99,color:#000000
style E1 fill:#FF00FF,color:#FFFFFF
style E2 fill:#FF33FF,color:#FFFFFF
style E3 fill:#FF66FF,color:#000000
style E4 fill:#FF99FF,color:#000000
style F1 fill:#00FFFF,color:#000000
style F2 fill:#33FFFF,color:#000000
style F3 fill:#66FFFF,color:#000000
style F4 fill:#99FFFF,color:#000000
gantt
title ์ ๊ณ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๊ฐ ๋ถ์
dateFormat X
axisFormat %s ms
section ๐ฑ ๋ฐ์ดํฐ ์์ง
์ฌ์ง ์
๋ก๋ :a1, 0, 2000
์์น ์ ๋ณด ์์ง :a2, 0, 500
ํ
์คํธ ์
๋ ฅ :a3, 0, 1000
section ๐ค AI ๋ถ์
์ด๋ฏธ์ง ์ ์ฒ๋ฆฌ :b1, after a1, 500ms
๊ฐ์ฒด ํ์ง :b2, after b1, 500ms
ํ
์คํธ ๋ถ์ :b3, after a3, 1500ms
์์น ๋ถ์ :b4, after a2, 500ms
section ๐ฏ ๋ถ๋ฅ ์ฒ๋ฆฌ
์นดํ
๊ณ ๋ฆฌ ๋ถ๋ฅ :c1, after b2 b3 b4, 200ms
๊ธด๊ธ๋ ํ์ :c2, after c1, 200ms
๊ดํ ๊ธฐ๊ด ๊ฒฐ์ :c3, after c2, 200ms
section ๐พ ์ ์ฅ ๋ฐ ์๋ฆผ
๋ฐ์ดํฐ ์ ์ฅ :d1, after c3, 400ms
๊ฒ์ ์ธ๋ฑ์ฑ :d2, after d1, 200ms
์๋ฆผ ๋ฐ์ก :d3, after d2, 300ms
sequenceDiagram
participant ์๋ฏผ as ๐ฑ ์๋ฏผ
participant ์น์ฑ as ๐ Web App
participant API๊ฒ์ดํธ์จ์ด as ๐ช API Gateway
participant AI์๋น์ค as ๐ค AI Service
participant ๋ฐ์ดํฐ๋ฒ ์ด์ค as ๐พ Database
participant ๊ดํ ๊ธฐ๊ด as ๐๏ธ ๊ดํ ๊ธฐ๊ด
participant ์๋ฆผ์๋น์ค as ๐ข Notification
Note over ์๋ฏผ,์๋ฆผ์๋น์ค: ์ ๊ณ ์ ์ ๋ฐ ์ฒ๋ฆฌ ํ๋ก์ธ์ค
์๋ฏผ->>์น์ฑ: 1. ์ฌ์ง + ์์น + ์ค๋ช
์
๋ก๋
์น์ฑ->>API๊ฒ์ดํธ์จ์ด: 2. ์ ๊ณ ๋ฐ์ดํฐ ์ ์ก
API๊ฒ์ดํธ์จ์ด->>AI์๋น์ค: 3. AI ๋ถ์ ์์ฒญ
par ๋ณ๋ ฌ AI ๋ถ์
AI์๋น์ค->>AI์๋น์ค: 4a. ๊ฐ์ฒด ํ์ง (YOLOv8)
and
AI์๋น์ค->>AI์๋น์ค: 4b. ํ
์คํธ ๋ถ์ (Gemini)
and
AI์๋น์ค->>AI์๋น์ค: 4c. ์์น ๋ถ์ (Geospatial)
end
AI์๋น์ค->>API๊ฒ์ดํธ์จ์ด: 5. ํตํฉ ๋ถ์ ๊ฒฐ๊ณผ ๋ฐํ
API๊ฒ์ดํธ์จ์ด->>๋ฐ์ดํฐ๋ฒ ์ด์ค: 6. ์ ๊ณ ๋ฐ์ดํฐ ์ ์ฅ
alt ๊ธด๊ธ ์ ๊ณ ์ธ ๊ฒฝ์ฐ
API๊ฒ์ดํธ์จ์ด->>๊ดํ ๊ธฐ๊ด: 7a. ์ฆ์ ์๋ฆผ ๋ฐ์ก
API๊ฒ์ดํธ์จ์ด->>์๋ฆผ์๋น์ค: 7b. SMS/์ด๋ฉ์ผ ๋ฐ์ก
else ์ผ๋ฐ ์ ๊ณ ์ธ ๊ฒฝ์ฐ
API๊ฒ์ดํธ์จ์ด->>๊ดํ ๊ธฐ๊ด: 7c. ์ผ๊ด ์ฒ๋ฆฌ ๋๊ธฐ์ด ์ถ๊ฐ
end
API๊ฒ์ดํธ์จ์ด->>์น์ฑ: 8. ์ ์ ์๋ฃ ์๋ต
์น์ฑ->>์๋ฏผ: 9. ์ ๊ณ ์๋ฃ ์๋ด ํ์
Note over ๋ฐ์ดํฐ๋ฒ ์ด์ค,์๋ฆผ์๋น์ค: ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฒ๋ฆฌ
๋ฐ์ดํฐ๋ฒ ์ด์ค->>์๋ฆผ์๋น์ค: 10. ์ฒ๋ฆฌ ์ํ ์
๋ฐ์ดํธ
์๋ฆผ์๋น์ค->>์๋ฏผ: 11. ์งํ ์ํฉ ํธ์ ์๋ฆผ
sequenceDiagram
participant U as ์ฌ์ฉ์
participant W as Web App
participant A as API Gateway
participant S as AI Service
participant D as Database
participant E as External APIs
U->>W: 1. ์ฌ์ง ์
๋ก๋ + ์์น ์ ๋ณด
W->>A: 2. ์ ๊ณ ์ ์ ์์ฒญ
A->>S: 3. AI ๋ถ์ ์์ฒญ
par ๊ฐ์ฒด ํ์ง
S->>S: 4a. YOLO ๋ชจ๋ธ ์คํ
and ํ
์คํธ ๋ถ์
S->>S: 4b. Gemini API ํธ์ถ
and ์์น ๋ถ์
S->>E: 4c. ์ง๋ API ์กฐํ
end
S->>A: 5. ๋ถ์ ๊ฒฐ๊ณผ ๋ฐํ
A->>D: 6. ์ ๊ณ ๋ฐ์ดํฐ ์ ์ฅ
A->>W: 7. ์ฒ๋ฆฌ ๊ฒฐ๊ณผ ์๋ต
W->>U: 8. ์ ๊ณ ์๋ฃ ์๋ฆผ
Note over S,D: ๋น๋๊ธฐ ํ์ฒ๋ฆฌ
S->>D: 9. ์์ธ ๋ถ์ ๊ฒฐ๊ณผ ์ ์ฅ
S->>E: 10. ๊ดํ ๊ธฐ๊ด ์๋ฆผ ๋ฐ์ก
graph TB
subgraph "๐จ Presentation Layer"
A1["Pages & Components
โข app/page.tsx
โข components/ui/*
โข components/maps/*"]
A2["State Management
โข Zustand Store
โข React Query Cache
โข Form Validation"]
end
subgraph "โก Service Layer"
B1["ReportService
โข ์ ๊ณ ์ ์ ๋ก์ง
โข ์ํ ๊ด๋ฆฌ
โข ์ ํจ์ฑ ๊ฒ์ฆ"]
B2["AIService
โข ๊ฐ์ฒด ํ์ง ์์ฒญ
โข ํ
์คํธ ๋ถ์
โข ๊ฒฐ๊ณผ ํฌ๋งทํ
"]
B3["MapService
โข ์ขํ ๋ณํ
โข ์ฃผ์ ๊ฒ์
โข ๊ดํ ๊ตฌ์ญ ํ์ "]
B4["NotificationService
โข ์ค์๊ฐ ์๋ฆผ
โข ์ด๋ฉ์ผ ๋ฐ์ก
โข SMS ์ ์ก"]
end
subgraph "๐ก Data Access Layer"
C1["API Client
โข HTTP ํต์
โข ์๋ฌ ํธ๋ค๋ง
โข ์ฌ์๋ ๋ก์ง"]
C2["Database Repository
โข CRUD ์์
โข ํธ๋์ญ์
๊ด๋ฆฌ
โข ์ฟผ๋ฆฌ ์ต์ ํ"]
end
subgraph "๐๏ธ Infrastructure Layer"
D1["External APIs
โข Gemini Pro
โข Map Services
โข Government APIs"]
D2["Storage
โข PostgreSQL
โข Redis
โข AWS S3"]
end
A1 --> B1
A1 --> B2
A1 --> B3
A2 --> B1
B1 --> C1
B2 --> C1
B3 --> C1
B4 --> C1
B1 --> C2
B2 --> C2
B3 --> C2
C1 --> D1
C2 --> D2
style A1 fill:#e3f2fd
style B1 fill:#fff3e0
style C1 fill:#e8f5e8
style D1 fill:#f3e5f5
interface ReportService {
// ์ ๊ณ ์ ์
submitReport(data: ReportData): Promise<ReportResult>;
// ์ ๊ณ ์ํ ์กฐํ
getReportStatus(reportId: string): Promise<ReportStatus>;
// ์ ๊ณ ๋ชฉ๋ก ์กฐํ
getReports(filters: ReportFilters): Promise<Report[]>;
// ์ ๊ณ ์์
updateReport(reportId: string, data: Partial<ReportData>): Promise<void>;
}
interface AIService {
// ๊ฐ์ฒด ํ์ง
detectObjects(imageFile: File): Promise<DetectionResult>;
// ํ
์คํธ ๋ถ์
analyzeText(text: string): Promise<TextAnalysisResult>;
// ์ํ๋ ํ๊ฐ
assessRiskLevel(analysis: AnalysisData): Promise<RiskAssessment>;
// ์๋ ๋ถ๋ฅ
categorizeReport(data: ReportData): Promise<CategoryResult>;
}
interface MapService {
// ์ขํโ์ฃผ์ ๋ณํ
geocodeReverse(lat: number, lng: number): Promise<AddressInfo>;
// ์ฃผ์โ์ขํ ๋ณํ
geocodeForward(address: string): Promise<Coordinates>;
// ๊ดํ ๊ตฌ์ญ ํ์
determineJurisdiction(coordinates: Coordinates): Promise<JurisdictionInfo>;
// ์ฃผ๋ณ ์์ค ๊ฒ์
searchNearbyFacilities(coordinates: Coordinates): Promise<Facility[]>;
}
graph TB
subgraph "๐ฏ ๊ฐ์ฒด ํ์ง AI"
A["YOLOv8 ๋ชจ๋ธ
โข ์ค์๊ฐ ๊ฐ์ฒด ํ์ง
โข ์ํ ์์ ์๋ณ
โข ์ ๋ขฐ๋ ์ค์ฝ์ด๋ง"]
A1["Safety Object Dataset
โข ๋๋ก ์ํ๋ฌผ
โข ์์ค๋ฌผ ํ์
โข ๊ตํต ์๋ฐ"]
end
subgraph "๐ ํ
์คํธ ๋ถ์ AI"
B["Gemini Pro 1.5
โข ์์ฐ์ด ์ดํด
โข ๊ฐ์ ๋ถ์
โข ์์ฝ ์์ฑ"]
B1["Korean Safety Corpus
โข ์ ๊ณ ํ
์คํธ
โข ๋ฒ๋ น ๋ฐ์ดํฐ
โข ๋ฏผ์ ๋ถ๋ฅ"]
end
subgraph "๐ ์์น ๊ธฐ๋ฐ AI"
C["Geospatial AI
โข ๊ดํ ๊ตฌ์ญ ํ์
โข ์ํ ์ง์ญ ๋ถ์
โข ํจํด ํ์ง"]
C1["Administrative Dataset
โข ํ์ ๊ตฌ์ญ ์ ๋ณด
โข ๊ดํ ๊ธฐ๊ด ๋งคํ
โข ์ง์ญ๋ณ ํต๊ณ"]
end
subgraph "๐ ํตํฉ ๋ถ์ AI"
D["Ensemble Model
โข ๋ค์ค ๋ชจ๋ฌ ์ตํฉ
โข ์ฐ์ ์์ ๊ฒฐ์
โข ์๋ ๋ผ์ฐํ
"]
D1["Historical Data
โข ๊ณผ๊ฑฐ ์ ๊ณ ๋ฐ์ดํฐ
โข ์ฒ๋ฆฌ ๊ฒฐ๊ณผ
โข ํผ๋๋ฐฑ ๋ก๊ทธ"]
end
A --> A1
B --> B1
C --> C1
D --> D1
A --> D
B --> D
C --> D
style A fill:#ff6b35
style B fill:#4ecdc4
style C fill:#45b7d1
style D fill:#96ceb4
| ๐ ํญ๋ชฉ | ๐ ์์ธ ๋ด์ฉ | ๐ฏ ์ฑ๋ฅ ๋ชฉํ |
|---|---|---|
| ๋ชจ๋ธ ๋ฒ์ | YOLOv8n/s/m/l/x (ํ๊ฒฝ๋ณ ์ ํ) | ๊ฒฝ๋ํ ์ฐ์ |
| ์ ๋ ฅ ํ์ | RGB ์ด๋ฏธ์ง (640x640px) | ๋ค์ํ ํด์๋ ์ง์ |
| ์ถ๋ ฅ ํ์ | Bounding Box + Class + Confidence | ๊ตฌ์กฐํ๋ JSON |
| ์ฒ๋ฆฌ ์๋ | ~50ms (GPU) / ~200ms (CPU) | ์ค์๊ฐ ์ฒ๋ฆฌ |
| ์ ํ๋ | [email protected]: 85.2% | ์ง์์ ๊ฐ์ |
๐๏ธ ํนํ ๋ฐ์ดํฐ์ : Safety Object Dataset (Ver 2.0)
pie title "๐ฏ ์์ ๊ฐ์ฒด ํ์ง ํ๋ จ ๋ฐ์ดํฐ ์์ธ ๋ถํฌ"
"๐ง ๋๋ก ์ํ๋ฌผ" : 35
"โ ๏ธ ์์ค๋ฌผ ํ์" : 25
"๐ ๊ตํต ์๋ฐ" : 20
"๐๏ธ ๊ณต์ฌ ์์ " : 15
"๐ก๏ธ ํ๊ฒฝ ์ํ" : 5
๐ ๋ฐ์ดํฐ์ ์์ธ ์ ๋ณด:
| ๐ ์นดํ ๊ณ ๋ฆฌ | ๐ธ ์ด๋ฏธ์ง ์ | ๐ท๏ธ ๋ผ๋ฒจ ์ | ๐ ์์ง ์ง์ญ | ๐ฏ ๊ฒ์ถ ์ ํ๋ |
|---|---|---|---|---|
| ๋๋ก ์ํ๋ฌผ | 17,500์ฅ | 45,230๊ฐ | ์ ๊ตญ 17๊ฐ ์๋ | 94.2% |
| ์์ค๋ฌผ ํ์ | 12,500์ฅ | 28,150๊ฐ | ๋์ฌ + ์ธ๊ณฝ ์ง์ญ | 91.8% |
| ๊ตํต ์๋ฐ | 10,000์ฅ | 22,340๊ฐ | ์ฃผ์ ๋๋ก๋ง | 89.6% |
| ๊ณต์ฌ ์์ | 7,500์ฅ | 15,680๊ฐ | ๊ณต์ฌ ํ์ฅ | 87.3% |
| ํ๊ฒฝ ์ํ | 2,500์ฅ | 5,420๊ฐ | ์ฐ์ ์ง์ญ | 85.1% |
๐ง ๋ฐ์ดํฐ ์์ง ๋ฐ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ:
graph LR
A[๐๏ธ ๊ณต๊ณต๋ฐ์ดํฐ
CCTV ์์
15,000์๊ฐ] --> D[๐ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ]
B[๐ฅ ์๋ฏผ ์ ๋ณด
ํฌ๋ผ์ฐ๋์์ฑ
25,000์ฅ] --> D
C[๐จ ํฉ์ฑ ๋ฐ์ดํฐ
Stable Diffusion
10,000์ฅ] --> D
D --> E[๐ท๏ธ ์๋ ๋ผ๋ฒจ๋ง
YOLO + ์๋ ๊ฒ์]
E --> F[๐ ๋ฐ์ดํฐ ์ฆ๊ฐ
8๋ฐฐ ํ์ฅ]
F --> G[โ
ํ์ง ๊ฒ์ฆ
IoU > 0.8]
style A fill:#FF0000,color:#FFFFFF
style B fill:#00FF00,color:#000000
style C fill:#0000FF,color:#FFFFFF
style D fill:#FF6600,color:#FFFFFF
style E fill:#9900FF,color:#FFFFFF
style F fill:#00FFFF,color:#000000
style G fill:#FFFF00,color:#000000
| ๐ ํญ๋ชฉ | ๐ ์์ธ ๋ด์ฉ | ๐ฏ ์ฑ๋ฅ ์งํ |
|---|---|---|
| ๋ชจ๋ธ ํ์ | Large Language Model | ํ๊ตญ์ด ํนํ |
| ์ ๋ ฅ ๊ธธ์ด | ์ต๋ 2M ํ ํฐ | ๊ธด ๋ฌธ์ ์ง์ |
| ์๋ต ์๊ฐ | ~1-3์ด | ์ค์๊ฐ ๋ถ์ |
| ์ง์ ์ธ์ด | ํ๊ตญ์ด ์ต์ ํ | ๋ค๊ตญ์ด ํ์ฅ ์์ |
| ์ถ๋ ฅ ํ์ | ๊ตฌ์กฐํ๋ JSON | API ์นํ์ |
๐๏ธ ํนํ ๋ฐ์ดํฐ์ : Korean Safety Corpus (Ver 3.1)
graph TB
subgraph "๐ ์ฝํผ์ค ๊ตฌ์ฑ"
A[๐ ์ ๊ณ ํ
์คํธ
150,000๊ฑด
์๋ฏผ ์ ๊ณ ์]
B[โ๏ธ ๋ฒ๋ น ๋ฐ์ดํฐ
75,000๊ฑด
์์ ๊ด๋ จ ์กฐํญ]
C[๐ ๋ฏผ์ ๋ถ๋ฅ
300,000๊ฑด
์ ๋ถ ๋ฏผ์ ์ฌ๋ก]
D[๐ฐ ๋ด์ค ๊ธฐ์ฌ
100,000๊ฑด
์์ ์ฌ๊ณ ๋ณด๋]
end
subgraph "๐ ๋ถ์ ์นดํ
๊ณ ๋ฆฌ"
E[๐จ ๊ธด๊ธ๋ ๋ถ๋ฅ
์ฆ์/24h/์ผ๋ฐ
3๋จ๊ณ]
F[๐ ์ฃผ์ ๋ถ๋ฅ
๊ตํต/์์ค/ํ๊ฒฝ
15๊ฐ ์ธ๋ถ ์นดํ
๊ณ ๋ฆฌ]
G[๐ ๊ฐ์ ๋ถ์
๋ถ๋
ธ/์ฐ๋ ค/์ ์
๊ฐ์ ๊ฐ๋ ์ธก์ ]
H[๐ฏ ํค์๋ ์ถ์ถ
ํต์ฌ ๋จ์ด
์ค์๋ ์ค์ฝ์ด๋ง]
end
A --> E
B --> F
C --> G
D --> H
style A fill:#FF3300,color:#FFFFFF
style B fill:#0066FF,color:#FFFFFF
style C fill:#00CC00,color:#000000
style D fill:#FF6600,color:#FFFFFF
style E fill:#9900CC,color:#FFFFFF
style F fill:#00CCCC,color:#000000
style G fill:#CCCC00,color:#000000
style H fill:#CC00CC,color:#FFFFFF
๏ฟฝ ํ ์คํธ ๋ถ์ ์ฑ๋ฅ ์งํ:
| ๐ฏ ๋ถ์ ํ์คํฌ | ๐ ์ ํ๋ | โก ์ฒ๋ฆฌ ์๊ฐ | ๐ ์ ๋ขฐ๋ |
|---|---|---|---|
| ๊ธด๊ธ๋ ๋ถ๋ฅ | 94.3% | 0.8์ด | 96.1% |
| ์นดํ ๊ณ ๋ฆฌ ๋ถ๋ฅ | 91.7% | 1.2์ด | 93.5% |
| ๊ฐ์ ๋ถ์ | 89.4% | 0.6์ด | 91.2% |
| ํค์๋ ์ถ์ถ | 87.9% | 0.4์ด | 89.7% |
| ๐ ํญ๋ชฉ | ๐ ์์ธ ๋ด์ฉ | ๐ฏ ์ปค๋ฒ๋ฆฌ์ง |
|---|---|---|
| ์์ง | PostGIS + H3 Spatial Index | ์ ๊ตญ ๋จ์ |
| ์ ํ๋ | ํ์ ๋ ์์ค (99.5%) | ์๋ฉด๋ ๋จ์ |
| ์ฒ๋ฆฌ ์๋ | ~10ms | ์ค์๊ฐ ๋งคํ |
| ๋ฐ์ดํฐ | 17๊ฐ ๊ด์ญ์๋ | ์ ๊ตญ ์ปค๋ฒ๋ฆฌ์ง |
๐๏ธ ํนํ ๋ฐ์ดํฐ์ : Comprehensive Administrative Dataset (Ver 4.2)
erDiagram
ADMINISTRATIVE_DISTRICTS {
string district_code PK "ํ์ ๊ตฌ์ญ ์ฝ๋"
string name "๊ตฌ์ญ๋ช
"
geometry boundary "๊ฒฝ๊ณ์ ์ขํ"
string parent_district "์์ ๊ตฌ์ญ"
int population "์ธ๊ตฌ์"
string risk_level "์ํ๋ ๋ฑ๊ธ"
timestamp last_updated "์ต์ข
์
๋ฐ์ดํธ"
}
GOVERNMENT_AGENCIES {
string agency_id PK "๊ธฐ๊ด ID"
string name "๊ธฐ๊ด๋ช
"
string type "๊ธฐ๊ด ์ ํ"
string contact_info "์ฐ๋ฝ์ฒ"
string[] service_areas "๋ด๋น ๊ตฌ์ญ"
string[] categories "์ฒ๋ฆฌ ๋ถ์ผ"
int capacity "์ฒ๋ฆฌ ์ฉ๋"
float response_time "ํ๊ท ์๋ต ์๊ฐ"
}
JURISDICTION_MAPPING {
string mapping_id PK "๋งคํ ID"
string district_code FK "๊ตฌ์ญ ์ฝ๋"
string agency_id FK "๊ธฐ๊ด ID"
string category "์ ๊ณ ์นดํ
๊ณ ๋ฆฌ"
int priority "์ฐ์ ์์"
float accuracy "๋งคํ ์ ํ๋"
timestamp created_at "์์ฑ์ผ์"
}
INCIDENT_PATTERNS {
string pattern_id PK "ํจํด ID"
string district_code FK "๊ตฌ์ญ ์ฝ๋"
string category "์ฌ๊ณ ์ ํ"
int frequency "๋ฐ์ ๋น๋"
json temporal_pattern "์๊ฐ ํจํด"
float risk_score "์ํ ์ ์"
}
ADMINISTRATIVE_DISTRICTS ||--o{ JURISDICTION_MAPPING : "covers"
GOVERNMENT_AGENCIES ||--o{ JURISDICTION_MAPPING : "serves"
ADMINISTRATIVE_DISTRICTS ||--o{ INCIDENT_PATTERNS : "analyzes"
๐๏ธ ๊ดํ ๊ธฐ๊ด ๋งคํ ๋ฐ์ดํฐ:
| ๐ข ๊ธฐ๊ด ์ ํ | ๐ ๊ธฐ๊ด ์ | ๐ฏ ๋ด๋น ๋ถ์ผ | โก ํ๊ท ์๋ต์๊ฐ |
|---|---|---|---|
| ๊ตฌ์ฒญ/์์ฒญ | 258๊ฐ | ๋๋ก, ์์ค๋ฌผ | 2.4์๊ฐ |
| ๊ฒฝ์ฐฐ์ | 183๊ฐ | ๊ตํต, ์์ | 15๋ถ |
| ์๋ฐฉ์ | 134๊ฐ | ํ์ฌ, ์๊ธ | 8๋ถ |
| ํ๊ฒฝ๊ด๋ฆฌ์ | 89๊ฐ | ํ๊ฒฝ, ์ค์ผ | 4.2์๊ฐ |
| ๊ต์ก์ฒญ | 17๊ฐ | ํ๊ต ์์ | 1.8์๊ฐ |
graph TB
subgraph "์ ํ๋ ๋ฉํธ๋ฆญ"
A[Precision: 92.3%]
B[Recall: 89.7%]
C[F1-Score: 90.9%]
end
subgraph "์๋ต ์๊ฐ"
D[๊ฐ์ฒด ํ์ง: 50ms]
E[ํ
์คํธ ๋ถ์: 1.2s]
F[์ ์ฒด ์ฒ๋ฆฌ: 2.1s]
end
subgraph "์ฌ์ฉ์ ๋ง์กฑ๋"
G[์ ํ๋ ์ฒด๊ฐ: 4.2/5]
H[์๋ ๋ง์กฑ: 4.1/5]
I[์ ๋ฐ์ ๋ง์กฑ: 4.3/5]
end
style A fill:#4caf50
style B fill:#4caf50
style C fill:#4caf50
style D fill:#2196f3
style E fill:#2196f3
style F fill:#2196f3
// AI ์๋น์ค ์ต์ ํ ์ค์
const AI_CONFIG = {
objectDetection: {
model: "yolov8n", // ๋ชจ๋ฐ์ผ ์ต์ ํ
confidence: 0.7,
maxObjects: 10,
enableGPU: true,
},
textAnalysis: {
model: "gemini-pro-1.5",
temperature: 0.3,
maxTokens: 1000,
enableStreaming: false,
},
caching: {
enableObjectCache: true,
cacheExpiry: 3600, // 1์๊ฐ
maxCacheSize: 100, // MB
},
};
gantt
title AI ์์ ์ ๋ฌธ๊ณ ๊ฐ๋ฐ ๋ก๋๋งต
dateFormat YYYY-MM-DD
section Phase 1: ๊ธฐ๋ฐ ๊ตฌ์ถ
ํ๋ก์ ํธ ์ค์ :p1-1, 2025-06-22, 5d
UI/UX ๋์์ธ ์์คํ
:p1-2, 2025-06-24, 7d
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ :p1-3, 2025-06-26, 5d
section Phase 2: ํต์ฌ ๊ธฐ๋ฅ
๊ฐ์ฒด ํ์ง AI ํตํฉ :p2-1, 2025-07-01, 10d
ํ
์คํธ ๋ถ์ AI ๊ตฌํ :p2-2, 2025-07-03, 8d
์ง๋ ์๋น์ค ์ฐ๋ :p2-3, 2025-07-05, 6d
์ ๊ณ ์์คํ
๊ฐ๋ฐ :p2-4, 2025-07-08, 12d
section Phase 3: ๊ณ ๋ํ
๊ด๋ฆฌ์ ๋์๋ณด๋ :p3-1, 2025-07-15, 8d
์ค์๊ฐ ์๋ฆผ ์์คํ
:p3-2, 2025-07-18, 6d
์ฑ๋ฅ ์ต์ ํ :p3-3, 2025-07-20, 5d
section Phase 4: ๋ฐฐํฌ
ํ
์คํธ ๋ฐ QA :p4-1, 2025-07-25, 7d
์ด์ ํ๊ฒฝ ๊ตฌ์ถ :p4-2, 2025-07-28, 5d
์๋น์ค ๋ฐ์นญ :p4-3, 2025-08-02, 3d
graph TB
subgraph "Production Environment"
subgraph "CDN Layer"
A[CloudFlare CDN]
end
subgraph "Load Balancer"
B[NGINX + SSL]
end
subgraph "Application Tier"
C[Next.js App 1]
D[Next.js App 2]
E[Python AI Service 1]
F[Python AI Service 2]
end
subgraph "Database Tier"
G[PostgreSQL Primary]
H[PostgreSQL Replica]
I[Redis Cluster]
end
subgraph "Storage Tier"
J[AWS S3]
K[Model Registry]
end
subgraph "Monitoring"
L[Grafana Dashboard]
M[Prometheus Metrics]
N[ELK Stack Logs]
end
end
A --> B
B --> C
B --> D
C --> E
D --> F
C --> G
D --> G
G --> H
C --> I
D --> I
E --> J
F --> K
style A fill:#ff9800
style B fill:#4caf50
style G fill:#2196f3
style L fill:#9c27b0
graph TB
subgraph "UX ์ค๊ณ ์์น"
A[์ง๊ด์ ์ธํฐํ์ด์ค
โข 3-ํด๋ฆญ ์์น
โข ๋ช
ํํ ์ก์
๋ฒํผ
โข ์๊ฐ์ ํผ๋๋ฐฑ]
B[์ ๊ทผ์ฑ ์ฐ์
โข WCAG 2.1 ์ค์
โข ํค๋ณด๋ ๋ค๋น๊ฒ์ด์
โข ์คํฌ๋ฆฐ ๋ฆฌ๋ ์ง์]
C[๋ฐ์ํ ๋์์ธ
โข ๋ชจ๋ฐ์ผ ์ฐ์ ์ค๊ณ
โข ํฐ์น ์นํ์ UI
โข ๋ค์ํ ํ๋ฉด ํฌ๊ธฐ]
D[์ฑ๋ฅ ์ต์ ํ
โข ๋น ๋ฅธ ๋ก๋ฉ ์๊ฐ
โข ํ๋ก๊ทธ๋ ์๋ธ ๋ก๋ฉ
โข ์คํ๋ผ์ธ ์ง์]
end
style A fill:#e3f2fd
style B fill:#fff3e0
style C fill:#e8f5e8
style D fill:#f3e5f5
journey
title "๐จ ์๋ฏผ ์์ ์ ๊ณ ์์ธ ์ฌ์ ๋งต"
section ๐ ์ํ ๋ฐ๊ฒฌ
์ํ ์ํฉ ์ธ์ง : 2 : ์๋ฏผ
์ฃผ๋ณ ํ๊ฒฝ ํ์
: 3 : ์๋ฏผ
์์ ํ๋ณด : 4 : ์๋ฏผ
์ดฌ์ ๊ฐ๋ ๊ฒฐ์ : 3 : ์๋ฏผ
section ๐ฑ ์ ๊ณ ์ค๋น
์ฑ ์คํ : 5 : ์๋ฏผ
์์น ๊ถํ ํ์ฉ : 4 : ์๋ฏผ
์นด๋ฉ๋ผ ๊ถํ ํ์ธ : 4 : ์๋ฏผ
์ ๊ณ ๋ฒํผ ํฐ์น : 5 : ์๋ฏผ
section ๐ธ ๋ฐ์ดํฐ ์์ง
์ฌ์ง/์์ ์ดฌ์ : 4 : ์๋ฏผ
GPS ์์น ์๋ ํ๋ : 5 : AI, ์์คํ
์ถ๊ฐ ์ฌ์ง ์ดฌ์ : 3 : ์๋ฏผ
์์น ์ ๋ณด ํ์ธ : 4 : ์๋ฏผ
section โ๏ธ ์์ธ ์ ๋ณด ์
๋ ฅ
AI ์นดํ
๊ณ ๋ฆฌ ์ถ์ฒ : 5 : AI
์นดํ
๊ณ ๋ฆฌ ์ ํ : 4 : ์๋ฏผ
์ํฉ ์ค๋ช
์
๋ ฅ : 3 : ์๋ฏผ
๊ธด๊ธ๋ ์๋ ํ์ : 5 : AI
section ๐ค AI ๋ถ์ ์ฒ๋ฆฌ
์ด๋ฏธ์ง ํ์ง ๊ฒ์ฆ : 5 : AI
๊ฐ์ฒด ํ์ง ์ํ : 5 : AI
ํ
์คํธ ๋ถ์ ์คํ : 5 : AI
์์น ๋ถ์ ์๋ฃ : 5 : AI
section ๐ฏ ๋ถ๋ฅ ๋ฐ ๋ผ์ฐํ
ํตํฉ ์ํ๋ ํ๊ฐ : 5 : AI
๊ดํ ๊ธฐ๊ด ์๋ ๊ฒฐ์ : 5 : AI
์ฐ์ ์์ ๋ฐฐ์ : 5 : ์์คํ
์ฒ๋ฆฌ ์์ ์๊ฐ ๊ณ์ฐ : 4 : ์์คํ
section ๐พ ๋ฐ์ดํฐ ์ ์ฅ
์ ๊ณ ๋ฐ์ดํฐ ์ ์ฅ : 5 : ์์คํ
ํ์ผ ์
๋ก๋ ์๋ฃ : 4 : ์์คํ
๊ฒ์ ์ธ๋ฑ์ค ์์ฑ : 5 : ์์คํ
๋ฐฑ์
๋ฐ์ดํฐ ์์ฑ : 4 : ์์คํ
section ๐ข ์๋ฆผ ๋ฐ ํ์ธ
์ ์ ์๋ฃ ์๋ฆผ : 5 : ์๋ฏผ
์ ๊ณ ๋ฒํธ ๋ฐ๊ธ : 5 : ์๋ฏผ
์ฒ๋ฆฌ ์ผ์ ์๋ด : 4 : ์๋ฏผ
์ถ์ ๋งํฌ ์ ๊ณต : 5 : ์๋ฏผ
section ๐๏ธ ๊ธฐ๊ด ์ ๋ฌ
๊ดํ ๊ธฐ๊ด ์๋ฆผ : 5 : ๋ด๋น์
์์ธ ์ ๋ณด ์ ์ก : 4 : ๋ด๋น์
์ฐ์ ์์ ํ์ : 5 : ๋ด๋น์
์ฒ๋ฆฌ ์ง์ ์ ๋ฌ : 4 : ๋ด๋น์
section ๐ ์ถ์ ๋ฐ ํผ๋๋ฐฑ
์ฒ๋ฆฌ ์ํ ์
๋ฐ์ดํธ : 4 : ์๋ฏผ
ํ์ฅ ์กฐ์น ์๋ฆผ : 5 : ์๋ฏผ
์๋ฃ ํ์ธ ์์ฒญ : 4 : ์๋ฏผ
๋ง์กฑ๋ ํ๊ฐ : 3 : ์๋ฏผ
graph TD
A[๐ ๋ฉ์ธ ํ๋ฉด] --> B{๐ฑ ์ ๊ณ ๋ฐฉ๋ฒ ์ ํ}
B -->|๋น ๋ฅธ ์ ๊ณ | C[๐ธ ์ฆ์ ์ดฌ์]
B -->|์์ธ ์ ๊ณ | D[๐ ๋จ๊ณ๋ณ ์
๋ ฅ]
B -->|๊ธด๊ธ ์ ๊ณ | E[๐จ ์ํฐ์น ์ ๊ณ ]
C --> F[๐ค AI ์๋ ๋ถ์]
D --> G[๐ ์ ๋ณด ์
๋ ฅ ํผ]
E --> H[๐ ์ฆ์ ์ ๊ณ ์ ์]
F --> I{๐ฏ ๋ถ์ ๊ฒฐ๊ณผ ํ์ธ}
G --> F
H --> J[โก ๊ธด๊ธ ์ฒ๋ฆฌ]
I -->|ํ์ธ| K[๐ค ์ ๊ณ ์ ์ถ]
I -->|์์ | L[โ๏ธ ์ ๋ณด ์์ ]
L --> G
K --> M[โ
์ ์ ์๋ฃ]
J --> N[๐จ ์ฆ์ ์ ๋ฌ]
M --> O[๐ฑ ์๋ฆผ ์ค์ ]
N --> P[๐ ๋ด๋น์ ์ฐ๊ฒฐ]
O --> Q[๐ ์งํ ์ํฉ ์ถ์ ]
P --> Q
style A fill:#E3F2FD
style C fill:#FF5722,color:#FFFFFF
style E fill:#D32F2F,color:#FFFFFF
style F fill:#4CAF50,color:#FFFFFF
style J fill:#FF9800,color:#FFFFFF
style M fill:#2196F3,color:#FFFFFF
style Q fill:#9C27B0,color:#FFFFFF
// ์ ๊ทผ์ฑ ๊ฐํ UI ์ปดํฌ๋ํธ ๊ตฌ์กฐ
const ACCESSIBLE_UI_COMPONENTS = {
layout: {
MobileHeader: {
description: "์๋จ ๋ค๋น๊ฒ์ด์
(๋ค๋ก๊ฐ๊ธฐ, ์ ๋ชฉ)",
accessibility: {
ariaLabel: "๋ฉ์ธ ๋ค๋น๊ฒ์ด์
",
keyboardNavigation: true,
screenReaderSupport: true,
colorContrast: "7:1 ์ด์",
},
},
BottomNavigation: {
description: "ํ๋จ ํญ ๋ฉ๋ด (ํ, ์ ๊ณ , ๋ด์ญ, ์ค์ )",
accessibility: {
touchTarget: "44px ์ด์",
voiceOver: "์ ์ฒด ์ง์",
hapticFeedback: true,
},
},
FloatingActionButton: {
description: "๋น ๋ฅธ ์ ๊ณ ๋ฒํผ",
accessibility: {
highContrast: "๋นจ๊ฐ์ ๋ฐฐ๊ฒฝ",
largeText: "18px ์ด์",
announcement: "์ ๊ณ ์์",
},
},
},
forms: {
CameraCapture: {
description: "์นด๋ฉ๋ผ ์ดฌ์ ์ธํฐํ์ด์ค",
accessibility: {
visualIndicators: "์ด์ ๊ฐ์ด๋๋ผ์ธ",
audioGuidance: "์ดฌ์ ์๋ด ์์ฑ",
alternativeInput: "ํ์ผ ์
๋ก๋ ์ต์
",
},
},
LocationPicker: {
description: "์์น ์ ํ ์ง๋",
accessibility: {
keyboardControls: "๋ฐฉํฅํค ์ง์",
locationDescription: "์ฃผ์ ์ฝ๊ธฐ",
zoomControls: "ํ๋/์ถ์ ๋ฒํผ",
},
},
CategorySelector: {
description: "AI ์ถ์ฒ ์นดํ
๊ณ ๋ฆฌ",
accessibility: {
clearLabels: "๋ช
ํํ ์นดํ
๊ณ ๋ฆฌ๋ช
",
confirmationDialog: "์ ํ ํ์ธ",
undoFunction: "๋๋๋ฆฌ๊ธฐ ๊ธฐ๋ฅ",
},
},
},
feedback: {
ProgressIndicator: {
description: "AI ๋ถ์ ์งํ ์ํ",
accessibility: {
progressAnnouncement: "์งํ๋ฅ ์์ฑ ์๋ด",
estimatedTime: "์์ ์์ ์๊ฐ",
cancelOption: "์ทจ์ ๋ฒํผ",
},
},
SuccessAnimation: {
description: "์ ๊ณ ์๋ฃ ์ ๋๋ฉ์ด์
",
accessibility: {
reduceMotion: "์์ง์ ์ต์ํ ์ต์
",
audioConfirmation: "์๋ฃ ์๋ฆผ์",
visualConfirmation: "์ฒดํฌ๋งํฌ ํ์",
},
},
},
};
graph TB
subgraph "๐จ Primary Colors (๊ณ ๋๋น)"
A[๐ด ๊ธด๊ธ ์ ๊ณ
#D32F2F
๋๋น์จ: 8.2:1]
B[๐ต ์ผ๋ฐ ์ ๊ณ
#1976D2
๋๋น์จ: 7.8:1]
C[๐ข ์๋ฃ ์ํ
#388E3C
๋๋น์จ: 7.5:1]
D[๐ก ์งํ ์ค
#F57C00
๋๋น์จ: 7.1:1]
end
subgraph "โฟ Accessibility Features"
E[๐ข Screen Reader
๋ชจ๋ ์์ ๋ผ๋ฒจ๋ง
NVDA/JAWS ์ง์]
F[โจ๏ธ Keyboard Nav
Tab ์์ ์ต์ ํ
Skip Links ์ ๊ณต]
G[๐ High Contrast
๋คํฌ๋ชจ๋ ์ง์
์์ฝ์ ๊ณ ๋ ค]
H[๐ฑ Touch Targets
44px ์ต์ ํฌ๊ธฐ
์ถฉ๋ถํ ๊ฐ๊ฒฉ]
end
A --> E
B --> F
C --> G
D --> H
style A fill:#D32F2F,color:#FFFFFF
style B fill:#1976D2,color:#FFFFFF
style C fill:#388E3C,color:#FFFFFF
style D fill:#F57C00,color:#FFFFFF
style E fill:#000000,color:#FFFFFF
style F fill:#4A4A4A,color:#FFFFFF
style G fill:#6A1B9A,color:#FFFFFF
style H fill:#795548,color:#FFFFFF
graph TB
subgraph "Client Security"
A[HTTPS Only
SSL/TLS 1.3]
B[Content Security Policy
XSS Protection]
C[Input Validation
Client Side]
end
subgraph "API Security"
D[JWT Authentication
Short-lived Tokens]
E[Rate Limiting
DDoS Protection]
F[API Key Management
Rotation Policy]
end
subgraph "Data Protection"
G[End-to-End Encryption
AES-256]
H[Database Encryption
TDE + Column Level]
I[Image Anonymization
Face/License Blur]
end
subgraph "Infrastructure Security"
J[WAF Protection
CloudFlare Security]
K[VPC Network
Private Subnets]
L[Monitoring & Logging
SIEM Integration]
end
style G fill:#f44336
style H fill:#f44336
style I fill:#f44336
| ๐ ํญ๋ชฉ | ๐ ์ฒ๋ฆฌ ๋ฐฉ์ | โฑ๏ธ ๋ณด๊ด ๊ธฐ๊ฐ |
|---|---|---|
| ์์น ์ ๋ณด | ์ ๊ณ ์ ์ ์์๋ง ์์ง, ์ฆ์ ์ํธํ | ์ฒ๋ฆฌ ์๋ฃ ํ 1๋ |
| ์ด๋ฏธ์ง ๋ฐ์ดํฐ | ์ผ๊ตด/๋ฒํธํ ์๋ ๋ธ๋ฌ ์ฒ๋ฆฌ | ๋ถ์ ์๋ฃ ํ 6๊ฐ์ |
| ์ฐ๋ฝ์ฒ ์ ๋ณด | ์ ํ์ ์์ง, ํด์ํ ์ ์ฅ | ์ฌ์ฉ์ ํํด ์ ์ฆ์ ์ญ์ |
| ์ ๊ณ ๋ด์ฉ | ๊ฐ์ธ์๋ณ์ ๋ณด ์๋ ๋ง์คํน | ํต๊ณ ๋ชฉ์ 3๋ (์ต anonymize) |
pie title ์๋น์ค ์ฑ๊ณผ ์ธก์ ์งํ
"์ ๊ณ ์ ํ๋ (AI ๋ถ๋ฅ)" : 25
"์ฒ๋ฆฌ ์๊ฐ ๋จ์ถ์จ" : 20
"์ฌ์ฉ์ ๋ง์กฑ๋" : 20
"์์คํ
๊ฐ์ฉ์ฑ" : 15
"๋ฐ์ดํฐ ํ์ง" : 10
"๋น์ฉ ํจ์จ์ฑ" : 10
graph TB
subgraph "๐ ์ด์ ๋์๋ณด๋ (์ค์๊ฐ)"
A[๐ฅ๏ธ ์์คํ
์ํ
โข ์๋ต ์๊ฐ: ํ๊ท 1.2์ด
โข ์ค๋ฅ์จ: 0.03%
โข ์ฒ๋ฆฌ๋: 1,500๊ฑด/์๊ฐ
โข ๊ฐ์ฉ์ฑ: 99.97%]
B[๐ค AI ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง
โข ๊ฐ์ฒด ํ์ง ์ ํ๋: 94.2%
โข ํ
์คํธ ๋ถ๋ฅ ์ ํ๋: 91.7%
โข ํ๊ท ๋ถ์ ์๊ฐ: 2.1์ด
โข ์ ๋ขฐ๋ ์ ์: 92.3%]
C[๐ฅ ์ฌ์ฉ์ ํ๋ ํํฉ
โข ์ผ์ผ ์ ๊ณ ์: 3,247๊ฑด
โข ์๊ฐ๋๋ณ ๋ถํฌ
โข ์ง์ญ๋ณ ๋ถํฌ ํํธ๋งต
โข ์นดํ
๊ณ ๋ฆฌ๋ณ ํต๊ณ]
end
subgraph "๐ ๋ถ์ ๋ฐ ์ธ์ฌ์ดํธ"
D[๐ ์ง์ญ๋ณ ๋ถ์
โข ํซ์คํ ์ง์ญ ์๋ณ
โข ๋ฐ๋ณต ์ ๊ณ ํจํด
โข ๊ณ์ ๋ณ ํธ๋ ๋
โข ์ํ๋ ์์ธก]
E[โฐ ์๊ฐ๋๋ณ ๋ถ์
โข ํผํฌ ์๊ฐ ์๋ณ
โข ์๋ต ์๊ฐ ์ต์ ํ
โข ๋ฆฌ์์ค ๋ฐฐ๋ถ
โข ์์ธก ๋ชจ๋ธ๋ง]
F[๐ ์นดํ
๊ณ ๋ฆฌ ๋ถ์
โข ์ ๊ณ ์ ํ ํธ๋ ๋
โข ์ฒ๋ฆฌ ํจ์จ์ฑ
โข ๋ง์กฑ๋ ๋ถ์
โข ๊ฐ์ ํฌ์ธํธ ๋์ถ]
end
subgraph "๐ฏ ์ฑ๊ณผ ์งํ (KPI)"
G[โก ํจ์จ์ฑ ์งํ
โข ํ๊ท ํด๊ฒฐ ์๊ฐ: 4.2์๊ฐ
โข ์๋ ๋ถ๋ฅ ์ ํ๋: 95.3%
โข 1์ฐจ ํด๊ฒฐ๋ฅ : 87.6%
โข ๋น์ฉ ์ ๊ฐ๋ฅ : 45%]
H[๐ ๋ง์กฑ๋ ์งํ
โข ์ฌ์ฉ์ ๋ง์กฑ๋: 4.3/5
โข ์ฌ์ฌ์ฉ๋ฅ : 78%
โข ์ถ์ฒ ์ํฅ: 82%
โข ์ฑ ํ์ : 4.5/5]
I[๐ ๊ฐ์ ์งํ
โข AI ํ์ต ์ ํ๋ ํฅ์
โข ์ฒ๋ฆฌ ์๊ฐ ๋จ์ถ
โข ์ค๋ฅ ๊ฐ์์จ
โข ๊ธฐ๋ฅ ๊ฐ์ ์์ฒญ]
end
A --> D
B --> E
C --> F
D --> G
E --> H
F --> I
style A fill:#FF0000,color:#FFFFFF
style B fill:#00AA00,color:#FFFFFF
style C fill:#0066FF,color:#FFFFFF
style D fill:#FF6600,color:#FFFFFF
style E fill:#9900FF,color:#FFFFFF
style F fill:#00AAAA,color:#000000
style G fill:#AA0066,color:#FFFFFF
style H fill:#AAAA00,color:#000000
style I fill:#6600AA,color:#FFFFFF
graph TD
subgraph "๐จ ์ค์๊ฐ ์๋ ์์คํ
"
A1[โ ๏ธ ์๊ณ์น ๋ชจ๋ํฐ๋ง
โข ์๋ต ์๊ฐ > 3์ด
โข ์ค๋ฅ์จ > 1%
โข ์ฒ๋ฆฌ๋ < 1000๊ฑด/์๊ฐ]
A2[๐ง ์๋ ์ ์ก
โข ์ด๋ฉ์ผ ์๋ฆผ
โข SMS ๊ธด๊ธ ์๋ฆผ
โข Slack ์ฑ๋ ์๋ฆผ
โข PagerDuty ์ฐ๋]
A3[๐ง ์๋ ๋ณต๊ตฌ
โข ์๋ฒ ์ฌ์์
โข ๋ก๋๋ฐธ๋ฐ์ฑ ์กฐ์
โข ํธ๋ํฝ ์ฐํ
โข ๋ฐฑ์
์๋ฒ ํ์ฑํ]
end
subgraph "๐ ์ฑ๋ฅ ์ถ์ ๋ฉํธ๋ฆญ"
B1[โก ์๋ต ์๊ฐ
โข P50: 800ms
โข P95: 2.1s
โข P99: 3.5s
โข P99.9: 5.2s]
B2[๐ฏ ์ ํ๋ ๋ฉํธ๋ฆญ
โข Precision: 94.2%
โข Recall: 91.8%
โข F1-Score: 92.9%
โข AUC: 0.96]
B3[๐พ ์์คํ
๋ฆฌ์์ค
โข CPU ์ฌ์ฉ๋ฅ : 68%
โข ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ฅ : 72%
โข ๋์คํฌ I/O: 45%
โข ๋คํธ์ํฌ ์ฒ๋ฆฌ๋: 2.3GB/h]
end
A1 --> A2
A2 --> A3
B1 --> A1
B2 --> A1
B3 --> A1
style A1 fill:#FF4444,color:#FFFFFF
style A2 fill:#FF8800,color:#FFFFFF
style A3 fill:#44AA44,color:#FFFFFF
style B1 fill:#4488FF,color:#FFFFFF
style B2 fill:#8844FF,color:#FFFFFF
style B3 fill:#FF4488,color:#FFFFFF
| ๐ ๋์๋ณด๋ ์์ญ | ๐ ์ฃผ์ ์ฐจํธ | ๐ ์์ธ ์ ๋ณด | ๐ฏ ํ์ฉ ๋ชฉ์ |
|---|---|---|---|
| ์ ๊ณ ํํฉ ์์ฝ | ์ค์๊ฐ ์นด์ดํฐ, ํธ๋ ๋ ๋ผ์ธ | ์๊ฐ๋๋ณ/์ง์ญ๋ณ ๋ถํฌ | ์ด์ ํํฉ ํ์ |
| AI ์ฑ๋ฅ ๋ถ์ | ์ ํ๋ ๊ฒ์ด์ง, ์ฒ๋ฆฌ ์๊ฐ ํ์คํ ๊ทธ๋จ | ๋ชจ๋ธ๋ณ ์ฑ๋ฅ ๋น๊ต | AI ๋ชจ๋ธ ์ต์ ํ |
| ์ง์ญ๋ณ ํํธ๋งต | ์ธํฐ๋ํฐ๋ธ ์ง๋, ํด๋ฌ์คํฐ๋ง | ํซ์คํ ์ง์ญ ์์ธ ๋ถ์ | ์ง์ญ๋ณ ๋์ ์ ๋ต |
| ์ฌ์ฉ์ ์ฌ์ ๋ถ์ | ํผ๋ ์ฐจํธ, ์ดํ๋ฅ ๋ถ์ | ๋จ๊ณ๋ณ ์๋ฃ์จ | UX ๊ฐ์ ํฌ์ธํธ ๋์ถ |
| ์ฒ๋ฆฌ ์ฑ๊ณผ ๋ถ์ | ํด๊ฒฐ ์๊ฐ ๋ถํฌ, ๋ง์กฑ๋ ์ ์ | ๊ธฐ๊ด๋ณ ์ฒ๋ฆฌ ํจ์จ์ฑ | ํ๋ก์ธ์ค ๊ฐ์ |
ai-safety-reporter/
โโโ ๐ app/ # Next.js 14 App Router
โ โโโ ๐ page.tsx # ๋ฉ์ธ ํ์ด์ง
โ โโโ ๐ api/ # API ๋ผ์ฐํธ
โ โ โโโ ๐ reports/ # ์ ๊ณ ๊ด๋ จ API
โ โ โโโ ๐ ai/ # AI ๋ถ์ API
โ โ โโโ ๐ maps/ # ์ง๋ ์๋น์ค API
โ โโโ ๐ globals.css # ์ ์ญ ์คํ์ผ
โโโ ๐ components/ # UI ์ปดํฌ๋ํธ
โ โโโ ๐ ui/ # shadcn/ui ์ปดํฌ๋ํธ
โ โโโ ๐ forms/ # ํผ ์ปดํฌ๋ํธ
โ โโโ ๐ maps/ # ์ง๋ ๊ด๋ จ ์ปดํฌ๋ํธ
โ โโโ ๐ layout/ # ๋ ์ด์์ ์ปดํฌ๋ํธ
โโโ ๐ services/ # ๋น์ฆ๋์ค ๋ก์ง
โ โโโ ๐ reportService.ts # ์ ๊ณ ์๋น์ค
โ โโโ ๐ aiService.ts # AI ๋ถ์ ์๋น์ค
โ โโโ ๐ mapService.ts # ์ง๋ ์๋น์ค
โโโ ๐ lib/ # ์ ํธ๋ฆฌํฐ ํจ์
โ โโโ ๐ apiClient.ts # API ํด๋ผ์ด์ธํธ
โ โโโ ๐ validators.ts # ๋ฐ์ดํฐ ๊ฒ์ฆ
โ โโโ ๐ constants.ts # ์์ ์ ์
โโโ ๐ types/ # TypeScript ํ์
์ ์
โ โโโ ๐ report.ts # ์ ๊ณ ๊ด๋ จ ํ์
โ โโโ ๐ ai.ts # AI ๋ถ์ ํ์
โ โโโ ๐ map.ts # ์ง๋ ๊ด๋ จ ํ์
โโโ ๐ public/ # ์ ์ ๋ฆฌ์์ค
โโโ ๐ icons/ # ์์ด์ฝ ํ์ผ
โโโ ๐ images/ # ์ด๋ฏธ์ง ํ์ผ
# ํ๋ก์ ํธ ์ด๊ธฐํ
npx create-next-app@latest ai-safety-reporter --typescript --tailwind --app
# ํต์ฌ ์์กด์ฑ ์ค์น
npm install @shadcn/ui lucide-react react-hook-form zod
npm install @tanstack/react-query zustand
npm install @google/generative-ai
# ๊ฐ๋ฐ ๋๊ตฌ ์ค์น
npm install -D prettier eslint-config-prettier
npm install -D @types/node @types/react
| ๐ ๏ธ ๊ธฐ์ ์คํ | ๐ ๊ณต์ ๋ฌธ์ | ๐ ํ์ต ๋ฆฌ์์ค |
|---|---|---|
| Next.js 14 | nextjs.org | App Router ๋ง์ด๊ทธ๋ ์ด์ ๊ฐ์ด๋ |
| YOLOv8 | ultralytics.com | Object Detection Tutorial |
| Gemini API | ai.google.dev | Prompt Engineering Guide |
| shadcn/ui | ui.shadcn.com | Component Library Docs |
| Tailwind CSS | tailwindcss.com | Design System Guide |
timeline
title ์๋น์ค ํ์ฅ ๋ก๋๋งต
2025 Q3 : MVP ์ถ์
: ๊ธฐ๋ณธ ์ ๊ณ ๊ธฐ๋ฅ
: AI ๊ฐ์ฒด ํ์ง
: ์ง๋ ์ฐ๋
2025 Q4 : ๊ธฐ๋ฅ ๊ณ ๋ํ
: ์ค์๊ฐ ์๋ฆผ
: ๊ด๋ฆฌ์ ๋์๋ณด๋
: ๋ค๊ตญ์ด ์ง์
2026 Q1 : AI ์ฑ๋ฅ ํฅ์
: ๋ฉํฐ๋ชจ๋ฌ AI
: ์์ธก ๋ถ์
: ์๋ ๋์ ์์คํ
2026 Q2 : ํ๋ซํผ ํ์ฅ
: ๋ชจ๋ฐ์ผ ์ฑ
: API ๊ฐ๋ฐฉ
: ํํธ๋์ญ ์ฐ๋
AI ์์ ์ ๋ฌธ๊ณ ํ๋ก์ ํธ๋ ์ต์ AI ๊ธฐ์ ๊ณผ ์ฌ์ฉ์ ์ค์ฌ ์ค๊ณ๋ฅผ ๊ฒฐํฉํ์ฌ, ์๋ฏผ๋ค์ด ๋ณด๋ค ์ฝ๊ณ ํจ๊ณผ์ ์ผ๋ก ์์ ์ํ์ ์ ๊ณ ํ ์ ์๋ ํ์ ์ ์ธ ํ๋ซํผ์ ์ ๊ณตํฉ๋๋ค.
์ด๋ฌํ ๊ธฐ์ ์ ํ ๋๋ฅผ ๋ฐํ์ผ๋ก, AI ์์ ์ ๋ฌธ๊ณ ๋ ๊ณต๊ณต ์์ ๋ถ์ผ์์ AI ๊ธฐ์ ์ ์๋ก์ด ํ์ฉ ์ฌ๋ก๋ฅผ ์ ์ํ๋ฉฐ, ์๋ฏผ๋ค์ ์์ ํ ์ผ์์ ์ํ ๋์งํธ ์ธํ๋ผ๋ก ์๋ฆฌ์ก์ ๊ฒ์ ๋๋ค.
๐ ๋ฌธ์ ์ ๋ณด
๋ณธ ๋ฌธ์๋ ํ๋ก์ ํธ์ ๊ธฐ์ ์ ๊ตฌํ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ ํฅ์์ ์ํ ์ข ํฉ ๊ฐ์ด๋๋ก ์์ฑ๋์์ต๋๋ค.