# πŸ† WSC2026 Test Project - Web Technologies ## **Module D: AI-Powered Global City Explorer (Full-stack Integration)** ### **1. 과제 κ°œμš” (Project Overview)** 당신은 'Global City Explorer' ν”Œλž«νΌμ˜ ν’€μŠ€νƒ κ°œλ°œμžμž…λ‹ˆλ‹€. 사내 AI μ—”μ§€λ‹ˆμ–΄λ§ νŒ€μ΄ 둜컬 AI λͺ¨λΈ(Ollama)을 ν™œμš©ν•˜μ—¬ λ„μ‹œμ˜ ν…μŠ€νŠΈ 정보와 μ΄λ―Έμ§€μ˜ ν‚€μ›Œλ“œλ₯Ό 뢄석해 μ£ΌλŠ” **'AI λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€(AI Middleware Server)'**λ₯Ό κ°œλ°œν•˜μ—¬ Starter Kit으둜 μ œκ³΅ν–ˆμŠ΅λ‹ˆλ‹€. λ‹Ήμ‹ μ˜ μž„λ¬΄λŠ” 제곡된 AI μ„œλ²„λ₯Ό κ΅¬λ™ν•˜κ³  APIλ₯Ό λͺ…ν™•νžˆ λΆ„μ„ν•œ λ’€, κ΄€λ¦¬μžκ°€ λ„μ‹œ 정보λ₯Ό 등둝, 쑰회, **μˆ˜μ • 및 μ‚­μ œ(CRUD)** ν•  수 μžˆλŠ” κ³ λ„ν™”λœ **ν”„λ‘ νŠΈμ—”λ“œ(UI)**와 μ—„κ²©ν•œ μœ νš¨μ„± 검사λ₯Ό ν†΅κ³Όν•œ λ°μ΄ν„°λ§Œ μ•ˆμ „ν•˜κ²Œ μ²˜λ¦¬ν•˜λŠ” **λ°±μ—”λ“œ(DB Storage)**λ₯Ό μ™„λ²½ν•˜κ²Œ κ΅¬μΆ•ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. --- ### **2. 인프라 ꡬ좕 방법 (Infrastructure Setup)** 과제λ₯Ό μˆ˜ν–‰ν•˜κΈ° μ „, 둜컬 PCκ°€ AI λͺ¨λΈκ³Ό Node.js μ„œλ²„λ₯Ό κ΅¬λ™ν•˜κΈ° μœ„ν•œ μš”κ΅¬μ‚¬ν•­μ„ μΆ©μ‘±ν•˜λŠ”μ§€ ν™•μΈν•˜κ³  ν™˜κ²½μ„ μ„ΈνŒ…ν•΄μ•Ό ν•©λ‹ˆλ‹€. #### **2.1. ν•˜λ“œμ›¨μ–΄ ꢌμž₯ 사양 (Hardware Requirements)** 둜컬 ν™˜κ²½μ—μ„œ 두 개의 AI λͺ¨λΈμ„ μ›ν™œν•˜κ²Œ κ΅¬λ™ν•˜κΈ° μœ„ν•΄ μ•„λž˜ 사양을 ꢌμž₯ν•©λ‹ˆλ‹€. * **Memory (RAM):** μ΅œμ†Œ 8GB / ꢌμž₯ 16GB 이상 (두 λͺ¨λΈμ΄ λ©”λͺ¨λ¦¬μ— μ μž¬λ˜μ–΄μ•Ό ν•˜λ―€λ‘œ RAM μš©λŸ‰μ΄ μ€‘μš”ν•©λ‹ˆλ‹€.) * **GPU:** VRAM 6GB μ΄μƒμ˜ NVIDIA GPU ꢌμž₯ (CPUλ‘œλ„ ꡬ동은 κ°€λŠ₯ν•˜λ‚˜, 이미지 뢄석 μ‹œ 처리 μ‹œκ°„μ΄ λ‹€μ†Œ 지연될 수 μžˆμŠ΅λ‹ˆλ‹€.) * **Storage:** μ΅œμ†Œ 10GB μ΄μƒμ˜ μ—¬μœ  곡간 (HDD보닀 SSD μ‚¬μš©μ„ κ°•λ ₯히 ꢌμž₯ν•©λ‹ˆλ‹€.) #### **2.2. Node.js 확인 및 μ„€μΉ˜** λ°±μ—”λ“œ 미듀웨어λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ Node.js ν™˜κ²½μ΄ ν•„μš”ν•©λ‹ˆλ‹€. 1. 터미널(λ˜λŠ” λͺ…λ Ή ν”„λ‘¬ν”„νŠΈ)을 μ—΄κ³  `node -v`λ₯Ό μž…λ ₯ν•˜μ—¬ μ„€μΉ˜ μ—¬λΆ€λ₯Ό ν™•μΈν•©λ‹ˆλ‹€. (`v18.x.x` μ΄μƒμ˜ 버전이 ν‘œμΆœλ˜λ©΄ μ •μƒμž…λ‹ˆλ‹€.) 2. **λ―Έμ„€μΉ˜ μ‹œ:** [Node.js 곡식 ν™ˆνŽ˜μ΄μ§€(nodejs.org)](https://nodejs.org/)에 μ ‘μ†ν•˜μ—¬ LTS(Long Term Support) 버전을 λ‹€μš΄λ‘œλ“œν•˜κ³  μ„€μΉ˜ν•˜μ‹­μ‹œμ˜€. #### **2.3. Ollama (AI ꡬ동 μ—”μ§„) 확인 및 μ„€μΉ˜** 1. 터미널을 μ—΄κ³  `ollama -v`λ₯Ό μž…λ ₯ν•˜μ—¬ 버전 정보가 λ‚˜μ˜€λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. 2. **λ―Έμ„€μΉ˜ μ‹œ:** Windows의 경우 **PowerShell**을 κ΄€λ¦¬μž κΆŒν•œμœΌλ‘œ μ‹€ν–‰ν•œ λ’€, μ•„λž˜ λͺ…λ Ήμ–΄λ₯Ό λΆ™μ—¬λ„£μ–΄ μ„€μΉ˜λ₯Ό μ§„ν–‰ν•˜μ‹­μ‹œμ˜€. `irm https://ollama.com/install.ps1 | iex` *(μ„€μΉ˜κ°€ μ™„λ£Œλ˜λ©΄ 터미널을 μž¬μ‹œμž‘ν•΄μ•Ό ν™˜κ²½λ³€μˆ˜κ°€ μ μš©λ©λ‹ˆλ‹€.)* #### **2.4. AI λͺ¨λΈ λ‹€μš΄λ‘œλ“œ 및 νŠΉμ§•** 터미널을 μ—΄κ³  μ•„λž˜ λͺ…λ Ήμ–΄λ₯Ό 순차적으둜 μ‹€ν–‰ν•˜μ—¬ λ³Έ κ³Όμ œμ— μ‚¬μš©ν•  2개의 AI λͺ¨λΈμ„ λ‹€μš΄λ‘œλ“œν•©λ‹ˆλ‹€. (`ollama list` λͺ…λ Ήμ–΄λ‘œ μ„€μΉ˜ μ™„λ£Œ 확인) * **ν…μŠ€νŠΈ 처리 λͺ¨λΈ λ‹€μš΄λ‘œλ“œ:** `ollama pull phi3` * **[λͺ¨λΈ νŠΉμ§•]:** Microsoftμ—μ„œ κ°œλ°œν•œ μ΄ˆκ²½λŸ‰ μ–Έμ–΄ λͺ¨λΈ(SLM)μž…λ‹ˆλ‹€. 가볍고 λΉ λ₯΄λ©΄μ„œλ„ ν›Œλ₯­ν•œ λ¬Έμž₯ 생성 및 논리적 μΆ”λ‘  λŠ₯λ ₯을 κ°–μΆ”κ³  μžˆμ–΄ λ„μ‹œμ˜ μ†Œκ°œκΈ€μ„ μž‘μ„±ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. * **λΉ„μ „(이미지) 처리 λͺ¨λΈ λ‹€μš΄λ‘œλ“œ:** `ollama pull llava` * **[λͺ¨λΈ νŠΉμ§•]:** ν…μŠ€νŠΈλΏλ§Œ μ•„λ‹ˆλΌ '눈(Vision)'을 κ°€μ§„ λ©€ν‹°λͺ¨λ‹¬(Multimodal) AIμž…λ‹ˆλ‹€. μ‚¬μš©μžκ°€ μ—…λ‘œλ“œν•œ λͺ…μ†Œ 이미지λ₯Ό λΆ„μ„ν•˜μ—¬ κ·Έ μ•ˆμ˜ κ°μ²΄λ‚˜ 풍경을 μ„€λͺ…ν•˜κ³  핡심 ν‚€μ›Œλ“œλ₯Ό μΆ”μΆœν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€. --- ### **3. AI Middleware Server μ„€μΉ˜ 및 μ‹€ν–‰** 제곡된 Starter Kit μ•ˆμ—λŠ” AI μ—”μ§€λ‹ˆμ–΄λ§ νŒ€μ΄ μž‘μ„±ν•œ `ai-api` 폴더가 μžˆμŠ΅λ‹ˆλ‹€. 이 폴더 μ•ˆμ—λŠ” `server.js`와 `package.json`이 ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. **(🚨 주의: 이 μ„œλ²„μ˜ μ½”λ“œλŠ” μ ˆλŒ€ μˆ˜μ •ν•˜μ§€ λ§ˆμ‹­μ‹œμ˜€.)** 1. 터미널을 μ—΄κ³  제곡된 `ai-api` 폴더 경둜둜 μ΄λ™ν•©λ‹ˆλ‹€. 2. μ•„λž˜ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•˜μ—¬ ν•„μˆ˜ νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•©λ‹ˆλ‹€. `npm install` 3. μ„€μΉ˜κ°€ μ™„λ£Œλ˜λ©΄ μ„œλ²„λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€. `npm start` 4. 터미널에 `πŸš€ AI Middleware Server running on http://localhost:3000` λ©”μ‹œμ§€κ°€ 좜λ ₯되면 μ„œλ²„κ°€ 정상 μž‘λ™ 쀑인 κ²ƒμž…λ‹ˆλ‹€. 이 터미널은 κ³Όμ œκ°€ 끝날 λ•ŒκΉŒμ§€ λ‹«μ§€ λ§ˆμ‹­μ‹œμ˜€. --- ### **4. HOPPSCOTCHλ₯Ό ν™œμš©ν•œ API ν…ŒμŠ€νŠΈ** 본격적인 κ°œλ°œμ— μ•žμ„œ, Hoppscotch(λ˜λŠ” Postman)λ₯Ό μ΄μš©ν•˜μ—¬ 제곡된 두 개의 APIκ°€ μ–΄λ–€ ν˜•νƒœμ˜ 데이터λ₯Ό λ°˜ν™˜ν•˜λŠ”μ§€ λ°˜λ“œμ‹œ ν…ŒμŠ€νŠΈν•˜μ‹­μ‹œμ˜€. * **API 1: ν…μŠ€νŠΈ 정보 생성 (`POST /api/generate-text`)** * Body (`application/json`): `{"city_name": "Paris", "country": "France"}` ![ν…μŠ€νŠΈ 정보 생성 ν…ŒμŠ€νŠΈ ν™”λ©΄](generate-text.png) * **API 2: 이미지 톡합 뢄석 (`POST /api/analyze-image`)** * Body (`multipart/form-data`): `city_name` (Text), `country` (Text), `image` (File ν˜•μ‹μœΌλ‘œ 이미지 μ—…λ‘œλ“œ) ![이미지 톡합 뢄석 ν…ŒμŠ€νŠΈ ν™”λ©΄](analyze-image.png) --- ### **5. μ„ μˆ˜λ“€μ΄ λ§Œλ“€μ–΄μ•Ό ν•  과제 (Tasks to Complete)** #### **5.1. Front-end μš”κ΅¬μ‚¬ν•­ (Advanced UI/UX)** κ΄€λ¦¬μžκ°€ μ‚¬μš©ν•  `index.html` (λ˜λŠ” SPA ν”„λ ˆμž„μ›Œν¬) 화면을 κ΅¬μΆ•ν•˜μ‹­μ‹œμ˜€. 화면은 크게 **'정보 등둝/μˆ˜μ • μ˜μ—­'**κ³Ό **'λ“±λ‘λœ λͺ©λ‘ 쑰회 μ˜μ—­'**으둜 λ‚˜λ‰˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. * **[정보 등둝 및 μˆ˜μ • μ˜μ—­ (Form Area)]** * **이미지 미리보기 (Image Preview):** ``을 톡해 이미지λ₯Ό μ„ νƒν•˜λ©΄, μ„œλ²„μ— μ „μ†‘ν•˜κΈ° μ „ 화면에 μ¦‰μ‹œ 이미지 썸넀일이 미리보기둜 ν‘œμ‹œλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. * **AI 데이터 연동:** λ„μ‹œλͺ…/κ΅­κ°€λͺ… μž…λ ₯ ν›„ AI ν…μŠ€νŠΈ 생성 APIλ₯Ό ν˜ΈμΆœν•˜κ³ , 사진 등둝 ν›„ AI λΉ„μ „ 뢄석 APIλ₯Ό ν˜ΈμΆœν•˜μ—¬ λ°˜ν™˜λœ 데이터λ₯Ό 폼(Form)에 μ±„μš°μ‹­μ‹œμ˜€. * **μ™„λ²½ν•œ 비동기 μƒνƒœ 관리 (Form Lock & Loading):** 무거운 AI 뢄석 μž‘μ—…(10~30초 μ†Œμš”)이 μ§„ν–‰λ˜λŠ” λ™μ•ˆ μ‚¬μš©μžμ˜ 쀑볡 클릭 및 였λ₯˜λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ **λͺ¨λ“  μž…λ ₯ 폼과 λ²„νŠΌμ„ λΉ„ν™œμ„±ν™”(Disabled)** μ²˜λ¦¬ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ˜ν•œ μž‘μ—… μ§„ν–‰ μƒνƒœλ₯Ό λͺ…ν™•νžˆ μ•Œ 수 μžˆλŠ” λ‘œλ”© UI(μŠ€ν”Όλ„ˆ μ• λ‹ˆλ©”μ΄μ…˜, ν”„λ‘œκ·Έλ ˆμŠ€ λ°” λ“±)λ₯Ό 화면에 ν‘œμ‹œν•˜μ—¬ μ‚¬μš©μž κ²½ν—˜μ„ μ΅œμ ν™”ν•˜μ‹­μ‹œμ˜€. * **정보 μˆ˜μ • 및 AI λ‹€μ‹œ 뢈러였기 (Re-fetch):** * λͺ©λ‘μ—μ„œ νŠΉμ • λ„μ‹œμ˜ 'μˆ˜μ •' λ²„νŠΌμ„ λˆ„λ₯΄λ©΄ ν•΄λ‹Ή λ„μ‹œμ˜ 데이터가 폼에 μ±„μ›Œμ Έμ•Ό ν•©λ‹ˆλ‹€. * μˆ˜μ • νΌμ—λŠ” **'AIμ—μ„œ λͺ¨λ“  정보 λ‹€μ‹œ 뢈러였기'** λ²„νŠΌμ΄ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. 이 λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄ ν˜„μž¬ 폼에 μžˆλŠ” λ„μ‹œ, κ΅­κ°€, 이미지 데이터λ₯Ό λ°”νƒ•μœΌλ‘œ AI API 두 개λ₯Ό λ‹€μ‹œ ν˜ΈμΆœν•˜κ³ , 폼의 ν…μŠ€νŠΈ κ°’λ“€(μ„€λͺ…, ν‚€μ›Œλ“œ λ“±)을 μ™„μ „νžˆ μƒˆλ‘œμš΄ AI μ‘λ‹΅μœΌλ‘œ ꡐ체해야 ν•©λ‹ˆλ‹€. 이후 μ‚¬μš©μžκ°€ 'μ΅œμ’… μˆ˜μ •' λ²„νŠΌμ„ λˆ„λ₯΄λ©΄ μ—…λ°μ΄νŠΈλ©λ‹ˆλ‹€. * **[λͺ©λ‘ 쑰회 및 필터링 μ˜μ—­ (List & Interactive Filtering)]** * μ΅œμ’… μ €μž₯된 κΈ€λ‘œλ²Œ λ„μ‹œ 정보듀을 DBμ—μ„œ λΆˆλŸ¬μ™€ 리슀트(List) λ˜λŠ” μΉ΄λ“œ(Card) 가러리 ν˜•νƒœλ‘œ λ Œλ”λ§ν•˜μ‹­μ‹œμ˜€. 각 μ•„μ΄ν…œμ—λŠ” **'μˆ˜μ •(Edit)'** 및 **'μ‚­μ œ(Delete)'** λ²„νŠΌμ΄ ν¬ν•¨λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. * **데이터 μ‚­μ œ (Delete):** 'μ‚­μ œ' λ²„νŠΌ 클릭 μ‹œ, μ‹€μˆ˜λ‘œ μ‚­μ œν•˜λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ λΈŒλΌμš°μ €μ˜ κΈ°λ³Έ `confirm` μ°½μ΄λ‚˜ μ»€μŠ€ν…€ λͺ¨λ‹¬(Modal) 창으둜 확인을 거친 ν›„ DBμ—μ„œ 데이터λ₯Ό μ‚­μ œν•˜κ³  λͺ©λ‘μ„ μ¦‰μ‹œ κ°±μ‹ ν•˜μ‹­μ‹œμ˜€. * **ν•΄μ‹œνƒœκ·Έ 필터링:** λͺ©λ‘μ— ν‘œμ‹œλœ νŠΉμ • ν‚€μ›Œλ“œ(예: `#μ—νŽ νƒ‘`)λ₯Ό ν΄λ¦­ν•˜λ©΄, 전체 λͺ©λ‘μ΄ μ¦‰μ‹œ ν•„ν„°λ§λ˜μ–΄ ν•΄λ‹Ή ν‚€μ›Œλ“œλ₯Ό λ³΄μœ ν•œ λ„μ‹œ μΉ΄λ“œλ“€λ§Œ 화면에 λ…ΈμΆœλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. #### **5.2. Back-end μš”κ΅¬μ‚¬ν•­ (DB 및 Server-side Validation)** λ°μ΄ν„°μ˜ 생성(Create), 쑰회(Read), μˆ˜μ •(Update), μ‚­μ œ(Delete)λ₯Ό μ™„λ²½ν•˜κ²Œ μ²˜λ¦¬ν•˜λŠ” 본인만의 λ°±μ—”λ“œ μ„œλ²„μ™€ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό κ΅¬μΆ•ν•˜μ‹­μ‹œμ˜€. * **DB μŠ€ν‚€λ§ˆ:** MySQL/MariaDB에 `city_contents` ν…Œμ΄λΈ”μ„ 직접 μ„€κ³„ν•˜μ—¬ μƒμ„±ν•˜μ‹­μ‹œμ˜€. * **API κ΅¬ν˜„ (CRUD):** 1. **GET (쑰회):** DB에 μ €μž₯된 전체 데이터λ₯Ό JSON ν˜•νƒœλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€. 2. **POST (생성):** μƒˆλ‘œμš΄ 데이터λ₯Ό DB에 `INSERT` ν•˜κ³  이미지λ₯Ό μ—…λ‘œλ“œ 폴더에 물리적으둜 μ €μž₯ν•©λ‹ˆλ‹€. 3. **PUT λ˜λŠ” PATCH (μˆ˜μ •):** νŠΉμ • ID의 데이터λ₯Ό μˆ˜μ •ν•©λ‹ˆλ‹€. (μƒˆλ‘œμš΄ 이미지가 μ „μ†‘λ˜μ—ˆλ‹€λ©΄ κΈ°μ‘΄ 이미지 νŒŒμΌμ„ κ΅μ²΄ν•˜κ±°λ‚˜ μƒˆλ‘œμš΄ 경둜λ₯Ό μ—…λ°μ΄νŠΈν•΄μ•Ό ν•©λ‹ˆλ‹€.) 4. **DELETE (μ‚­μ œ):** νŠΉμ • ID의 데이터λ₯Ό DBμ—μ„œ μ‚­μ œν•©λ‹ˆλ‹€. * **μ €μž₯/μˆ˜μ • 둜직의 λ³΄μ•ˆ 검사 (Server-side Validation):** POST 및 PUT/PATCH μš”μ²­ μ‹œ, μ•„λž˜μ˜ μœ νš¨μ„± 검사λ₯Ό λ°˜λ“œμ‹œ ν†΅κ³Όν•œ λ°μ΄ν„°λ§Œ μ„œλ²„μ— μ €μž₯ν•΄μ•Ό ν•©λ‹ˆλ‹€. 1. **파일 μš©λŸ‰ μ œν•œ:** μ—…λ‘œλ“œλœ 이미지 파일이 **5MB**λ₯Ό μ΄ˆκ³Όν•  경우 처리λ₯Ό κ±°λΆ€ν•˜κ³  HTTP μƒνƒœ μ½”λ“œ 400(Bad Request)κ³Ό ν•¨κ»˜ μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. 2. **ν™•μž₯자 검사:** ν—ˆμš©λœ 이미지 포맷(`.jpg`, `.jpeg`, `.png`, `.webp`)이 아닐 경우 μ €μž₯을 κ±°λΆ€ν•΄μ•Ό ν•©λ‹ˆλ‹€. #### **5.3. 기타 μš”κ΅¬μ‚¬ν•­ (함정 및 평가 포인트)** * **데이터 νŒŒμ‹±(Parsing):** λΉ„μ „ API의 응닡 쀑 `keywords`λŠ” 순수 배열이 μ•„λ‹Œ **JSON 포맷으둜 감싸진 ν…μŠ€νŠΈ λ¬Έμžμ—΄(Stringified Array)**둜 λ°˜ν™˜λ©λ‹ˆλ‹€. 이λ₯Ό 화면에 κΉ”λ”ν•œ νƒœκ·Έλ‘œ λ Œλ”λ§ν•˜κΈ° μœ„ν•΄ ν”„λ‘ νŠΈμ—”λ“œμ—μ„œ λ°˜λ“œμ‹œ μ μ ˆν•œ νŒŒμ‹±(`JSON.parse`) 과정을 거쳐야 ν•©λ‹ˆλ‹€. * **μ˜ˆμ™Έ 처리:** λ°±μ—”λ“œ μœ νš¨μ„± 검사 μ‹€νŒ¨ μ‹œ(예: μš©λŸ‰ 초과) ν”„λ‘ νŠΈμ—”λ“œ ν”„λ‘œκ·Έλž¨μ΄ λ©ˆμΆ”μ§€ μ•Šκ³ , 캐치(Catch)ν•˜μ—¬ μ‚¬μš©μžμ—κ²Œ `alert` λ˜λŠ” λͺ¨λ‹¬ 창으둜 λͺ…ν™•νžˆ μ•ˆλ‚΄ν•΄μ•Ό ν•©λ‹ˆλ‹€. --- ### **6. μ„ μˆ˜ μž‘μ—… μ•ˆλ‚΄ (Competitor Workspace Guide)** * **AI Middleware μ‹€ν–‰ μœ„μΉ˜:** 제곡된 `ai-api` 폴더. (터미널 1μ—μ„œ μ‹€ν–‰ ν›„ 방치) * **μ„ μˆ˜ μž‘μ—… μœ„μΉ˜:** 본인의 μ›Ή μ„œλ²„ 루트 폴더(예: `http://localhost/module-d/`). * **평가 μ€€λΉ„:** 과제 μ’…λ£Œ μ‹œμ μ—λŠ” AI Middleware 터미널과 μ„ μˆ˜κ°€ μž‘μ„±ν•œ μ›Ή μ„œλ²„κ°€ λͺ¨λ‘ μ‹€ν–‰ 쀑이어야 ν•©λ‹ˆλ‹€. μ‹¬μ‚¬μœ„μ›(Expert)은 λΈŒλΌμš°μ €λ₯Ό 톡해 μ ‘μ†ν•˜μ—¬ μ•„λž˜ 사이클을 순차적으둜 ν…ŒμŠ€νŠΈν•  κ²ƒμž…λ‹ˆλ‹€. 1. 5MB 초과 이미지 μ—…λ‘œλ“œ μ‹œλ„ (μ—λŸ¬ 처리 확인) 2. 정상 데이터 생성 (Create) 3. λͺ©λ‘ 쑰회 및 ν•΄μ‹œνƒœκ·Έ 클릭 필터링 (Read & Filter) 4. **'μˆ˜μ •' λ²„νŠΌ 클릭 ν›„ 'AI λ‹€μ‹œ 뢈러였기'λ₯Ό ν†΅ν•œ λ‚΄μš© κ°±μ‹  및 μ €μž₯ (Update)** 5. **'μ‚­μ œ' λ²„νŠΌ 클릭을 ν†΅ν•œ 데이터 μ™„μ „ μ‚­μ œ (Delete)** --- ### **7. Appendix: ν…ŒμŠ€νŠΈμš© 제곡 데이터 (Sample Data)** ν…ŒμŠ€νŠΈ 및 μ΅œμ’… μ‹œμ—°μ„ μœ„ν•΄ μ•„λž˜μ˜ λ„μ‹œ/κ΅­κ°€ λͺ©λ‘μ„ ν™œμš©ν•˜μ‹­μ‹œμ˜€. **과제 ν…ŒμŠ€νŠΈμš© λͺ…μ†Œ μ΄λ―Έμ§€λŠ” 제곡된 Starter Kit λ‚΄μ˜ `sample-images` 폴더에 μ€€λΉ„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.** (특히 5MBκ°€ λ„˜λŠ” 고해상도 이미지λ₯Ό ν•˜λ‚˜ μ€€λΉ„ν•˜μ—¬ λ°±μ—”λ“œ λ°©μ–΄ λ‘œμ§μ„ ν…ŒμŠ€νŠΈν•˜μ‹­μ‹œμ˜€.) | λ„μ‹œλͺ… (City) | κ΅­κ°€λͺ… (Country) | λŒ€ν‘œ λͺ…μ†Œ | | :--- | :--- | :--- | | **Paris** | France | μ—νŽ νƒ‘, 루브λ₯΄ λ°•λ¬Όκ΄€ | | **Seoul** | South Korea | 경볡ꢁ, Nμ„œμšΈνƒ€μ›Œ | | **Tokyo** | Japan | 도쿄 νƒ€μ›Œ, μ‹œλΆ€μ•Ό ꡐ차둜 | | **New York** | USA | 자유의 여신상, νƒ€μž„μŠ€ν€˜μ–΄ | | **Rome** | Italy | μ½œλ‘œμ„Έμ›€, νŠΈλ ˆλΉ„ λΆ„μˆ˜ | | **Sydney** | Australia | 였페라 ν•˜μš°μŠ€, ν•˜λ²„ λΈŒλ¦Ώμ§€ | | **Cairo** | Egypt | 기자 ν”ΌλΌλ―Έλ“œ, μŠ€ν•‘ν¬μŠ€ | | **London** | UK | λΉ… λ²€, 런던 아이 | --- ### **8. Mark Summary (채점 μš”μ•½ν‘œ - Total 25 Marks)** 이 ν‘œλŠ” 평가 μΉ΄ν…Œκ³ λ¦¬λ³„ 배점 μš”μ•½μž…λ‹ˆλ‹€. μ„ΈλΆ€ 채점 κΈ°μ€€(Marking Scheme)은 λ³„λ„λ‘œ μ œκ³΅λ©λ‹ˆλ‹€. | Category | Description | Max Marks | | :--- | :--- | :---: | | **A. Front-end UI & UX** | UI ꡬ성, 비동기 μƒνƒœ 관리(λ‘œλ”©/잠금), 데이터 바인딩 및 νŒŒμ‹± 처리 | 7 | | **B. Data Interaction** | 데이터 λͺ©λ‘ λ Œλ”λ§ 및 ν•΄μ‹œνƒœκ·Έ 기반 필터링 κΈ°λŠ₯ | 5 | | **C. Back-end CRUD API** | λ°μ΄ν„°λ² μ΄μŠ€ 및 파일 μ‹œμŠ€ν…œ 기반의 생성, 쑰회, μˆ˜μ •(AI λ‹€μ‹œ 뢈러였기 포함), μ‚­μ œ κΈ°λŠ₯ | 8 | | **D. Security & Validation**| μ„œλ²„ μΈ‘ 파일 μš©λŸ‰ 및 ν™•μž₯자 검사, ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ μ˜ˆμ™Έ 처리 | 5 | | **Total Marks** | | **25** |