๐ธ ๋ฐด๋ ๊ณต์ฐ ์ ๋ฆฌ์คํธ ํฌํ ํ์ด์ง - ํฌ๋ค์ด ์ง์ ์ ๊ณกํ๋ ๋ผ์ด๋ธ ๋ฌด๋
band-setlist-voting-page
๋ฌธ์ ์ค๋ช
๐ธ ๋ฐด๋ ๊ณต์ฐ ์ ๋ฆฌ์คํธ ํฌํ ํ์ด์ง
์ธ๋ ๋ฐด๋๋ ๋ฎค์ง์ ์ด ํฌ๋ค๊ณผ ํจ๊ป ๊ณต์ฐ ์ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด๊ฐ๋ ์ธํฐ๋ํฐ๋ธ ํฌํ ํ๋ซํผ์ ๋๋ค. ํฌ๋ค์ ์ต์ฝ๊ณก์ด๋ ์ฐ์ฃผํด์ฃผ๊ธธ ๋ฐ๋ผ๋ ๋ ธ๋์ ํฌํํ๊ณ , ๋ฐด๋๋ ์ค์๊ฐ์ผ๋ก ์ด๋ค ๊ณก์ด ์ธ๊ธฐ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
๐ฏ ํต์ฌ ๊ธฐ๋ฅ
ํ์ ๊ธฐ๋ฅ
- ๋ ธ๋ ๋ชฉ๋ก ํ์: ์จ๋ฒ ์ปค๋ฒ ์ธ๋ค์ผ, ๊ณก๋ช , ์จ๋ฒ๋ช , ํ์ฌ ๋ํ์ ํ์
- ํฌํํ๊ธฐ: ๊ฐ ๋ ธ๋๋ง๋ค "์ด ๊ณก ๋ฃ๊ณ ์ถ์ด์!" ๋ฒํผ์ผ๋ก ํฌํ (1์ธ 1๊ณก ์ ํ ๋๋ ์ค๋ณต ํฌํ ๊ฐ๋ฅ ์ต์ )
- ์ค์๊ฐ ์์: ๋ํ์ ๊ธฐ์ค ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ, 1์~3์ ํ์ด๋ผ์ดํธ ํ์
- ๋ฐ์ํ ์นด๋ ๋ ์ด์์: Tailwind CSS๋ก ๋ชจ๋ฐ์ผ/ํ๋ธ๋ฆฟ/๋ฐ์คํฌํฑ ๋์
- ํฌํ ์๋ฃ ํผ๋๋ฐฑ: ํฌํ ํ ๋ฒํผ ์์ ๋ณ๊ฒฝ ๋๋ "ํฌํ ์๋ฃ!" ๋ฉ์์ง
๋ณด๋์ค ๊ธฐ๋ฅ (์ ํ)
- ๋ ธ๋ ๋ฏธ๋ฆฌ๋ฃ๊ธฐ ๋งํฌ (YouTube/Spotify ์๋ฒ ๋)
- ํฌํ ์ ์ ๋๋ฉ์ด์ ํจ๊ณผ (ํํธ ๋ ๋ฆฌ๊ธฐ, ์นด์ดํฐ ์ฆ๊ฐ ์ ๋๋ฉ์ด์ )
- ํฌํ ๋ง๊ฐ ์๊ฐ ํ์ด๋จธ (D-Day ์นด์ดํธ๋ค์ด)
- ์ฅ๋ฅด๋ณ ํํฐ๋ง (๋ฐ๋ผ๋/๋ก/๋์ค ๋ฑ)
- SNS ๊ณต์ ๋ฒํผ ("๋ด๊ฐ ํฌํํ ๊ณก ๋ณด๋ฌ ์ค์ธ์!")
๐ ๊ธฐ์ ์คํ
- ํ๋ ์์ํฌ: Laravel 13.x (Blade ํ ํ๋ฆฟ)
- ๋ฐ์ดํฐ๋ฒ ์ด์ค: SQLite (songs ํ ์ด๋ธ: title, album, thumbnail_url, votes)
- ์คํ์ผ๋ง: Tailwind CSS
- ์์ด์ฝ: Heroicons ๋๋ Font Awesome
๐ ์ ์ฝ ์กฐ๊ฑด
- ๋ณ๋์ ํ์๊ฐ์ /๋ก๊ทธ์ธ ๋ถํ์ (๊ฐ๋จํ ์ฟ ํค ๊ธฐ๋ฐ ์ค๋ณต ๋ฐฉ์ง๋ ์ ํ)
- ๊ด๋ฆฌ์ ๊ธฐ๋ฅ ์์ (์๋ ๋ฐ์ดํฐ๋ก ๋ ธ๋ ๋ฏธ๋ฆฌ ๋ฑ๋ก)
- ๋ณต์กํ ์ธ์ฆ/๊ถํ ์์คํ ์ฌ์ฉ ๊ธ์ง
- ๋จ์ผ ํ์ด์ง๋ก ๋ชจ๋ ๊ธฐ๋ฅ ๊ตฌํ (index ๋ผ์ฐํธ ํ๋)
๐จ UI/UX ํฌ์ธํธ
- ์จ๋ฒ ์ปค๋ฒ ์ด๋ฏธ์ง๊ฐ ๋๋ณด์ด๋ ์นด๋ ๋์์ธ
- ํฌํ ๋ฒํผ ํธ๋ฒ ์ ์ค์ผ์ผ ์ ๋๋ฉ์ด์
- ๋ํ์ ์ฆ๊ฐ ์ ์ซ์ ์นด์ดํฐ ์ ๋๋ฉ์ด์ (์ ํ)
- 1์ ๊ณก์ "๐ Most Wanted" ๋ฐฐ์ง ํ์
- ๋คํฌ ๋ชจ๋ ์ง์ (Tailwind dark: ํด๋์ค ํ์ฉ)
ํ๋ก๊ทธ๋๋ฐ ์ด๋ณด์๋ Laravel์ ๊ธฐ๋ณธ ๋ผ์ฐํ , ์ปจํธ๋กค๋ฌ, Blade ๋ฌธ๋ฒ, DB ์ฟผ๋ฆฌ๋ฅผ ์ตํ๋ฉด์ ์ค์ ๋ก ํฌ๋ค์ด ์ฌ์ฉํ ์ ์๋ ์ฌ๋ฏธ์๋ ์๋น์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค!
์ ์ฝ ์กฐ๊ฑด
- โข Laravel 13.x + Blade ํ ํ๋ฆฟ ์ฌ์ฉ (React/Vue ๊ธ์ง)
- โข SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ (๊ฐ๋จํ ์ค์ )
- โข Tailwind CSS๋ก ์คํ์ผ๋ง
- โข ๋จ์ผ ํ์ด์ง ๊ตฌ์ฑ (index ๋ผ์ฐํธ)
- โข ๋ณ๋์ ํ์๊ฐ์ /๋ก๊ทธ์ธ ๋ถํ์
- โข ์๋ ๋ฐ์ดํฐ๋ก ์ํ ๋ ธ๋ 5~10๊ณก ๋ฏธ๋ฆฌ ๋ฑ๋ก
- โข ํฌํ ์ค๋ณต ๋ฐฉ์ง๋ ์ ํ ์ฌํญ (์ฟ ํค ๋๋ ์ธ์ ํ์ฉ)
ํ๋กฌํํธ ๋ ์ํผ
์๋ ํ๋กฌํํธ๋ฅผ ์์๋๋ก AI์๊ฒ ๋ณด๋ด๋ฉด ๋ฉ๋๋ค. ๋ณต์ฌ ๋ฒํผ์ ๋๋ฌ ๋ฐ๋ก ์ฌ์ฉํ์ธ์.
mkdir band-setlist-voting-page && cd band-setlist-voting-page
์ด ํด๋์์ ํ๋ก์ ํธ๋ฅผ ์์ํฉ๋๋ค.
Laravel 13.x ํ๋ก์ ํธ๋ฅผ ์์ฑํ๊ณ ์ด๊ธฐ ์ค์ ์ ํด์ฃผ์ธ์.
์๊ตฌ์ฌํญ:
1. `composer create-project laravel/laravel .` ๋ช
๋ น์ผ๋ก Laravel 13.x ์ต์ ๋ฒ์ ์ค์น
2. `.env` ํ์ผ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ SQLite๋ก ์ค์ :
- DB_CONNECTION=sqlite
- DB_DATABASE=/absolute/path/to/database.sqlite (๋๋ ์๋๊ฒฝ๋ก database/database.sqlite)
- database/database.sqlite ํ์ผ ์์ฑ (touch database/database.sqlite)
3. Tailwind CSS ์ค์น ๋ฐ ์ค์ :
- `npm install -D tailwindcss postcss autoprefixer`
- `npx tailwindcss init -p`
- tailwind.config.js์์ content ๊ฒฝ๋ก ์ค์ : `content: ['./resources/**/*.blade.php', './resources/**/*.js']`
- resources/css/app.css์ Tailwind ๋๋ ํฐ๋ธ ์ถ๊ฐ:
```css
@tailwind base;
@tailwind components;
@tailwind utilities;
```
- resources/views/layouts/app.blade.php ๋ ์ด์์ ํ์ผ ์์ฑ (๊ธฐ๋ณธ HTML ๊ตฌ์กฐ + Vite๋ก CSS/JS ๋ก๋)
4. `php artisan serve` ๋ช
๋ น์ผ๋ก ๊ฐ๋ฐ ์๋ฒ ์คํ ํ์ธ
5. `npm run dev` ๋ช
๋ น์ผ๋ก Vite ๊ฐ๋ฐ ์๋ฒ ์คํ ํ์ธ
์ด๊ธฐ ์ค์ ์ด ์๋ฃ๋๋ฉด "Laravel 13.x ํ๋ก์ ํธ ์์ฑ ์๋ฃ, Tailwind CSS ์ค์ ์๋ฃ, ๊ฐ๋ฐ ์๋ฒ ์คํ ์ค" ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํด์ฃผ์ธ์.
๊ธฐ๋ ๊ฒฐ๊ณผ: Laravel 13.x ํ๋ก์ ํธ๊ฐ ์์ฑ๋๊ณ , SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ค์ ๋๋ฉฐ, Tailwind CSS๊ฐ ํตํฉ๋ฉ๋๋ค. ๊ธฐ๋ณธ ๋ ์ด์์ ํ์ผ(app.blade.php)์ด ์์ฑ๋๊ณ , `php artisan serve`์ `npm run dev`๋ก ๋ก์ปฌ ์๋ฒ๊ฐ ์คํ๋ฉ๋๋ค.
๋ ธ๋ ์ ๋ณด๋ฅผ ์ ์ฅํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ง์ด๊ทธ๋ ์ด์ ๊ณผ ๋ชจ๋ธ, ์๋ ๋ฐ์ดํฐ๋ฅผ ์์ฑํด์ฃผ์ธ์. ์๊ตฌ์ฌํญ: 1. `php artisan make:model Song -m` ๋ช ๋ น์ผ๋ก Song ๋ชจ๋ธ๊ณผ ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ ์์ฑ 2. ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ(database/migrations/xxxx_create_songs_table.php)์ ๋ค์ ์ปฌ๋ผ ์ถ๊ฐ: - id (primary key, auto increment) - title (string, ๊ณก๋ช ) - album (string, ์จ๋ฒ๋ช ) - thumbnail_url (string, ์จ๋ฒ ์ปค๋ฒ ์ด๋ฏธ์ง URL) - genre (string, nullable, ์ฅ๋ฅด - ์: Rock, Ballad, Dance) - votes (integer, default 0, ๋ํ์) - spotify_link (string, nullable, Spotify ๋งํฌ - ๋ณด๋์ค) - timestamps (created_at, updated_at) 3. `php artisan migrate` ๋ช ๋ น์ผ๋ก ํ ์ด๋ธ ์์ฑ 4. database/seeders/DatabaseSeeder.php์์ ์ํ ๋ ธ๋ ๋ฐ์ดํฐ 5~10๊ณก ์๋: - ์ค์ ์ธ๋ ๋ฐด๋ ๊ณก ๋๋ ๊ฐ์์ ๊ณก๋ช ์ฌ์ฉ - thumbnail_url์ Unsplash ๋๋ Placeholder ์ด๋ฏธ์ง URL ์ฌ์ฉ (์: https://picsum.photos/seed/song1/400/400) - ์ฅ๋ฅด๋ Rock, Ballad, Dance, Pop ๋ฑ ๋ค์ํ๊ฒ - votes๋ 0์ผ๋ก ์ด๊ธฐํ 5. `php artisan db:seed` ๋ช ๋ น์ผ๋ก ์๋ ๋ฐ์ดํฐ ์ฝ์ 6. Song ๋ชจ๋ธ(app/Models/Song.php)์ $fillable ์์ฑ ์ค์ : - protected $fillable = ['title', 'album', 'thumbnail_url', 'genre', 'votes', 'spotify_link']; ์๋ฃ ํ "songs ํ ์ด๋ธ ์์ฑ ์๋ฃ, ์๋ ๋ฐ์ดํฐ ์ฝ์ ์๋ฃ" ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํด์ฃผ์ธ์.
๊ธฐ๋ ๊ฒฐ๊ณผ: songs ํ ์ด๋ธ์ด ์์ฑ๋๊ณ , Song ๋ชจ๋ธ์ด ์ค๋น๋๋ฉฐ, 5~10๊ณก์ ์ํ ๋ฐ์ดํฐ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฝ์ ๋ฉ๋๋ค. ๊ฐ ๋ ธ๋๋ ์ ๋ชฉ, ์จ๋ฒ๋ช , ์ธ๋ค์ผ URL, ์ฅ๋ฅด, ๋ํ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๋๋ค.
๋ฉ์ธ ํ์ด์ง์์ ๋
ธ๋ ๋ชฉ๋ก์ ํ์ํ๊ณ ํฌํ ๊ธฐ๋ฅ์ ๊ตฌํํด์ฃผ์ธ์.
์๊ตฌ์ฌํญ:
1. routes/web.php์ ๋ฉ์ธ ๋ผ์ฐํธ ์ ์:
- GET '/' ๋ผ์ฐํธ: ๋ชจ๋ ๋
ธ๋๋ฅผ ๋ํ์ ๊ธฐ์ค ๋ด๋ฆผ์ฐจ์์ผ๋ก ์กฐํํ์ฌ ๋ทฐ์ ์ ๋ฌ
- POST '/vote/{song}' ๋ผ์ฐํธ: ํน์ ๋
ธ๋์ votes ์ปฌ๋ผ์ +1 ์ฆ๊ฐ์ํค๊ณ ๋ฉ์ธ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ
2. app/Http/Controllers/SongController.php ์ปจํธ๋กค๋ฌ ์์ฑ:
- `php artisan make:controller SongController` ๋ช
๋ น ์คํ
- index() ๋ฉ์๋: Song::orderBy('votes', 'desc')->get()์ผ๋ก ๋
ธ๋ ๋ชฉ๋ก ์กฐํ ํ 'songs.index' ๋ทฐ์ ์ ๋ฌ
- vote(Song $song) ๋ฉ์๋: $song->increment('votes'); ํ redirect()->route('songs.index')->with('success', 'ํฌํ ์๋ฃ!');
3. resources/views/songs/index.blade.php ๋ทฐ ์์ฑ:
- layouts/app.blade.php ๋ ์ด์์ ํ์ฅ (@extends('layouts.app'))
- ํ์ด์ง ์ ๋ชฉ: "๐ธ ๋ฐด๋ ๊ณต์ฐ ์
๋ฆฌ์คํธ ํฌํ - ํฌ๋ค์ด ์ ํํ๋ ์ต์ฝ๊ณก"
- ๋
ธ๋ ๋ชฉ๋ก์ Tailwind CSS ๊ทธ๋ฆฌ๋ ์นด๋๋ก ํ์ (grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6):
- ๊ฐ ์นด๋: ์จ๋ฒ ์ปค๋ฒ ์ด๋ฏธ์ง (์ธ๋ค์ผ), ๊ณก๋ช
, ์จ๋ฒ๋ช
, ์ฅ๋ฅด ๋ฐฐ์ง, ๋ํ์ ํ์
- "์ด ๊ณก ๋ฃ๊ณ ์ถ์ด์! ๐ต" ๋ฒํผ (POST /vote/{song->id} ํผ ์ ์ถ)
- 1์~3์ ๋
ธ๋์ ํน๋ณ ๋ฐฐ์ง ํ์ ("๐ 1์", "๐ฅ 2์", "๐ฅ 3์")
- ํฌํ ์๋ฃ ๋ฉ์์ง ํ์ (session('success') ํ์ธ)
4. Tailwind CSS ์คํ์ผ๋ง:
- ์นด๋: ๋ฐฐ๊ฒฝ ํฐ์, ๊ทธ๋ฆผ์, ๋ฅ๊ทผ ๋ชจ์๋ฆฌ, ํธ๋ฒ ์ ์ค์ผ์ผ ์ ๋๋ฉ์ด์
- ๋ฒํผ: ๊ธฐ๋ณธ ํ๋์, ํธ๋ฒ ์ ์งํ ํ๋์, ํฌํ ํ ์ด๋ก์์ผ๋ก ๋ณ๊ฒฝ (์ ํ)
- ๋ํ์ ์นด์ดํฐ: ํฐ ํฐํธ, ๋ณผ๋์ฒด, ๊ฐ์กฐ ์์
- ๋ฐ์ํ ๋์์ธ: ๋ชจ๋ฐ์ผ(1์ด), ํ๋ธ๋ฆฟ(2์ด), ๋ฐ์คํฌํฑ(3์ด)
์๋ฃ ํ ๋ธ๋ผ์ฐ์ ์์ http://localhost:8000 ์ ์ ์ ๋
ธ๋ ๋ชฉ๋ก์ด ์นด๋ ํํ๋ก ํ์๋๊ณ , ํฌํ ๋ฒํผ ํด๋ฆญ ์ ๋ํ์๊ฐ ์ฆ๊ฐํ๋ฉฐ ํ์ด์ง๊ฐ ์๋ก๊ณ ์นจ๋๋์ง ํ์ธํด์ฃผ์ธ์.
๊ธฐ๋ ๊ฒฐ๊ณผ: ๋ฉ์ธ ํ์ด์ง(/)์ ๋ ธ๋ ๋ชฉ๋ก์ด ๋ํ์ ์์ผ๋ก ์นด๋ ํํ๋ก ํ์๋ฉ๋๋ค. ๊ฐ ์นด๋์๋ ์จ๋ฒ ์ปค๋ฒ, ๊ณก๋ช , ์จ๋ฒ๋ช , ์ฅ๋ฅด, ๋ํ์, ํฌํ ๋ฒํผ์ด ํฌํจ๋ฉ๋๋ค. ํฌํ ๋ฒํผ ํด๋ฆญ ์ ํด๋น ๋ ธ๋์ ๋ํ์๊ฐ 1 ์ฆ๊ฐํ๊ณ , ํ์ด์ง๊ฐ ์๋ก๊ณ ์นจ๋๋ฉฐ ์์๊ฐ ์ ๋ฐ์ดํธ๋ฉ๋๋ค. 1์~3์ ๋ ธ๋์๋ ํน๋ณ ๋ฐฐ์ง๊ฐ ํ์๋ฉ๋๋ค.
UI/UX๋ฅผ ๊ฐ์ ํ๊ณ ๋ณด๋์ค ๊ธฐ๋ฅ์ ์ถ๊ฐํด์ฃผ์ธ์.
์๊ตฌ์ฌํญ:
1. **ํฌํ ์๋ฃ ํผ๋๋ฐฑ ๊ฐํ**:
- ํฌํ ํ ์ธ์
์ ํฌํํ ๋
ธ๋ ID ์ ์ฅ (session()->put('voted_songs', []))
- ์ด๋ฏธ ํฌํํ ๋
ธ๋๋ ๋ฒํผ์ ๋นํ์ฑํํ๊ฑฐ๋ "ํฌํ ์๋ฃ โ
" ํ
์คํธ๋ก ๋ณ๊ฒฝ
- ํฌํ ์๋ฃ ์ Toast ์๋ฆผ ๋๋ ๊ฐ๋จํ ๋ชจ๋ฌ ํ์ (์ ํ, Alpine.js ์ฌ์ฉ ๊ฐ๋ฅ)
2. **์ ๋๋ฉ์ด์
ํจ๊ณผ**:
- ํฌํ ๋ฒํผ ํด๋ฆญ ์ ํํธ ์ด๋ชจ์ง(โค๏ธ) ๋ ๋ฆฌ๊ธฐ ์ ๋๋ฉ์ด์
(CSS keyframes ๋๋ Alpine.js)
- ๋ํ์ ์ฆ๊ฐ ์ ์ซ์ ์นด์ดํฐ ์ ๋๋ฉ์ด์
(์ ํ, CountUp.js ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ CSS transition)
3. **์ฅ๋ฅด ํํฐ๋ง**:
- ํ์ด์ง ์๋จ์ ์ฅ๋ฅด ํํฐ ๋ฒํผ ์ถ๊ฐ (์ ์ฒด, Rock, Ballad, Dance, Pop)
- JavaScript๋ก ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ํํฐ๋ง ๊ตฌํ (data-genre ์์ฑ ํ์ฉ)
4. **Spotify ๋ฏธ๋ฆฌ๋ฃ๊ธฐ ๋งํฌ**:
- ๊ฐ ์นด๋์ "๐ง ๋ฏธ๋ฆฌ๋ฃ๊ธฐ" ๋ฒํผ ์ถ๊ฐ (spotify_link๊ฐ ์๋ ๊ฒฝ์ฐ๋ง ํ์)
- ์ ์ฐฝ์ผ๋ก Spotify ๋งํฌ ์ด๊ธฐ (target="_blank")
5. **๋คํฌ ๋ชจ๋ ์ง์**:
- Tailwind CSS dark: ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋คํฌ ๋ชจ๋ ์คํ์ผ ์ถ๊ฐ
- ํ์ด์ง ์๋จ์ ๋คํฌ ๋ชจ๋ ํ ๊ธ ๋ฒํผ (Alpine.js ๋๋ JavaScript๋ก ๊ตฌํ)
6. **๋ฐ์ํ ๊ฐ์ **:
- ๋ชจ๋ฐ์ผ์์ ์นด๋ ํฌ๊ธฐ ์ต์ ํ
- ํ๋ธ๋ฆฟ์์ 2์ด ๊ทธ๋ฆฌ๋ ๊ฐ๊ฒฉ ์กฐ์
์๋ฃ ํ ๋ธ๋ผ์ฐ์ ์์ ํฌํ ์ ์ ๋๋ฉ์ด์
์ด ์๋ํ๊ณ , ์ฅ๋ฅด ํํฐ๋ง์ด ๋์ํ๋ฉฐ, ๋คํฌ ๋ชจ๋ ์ ํ์ด ๊ฐ๋ฅํ์ง ํ์ธํด์ฃผ์ธ์.
๊ธฐ๋ ๊ฒฐ๊ณผ: ํฌํ ์๋ฃ ํ ํด๋น ๋ ธ๋์ ๋ฒํผ์ด ๋นํ์ฑํ๋๊ฑฐ๋ "ํฌํ ์๋ฃ" ์ํ๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค. ํฌํ ์ ํํธ ์ ๋๋ฉ์ด์ ์ด ์ฌ์๋๊ณ , ๋ํ์๊ฐ ๋ถ๋๋ฝ๊ฒ ์ฆ๊ฐํฉ๋๋ค. ์ฅ๋ฅด ํํฐ ๋ฒํผ์ผ๋ก ํน์ ์ฅ๋ฅด ๋ ธ๋๋ง ํ์ํ ์ ์์ต๋๋ค. Spotify ๋งํฌ๊ฐ ์๋ ๋ ธ๋๋ ๋ฏธ๋ฆฌ๋ฃ๊ธฐ ๋ฒํผ์ด ํ์๋ฉ๋๋ค. ๋คํฌ ๋ชจ๋ ํ ๊ธ ๋ฒํผ์ผ๋ก ํ ๋ง๋ฅผ ์ ํํ ์ ์์ต๋๋ค.
์ ์ถ๋ ์ํ (0)
๋ก๊ทธ์ธ ํ ์ ์ถ์์ง ์ ์ถ๋ ์ํ์ด ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๋์ ์๊ฐ ๋์ด๋ณด์ธ์!