๐ฐ ํ๋ฒ ์ดํน ๋ ์ํผ๋ถ - ๋ด๊ฐ ๋ง๋ ๋์ ํธ ์์นด์ด๋ธ
homebaking-recipe-archive
๋ฌธ์ ์ค๋ช
ํ๋ก์ ํธ ๊ฐ์
ํ๋ฒ ์ดํน์ ์ฆ๊ธฐ๋ ์ฌ๋๋ค์ ์ํ ๊ฐ์ธ ๋ ์ํผ ์์นด์ด๋ธ ์น์ฌ์ดํธ๋ฅผ ๋ง๋ญ๋๋ค. ๋ง๋ ๋์ ํธ์ ์ฌ์ง, ๋ ์ํผ, ๋์ด๋, ์์ ์๊ฐ์ ๊ธฐ๋กํ๊ณ ์ฑ๊ณต/์คํจ ๋ฉ๋ชจ๋ฅผ ๋จ๊ธธ ์ ์์ต๋๋ค. Laravel 13.x + Blade ํ ํ๋ฆฟ + Tailwind CSS๋ก ๊ตฌํํ๋ฉฐ, SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ๊ฒ ์์ํ ์ ์์ต๋๋ค.
ํ์ ๊ธฐ๋ฅ
- ๋ ์ํผ ๋ฑ๋ก: ๋์ ํธ ์ด๋ฆ, ์นดํ ๊ณ ๋ฆฌ(์ผ์ดํฌ/์ฟ ํค/ํ๋ฅดํธ/๋นต ๋ฑ), ๋์ด๋(โญ~โญโญโญโญโญ), ์์ ์๊ฐ, ์ฌ๋ฃ ๋ชฉ๋ก, ๋ง๋๋ ๋ฐฉ๋ฒ, ์์ฑ ์ฌ์ง URL ์ ๋ ฅ
- ๋ ์ํผ ๋ชฉ๋ก: ์นด๋ ํํ๋ก ์ธ๋ค์ผ ์ด๋ฏธ์ง์ ํจ๊ป ํ์, ์นดํ ๊ณ ๋ฆฌ๋ณ ํํฐ๋ง ๊ธฐ๋ฅ
- ๋ ์ํผ ์์ธ ๋ณด๊ธฐ: ์ ์ฒด ๋ ์ํผ ๋ด์ฉ, ์ฑ๊ณต/์คํจ ๋ฉ๋ชจ, ๋ง๋ ๋ ์ง ํ์
- ๋ ์ํผ ์์ /์ญ์ : ๊ธฐ๋กํ ๋ ์ํผ ํธ์ง ๋ฐ ์ญ์ ๊ธฐ๋ฅ
- ์ฑ๊ณต๋ฅ ๋ฐฐ์ง: ๋ ์ํผ๋ณ๋ก "๋์ฑ๊ณต ๐", "๋ณดํต ๐", "์ฌ๋์ ํ์ ๐ช" ๋ฑ ์ํ ํ์
์ ํ ์ถ๊ฐ ๊ธฐ๋ฅ (๋ณด๋์ค)
- ๊ฒ์ ๊ธฐ๋ฅ: ๋์ ํธ ์ด๋ฆ์ด๋ ์ฌ๋ฃ๋ก ๊ฒ์
- ์ฆ๊ฒจ์ฐพ๊ธฐ: ์์ฃผ ๋ง๋๋ ๋ ์ํผ์ ํํธ ํ์
- ํ๊ทธ ์์คํ : #์ด์ฝ๋ฆฟ #๋น๊ฑด #๊ธ๋ฃจํ ํ๋ฆฌ ๋ฑ ์์ ํ๊ทธ ์ถ๊ฐ
- ์์ ์๊ฐ ํต๊ณ: ํ๊ท ๋ฒ ์ดํน ์๊ฐ, ๊ฐ์ฅ ์ค๋ ๊ฑธ๋ฆฐ ๋ ์ํผ ๋ฑ ๋์๋ณด๋
- ๋คํฌ ๋ชจ๋ ํ ๊ธ
๊ธฐ์ ์คํ
- Backend: Laravel 13.x (Blade ํ ํ๋ฆฟ)
- Database: SQLite
- Frontend: Tailwind CSS
- ์ด๋ฏธ์ง: ์ธ๋ถ URL ์ฌ์ฉ (Unsplash ๋ฑ)
ํ์ต ๋ชฉํ
- Laravel ๋ผ์ฐํ ๊ณผ ์ปจํธ๋กค๋ฌ ๊ธฐ๋ณธ ๊ฐ๋ ์ดํด
- Blade ํ ํ๋ฆฟ ๋ฌธ๋ฒ๊ณผ ์ปดํฌ๋ํธ ํ์ฉ
- Eloquent ORM์ผ๋ก CRUD ๊ตฌํ
- Tailwind CSS๋ก ๋ฐ์ํ ์นด๋ ๋ ์ด์์ ๊ตฌ์ฑ
- Form validation๊ณผ ์๋ฌ ๋ฉ์์ง ์ฒ๋ฆฌ
์ ์ฝ ์กฐ๊ฑด
- โข Laravel 13.x ์ฌ์ฉ (์ต์ ๋ฒ์ )
- โข Blade ํ ํ๋ฆฟ ์์ง ์ฌ์ฉ (React/Vue ๊ธ์ง)
- โข SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ
- โข Tailwind CSS๋ก ์คํ์ผ๋ง
- โข ์ด๋ฏธ์ง๋ ์ธ๋ถ URL๋ก ์ ์ฅ (ํ์ผ ์ ๋ก๋ ๊ตฌํ ๋ถํ์)
- โข ๋จ์ผ ์ฌ์ฉ์์ฉ (์ธ์ฆ ์์คํ ๋ถํ์)
- โข ๋ชจ๋ฐ์ผ ๋ฐ์ํ ๋์์ธ ํ์
ํ๋กฌํํธ ๋ ์ํผ
์๋ ํ๋กฌํํธ๋ฅผ ์์๋๋ก AI์๊ฒ ๋ณด๋ด๋ฉด ๋ฉ๋๋ค. ๋ณต์ฌ ๋ฒํผ์ ๋๋ฌ ๋ฐ๋ก ์ฌ์ฉํ์ธ์.
mkdir homebaking-recipe-archive && cd homebaking-recipe-archive
์ด ํด๋์์ Laravel 13.x ํ๋ก์ ํธ๋ฅผ ์์ํฉ๋๋ค.
Laravel 13.x ํ๋ก์ ํธ๋ฅผ ์์ฑํ๊ณ ๊ธฐ๋ณธ ์ค์ ์ ์๋ฃํด์ฃผ์ธ์:
1. Laravel 13.x ์ค์น (composer create-project laravel/laravel . "13.*")
2. .env ํ์ผ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ SQLite๋ก ์ค์ :
- DB_CONNECTION=sqlite
- DB_DATABASE์ database/database.sqlite ๊ฒฝ๋ก ์ง์
- ๋ค๋ฅธ DB ๊ด๋ จ ์ค์ ์ ์ฃผ์ ์ฒ๋ฆฌ
3. database/database.sqlite ํ์ผ ์์ฑ (touch ๋ช
๋ น ๋๋ ๋น ํ์ผ ์์ฑ)
4. Tailwind CSS ์ค์น ๋ฐ ์ค์ (npm install, vite.config.js์ tailwind ํ๋ฌ๊ทธ์ธ ์ถ๊ฐ)
5. tailwind.config.js ์์ฑ ๋ฐ content ๊ฒฝ๋ก์ blade ํ์ผ ํฌํจ
6. resources/css/app.css์ Tailwind ๋๋ ํฐ๋ธ ์ถ๊ฐ (@tailwind base, components, utilities)
7. resources/views/layouts/app.blade.php ๋ ์ด์์ ํ์ผ ์์ฑ:
- <!DOCTYPE html> ๊ธฐ๋ณธ ๊ตฌ์กฐ
- <head>์ @vite(['resources/css/app.css', 'resources/js/app.js']) ํฌํจ
- <body>์ ๋ค๋น๊ฒ์ด์
๋ฐ (ํ๋ฒ ์ดํน ๋ ์ํผ๋ถ ๐ฐ ๋ก๊ณ , "๋ ์ํผ ์ถ๊ฐ" ๋ฒํผ)
- @yield('content') ์น์
- ํ๋จ์ ์ ์๊ถ ์ ๋ณด
- Tailwind CSS๋ก ์คํ์ผ๋ง (๋ฐฐ๊ฒฝ์, ํจ๋ฉ, ๋ฐ์ํ ์ปจํ
์ด๋)
๊ฐ๋ฐ ์๋ฒ ์คํ ๋ช
๋ น๊ณผ ํ์ธ ๋ฐฉ๋ฒ๋ ์๋ ค์ฃผ์ธ์.
๊ธฐ๋ ๊ฒฐ๊ณผ: Laravel 13.x ํ๋ก์ ํธ๊ฐ ์์ฑ๋๊ณ , SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ผ์ด ์ค๋น๋ฉ๋๋ค. Tailwind CSS๊ฐ ์ค์น๋๊ณ , ๊ธฐ๋ณธ ๋ ์ด์์ ํ์ผ(app.blade.php)์ด ์์ฑ๋์ด ๋ค๋น๊ฒ์ด์ ๋ฐ์ ํธํฐ๊ฐ ํ์๋ฉ๋๋ค. npm run dev์ php artisan serve ๋ช ๋ น์ผ๋ก ๊ฐ๋ฐ ์๋ฒ๋ฅผ ์คํํ๋ฉด Tailwind ์คํ์ผ์ด ์ ์ฉ๋ ๊ธฐ๋ณธ ๋ ์ด์์์ ํ์ธํ ์ ์์ต๋๋ค.
๋ ์ํผ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ๊ณผ ๋ชจ๋ธ์ ์์ฑํด์ฃผ์ธ์: 1. Recipe ๋ชจ๋ธ ์์ฑ (php artisan make:model Recipe -m): - app/Models/Recipe.php ํ์ผ ํ์ธ - $fillable ์์ฑ์ ๋ชจ๋ ์ ๋ ฅ ๊ฐ๋ฅ ํ๋ ์ถ๊ฐ 2. ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ (database/migrations/xxxx_create_recipes_table.php) ์์ฑ: - id (์๋ ์์ฑ) - name: string, ๋์ ํธ ์ด๋ฆ - category: string, ์นดํ ๊ณ ๋ฆฌ (์ผ์ดํฌ/์ฟ ํค/ํ๋ฅดํธ/๋นต/๊ธฐํ) - difficulty: integer, ๋์ด๋ (1~5) - duration_minutes: integer, ์์ ์๊ฐ(๋ถ) - ingredients: text, ์ฌ๋ฃ ๋ชฉ๋ก - instructions: text, ๋ง๋๋ ๋ฐฉ๋ฒ - image_url: string, nullable, ์์ฑ ์ฌ์ง URL - status: string, default 'pending', ์ฑ๊ณต ์ฌ๋ถ (pending/success/retry) - notes: text, nullable, ๋ฉ๋ชจ - timestamps (created_at, updated_at ์๋ ์์ฑ) 3. ๋ง์ด๊ทธ๋ ์ด์ ์คํ (php artisan migrate) 4. ํ ์คํธ ๋ฐ์ดํฐ ์๋ ์์ฑ (database/seeders/RecipeSeeder.php): - 3~5๊ฐ์ ์ํ ๋ ์ํผ ๋ฐ์ดํฐ ์์ฑ (์ด์ฝ์นฉ ์ฟ ํค, ๋ฐ๋๋ผ ์ผ์ดํฌ, ์ ํ ํ์ด ๋ฑ) - ์ด๋ฏธ์ง๋ Unsplash ๋ฒ ์ดํน ์ด๋ฏธ์ง URL ์ฌ์ฉ - php artisan db:seed --class=RecipeSeeder ์คํ ๋ฐฉ๋ฒ ์๋ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ ๊ตฌ์กฐ์ ์ํ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ๋ ์๋ ค์ฃผ์ธ์.
๊ธฐ๋ ๊ฒฐ๊ณผ: recipes ํ ์ด๋ธ์ด ์์ฑ๋๊ณ , Recipe ๋ชจ๋ธ์ด ์ค๋น๋ฉ๋๋ค. ๋ง์ด๊ทธ๋ ์ด์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์คํ๋์ด SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ์ด ์์ฑ๋ฉ๋๋ค. ์๋๋ฅผ ์คํํ๋ฉด 3~5๊ฐ์ ์ํ ๋ ์ํผ ๋ฐ์ดํฐ๊ฐ ์ฝ์ ๋์ด ์ฆ์ ํ ์คํธํ ์ ์์ต๋๋ค. php artisan tinker๋ก Recipe::all()์ ์คํํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
๋ ์ํผ ๋ชฉ๋ก์ ๋ณด์ฌ์ฃผ๋ ๋ฉ์ธ ํ์ด์ง๋ฅผ ๋ง๋ค์ด์ฃผ์ธ์:
1. RecipeController ์์ฑ (php artisan make:controller RecipeController):
- index() ๋ฉ์๋: ๋ชจ๋ ๋ ์ํผ๋ฅผ ์ต์ ์์ผ๋ก ์กฐํํ์ฌ ๋ทฐ์ ์ ๋ฌ
- ์นดํ
๊ณ ๋ฆฌ ํํฐ๋ง ๊ธฐ๋ฅ ์ถ๊ฐ (์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ?category=์ผ์ดํฌ)
2. routes/web.php์ ๋ผ์ฐํธ ์ถ๊ฐ:
- GET / โ RecipeController@index (๋ฉ์ธ ํ์ด์ง)
3. resources/views/recipes/index.blade.php ์์ฑ:
- @extends('layouts.app') ๋ ์ด์์ ์์
- ํ์ด์ง ์ ๋ชฉ: "๋ด ๋ฒ ์ดํน ๋ ์ํผ๋ถ ๐ฐ"
- ์นดํ
๊ณ ๋ฆฌ ํํฐ ๋ฒํผ (์ ์ฒด/์ผ์ดํฌ/์ฟ ํค/ํ๋ฅดํธ/๋นต/๊ธฐํ)
- ๋ ์ํผ ์นด๋ ๊ทธ๋ฆฌ๋ ๋ ์ด์์ (grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3)
- ๊ฐ ์นด๋์ ํ์:
* ์ธ๋ค์ผ ์ด๋ฏธ์ง (image_url, ์์ผ๋ฉด ๊ธฐ๋ณธ ์ด๋ฏธ์ง)
* ๋์ ํธ ์ด๋ฆ
* ์นดํ
๊ณ ๋ฆฌ ๋ฐฐ์ง
* ๋์ด๋ ๋ณ ํ์ (โญ x difficulty)
* ์์ ์๊ฐ (์: 45๋ถ)
* ์ํ ๋ฐฐ์ง (๋์ฑ๊ณต ๐ / ๋ณดํต ๐ / ์ฌ๋์ ํ์ ๐ช)
* "์์ธํ ๋ณด๊ธฐ" ๋งํฌ
- ๋ ์ํผ๊ฐ ์์ ๋: "์์ง ๋ ์ํผ๊ฐ ์์ด์. ์ฒซ ๋ ์ํผ๋ฅผ ์ถ๊ฐํด๋ณด์ธ์!" ๋ฉ์์ง
- Tailwind CSS๋ก ์นด๋ ๋์์ธ (shadow, rounded, hover ํจ๊ณผ)
4. ์นดํ
๊ณ ๋ฆฌ ํํฐ ํด๋ฆญ ์ URL์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ์ถ๊ฐํ์ฌ ํ์ด์ง ์๋ก๊ณ ์นจ
๋ฐ์ํ ๋์์ธ๊ณผ ํธ๋ฒ ํจ๊ณผ๋ฅผ ํฌํจํด์ฃผ์ธ์.
๊ธฐ๋ ๊ฒฐ๊ณผ: ๋ฉ์ธ ํ์ด์ง(/)์ ์ ์ํ๋ฉด ๋ ์ํผ ๋ชฉ๋ก์ด ์นด๋ ํํ๋ก ํ์๋ฉ๋๋ค. ์นดํ ๊ณ ๋ฆฌ ํํฐ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ํด๋น ์นดํ ๊ณ ๋ฆฌ์ ๋ ์ํผ๋ง ํํฐ๋ง๋์ด ํ์๋ฉ๋๋ค. ๊ฐ ์นด๋์๋ ์ธ๋ค์ผ, ์ด๋ฆ, ๋์ด๋, ์์ ์๊ฐ, ์ํ ๋ฐฐ์ง๊ฐ ๋ณด๊ธฐ ์ข๊ฒ ๋ฐฐ์น๋๋ฉฐ, ํธ๋ฒ ์ ์นด๋๊ฐ ์ด์ง ๋ ์ค๋ฅด๋ ํจ๊ณผ๊ฐ ์ ์ฉ๋ฉ๋๋ค. ๋ชจ๋ฐ์ผ/ํ๋ธ๋ฆฟ/๋ฐ์คํฌํฑ์์ ๊ทธ๋ฆฌ๋ ์ปฌ๋ผ ์๊ฐ ์๋ ์กฐ์ ๋ฉ๋๋ค.
๋ ์ํผ ์์ธ ํ์ด์ง์ ์ ๋ ์ํผ ์ถ๊ฐ ๊ธฐ๋ฅ์ ๊ตฌํํด์ฃผ์ธ์:
1. RecipeController์ ๋ฉ์๋ ์ถ๊ฐ:
- show($id): ํน์ ๋ ์ํผ ์์ธ ์กฐํ
- create(): ๋ ์ํผ ์ถ๊ฐ ํผ ํ์
- store(Request $request): ์ ๋ ์ํผ ์ ์ฅ (์ ํจ์ฑ ๊ฒ์ฌ ํฌํจ)
2. routes/web.php์ ๋ผ์ฐํธ ์ถ๊ฐ:
- GET /recipes/{id} โ RecipeController@show
- GET /recipes/create โ RecipeController@create
- POST /recipes โ RecipeController@store
3. resources/views/recipes/show.blade.php ์์ฑ (์์ธ ํ์ด์ง):
- ํฐ ์ด๋ฏธ์ง ํ์ (์์ผ๋ฉด)
- ๋์ ํธ ์ด๋ฆ (์ ๋ชฉ)
- ์นดํ
๊ณ ๋ฆฌ, ๋์ด๋, ์์ ์๊ฐ ์ ๋ณด
- ์ํ ๋ฐฐ์ง (๋์ฑ๊ณต/๋ณดํต/์ฌ๋์ ํ์)
- ์ฌ๋ฃ ๋ชฉ๋ก (์ค๋ฐ๊ฟ ์ฒ๋ฆฌํ์ฌ ๋ฆฌ์คํธ๋ก ํ์)
- ๋ง๋๋ ๋ฐฉ๋ฒ (๋จ๊ณ๋ณ๋ก ๋ณด๊ธฐ ์ข๊ฒ)
- ๋ฉ๋ชจ ์น์
(์์ผ๋ฉด)
- ๋ง๋ ๋ ์ง (created_at)
- "์์ " / "์ญ์ " / "๋ชฉ๋ก์ผ๋ก" ๋ฒํผ
- Tailwind CSS๋ก ์ฝ๊ธฐ ํธํ ํ์ดํฌ๊ทธ๋ํผ
4. resources/views/recipes/create.blade.php ์์ฑ (์ถ๊ฐ ํผ):
- ํผ ์์:
* ๋์ ํธ ์ด๋ฆ (text input, required)
* ์นดํ
๊ณ ๋ฆฌ (select: ์ผ์ดํฌ/์ฟ ํค/ํ๋ฅดํธ/๋นต/๊ธฐํ, required)
* ๋์ด๋ (radio buttons 1~5, required)
* ์์ ์๊ฐ (number input, ๋ถ ๋จ์, required)
* ์ฌ๋ฃ ๋ชฉ๋ก (textarea, placeholder: "๋ฐ๊ฐ๋ฃจ 200g\n์คํ 100g\n...", required)
* ๋ง๋๋ ๋ฐฉ๋ฒ (textarea, placeholder: "1. ์ค๋ธ์ 180๋๋ก ์์ดํฉ๋๋ค.\n2. ...", required)
* ์์ฑ ์ฌ์ง URL (text input, optional)
* ์ํ (select: pending/success/retry, default pending)
* ๋ฉ๋ชจ (textarea, optional)
- @csrf ํ ํฐ ํฌํจ
- ์ ํจ์ฑ ๊ฒ์ฌ ์๋ฌ ๋ฉ์์ง ํ์ (@error ๋๋ ํฐ๋ธ)
- "์ ์ฅ" / "์ทจ์" ๋ฒํผ
- Tailwind CSS ํผ ์คํ์ผ๋ง (focus ํจ๊ณผ, ๋ผ๋ฒจ ๋์์ธ)
5. store() ๋ฉ์๋์์ ์ ํจ์ฑ ๊ฒ์ฌ:
- name, category, difficulty, duration_minutes, ingredients, instructions ํ์
- difficulty๋ 1~5 ๋ฒ์
- duration_minutes๋ ์์
- ์ ์ฅ ํ ๋ ์ํผ ์์ธ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ (์ฑ๊ณต ๋ฉ์์ง ํฌํจ)
ํผ ์ ํจ์ฑ ๊ฒ์ฌ์ ์๋ฌ ๋ฉ์์ง ์ฒ๋ฆฌ๋ฅผ ํฌํจํด์ฃผ์ธ์.
๊ธฐ๋ ๊ฒฐ๊ณผ: ๋ ์ํผ ์นด๋์ "์์ธํ ๋ณด๊ธฐ"๋ฅผ ํด๋ฆญํ๋ฉด ์์ธ ํ์ด์ง(/recipes/{id})๋ก ์ด๋ํ์ฌ ์ ์ฒด ๋ ์ํผ ๋ด์ฉ์ ๋ณผ ์ ์์ต๋๋ค. ๋ค๋น๊ฒ์ด์ ์ "๋ ์ํผ ์ถ๊ฐ" ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ถ๊ฐ ํผ(/recipes/create)์ด ํ์๋๊ณ , ๋ชจ๋ ํ๋๋ฅผ ์ ๋ ฅํ์ฌ ์ ์ถํ๋ฉด ์ ๋ ์ํผ๊ฐ ์ ์ฅ๋ฉ๋๋ค. ํ์ ํญ๋ชฉ์ ๋น ํธ๋ฆฌ๋ฉด ์๋ฌ ๋ฉ์์ง๊ฐ ํ์๋๋ฉฐ, ์ ์ฅ ์ฑ๊ณต ์ ํด๋น ๋ ์ํผ ์์ธ ํ์ด์ง๋ก ์ด๋ํ๊ณ "๋ ์ํผ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค!" ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค.
๋ ์ํผ ์์ ๋ฐ ์ญ์ ๊ธฐ๋ฅ์ ์์ฑํด์ฃผ์ธ์:
1. RecipeController์ ๋ฉ์๋ ์ถ๊ฐ:
- edit($id): ์์ ํผ ํ์ (๊ธฐ์กด ๋ฐ์ดํฐ ๋ก๋)
- update(Request $request, $id): ๋ ์ํผ ์์ ์ ์ฅ (์ ํจ์ฑ ๊ฒ์ฌ ํฌํจ)
- destroy($id): ๋ ์ํผ ์ญ์
2. routes/web.php์ ๋ผ์ฐํธ ์ถ๊ฐ:
- GET /recipes/{id}/edit โ RecipeController@edit
- PUT /recipes/{id} โ RecipeController@update
- DELETE /recipes/{id} โ RecipeController@destroy
3. resources/views/recipes/edit.blade.php ์์ฑ:
- create.blade.php์ ์ ์ฌํ์ง๋ง ๊ธฐ์กด ๋ฐ์ดํฐ๊ฐ ์
๋ ฅ๋ ์ํ
- ํผ method๋ฅผ @method('PUT')๋ก ์ค์
- ๋ชจ๋ ํ๋์ ๊ธฐ์กด ๊ฐ ํ์ (old() ํฌํผ์ ๋ชจ๋ธ ๋ฐ์ดํฐ ์กฐํฉ)
- "์์ ์๋ฃ" / "์ทจ์" ๋ฒํผ
- Tailwind CSS ์คํ์ผ ๋์ผํ๊ฒ ์ ์ฉ
4. update() ๋ฉ์๋:
- store()์ ๋์ผํ ์ ํจ์ฑ ๊ฒ์ฌ
- ๋ ์ํผ ์
๋ฐ์ดํธ ํ ์์ธ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ (์ฑ๊ณต ๋ฉ์์ง)
5. destroy() ๋ฉ์๋:
- ๋ ์ํผ ์ญ์ ํ ๋ฉ์ธ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ (์ญ์ ์๋ฃ ๋ฉ์์ง)
6. show.blade.php์์ ์ญ์ ๋ฒํผ:
- form์ผ๋ก DELETE ์์ฒญ ์ ์ก (@method('DELETE'))
- JavaScript confirm ํ์ธ ์ฐฝ ("์ ๋ง ์ญ์ ํ์๊ฒ ์ต๋๊น?")
7. ์ธ์
ํ๋์ ๋ฉ์์ง ํ์:
- layouts/app.blade.php์ @if(session('success')) ๋ฉ์์ง ์์ญ ์ถ๊ฐ
- Tailwind CSS alert ์คํ์ผ (๋
น์ ๋ฐฐ๊ฒฝ, ์ฒดํฌ ์์ด์ฝ)
๋ชจ๋ CRUD ๊ธฐ๋ฅ์ด ์์ฑ๋๋๋ก ํด์ฃผ์ธ์.
๊ธฐ๋ ๊ฒฐ๊ณผ: ๋ ์ํผ ์์ธ ํ์ด์ง์์ "์์ " ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์์ ํผ(/recipes/{id}/edit)์ด ํ์๋๊ณ ๊ธฐ์กด ๋ด์ฉ์ด ์ ๋ ฅ๋์ด ์์ต๋๋ค. ๋ด์ฉ์ ๋ณ๊ฒฝํ๊ณ "์์ ์๋ฃ"๋ฅผ ๋๋ฅด๋ฉด ์ ๋ฐ์ดํธ๋๊ณ "๋ ์ํผ๊ฐ ์์ ๋์์ต๋๋ค!" ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค. "์ญ์ " ๋ฒํผ์ ํด๋ฆญํ๋ฉด ํ์ธ ์ฐฝ์ด ๋จ๊ณ , ํ์ธํ๋ฉด ๋ ์ํผ๊ฐ ์ญ์ ๋๋ฉฐ ๋ฉ์ธ ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค. ๋ชจ๋ ์ฑ๊ณต ๋ฉ์์ง๋ ์๋จ์ ๋ น์ ์๋ฆผ์ผ๋ก ํ์๋ฉ๋๋ค. ์ด์ ๋ ์ํผ ์ถ๊ฐ/์กฐํ/์์ /์ญ์ ๋ชจ๋ ๊ธฐ๋ฅ์ด ์์ฑ๋์์ต๋๋ค!
์ ์ถ๋ ์ํ (0)
๋ก๊ทธ์ธ ํ ์ ์ถ์์ง ์ ์ถ๋ ์ํ์ด ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๋์ ์๊ฐ ๋์ด๋ณด์ธ์!