๐ธ ๋ก์ปฌ ๋ฎค์ง ํ์คํฐ๋ฒ ์ํฐ์คํธ ๋ผ์ธ์ ์๊ฐ ํ์ด์ง
music-festival-artist-showcase
๋ฌธ์ ์ค๋ช
๐ต ํ๋ก์ ํธ ๊ฐ์
์์ ํ์คํฐ๋ฒ์ ์ถ์ฐ ์ํฐ์คํธ๋ฅผ ์๊ฐํ๋ ๋งค๋ ฅ์ ์ธ ์น ํ์ด์ง๋ฅผ ๋ง๋ญ๋๋ค. ๊ฐ ์ํฐ์คํธ์ ํ๋กํ, ๊ณต์ฐ ์๊ฐ, ์ฅ๋ฅด, ๋ํ๊ณก์ ํ๋์ ๋ณผ ์ ์์ผ๋ฉฐ, ๋ฐฉ๋ฌธ์๊ฐ ๊ด์ฌ ์๋ ์ํฐ์คํธ์๊ฒ '์ข์์'๋ฅผ ๋จ๊ธธ ์ ์์ต๋๋ค.
โจ ํ์ ๊ธฐ๋ฅ
- ์ํฐ์คํธ ๋ชฉ๋ก ํ์ด์ง: ํ์คํฐ๋ฒ ์ถ์ฐ์ง ์ ์ฒด ๋ฆฌ์คํธ (์นด๋ ํ์)
- ์ํฐ์คํธ ์์ธ ํ์ด์ง: ํ๋กํ ์ฌ์ง, ์๊ฐ, ๊ณต์ฐ ์๊ฐ, ์ฅ๋ฅด, ๋ํ๊ณก ๋ฆฌ์คํธ
- ์ข์์ ๊ธฐ๋ฅ: ๊ฐ ์ํฐ์คํธ์๊ฒ ์ข์์ ๋ฒํผ ํด๋ฆญ (๋ก๊ทธ์ธ ์์ด ๊ฐ๋ฅ, ์ฟ ํค ๊ธฐ๋ฐ)
- ์ฅ๋ฅด ํํฐ๋ง: ๋ก, ์ฌ์ฆ, ํํฉ, ์ผ๋ ํธ๋ก๋ ๋ฑ ์ฅ๋ฅด๋ณ๋ก ์ํฐ์คํธ ํํฐ
- ๊ณต์ฐ ์ผ์ ํ์๋ผ์ธ: ๋ ์ง/์๊ฐ๋ณ๋ก ์ํฐ์คํธ ๊ณต์ฐ ์ค์ผ์ค ๋ณด๊ธฐ
- ๋ฐ์ํ ๋์์ธ: ๋ชจ๋ฐ์ผ/ํ๋ธ๋ฆฟ/๋ฐ์คํฌํฑ ๋ชจ๋ ์ต์ ํ
๐ ๋ณด๋์ค ๊ธฐ๋ฅ
- ์ํฐ์คํธ ๊ฒ์ ๊ธฐ๋ฅ (์ด๋ฆ์ผ๋ก ์ฐพ๊ธฐ)
- ์ข์์ ๋ง์ ์์ผ๋ก ์ธ๊ธฐ ์ํฐ์คํธ TOP 5 ํ์
- ์ํฐ์คํธ SNS ๋งํฌ ์ฐ๊ฒฐ (์ธ์คํ๊ทธ๋จ, ์ ํ๋ธ ๋ฑ)
- ๋คํฌ๋ชจ๋ ํ ๊ธ
- ๊ณต์ฐ ์๋ฆผ ์ค์ (์ด๋ฉ์ผ ์ฃผ์ ์ ๋ ฅ)
๐ฏ ํ์ต ๋ชฉํ
- Laravel 13.x ๊ธฐ๋ณธ ๋ผ์ฐํ ๋ฐ ์ปจํธ๋กค๋ฌ ๊ตฌ์กฐ ์ดํด
- Blade ํ ํ๋ฆฟ ์์ง ํ์ฉ (์ปดํฌ๋ํธ, ๋ ์ด์์, ์น์ )
- SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ง์ด๊ทธ๋ ์ด์ ๋ฐ Eloquent ORM ์ฌ์ฉ
- Tailwind CSS๋ก ๋ชจ๋ํ UI ๊ตฌํ
- ์ฟ ํค ๊ธฐ๋ฐ ๊ฐ๋จํ ์ํ ๊ด๋ฆฌ (์ข์์ ๊ธฐ๋ฅ)
- ๋ฐ์ดํฐ ํํฐ๋ง ๋ฐ ์ ๋ ฌ ๋ก์ง
์ ์ฝ ์กฐ๊ฑด
- โข Laravel 13.x ์ฌ์ฉ (์ต์ ๋ฒ์ )
- โข Blade ํ ํ๋ฆฟ ์์ง๋ง ์ฌ์ฉ (React, Vue ๋ฑ SPA ํ๋ ์์ํฌ ๊ธ์ง)
- โข SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ (๊ฐ๋จํ ๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝ)
- โข Tailwind CSS 3.x ์ฌ์ฉ (CDN ๋๋ npm)
- โข PHP 8.3 ์ด์ ๊ถ์ฅ
- โข ์ธ๋ถ ์ธ์ฆ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ถํ์ (์ฟ ํค ๊ธฐ๋ฐ ์ข์์)
- โข ์ต์ 5๋ช ์ด์์ ์ํฐ์คํธ ์ํ ๋ฐ์ดํฐ ํฌํจ
- โข ๋ฐ์ํ ๋์์ธ ํ์ (๋ชจ๋ฐ์ผ ์ฐ์ )
ํ๋กฌํํธ ๋ ์ํผ
์๋ ํ๋กฌํํธ๋ฅผ ์์๋๋ก AI์๊ฒ ๋ณด๋ด๋ฉด ๋ฉ๋๋ค. ๋ณต์ฌ ๋ฒํผ์ ๋๋ฌ ๋ฐ๋ก ์ฌ์ฉํ์ธ์.
mkdir music-festival-artist-showcase && cd music-festival-artist-showcase ์ด ํด๋์์ ํ๋ก์ ํธ๋ฅผ ์์ํฉ๋๋ค. Laravel 13.x ํ๋ก์ ํธ๋ฅผ ์์ฑํ๊ณ ๊ธฐ๋ณธ ์ค์ ์ ์๋ฃํด์ฃผ์ธ์. **์๊ตฌ์ฌํญ:** - `composer create-project laravel/laravel .` ๋ช ๋ น์ผ๋ก ํ์ฌ ํด๋์ Laravel ์ค์น - `.env` ํ์ผ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ SQLite๋ก ์ค์ (`DB_CONNECTION=sqlite`, `DB_DATABASE=database/database.sqlite`) - `database/database.sqlite` ํ์ผ ์์ฑ - Tailwind CSS 3.x ์ค์น ๋ฐ ์ค์ (npm ๊ธฐ๋ฐ, `tailwind.config.js`์์ Blade ํ์ผ ๊ฒฝ๋ก ํฌํจ) - `php artisan serve` ๋ช ๋ น์ผ๋ก ์๋ฒ ์คํ ๊ฐ๋ฅํ๋๋ก ํ์ธ **์ถ๊ฐ ์ค์ :** - `resources/views` ํด๋์ `layouts/app.blade.php` ๊ธฐ๋ณธ ๋ ์ด์์ ํ์ผ ์์ฑ (Tailwind CSS CDN ๋๋ ๋น๋๋ CSS ์ฐ๊ฒฐ) - ๊ธฐ๋ณธ ํฐํธ๋ 'Inter' ๋๋ 'Pretendard' ์ฌ์ฉ - ๋ ์ด์์์ ๋ค๋น๊ฒ์ด์ ๋ฐ ํฌํจ (๋ก๊ณ : '๐ธ MUSIC FEST 2025', ๋ฉ๋ด: Home, Artists, Schedule) ์๋ฃ ํ `http://localhost:8000` ์ ์ ์ Laravel ๊ธฐ๋ณธ ํ๋ฉด์ด ๋ณด์ฌ์ผ ํฉ๋๋ค.
๊ธฐ๋ ๊ฒฐ๊ณผ: Laravel 13.x ํ๋ก์ ํธ๊ฐ ์์ฑ๋๊ณ , SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ค์ ๋๋ฉฐ, Tailwind CSS๊ฐ ํตํฉ๋ ๊ธฐ๋ณธ ๋ ์ด์์ ํ์ผ์ด ์ค๋น๋ฉ๋๋ค. ์๋ฒ ์คํ ์ ๊ธฐ๋ณธ Laravel ํ๋ฉด์ด ์ ์์ ์ผ๋ก ํ์๋ฉ๋๋ค.
์ํฐ์คํธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด์ฃผ์ธ์. **์๊ตฌ์ฌํญ:** - `artists` ํ ์ด๋ธ ๋ง์ด๊ทธ๋ ์ด์ ์์ฑ (`php artisan make:migration create_artists_table`) - ์ปฌ๋ผ ๊ตฌ์กฐ: - `id`: ๊ธฐ๋ณธํค - `name`: ์ํฐ์คํธ ์ด๋ฆ (string, ํ์) - `genre`: ์ฅ๋ฅด (string, ์: Rock, Jazz, Hip-Hop, Electronic) - `bio`: ์๊ฐ๊ธ (text, nullable) - `profile_image`: ํ๋กํ ์ด๋ฏธ์ง URL (string, nullable) - `performance_date`: ๊ณต์ฐ ๋ ์ง (date) - `performance_time`: ๊ณต์ฐ ์๊ฐ (time) - `stage`: ๊ณต์ฐ ๋ฌด๋ (string, ์: Main Stage, Sub Stage) - `likes_count`: ์ข์์ ์ (integer, default 0) - `instagram_url`: ์ธ์คํ๊ทธ๋จ ๋งํฌ (string, nullable) - `youtube_url`: ์ ํ๋ธ ๋งํฌ (string, nullable) - `timestamps`: ์์ฑ/์์ ์๊ฐ - `representative_songs` ํ ์ด๋ธ ๋ง์ด๊ทธ๋ ์ด์ ์์ฑ (๋ํ๊ณก ์ ์ฅ์ฉ) - ์ปฌ๋ผ ๊ตฌ์กฐ: - `id`: ๊ธฐ๋ณธํค - `artist_id`: ์ธ๋ํค (artists ํ ์ด๋ธ ์ฐธ์กฐ, onDelete cascade) - `title`: ๊ณก ์ ๋ชฉ (string) - `duration`: ์ฌ์ ์๊ฐ (string, ์: '3:45') - `timestamps` - ๋ง์ด๊ทธ๋ ์ด์ ์คํ (`php artisan migrate`) - Artist ๋ชจ๋ธ ์์ฑ (`php artisan make:model Artist`) - Artist ๋ชจ๋ธ์ `representativeSongs()` ๊ด๊ณ ๋ฉ์๋ ์ถ๊ฐ (hasMany) - RepresentativeSong ๋ชจ๋ธ ์์ฑ ๋ฐ `artist()` ๊ด๊ณ ๋ฉ์๋ ์ถ๊ฐ (belongsTo) ์๋ฃ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ์ด ์์ฑ๋์ด์ผ ํฉ๋๋ค.
๊ธฐ๋ ๊ฒฐ๊ณผ: artists์ representative_songs ํ ์ด๋ธ์ด ์์ฑ๋๊ณ , Artist์ RepresentativeSong ๋ชจ๋ธ ๊ฐ ๊ด๊ณ๊ฐ ์ค์ ๋ฉ๋๋ค. ๋ง์ด๊ทธ๋ ์ด์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์คํ๋ฉ๋๋ค.
์ํ ์ํฐ์คํธ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์์ฑํ๋ ์๋(Seeder)๋ฅผ ๋ง๋ค์ด์ฃผ์ธ์.
**์๊ตฌ์ฌํญ:**
- `php artisan make:seeder ArtistSeeder` ๋ช
๋ น์ผ๋ก ์๋ ์์ฑ
- ์ต์ 8๋ช
์ ์ํฐ์คํธ ์ํ ๋ฐ์ดํฐ ์ฝ์
- ๊ฐ ์ํฐ์คํธ๋ง๋ค 2~4๊ณก์ ๋ํ๊ณก ํฌํจ
- ์ฅ๋ฅด๋ Rock, Jazz, Hip-Hop, Electronic, Indie, K-Pop ๋ฑ ๋ค์ํ๊ฒ
- ๊ณต์ฐ ๋ ์ง๋ 2025-07-15, 2025-07-16, 2025-07-17 3์ผ๋ก ๋ถ์ฐ
- ๊ณต์ฐ ์๊ฐ์ 14:00, 16:00, 18:00, 20:00, 22:00 ๋ฑ์ผ๋ก ๋ถ์ฐ
- ๋ฌด๋๋ 'Main Stage', 'Sub Stage', 'Acoustic Stage' ๋ฑ์ผ๋ก ๋ถ์ฐ
- ํ๋กํ ์ด๋ฏธ์ง๋ Unsplash API ๋๋ placeholder ์ด๋ฏธ์ง ์ฌ์ฉ (์: `https://i.pravatar.cc/300?img={๋ฒํธ}`)
- Instagram/YouTube URL์ ์ค์ ๋งํฌ ํ์์ผ๋ก (์: `https://instagram.com/artist_name`)
**์ํ ์ํฐ์คํธ ์์:**
- The Midnight Riders (Rock, Main Stage, 2025-07-15 20:00)
- Luna Jazz Quartet (Jazz, Acoustic Stage, 2025-07-15 18:00)
- DJ Pulse (Electronic, Main Stage, 2025-07-16 22:00)
- Seoul Vibes (K-Pop, Sub Stage, 2025-07-16 16:00)
- ๋ฑ๋ฑ...
- `DatabaseSeeder.php`์์ ArtistSeeder ํธ์ถ ์ถ๊ฐ
- `php artisan db:seed` ๋ช
๋ น์ผ๋ก ์๋ ์คํ
์๋ฃ ํ `php artisan tinker`๋ก `Artist::count()`๊ฐ 8 ์ด์์ด์ด์ผ ํฉ๋๋ค.
๊ธฐ๋ ๊ฒฐ๊ณผ: 8๋ช ์ด์์ ์ํฐ์คํธ์ ๊ฐ๊ฐ์ ๋ํ๊ณก์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฝ์ ๋ฉ๋๋ค. ์๋ ์คํ ํ ๋ฐ์ดํฐ ํ์ธ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ํฐ์คํธ ๋ชฉ๋ก ํ์ด์ง์ ์์ธ ํ์ด์ง๋ฅผ ๋ง๋ค์ด์ฃผ์ธ์.
**์๊ตฌ์ฌํญ:**
**1. ๋ผ์ฐํธ ์ค์ (`routes/web.php`):**
- `GET /` โ ํ ํ์ด์ง (์ํฐ์คํธ ๋ชฉ๋ก์ผ๋ก ๋ฆฌ๋ค์ด๋ ํธ)
- `GET /artists` โ ์ํฐ์คํธ ๋ชฉ๋ก ํ์ด์ง
- `GET /artists?genre={์ฅ๋ฅด}` โ ์ฅ๋ฅด๋ณ ํํฐ๋ง
- `GET /artists/{id}` โ ์ํฐ์คํธ ์์ธ ํ์ด์ง
**2. ArtistController ์์ฑ (`php artisan make:controller ArtistController`):**
- `index()` ๋ฉ์๋: ์ ์ฒด ์ํฐ์คํธ ๋ชฉ๋ก ๋๋ ์ฅ๋ฅด๋ณ ํํฐ๋ง
- ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ `genre`๊ฐ ์์ผ๋ฉด ํด๋น ์ฅ๋ฅด๋ง ์กฐํ
- ์ข์์ ์ ๋ง์ ์์ผ๋ก ์ ๋ ฌ ์ต์
์ถ๊ฐ (์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ `sort=popular`)
- ํ์ด์ง๋ค์ด์
์์ด ์ ์ฒด ๋ชฉ๋ก ๋ฐํ
- `show($id)` ๋ฉ์๋: ์ํฐ์คํธ ์์ธ ์ ๋ณด + ๋ํ๊ณก ๋ชฉ๋ก
**3. Blade ๋ทฐ ํ์ผ ์์ฑ:**
**`resources/views/artists/index.blade.php`:**
- ํ์ด์ง ์๋จ์ ์ฅ๋ฅด ํํฐ ๋ฒํผ (All, Rock, Jazz, Hip-Hop, Electronic, Indie, K-Pop)
- ๊ฐ ๋ฒํผ ํด๋ฆญ ์ `?genre={์ฅ๋ฅด}` ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ก ํ์ด์ง ์๋ก๊ณ ์นจ
- ํ์ฌ ์ ํ๋ ์ฅ๋ฅด ๋ฒํผ์ ํ๋์์ผ๋ก ํ์ด๋ผ์ดํธ
- ์ํฐ์คํธ ์นด๋ ๊ทธ๋ฆฌ๋ ๋ ์ด์์ (3์ด, ๋ชจ๋ฐ์ผ์์๋ 1์ด)
- ๊ฐ ์นด๋ ๋ด์ฉ:
- ํ๋กํ ์ด๋ฏธ์ง (์ํ, 150x150px)
- ์ํฐ์คํธ ์ด๋ฆ (๊ตต์ ๊ธ์จ)
- ์ฅ๋ฅด ๋ฐฐ์ง (์์๋ณ ๊ตฌ๋ถ: Rock์ ๋นจ๊ฐ, Jazz๋ ๋ณด๋ผ, ๋ฑ)
- ๊ณต์ฐ ์ผ์ (์์ด์ฝ + ๋ ์ง/์๊ฐ)
- ๋ฌด๋ ์ ๋ณด
- ์ข์์ ์ ํ์ (โค๏ธ ์์ด์ฝ + ์ซ์)
- '์์ธํ ๋ณด๊ธฐ' ๋ฒํผ (์ํฐ์คํธ ์์ธ ํ์ด์ง๋ก ๋งํฌ)
- Tailwind CSS๋ก ์นด๋ hover ํจ๊ณผ ์ถ๊ฐ (๊ทธ๋ฆผ์, ํ๋ ์ ๋๋ฉ์ด์
)
**`resources/views/artists/show.blade.php`:**
- ์ํฐ์คํธ ํ๋กํ ์น์
:
- ํฐ ํ๋กํ ์ด๋ฏธ์ง (300x300px)
- ์ด๋ฆ, ์ฅ๋ฅด, ๊ณต์ฐ ์ผ์, ๋ฌด๋
- ์๊ฐ๊ธ (bio)
- SNS ๋งํฌ ๋ฒํผ (Instagram, YouTube)
- ๋ํ๊ณก ๋ฆฌ์คํธ:
- ๊ณก ์ ๋ชฉ, ์ฌ์ ์๊ฐ
- ๋ฆฌ์คํธ ์คํ์ผ๋ก ๊น๋ํ๊ฒ ํ์
- ์ข์์ ๋ฒํผ (ํํธ ์์ด์ฝ, ํด๋ฆญ ์ Ajax๋ก ์ข์์ ์ฆ๊ฐ - ๋ค์ ๋จ๊ณ์์ ๊ตฌํ)
- '๋ชฉ๋ก์ผ๋ก ๋์๊ฐ๊ธฐ' ๋ฒํผ
**4. ๋ ์ด์์ ์
๋ฐ์ดํธ:**
- `layouts/app.blade.php`์ ๋ค๋น๊ฒ์ด์
๋ฐ์์ 'Artists' ๋ฉ๋ด๋ฅผ `/artists`๋ก ๋งํฌ
์๋ฃ ํ `/artists` ์ ์ ์ ์ํฐ์คํธ ๋ชฉ๋ก์ด ์นด๋ ํ์์ผ๋ก ํ์๋๊ณ , ์ฅ๋ฅด ํํฐ๊ฐ ์๋ํด์ผ ํฉ๋๋ค. ๊ฐ ์นด๋ ํด๋ฆญ ์ ์์ธ ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
๊ธฐ๋ ๊ฒฐ๊ณผ: ์ํฐ์คํธ ๋ชฉ๋ก ํ์ด์ง์ ์นด๋ ๊ทธ๋ฆฌ๋๊ฐ ํ์๋๊ณ , ์ฅ๋ฅด ํํฐ๋ง์ด ์๋ํ๋ฉฐ, ์์ธ ํ์ด์ง์์ ์ํฐ์คํธ ์ ๋ณด์ ๋ํ๊ณก์ด ๋ณด์ ๋๋ค. UI๊ฐ ๋ฐ์ํ์ผ๋ก ๋์ํฉ๋๋ค.
์ข์์ ๊ธฐ๋ฅ์ ๊ตฌํํด์ฃผ์ธ์. ์ฌ์ฉ์๊ฐ ์ํฐ์คํธ ์์ธ ํ์ด์ง์์ '์ข์์' ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ข์์ ์๊ฐ ์ฆ๊ฐํ๊ณ , ์ฟ ํค๋ก ์ค๋ณต ํด๋ฆญ์ ๋ฐฉ์งํฉ๋๋ค.
**์๊ตฌ์ฌํญ:**
**1. ๋ผ์ฐํธ ์ถ๊ฐ (`routes/web.php`):**
- `POST /artists/{id}/like` โ ์ข์์ ์ฆ๊ฐ API
**2. ArtistController์ `like($id)` ๋ฉ์๋ ์ถ๊ฐ:**
- ์ฟ ํค ํ์ธ: `liked_artists_{์ํฐ์คํธ ID}` ์ฟ ํค๊ฐ ์์ผ๋ฉด ์ด๋ฏธ ์ข์์๋ฅผ ๋๋ ๋ค๊ณ ํ๋จํ๊ณ ์๋ฌ ๋ฐํ
- ์ฟ ํค๊ฐ ์์ผ๋ฉด:
- ์ํฐ์คํธ์ `likes_count` ์ฆ๊ฐ (`$artist->increment('likes_count')`)
- ์ฟ ํค ์์ฑ (์ ํจ๊ธฐ๊ฐ 30์ผ)
- JSON ์๋ต์ผ๋ก ์๋ก์ด ์ข์์ ์ ๋ฐํ
**3. Blade ๋ทฐ ์
๋ฐ์ดํธ (`artists/show.blade.php`):**
- ์ข์์ ๋ฒํผ ์ถ๊ฐ:
- ๋ฒํผ ๋์์ธ: ํฐ ํํธ ์์ด์ฝ + '์ข์์' ํ
์คํธ + ํ์ฌ ์ข์์ ์
- ์ด๋ฏธ ์ข์์๋ฅผ ๋๋ ๋ค๋ฉด ๋ฒํผ ๋นํ์ฑํ (์ฟ ํค ํ์ธ)
- ๋ฒํผ ํด๋ฆญ ์ Ajax ์์ฒญ์ผ๋ก `/artists/{id}/like` POST ํธ์ถ
- JavaScript (Blade ํ
ํ๋ฆฟ ๋ด `<script>` ํ๊ทธ):
- Fetch API ์ฌ์ฉํ์ฌ POST ์์ฒญ
- CSRF ํ ํฐ ํฌํจ (`@csrf` ๋๋ `<meta name="csrf-token">`)
- ์ฑ๊ณต ์: ์ข์์ ์ ์
๋ฐ์ดํธ, ๋ฒํผ ๋นํ์ฑํ, ์ ๋๋ฉ์ด์
ํจ๊ณผ (ํํธ ์ปค์ก๋ค ์์์ง๋ ํจ๊ณผ)
- ์คํจ ์: ์๋ฆผ ๋ฉ์์ง ํ์ ('์ด๋ฏธ ์ข์์๋ฅผ ๋๋ ์ต๋๋ค')
**4. ๋ชฉ๋ก ํ์ด์ง์๋ ์ข์์ ์ ์ค์๊ฐ ๋ฐ์:**
- ์ํฐ์คํธ ์นด๋์ ์ข์์ ์ ํ์
- ์ธ๊ธฐ์ ์ ๋ ฌ ๋ฒํผ ์ถ๊ฐ (`?sort=popular`)
์๋ฃ ํ ์ํฐ์คํธ ์์ธ ํ์ด์ง์์ ์ข์์ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ซ์๊ฐ ์ฆ๊ฐํ๊ณ , ์๋ก๊ณ ์นจ ํ์๋ ์ค๋ณต ํด๋ฆญ์ด ๋ฐฉ์ง๋์ด์ผ ํฉ๋๋ค.
๊ธฐ๋ ๊ฒฐ๊ณผ: ์ข์์ ๋ฒํผ์ด ์๋ํ๊ณ , Ajax๋ก ์ค์๊ฐ ์ ๋ฐ์ดํธ๊ฐ ์ด๋ฃจ์ด์ง๋ฉฐ, ์ฟ ํค๋ก ์ค๋ณต ํด๋ฆญ์ด ๋ฐฉ์ง๋ฉ๋๋ค. ์ ๋๋ฉ์ด์ ํจ๊ณผ๊ฐ ์ถ๊ฐ๋์ด ์ฌ์ฉ์ ๊ฒฝํ์ด ํฅ์๋ฉ๋๋ค.
๊ณต์ฐ ์ผ์ ํ์๋ผ์ธ ํ์ด์ง๋ฅผ ์ถ๊ฐํ๊ณ , ์ ์ฒด ํ๋ก์ ํธ๋ฅผ ๋ง๋ฌด๋ฆฌํด์ฃผ์ธ์. **์๊ตฌ์ฌํญ:** **1. ๋ผ์ฐํธ ์ถ๊ฐ (`routes/web.php`):** - `GET /schedule` โ ๊ณต์ฐ ์ผ์ ํ์๋ผ์ธ ํ์ด์ง **2. ArtistController์ `schedule()` ๋ฉ์๋ ์ถ๊ฐ:** - ๋ชจ๋ ์ํฐ์คํธ๋ฅผ ๊ณต์ฐ ๋ ์ง ๋ฐ ์๊ฐ ์์ผ๋ก ์ ๋ ฌ - ๋ ์ง๋ณ๋ก ๊ทธ๋ฃนํํ์ฌ ๋ทฐ์ ์ ๋ฌ **3. Blade ๋ทฐ ์์ฑ (`resources/views/schedule.blade.php`):** - ํ์ด์ง ์ ๋ชฉ: '๐ต Festival Schedule' - ๋ ์ง๋ณ ํญ ๋๋ ์น์ (2025-07-15, 2025-07-16, 2025-07-17) - ๊ฐ ๋ ์ง๋ณ๋ก ํ์๋ผ์ธ ํ์์ผ๋ก ์ํฐ์คํธ ํ์: - ์๊ฐ (์: 14:00) - ์ํฐ์คํธ ์ด๋ฆ - ๋ฌด๋ (Main Stage, Sub Stage ๋ฑ) - ์ฅ๋ฅด ๋ฐฐ์ง - ์ํฐ์คํธ ์์ธ ํ์ด์ง๋ก ๋งํฌ - ํ์๋ผ์ธ ๋์์ธ: ์ธ๋ก ๋ผ์ธ + ๋๊ทธ๋ผ๋ฏธ ๋ง์ปค + ์นด๋ ํ์ - ๋ชจ๋ฐ์ผ ์ต์ ํ **4. ๋ค๋น๊ฒ์ด์ ์ ๋ฐ์ดํธ:** - `layouts/app.blade.php`์ 'Schedule' ๋ฉ๋ด๋ฅผ `/schedule`๋ก ๋งํฌ **5. ํ ํ์ด์ง (`welcome.blade.php` ๋๋ ์๋ก์ด `home.blade.php`) ๊ฐ์ :** - ํ์คํฐ๋ฒ ์๊ฐ ์น์ : - ํฐ ํค๋ ์ด๋ฏธ์ง ๋๋ ๊ทธ๋ผ๋ฐ์ด์ ๋ฐฐ๊ฒฝ - ํ์คํฐ๋ฒ ์ด๋ฆ: 'MUSIC FEST 2025' - ๋ถ์ : 'Experience the Best Live Music' - ๋ ์ง: July 15-17, 2025 - ์ฅ์: Seoul Olympic Park - ์ธ๊ธฐ ์ํฐ์คํธ TOP 5 ํ์ (์ข์์ ์ ๊ธฐ์ค) - 'View All Artists' ๋ฒํผ โ `/artists`๋ก ๋งํฌ - 'See Schedule' ๋ฒํผ โ `/schedule`๋ก ๋งํฌ **6. ์ ์ฒด ๋์์ธ ํต์ผ:** - ์์ ํ ๋ง: ๋ณด๋ผ์/ํ๋์ ๊ทธ๋ผ๋ฐ์ด์ (์์ ํ์คํฐ๋ฒ ๋๋) - ๋ชจ๋ ํ์ด์ง์ ์ผ๊ด๋ ์ฌ๋ฐฑ, ํฐํธ, ๋ฒํผ ์คํ์ผ ์ ์ฉ - ๋คํฌ๋ชจ๋ ํ ๊ธ ์ถ๊ฐ (๋ณด๋์ค, JavaScript๋ก `localStorage` ํ์ฉ) **7. README.md ์์ฑ:** - ํ๋ก์ ํธ ์ค๋ช - ์ค์น ๋ฐฉ๋ฒ (composer install, npm install, migrate, seed) - ์คํ ๋ฐฉ๋ฒ (php artisan serve) - ์ฃผ์ ๊ธฐ๋ฅ ๋ชฉ๋ก - ์คํฌ๋ฆฐ์ท (์ ํ) ์๋ฃ ํ ์ ์ฒด ํ๋ก์ ํธ๊ฐ ์์ฑ๋๊ณ , `/schedule` ํ์ด์ง์์ ๊ณต์ฐ ์ผ์ ์ ํ์๋ผ์ธ ํ์์ผ๋ก ๋ณผ ์ ์์ด์ผ ํฉ๋๋ค. ํ ํ์ด์ง์์ ํ์คํฐ๋ฒ ๋ถ์๊ธฐ๊ฐ ๋๊ปด์ง๊ณ , ๋ชจ๋ ํ์ด์ง๊ฐ ๋ฐ์ํ์ผ๋ก ๋์ํด์ผ ํฉ๋๋ค.
๊ธฐ๋ ๊ฒฐ๊ณผ: ๊ณต์ฐ ์ผ์ ํ์๋ผ์ธ ํ์ด์ง๊ฐ ์์ฑ๋๊ณ , ํ ํ์ด์ง๊ฐ ๋งค๋ ฅ์ ์ผ๋ก ๊ฐ์ ๋๋ฉฐ, ์ ์ฒด ํ๋ก์ ํธ๊ฐ ์ผ๊ด๋ ๋์์ธ์ผ๋ก ๋ง๋ฌด๋ฆฌ๋ฉ๋๋ค. README ํ์ผ์ด ์์ฑ๋์ด ํ๋ก์ ํธ ์ฌ์ฉ๋ฒ์ด ๋ช ํํด์ง๋๋ค.
์ ์ถ๋ ์ํ (0)
๋ก๊ทธ์ธ ํ ์ ์ถ์์ง ์ ์ถ๋ ์ํ์ด ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๋์ ์๊ฐ ๋์ด๋ณด์ธ์!