๐ŸŽจ ํ”„๋ฆฌ๋žœ์„œ ํฌํŠธํด๋ฆฌ์˜ค ๋žœ๋”ฉํŽ˜์ด์ง€ - ์ž‘์—…๋ฌผ ๊ฐค๋Ÿฌ๋ฆฌ & ๋ฌธ์˜ ํผ - ๋ฐ”์ด๋ธŒ์ฝ”๋”ฉ ๋ ˆ์‹œํ”ผ
์ž…๋ฌธ PHP Laravel AI: Claude

๐ŸŽจ ํ”„๋ฆฌ๋žœ์„œ ํฌํŠธํด๋ฆฌ์˜ค ๋žœ๋”ฉํŽ˜์ด์ง€ - ์ž‘์—…๋ฌผ ๊ฐค๋Ÿฌ๋ฆฌ & ๋ฌธ์˜ ํผ

๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ช… freelancer-portfolio-landing
์กฐํšŒ์ˆ˜ 131 0๊ฑด ์ œ์ถœ

๋ฌธ์ œ ์„ค๋ช…

ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

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

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

  1. ํžˆ์–ด๋กœ ์„น์…˜: ํ”„๋กœํ•„ ์‚ฌ์ง„, ์ด๋ฆ„, ์ง์—…, ์งง์€ ์†Œ๊ฐœ ๋ฌธ๊ตฌ
  2. ์ž‘์—…๋ฌผ ๊ฐค๋Ÿฌ๋ฆฌ: ํฌํŠธํด๋ฆฌ์˜ค ํ”„๋กœ์ ํŠธ ๋ชฉ๋ก (์ด๋ฏธ์ง€, ์ œ๋ชฉ, ์„ค๋ช…, ์‚ฌ์šฉ ๊ธฐ์ˆ )
    • ์นด๋“œ ํ˜•ํƒœ๋กœ ๊ทธ๋ฆฌ๋“œ ๋ ˆ์ด์•„์›ƒ
    • ํ˜ธ๋ฒ„ ์‹œ ํ™•๋Œ€ ํšจ๊ณผ ๋˜๋Š” ๊ทธ๋ฆผ์ž ์• ๋‹ˆ๋ฉ”์ด์…˜
  3. ๊ธฐ์ˆ  ์Šคํƒ ์„น์…˜: ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ธฐ์ˆ /๋„๊ตฌ๋ฅผ ๋ฑƒ์ง€๋กœ ํ‘œ์‹œ
  4. ๋ฌธ์˜ํ•˜๊ธฐ ํผ: ์ด๋ฆ„, ์ด๋ฉ”์ผ, ํ”„๋กœ์ ํŠธ ๋‚ด์šฉ ์ž…๋ ฅ ํ›„ DB์— ์ €์žฅ
    • ํผ ์ œ์ถœ ์‹œ ์„ฑ๊ณต ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ
  5. ๋ฐ˜์‘ํ˜• ๋””์ž์ธ: ๋ชจ๋ฐ”์ผ/ํƒœ๋ธ”๋ฆฟ/๋ฐ์Šคํฌํ†ฑ ๋ชจ๋‘ ์ตœ์ ํ™”

์„ ํƒ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ (๋ณด๋„ˆ์Šค)

  • ์ž‘์—…๋ฌผ ์นดํ…Œ๊ณ ๋ฆฌ ํ•„ํ„ฐ๋ง (์›น, ๋ชจ๋ฐ”์ผ, ๋””์ž์ธ ๋“ฑ)
  • ๋‹คํฌ ๋ชจ๋“œ ํ† ๊ธ€ ๋ฒ„ํŠผ
  • ์Šคํฌ๋กค ์‹œ ๋ถ€๋“œ๋Ÿฌ์šด ์• ๋‹ˆ๋ฉ”์ด์…˜ (fade-in, slide-up)
  • SNS ๋งํฌ ์•„์ด์ฝ˜ (GitHub, LinkedIn, Behance ๋“ฑ)
  • ์ด๋ฉ”์ผ ์ž๋™ ๋ฐœ์†ก (๋ฌธ์˜ ์ ‘์ˆ˜ ํ™•์ธ ๋ฉ”์ผ)

๊ธฐ์ˆ  ์Šคํƒ

  • ๋ฐฑ์—”๋“œ: Laravel 13.x + Blade ํ…œํ”Œ๋ฆฟ
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค: SQLite (๊ฐ„๋‹จํ•œ ์„ค์ •)
  • ์Šคํƒ€์ผ๋ง: Tailwind CSS
  • ์• ๋‹ˆ๋ฉ”์ด์…˜: Alpine.js (์„ ํƒ์ )

์™œ ์ด ํ”„๋กœ์ ํŠธ์ธ๊ฐ€?

  • ์‹ค์ œ๋กœ ์ž์‹ ์˜ ํฌํŠธํด๋ฆฌ์˜ค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • ์‹œ๊ฐ์  ๊ฒฐ๊ณผ๋ฌผ์ด ์ฆ‰์‹œ ํ™•์ธ ๊ฐ€๋Šฅ
  • CRUD์˜ ๊ธฐ๋ณธ (Create: ๋ฌธ์˜ ๋“ฑ๋ก, Read: ์ž‘์—…๋ฌผ ์กฐํšŒ)
  • Blade ์ปดํฌ๋„ŒํŠธ์™€ Tailwind CSS ํ™œ์šฉ๋ฒ• ํ•™์Šต
  • ํ”„๋ฆฌ๋žœ์„œ/์ฐฝ์—…์ž๊ฐ€ ๋ฐ”๋กœ ์จ๋จน์„ ์ˆ˜ ์žˆ๋Š” ์‹ค์šฉ์  ์„œ๋น„์Šค

์ œ์•ฝ ์กฐ๊ฑด

  • โ€ข Laravel 13.x ์‚ฌ์šฉ (์ตœ์‹  ๋ฒ„์ „ ํ•„์ˆ˜)
  • โ€ข Blade ํ…œํ”Œ๋ฆฟ ์—”์ง„ ์‚ฌ์šฉ (React/Vue ๊ธˆ์ง€)
  • โ€ข Tailwind CSS๋กœ ์Šคํƒ€์ผ๋ง
  • โ€ข SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (์„ค์ • ๊ฐ„ํŽธ)
  • โ€ข ๋ฌธ์˜ ํผ ๋ฐ์ดํ„ฐ๋Š” DB์— ์ €์žฅ (์ด๋ฉ”์ผ ๋ฐœ์†ก์€ ์„ ํƒ์‚ฌํ•ญ)
  • โ€ข ๋ฐ˜์‘ํ˜• ๋””์ž์ธ ํ•„์ˆ˜ (๋ชจ๋ฐ”์ผ ์šฐ์„ )
  • โ€ข ์ž‘์—…๋ฌผ ๋ฐ์ดํ„ฐ๋Š” ์‹œ๋“œ(Seeder)๋กœ ๋ฏธ๋ฆฌ ์ƒ์„ฑ
  • โ€ข ๋‹จ์ผ ํŽ˜์ด์ง€ ๊ตฌ์กฐ (์Šคํฌ๋กค๋กœ ์„น์…˜ ์ด๋™)

ํ”„๋กฌํ”„ํŠธ ๋ ˆ์‹œํ”ผ

์•„๋ž˜ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ AI์—๊ฒŒ ๋ณด๋‚ด๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ณต์‚ฌ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜์„ธ์š”.

1
Step 1
mkdir freelancer-portfolio-landing && cd freelancer-portfolio-landing

์ด ํด๋”์—์„œ Laravel 13.x ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

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

1. Laravel 13.x ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”.
   - `composer create-project laravel/laravel .` ๋ช…๋ น ์‚ฌ์šฉ
   - ํ˜„์žฌ ํด๋”(.)์— ์ง์ ‘ ์„ค์น˜

2. Tailwind CSS ์„ค์ •:
   - `npm install -D tailwindcss postcss autoprefixer` ์‹คํ–‰
   - `npx tailwindcss init -p`๋กœ ์„ค์ • ํŒŒ์ผ ์ƒ์„ฑ
   - `tailwind.config.js`์—์„œ content ๊ฒฝ๋กœ๋ฅผ `['./resources/**/*.blade.php', './resources/**/*.js']`๋กœ ์„ค์ •
   - `resources/css/app.css`์— Tailwind ๋””๋ ‰ํ‹ฐ๋ธŒ ์ถ”๊ฐ€:
     ```css
     @tailwind base;
     @tailwind components;
     @tailwind utilities;
     ```
   - `vite.config.js`์—์„œ Tailwind CSS๊ฐ€ ๋นŒ๋“œ๋˜๋„๋ก ์„ค์ •

3. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ •:
   - `.env` ํŒŒ์ผ์—์„œ `DB_CONNECTION=sqlite`๋กœ ๋ณ€๊ฒฝ
   - `DB_DATABASE=database/database.sqlite` ์„ค์ •
   - `database/database.sqlite` ํŒŒ์ผ ์ƒ์„ฑ (๋นˆ ํŒŒ์ผ)

4. ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰ ์ค€๋น„:
   - `php artisan serve` ๋ช…๋ น์œผ๋กœ Laravel ์„œ๋ฒ„ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋„๋ก
   - `npm run dev` ๋ช…๋ น์œผ๋กœ Vite ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋„๋ก

5. ํ™•์ธ:
   - `http://localhost:8000` ์ ‘์† ์‹œ Laravel ๊ธฐ๋ณธ ํŽ˜์ด์ง€๊ฐ€ ๋ณด์ด๋ฉด ์„ฑ๊ณต
   - Tailwind CSS๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋กœ๋“œ๋˜๋Š”์ง€ ํ™•์ธ (๊ฐ„๋‹จํ•œ ํด๋ž˜์Šค ํ…Œ์ŠคํŠธ)

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: Laravel 13.x ํ”„๋กœ์ ํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , Tailwind CSS๊ฐ€ ์„ค์ •๋˜๋ฉฐ, SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ค€๋น„๋ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰ ์‹œ ๊ธฐ๋ณธ Laravel ํŽ˜์ด์ง€๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

2
Step 2
**๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๊ณผ ๋ชจ๋ธ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.**

1. **Portfolio ๋ชจ๋ธ๊ณผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ƒ์„ฑ:**
   - `php artisan make:model Portfolio -m` ๋ช…๋ น ์‹คํ–‰
   - ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ(`database/migrations/xxxx_create_portfolios_table.php`)์— ๋‹ค์Œ ์ปฌ๋Ÿผ ์ถ”๊ฐ€:
     - `title` (string, ์ž‘์—…๋ฌผ ์ œ๋ชฉ)
     - `description` (text, ์ž‘์—…๋ฌผ ์„ค๋ช…)
     - `image_url` (string, ์ด๋ฏธ์ง€ URL ๋˜๋Š” ๊ฒฝ๋กœ)
     - `tech_stack` (string, ์‚ฌ์šฉ ๊ธฐ์ˆ  - ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„)
     - `category` (string, ์นดํ…Œ๊ณ ๋ฆฌ ์˜ˆ: 'web', 'mobile', 'design')
     - `project_url` (string, nullable, ํ”„๋กœ์ ํŠธ ๋งํฌ)
     - `timestamps`

2. **Inquiry ๋ชจ๋ธ๊ณผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ƒ์„ฑ:**
   - `php artisan make:model Inquiry -m` ๋ช…๋ น ์‹คํ–‰
   - ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ์— ๋‹ค์Œ ์ปฌ๋Ÿผ ์ถ”๊ฐ€:
     - `name` (string, ๋ฌธ์˜์ž ์ด๋ฆ„)
     - `email` (string, ๋ฌธ์˜์ž ์ด๋ฉ”์ผ)
     - `message` (text, ๋ฌธ์˜ ๋‚ด์šฉ)
     - `timestamps`

3. **๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹คํ–‰:**
   - `php artisan migrate` ์‹คํ–‰ํ•˜์—ฌ ํ…Œ์ด๋ธ” ์ƒ์„ฑ

4. **๋ชจ๋ธ ์„ค์ •:**
   - `Portfolio` ๋ชจ๋ธ์— `$fillable` ์†์„ฑ ์ถ”๊ฐ€:
     ```php
     protected $fillable = ['title', 'description', 'image_url', 'tech_stack', 'category', 'project_url'];
     ```
   - `Inquiry` ๋ชจ๋ธ์— `$fillable` ์†์„ฑ ์ถ”๊ฐ€:
     ```php
     protected $fillable = ['name', 'email', 'message'];
     ```

5. **ํ™•์ธ:**
   - `php artisan tinker`๋กœ ๋ชจ๋ธ ์ ‘๊ทผ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํ™•์ธ
   - `Portfolio::count()`, `Inquiry::count()` ๋ช…๋ น์ด ์ •์ƒ ์ž‘๋™ํ•˜๋ฉด ์„ฑ๊ณต

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: portfolios์™€ inquiries ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋˜๊ณ , Portfolio์™€ Inquiry ๋ชจ๋ธ์ด ์ค€๋น„๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

3
Step 3
**์‹œ๋”(Seeder)๋กœ ์ƒ˜ํ”Œ ํฌํŠธํด๋ฆฌ์˜ค ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.**

1. **Portfolio Seeder ์ƒ์„ฑ:**
   - `php artisan make:seeder PortfolioSeeder` ๋ช…๋ น ์‹คํ–‰
   - `database/seeders/PortfolioSeeder.php` ํŒŒ์ผ์— ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ 5~8๊ฐœ ์ถ”๊ฐ€:
     ```php
     use App\Models\Portfolio;
     use Illuminate\Database\Seeder;

     class PortfolioSeeder extends Seeder
     {
         public function run()
         {
             Portfolio::create([
                 'title' => '์ด์ปค๋จธ์Šค ์‡ผํ•‘๋ชฐ ์›น์‚ฌ์ดํŠธ',
                 'description' => '๋ฐ˜์‘ํ˜• ์˜จ๋ผ์ธ ์‡ผํ•‘๋ชฐ ํ”„๋ก ํŠธ์—”๋“œ ๊ตฌํ˜„. ์žฅ๋ฐ”๊ตฌ๋‹ˆ, ๊ฒฐ์ œ, ์ฃผ๋ฌธ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ ํฌํ•จ.',
                 'image_url' => 'https://images.unsplash.com/photo-1557821552-17105176677c?w=800',
                 'tech_stack' => 'Laravel, Tailwind CSS, MySQL',
                 'category' => 'web',
                 'project_url' => 'https://example.com/ecommerce'
             ]);

             Portfolio::create([
                 'title' => '๋ชจ๋ฐ”์ผ ํˆฌ๋‘ ์•ฑ UI',
                 'description' => 'iOS/Android ํˆฌ๋‘ ์•ฑ ๋””์ž์ธ ๋ฐ ํ”„๋กœํ† ํƒ€์ž…. ๋‹คํฌ๋ชจ๋“œ ์ง€์›.',
                 'image_url' => 'https://images.unsplash.com/photo-1512941937669-90a1b58e7e9c?w=800',
                 'tech_stack' => 'Figma, React Native',
                 'category' => 'mobile',
                 'project_url' => null
             ]);

             Portfolio::create([
                 'title' => '๋ธŒ๋žœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ๋””์ž์ธ',
                 'description' => '์Šคํƒ€ํŠธ์—… ๋กœ๊ณ , ๋ช…ํ•จ, ๋ธŒ๋กœ์Šˆ์–ด ๋””์ž์ธ ํŒจํ‚ค์ง€.',
                 'image_url' => 'https://images.unsplash.com/photo-1561070791-2526d30994b5?w=800',
                 'tech_stack' => 'Adobe Illustrator, Photoshop',
                 'category' => 'design',
                 'project_url' => 'https://behance.net/example'
             ]);

             // ๋‚˜๋จธ์ง€ ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ (์ด 5~8๊ฐœ)
         }
     }
     ```

2. **DatabaseSeeder์— ๋“ฑ๋ก:**
   - `database/seeders/DatabaseSeeder.php` ํŒŒ์ผ์—์„œ `run()` ๋ฉ”์„œ๋“œ์— ์ถ”๊ฐ€:
     ```php
     $this->call(PortfolioSeeder::class);
     ```

3. **์‹œ๋” ์‹คํ–‰:**
   - `php artisan db:seed` ๋ช…๋ น ์‹คํ–‰

4. **ํ™•์ธ:**
   - `php artisan tinker`์—์„œ `Portfolio::all()`๋กœ ๋ฐ์ดํ„ฐ ํ™•์ธ
   - 5~8๊ฐœ์˜ ์ƒ˜ํ”Œ ํฌํŠธํด๋ฆฌ์˜ค๊ฐ€ ์กฐํšŒ๋˜๋ฉด ์„ฑ๊ณต

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: ์ƒ˜ํ”Œ ํฌํŠธํด๋ฆฌ์˜ค ๋ฐ์ดํ„ฐ๊ฐ€ DB์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์นดํ…Œ๊ณ ๋ฆฌ(web, mobile, design)์˜ ์ž‘์—…๋ฌผ์ด ์ค€๋น„๋ฉ๋‹ˆ๋‹ค.

4
Step 4
**๋ฉ”์ธ ํŽ˜์ด์ง€ ๋ผ์šฐํŠธ์™€ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , Blade ๋ทฐ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.**

1. **HomeController ์ƒ์„ฑ:**
   - `php artisan make:controller HomeController` ๋ช…๋ น ์‹คํ–‰
   - `app/Http/Controllers/HomeController.php`์— `index()` ๋ฉ”์„œ๋“œ ์ž‘์„ฑ:
     ```php
     use App\Models\Portfolio;

     public function index()
     {
         $portfolios = Portfolio::all();
         return view('home', compact('portfolios'));
     }
     ```

2. **๋ผ์šฐํŠธ ์„ค์ •:**
   - `routes/web.php`์—์„œ ๊ธฐ๋ณธ ๋ผ์šฐํŠธ๋ฅผ ๋‹ค์Œ์œผ๋กœ ๋ณ€๊ฒฝ:
     ```php
     use App\Http\Controllers\HomeController;

     Route::get('/', [HomeController::class, 'index'])->name('home');
     ```

3. **Blade ๋ทฐ ์ƒ์„ฑ:**
   - `resources/views/home.blade.php` ํŒŒ์ผ ์ƒ์„ฑ
   - ๋‹ค์Œ ์„น์…˜ ๊ตฌ์กฐ๋กœ HTML ์ž‘์„ฑ:
     - **ํ—ค๋”**: ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ” (๋กœ๊ณ , ์„น์…˜ ๋งํฌ)
     - **ํžˆ์–ด๋กœ ์„น์…˜**: ํ”„๋กœํ•„ ์‚ฌ์ง„, ์ด๋ฆ„, ์ง์—…, ์†Œ๊ฐœ ๋ฌธ๊ตฌ
       - ์˜ˆ: "์•ˆ๋…•ํ•˜์„ธ์š”, ํ”„๋ฆฌ๋žœ์„œ ์›น ๊ฐœ๋ฐœ์ž ํ™๊ธธ๋™์ž…๋‹ˆ๋‹ค."
       - Tailwind CSS๋กœ ์ค‘์•™ ์ •๋ ฌ, ํฐ ํฐํŠธ, ๊ทธ๋ผ๋””์–ธํŠธ ๋ฐฐ๊ฒฝ
     - **ํฌํŠธํด๋ฆฌ์˜ค ๊ฐค๋Ÿฌ๋ฆฌ**: ์ž‘์—…๋ฌผ ์นด๋“œ ๊ทธ๋ฆฌ๋“œ (3์—ด ๋ ˆ์ด์•„์›ƒ)
       - ๊ฐ ์นด๋“œ: ์ด๋ฏธ์ง€, ์ œ๋ชฉ, ์„ค๋ช…, ๊ธฐ์ˆ  ์Šคํƒ ๋ฑƒ์ง€
       - `@foreach($portfolios as $portfolio)` ๋ฐ˜๋ณต๋ฌธ ์‚ฌ์šฉ
       - ํ˜ธ๋ฒ„ ์‹œ ๊ทธ๋ฆผ์ž ํšจ๊ณผ (`hover:shadow-2xl transition`)
     - **๊ธฐ์ˆ  ์Šคํƒ ์„น์…˜**: ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ธฐ์ˆ  ๋ฑƒ์ง€ ํ‘œ์‹œ
       - ์˜ˆ: Laravel, React, Tailwind CSS, Figma ๋“ฑ
     - **๋ฌธ์˜ํ•˜๊ธฐ ํผ ์„น์…˜**: (๋‹ค์Œ ๋‹จ๊ณ„์—์„œ ๊ตฌํ˜„)

4. **Tailwind CSS ์Šคํƒ€์ผ๋ง:**
   - ๋ฐ˜์‘ํ˜• ๊ทธ๋ฆฌ๋“œ: `grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6`
   - ์นด๋“œ ์Šคํƒ€์ผ: `bg-white rounded-lg shadow-lg overflow-hidden`
   - ๋ฑƒ์ง€ ์Šคํƒ€์ผ: `bg-blue-100 text-blue-800 px-3 py-1 rounded-full text-sm`

5. **ํ™•์ธ:**
   - `http://localhost:8000` ์ ‘์† ์‹œ ํฌํŠธํด๋ฆฌ์˜ค ๊ฐค๋Ÿฌ๋ฆฌ๊ฐ€ ๋ณด์ด๋ฉด ์„ฑ๊ณต
   - ์ด๋ฏธ์ง€, ์ œ๋ชฉ, ์„ค๋ช…์ด ์ •์ƒ์ ์œผ๋กœ ๋ Œ๋”๋ง๋˜๋Š”์ง€ ํ™•์ธ

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: ๋ฉ”์ธ ํŽ˜์ด์ง€์— ํžˆ์–ด๋กœ ์„น์…˜๊ณผ ํฌํŠธํด๋ฆฌ์˜ค ๊ฐค๋Ÿฌ๋ฆฌ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. Tailwind CSS๋กœ ์Šคํƒ€์ผ๋ง๋œ ๋ฐ˜์‘ํ˜• ๋ ˆ์ด์•„์›ƒ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

5
Step 5
**๋ฌธ์˜ํ•˜๊ธฐ ํผ์„ ๊ตฌํ˜„ํ•˜๊ณ , DB์— ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.**

1. **InquiryController ์ƒ์„ฑ:**
   - `php artisan make:controller InquiryController` ๋ช…๋ น ์‹คํ–‰
   - `store()` ๋ฉ”์„œ๋“œ ์ž‘์„ฑ:
     ```php
     use App\Models\Inquiry;
     use Illuminate\Http\Request;

     public function store(Request $request)
     {
         $validated = $request->validate([
             'name' => 'required|string|max:255',
             'email' => 'required|email|max:255',
             'message' => 'required|string|max:1000'
         ]);

         Inquiry::create($validated);

         return redirect()->back()->with('success', '๋ฌธ์˜๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ ‘์ˆ˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค!');
     }
     ```

2. **๋ผ์šฐํŠธ ์ถ”๊ฐ€:**
   - `routes/web.php`์— POST ๋ผ์šฐํŠธ ์ถ”๊ฐ€:
     ```php
     use App\Http\Controllers\InquiryController;

     Route::post('/inquiry', [InquiryController::class, 'store'])->name('inquiry.store');
     ```

3. **home.blade.php์— ๋ฌธ์˜ ํผ ์ถ”๊ฐ€:**
   - ๋ฌธ์˜ํ•˜๊ธฐ ์„น์…˜์— ํผ ์ถ”๊ฐ€:
     ```blade
     <section id="contact" class="py-16 bg-gray-50">
         <div class="container mx-auto px-4 max-w-2xl">
             <h2 class="text-3xl font-bold text-center mb-8">๋ฌธ์˜ํ•˜๊ธฐ</h2>
             
             @if(session('success'))
                 <div class="bg-green-100 border border-green-400 text-green-700 px-4 py-3 rounded mb-4">
                     {{ session('success') }}
                 </div>
             @endif

             <form action="{{ route('inquiry.store') }}" method="POST" class="space-y-4">
                 @csrf
                 <div>
                     <label class="block text-sm font-medium mb-2">์ด๋ฆ„</label>
                     <input type="text" name="name" required class="w-full px-4 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500">
                     @error('name')
                         <p class="text-red-500 text-sm mt-1">{{ $message }}</p>
                     @enderror
                 </div>
                 <div>
                     <label class="block text-sm font-medium mb-2">์ด๋ฉ”์ผ</label>
                     <input type="email" name="email" required class="w-full px-4 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500">
                     @error('email')
                         <p class="text-red-500 text-sm mt-1">{{ $message }}</p>
                     @enderror
                 </div>
                 <div>
                     <label class="block text-sm font-medium mb-2">ํ”„๋กœ์ ํŠธ ๋‚ด์šฉ</label>
                     <textarea name="message" rows="5" required class="w-full px-4 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500"></textarea>
                     @error('message')
                         <p class="text-red-500 text-sm mt-1">{{ $message }}</p>
                     @enderror
                 </div>
                 <button type="submit" class="w-full bg-blue-600 text-white py-3 rounded-lg hover:bg-blue-700 transition">
                     ๋ฌธ์˜ํ•˜๊ธฐ
                 </button>
             </form>
         </div>
     </section>
     ```

4. **ํ™•์ธ:**
   - ๋ฌธ์˜ ํผ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์ œ์ถœ
   - ์„ฑ๊ณต ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๊ณ , DB์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š”์ง€ ํ™•์ธ
   - `php artisan tinker`์—์„œ `Inquiry::all()`๋กœ ํ™•์ธ

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: ๋ฌธ์˜ํ•˜๊ธฐ ํผ์ด ์ž‘๋™ํ•˜๊ณ , ์ œ์ถœ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ DB์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์„ฑ๊ณต ๋ฉ”์‹œ์ง€์™€ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์ œ์ถœ๋œ ์ž‘ํ’ˆ (0)

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

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

๋Œ“๊ธ€ (0)

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