๐ŸŽธ ๋กœ์ปฌ ๋ฎค์ง ํŽ˜์Šคํ‹ฐ๋ฒŒ ์•„ํ‹ฐ์ŠคํŠธ ๋ผ์ธ์—… ์†Œ๊ฐœ ํŽ˜์ด์ง€ - ๋ฐ”์ด๋ธŒ์ฝ”๋”ฉ ๋ ˆ์‹œํ”ผ
์ž…๋ฌธ PHP Laravel AI: Claude

๐ŸŽธ ๋กœ์ปฌ ๋ฎค์ง ํŽ˜์Šคํ‹ฐ๋ฒŒ ์•„ํ‹ฐ์ŠคํŠธ ๋ผ์ธ์—… ์†Œ๊ฐœ ํŽ˜์ด์ง€

๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ช… music-festival-artist-showcase
์กฐํšŒ์ˆ˜ 96 0๊ฑด ์ œ์ถœ

๋ฌธ์ œ ์„ค๋ช…

๐ŸŽต ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

์Œ์•… ํŽ˜์Šคํ‹ฐ๋ฒŒ์˜ ์ถœ์—ฐ ์•„ํ‹ฐ์ŠคํŠธ๋ฅผ ์†Œ๊ฐœํ•˜๋Š” ๋งค๋ ฅ์ ์ธ ์›น ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ฐ ์•„ํ‹ฐ์ŠคํŠธ์˜ ํ”„๋กœํ•„, ๊ณต์—ฐ ์‹œ๊ฐ„, ์žฅ๋ฅด, ๋Œ€ํ‘œ๊ณก์„ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฐฉ๋ฌธ์ž๊ฐ€ ๊ด€์‹ฌ ์žˆ๋Š” ์•„ํ‹ฐ์ŠคํŠธ์—๊ฒŒ '์ข‹์•„์š”'๋ฅผ ๋‚จ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœจ ํ•„์ˆ˜ ๊ธฐ๋Šฅ

  • ์•„ํ‹ฐ์ŠคํŠธ ๋ชฉ๋ก ํŽ˜์ด์ง€: ํŽ˜์Šคํ‹ฐ๋ฒŒ ์ถœ์—ฐ์ง„ ์ „์ฒด ๋ฆฌ์ŠคํŠธ (์นด๋“œ ํ˜•์‹)
  • ์•„ํ‹ฐ์ŠคํŠธ ์ƒ์„ธ ํŽ˜์ด์ง€: ํ”„๋กœํ•„ ์‚ฌ์ง„, ์†Œ๊ฐœ, ๊ณต์—ฐ ์‹œ๊ฐ„, ์žฅ๋ฅด, ๋Œ€ํ‘œ๊ณก ๋ฆฌ์ŠคํŠธ
  • ์ข‹์•„์š” ๊ธฐ๋Šฅ: ๊ฐ ์•„ํ‹ฐ์ŠคํŠธ์—๊ฒŒ ์ข‹์•„์š” ๋ฒ„ํŠผ ํด๋ฆญ (๋กœ๊ทธ์ธ ์—†์ด ๊ฐ€๋Šฅ, ์ฟ ํ‚ค ๊ธฐ๋ฐ˜)
  • ์žฅ๋ฅด ํ•„ํ„ฐ๋ง: ๋ก, ์žฌ์ฆˆ, ํž™ํ•ฉ, ์ผ๋ ‰ํŠธ๋กœ๋‹‰ ๋“ฑ ์žฅ๋ฅด๋ณ„๋กœ ์•„ํ‹ฐ์ŠคํŠธ ํ•„ํ„ฐ
  • ๊ณต์—ฐ ์ผ์ • ํƒ€์ž„๋ผ์ธ: ๋‚ ์งœ/์‹œ๊ฐ„๋ณ„๋กœ ์•„ํ‹ฐ์ŠคํŠธ ๊ณต์—ฐ ์Šค์ผ€์ค„ ๋ณด๊ธฐ
  • ๋ฐ˜์‘ํ˜• ๋””์ž์ธ: ๋ชจ๋ฐ”์ผ/ํƒœ๋ธ”๋ฆฟ/๋ฐ์Šคํฌํ†ฑ ๋ชจ๋‘ ์ตœ์ ํ™”

๐ŸŽ ๋ณด๋„ˆ์Šค ๊ธฐ๋Šฅ

  • ์•„ํ‹ฐ์ŠคํŠธ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ (์ด๋ฆ„์œผ๋กœ ์ฐพ๊ธฐ)
  • ์ข‹์•„์š” ๋งŽ์€ ์ˆœ์œผ๋กœ ์ธ๊ธฐ ์•„ํ‹ฐ์ŠคํŠธ 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์—๊ฒŒ ๋ณด๋‚ด๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ณต์‚ฌ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜์„ธ์š”.

1
Step 1
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 ํ™”๋ฉด์ด ์ •์ƒ์ ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

2
Step 2
์•„ํ‹ฐ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”.

**์š”๊ตฌ์‚ฌํ•ญ:**
- `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 ๋ชจ๋ธ ๊ฐ„ ๊ด€๊ณ„๊ฐ€ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

3
Step 3
์ƒ˜ํ”Œ ์•„ํ‹ฐ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ์‹œ๋”(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๋ช… ์ด์ƒ์˜ ์•„ํ‹ฐ์ŠคํŠธ์™€ ๊ฐ๊ฐ์˜ ๋Œ€ํ‘œ๊ณก์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์‚ฝ์ž…๋ฉ๋‹ˆ๋‹ค. ์‹œ๋” ์‹คํ–‰ ํ›„ ๋ฐ์ดํ„ฐ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

4
Step 4
์•„ํ‹ฐ์ŠคํŠธ ๋ชฉ๋ก ํŽ˜์ด์ง€์™€ ์ƒ์„ธ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”.

**์š”๊ตฌ์‚ฌํ•ญ:**

**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๊ฐ€ ๋ฐ˜์‘ํ˜•์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

5
Step 5
์ข‹์•„์š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์ฃผ์„ธ์š”. ์‚ฌ์šฉ์ž๊ฐ€ ์•„ํ‹ฐ์ŠคํŠธ ์ƒ์„ธ ํŽ˜์ด์ง€์—์„œ '์ข‹์•„์š”' ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ข‹์•„์š” ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ณ , ์ฟ ํ‚ค๋กœ ์ค‘๋ณต ํด๋ฆญ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

**์š”๊ตฌ์‚ฌํ•ญ:**

**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๋กœ ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋ฉฐ, ์ฟ ํ‚ค๋กœ ์ค‘๋ณต ํด๋ฆญ์ด ๋ฐฉ์ง€๋ฉ๋‹ˆ๋‹ค. ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

6
Step 6
๊ณต์—ฐ ์ผ์ • ํƒ€์ž„๋ผ์ธ ํŽ˜์ด์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ์ „์ฒด ํ”„๋กœ์ ํŠธ๋ฅผ ๋งˆ๋ฌด๋ฆฌํ•ด์ฃผ์„ธ์š”.

**์š”๊ตฌ์‚ฌํ•ญ:**

**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)

๋กœ๊ทธ์ธ ํ›„ ์ œ์ถœ

์•„์ง ์ œ์ถœ๋œ ์ž‘ํ’ˆ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋„์ „์ž๊ฐ€ ๋˜์–ด๋ณด์„ธ์š”!

๋Œ“๊ธ€ (0)

๋กœ๊ทธ์ธ ํ›„ ๋Œ“๊ธ€์„ ๋‚จ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋Œ“๊ธ€์„ ๋‚จ๊ฒจ๋ณด์„ธ์š”!