# πŸ›οΈ Test Project: Module B β€” ShopPress (온라인 μ‡Όν•‘λͺ°) ## 1. ν”„λ‘œμ νŠΈ κ°œμš” (Project Overview) λΉ λ₯΄κ²Œ μ„±μž₯ν•˜λŠ” 이컀머슀 μ‹œμž₯μ—μ„œ μŠ€νƒ€νŠΈμ—… **ShopPress**λŠ” κ΄€λ¦¬μžκ°€ μƒν’ˆκ³Ό 주문을 직접 μš΄μ˜ν•  수 μžˆλŠ” 자체 μ‡Όν•‘λͺ° ν”Œλž«νΌμ„ λŸ°μΉ­ν•˜λ € ν•©λ‹ˆλ‹€. κ΄€λ¦¬μžλŠ” μƒν’ˆμ„ 등둝/κ΄€λ¦¬ν•˜κ³  주문을 μ²˜λ¦¬ν•˜λ©°, 일반 λ°©λ¬ΈμžλŠ” μƒν’ˆμ„ νƒμƒ‰ν•˜κ³  ꡬ맀할 수 μžˆμŠ΅λ‹ˆλ‹€. λ³Έ κ³Όμ œμ—μ„œ μ„ μˆ˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€ 섀계뢀터 핡심 κΈ°λŠ₯ κ΅¬ν˜„κΉŒμ§€ μ „λ‹΄ν•©λ‹ˆλ‹€. 이 ν”„λ‘œμ νŠΈλŠ” MVPμ΄λ―€λ‘œ 핡심 κΈ°λŠ₯ κ΅¬ν˜„μ— μ§‘μ€‘ν•˜μ‹­μ‹œμ˜€. **λ””μžμΈμ€ 채점 ν•­λͺ©μ΄ μ•„λ‹™λ‹ˆλ‹€.** --- ## 2. 기술 μŠ€νƒ 및 μ œμ•½ 쑰건 (Tech Stack & Constraints) * **기술 μŠ€νƒ**: μ‚¬μš© μ–Έμ–΄ 및 ν”„λ ˆμž„μ›Œν¬μ— μ œν•œμ΄ μ—†μŠ΅λ‹ˆλ‹€. Laravel, Django, Ruby on Rails, Spring Boot λ“± μ„œλ²„ μ‚¬μ΄λ“œ λ Œλ”λ§(SSR)이 κ°€λŠ₯ν•œ ν”„λ ˆμž„μ›Œν¬λ₯Ό 자유둭게 선택할 수 μžˆμŠ΅λ‹ˆλ‹€. * **λ°μŠ€ν¬ν†± ν™˜κ²½**: λ°˜μ‘ν˜• λ””μžμΈμ€ κ΅¬ν˜„ν•˜μ§€ μ•ŠμœΌλ©°, λ°μŠ€ν¬ν†± Chrome λΈŒλΌμš°μ €μ—μ„œλ§Œ λ™μž‘ν•˜λ©΄ λ©λ‹ˆλ‹€. * **이미지 μ—…λ‘œλ“œ**: μƒν’ˆ μ΄λ―Έμ§€λŠ” JPG, PNG ν˜•μ‹λ§Œ ν—ˆμš©ν•˜λ©°, 파일 ν¬κΈ°λŠ” **5MB** μ΄ν•˜λ‘œ μ œν•œλ©λ‹ˆλ‹€. 이 κ²€μ‚¬λŠ” **μ„œλ²„ μΈ‘**μ—μ„œ μˆ˜ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€. * **λ°μ΄ν„°λ² μ΄μŠ€**: μΉ΄ν…Œκ³ λ¦¬λŠ” 별도 ν…Œμ΄λΈ”(`categories`)둜 κ΄€λ¦¬ν•˜κ³ , μƒν’ˆ ν…Œμ΄λΈ”(`products`)은 `category_id`λ₯Ό μ™Έλž˜ ν‚€(FK)둜 μ°Έμ‘°ν•˜λŠ” ꡬ쑰둜 μ„€κ³„ν•˜μ‹­μ‹œμ˜€. * **초기 데이터**: μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 졜초 μ‹€ν–‰ μ‹œ(Seeder λ˜λŠ” Migration) λ‹€μŒ 데이터가 μžλ™μœΌλ‘œ μƒμ„±λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. * κ΄€λ¦¬μž 계정: 이름 `Admin`, 이메일 `admin@shoppress.local`, λΉ„λ°€λ²ˆν˜Έ `password` (λΉ„λ°€λ²ˆν˜ΈλŠ” λ°˜λ“œμ‹œ ν•΄μ‹œν•˜μ—¬ μ €μž₯) * 초기 μΉ΄ν…Œκ³ λ¦¬ 3개 이상 (예: `Clothing`, `Electronics`, `Food`) --- ## 3. 과제 μš”κ΅¬μ‚¬ν•­ (Tasks to Complete) ### **1. 인증 (Authentication)** #### 1.1 둜그인 및 μ„Έμ…˜ 관리 둜그인 νŽ˜μ΄μ§€λŠ” `/admin/login`μ—μ„œ μ ‘κ·Ό κ°€λŠ₯ν•©λ‹ˆλ‹€. μ‚¬μš©μžλŠ” 이메일과 λΉ„λ°€λ²ˆν˜Έλ₯Ό μž…λ ₯ν•©λ‹ˆλ‹€. 둜그인 성곡 μ‹œ κ΄€λ¦¬μž λŒ€μ‹œλ³΄λ“œλ‘œ μ΄λ™ν•©λ‹ˆλ‹€. 둜그인 μ‹€νŒ¨ μ‹œ **"Incorrect email or password."** λ©”μ‹œμ§€λ₯Ό ν‘œμ‹œν•©λ‹ˆλ‹€. `/admin` ν•˜μœ„ κ²½λ‘œμ— 둜그인 없이 μ ‘κ·Όν•˜λ©΄ 둜그인 νŽ˜μ΄μ§€λ‘œ λ¦¬λ‹€μ΄λ ‰νŠΈλ©λ‹ˆλ‹€. λ‘œκ·Έμ•„μ›ƒ μ‹œ μ„Έμ…˜μ΄ 파기되고 둜그인 νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•©λ‹ˆλ‹€. ν˜„μž¬ λ‘œκ·ΈμΈν•œ κ΄€λ¦¬μž 이름은 λͺ¨λ“  κ΄€λ¦¬μž νŽ˜μ΄μ§€μ˜ λ‚΄λΉ„κ²Œμ΄μ…˜μ— ν‘œμ‹œλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. --- ### **2. κ΄€λ¦¬μž κΈ°λŠ₯ (Admin Features)** #### 2.1 λŒ€μ‹œλ³΄λ“œ λŒ€μ‹œλ³΄λ“œλŠ” κ΄€λ¦¬μž νŒ¨λ„μ˜ κΈ°λ³Έ νŽ˜μ΄μ§€(`/admin` λ˜λŠ” `/admin/dashboard`)이며, 둜그인 ν›„ 첫 번째둜 ν‘œμ‹œλ˜λŠ” νŽ˜μ΄μ§€μž…λ‹ˆλ‹€. λŒ€μ‹œλ³΄λ“œμ—λŠ” λ‹€μŒ 4κ°€μ§€ 톡계λ₯Ό μΉ΄λ“œ ν˜•νƒœλ‘œ ν‘œμ‹œν•˜μ‹­μ‹œμ˜€. | μΉ΄λ“œ λ ˆμ΄λΈ” | λ‚΄μš© | | :--- | :--- | | **Total Products** | 전체 μƒν’ˆ 수 | | **Active Products** | μƒνƒœκ°€ `Active`인 μƒν’ˆ 수 | | **Total Orders** | 전체 μ£Όλ¬Έ 수 | | **Total Revenue** | 전체 λˆ„μ  μ£Όλ¬Έ κΈˆμ•‘(쿠폰 할인 적용 ν›„ μ΅œμ’… 결제 κΈˆμ•‘ ν•©μ‚° κΈ°μ€€) | λ˜ν•œ κ°€μž₯ 졜근 μ ‘μˆ˜λœ μ£Όλ¬Έ 5건의 λͺ©λ‘μ„ ν‘œμ‹œν•˜μ‹­μ‹œμ˜€. 각 ν•­λͺ©μ—λŠ” Order #(주문번호), Customer(ꡬ맀자λͺ…), Total(μ΅œμ’… κΈˆμ•‘), Status(μ£Όλ¬Έμƒνƒœ), Date(μ£Όλ¬ΈμΌμ‹œ)κ°€ ν¬ν•¨λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. #### 2.2 μƒν’ˆ 관리 μƒν’ˆ 관리 νŽ˜μ΄μ§€(`/admin/products`)λŠ” 전체 μƒν’ˆ λͺ©λ‘μ„ ν…Œμ΄λΈ”λ‘œ ν‘œμ‹œν•©λ‹ˆλ‹€. ν…Œμ΄λΈ” 컬럼: **Name**, **Category**, **Price**, **Stock**, **Status**, **Created At**, Edit / Delete buttons. μƒν’ˆλͺ…을 κΈ°μ€€μœΌλ‘œ 검색할 수 μžˆλŠ” 검색창을 μ œκ³΅ν•˜μ‹­μ‹œμ˜€. 검색어λ₯Ό μž…λ ₯ν•˜κ³  μ œμΆœν•˜λ©΄ ν•΄λ‹Ή ν‚€μ›Œλ“œκ°€ ν¬ν•¨λœ μƒν’ˆλ§Œ λͺ©λ‘μ— ν‘œμ‹œλ©λ‹ˆλ‹€. **μƒν’ˆ 등둝 폼** (`/admin/products/new`)κ³Ό **μƒν’ˆ μˆ˜μ • 폼** (`/admin/products/{id}/edit`)은 λ‹€μŒ ν•„λ“œλ₯Ό 포함해야 ν•©λ‹ˆλ‹€. * **Name** (ν•„μˆ˜, μ΅œλŒ€ 100자) * **Category** (ν•„μˆ˜, λ“œλ‘­λ‹€μš΄ 선택 β€” DB에 λ“±λ‘λœ μΉ΄ν…Œκ³ λ¦¬ λͺ©λ‘μœΌλ‘œ ꡬ성) * **Price** (ν•„μˆ˜, μ •μˆ˜, 0 이상) * **Stock** (ν•„μˆ˜, μ •μˆ˜, 0 이상) * **Description** (`