<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>테디와 친구들의 스터디룸</title>
    <link>https://teddystudyroom.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 15 May 2026 16:29:36 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>테디아저씨</managingEditor>
    <image>
      <title>테디와 친구들의 스터디룸</title>
      <url>https://tistory1.daumcdn.net/tistory/5920485/attach/620303bd4e364f5c8161b49d7dfe0f1e</url>
      <link>https://teddystudyroom.tistory.com</link>
    </image>
    <item>
      <title>Laravel 10. API Development</title>
      <link>https://teddystudyroom.tistory.com/52</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;10과.jpeg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;571&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c20WgP/dJMcaaZwox0/ihdkSxTd0OujLXRUGxZvk0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c20WgP/dJMcaaZwox0/ihdkSxTd0OujLXRUGxZvk0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c20WgP/dJMcaaZwox0/ihdkSxTd0OujLXRUGxZvk0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc20WgP%2FdJMcaaZwox0%2FihdkSxTd0OujLXRUGxZvk0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;571&quot; data-filename=&quot;10과.jpeg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;571&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사전준비&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pakistan_cities.csv&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1128&quot; data-origin-height=&quot;425&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfi4Z9/dJMcahxGdrH/VPHwKgNklVgmY8DlSyQfp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfi4Z9/dJMcahxGdrH/VPHwKgNklVgmY8DlSyQfp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfi4Z9/dJMcahxGdrH/VPHwKgNklVgmY8DlSyQfp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbfi4Z9%2FdJMcahxGdrH%2FVPHwKgNklVgmY8DlSyQfp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1128&quot; height=&quot;425&quot; data-origin-width=&quot;1128&quot; data-origin-height=&quot;425&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;database/seeders/seederData/pakistan_cities.csv&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dinui8/dJMcaiDkBY4/PKqChV7FO5XZpbnCxKrxY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dinui8/dJMcaiDkBY4/PKqChV7FO5XZpbnCxKrxY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dinui8/dJMcaiDkBY4/PKqChV7FO5XZpbnCxKrxY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdinui8%2FdJMcaiDkBY4%2FPKqChV7FO5XZpbnCxKrxY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;962&quot; height=&quot;380&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Model&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1778804789366&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan make:model Address -m&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;database/migrations/xxxxx_create_addresses_table.php&lt;/p&gt;
&lt;pre id=&quot;code_1778805142758&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('addresses', function (Blueprint $table) {
            $table-&amp;gt;id();
            $table-&amp;gt;string('wikiDataId',50)-&amp;gt;nullable();
            $table-&amp;gt;string('type',50)-&amp;gt;nullable();
            $table-&amp;gt;string('city',50)-&amp;gt;nullable();
            $table-&amp;gt;string('name',50)-&amp;gt;nullable();
            $table-&amp;gt;string('country',50)-&amp;gt;nullable();
            $table-&amp;gt;string('countryCode',50)-&amp;gt;nullable();
            $table-&amp;gt;string('region',50)-&amp;gt;nullable();
            $table-&amp;gt;string('regionCode',50)-&amp;gt;nullable();
            $table-&amp;gt;string('regionWdId',100)-&amp;gt;nullable();
            $table-&amp;gt;decimal('latitude', 11, 8)-&amp;gt;nullable();
            $table-&amp;gt;decimal('longitude', 11, 8)-&amp;gt;nullable();
            $table-&amp;gt;integer('population')-&amp;gt;default(0);

            $table-&amp;gt;timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('addresses');
    }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;make table&lt;/p&gt;
&lt;pre id=&quot;code_1778805704849&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan migrate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Data&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Address.php&lt;/p&gt;
&lt;pre id=&quot;code_1778804662610&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan make:seeder AddressSeeder&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;database\seeders\AddressSeeder.php&lt;/p&gt;
&lt;pre id=&quot;code_1778805314313&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class AddressSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        //

        $csvFile = fopen('database/seeders/seederData/pakistan_cities.csv', &quot;r&quot;);
        $isFirstRow = true; // Flag to skip the first row

        while (($data = fgetcsv($csvFile, 1000, &quot;,&quot;)) !== FALSE) {
            if ($isFirstRow) {
                $isFirstRow = false; // Skip the first row
                continue;
            }

            \App\Models\Address::create([
                'id' =&amp;gt; $data[0],
                'wikiDataId' =&amp;gt; $data[1],
                'type' =&amp;gt; $data[2],
                'city' =&amp;gt; $data[3],
                'name' =&amp;gt; $data[4],
                'country' =&amp;gt; $data[5],
                'countryCode' =&amp;gt; $data[6],
                'region' =&amp;gt; $data[7],
                'regionCode' =&amp;gt; $data[8],
                'regionWdId' =&amp;gt; $data[9],
                'latitude' =&amp;gt; $data[10],
                'longitude' =&amp;gt; $data[11],
                'population' =&amp;gt; $data[12],
            ]);
        }

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;seeding&lt;/p&gt;
&lt;pre id=&quot;code_1778805273247&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan db:seed AddressSeeder&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app/Models/Address.php&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;기존 웹 개발방식&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저요청 =&amp;gt; HTML 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1778283796781&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;return view('posts.index',[&quot;posts&quot;=&amp;gt;$posts]);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;b&gt;web&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778739432648&quot; class=&quot;&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;routes/web.php&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;api 개발방식 &lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;664&quot; data-start=&quot;627&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;634&quot; data-start=&quot;627&quot; data-section-id=&quot;e8zvsp&quot;&gt;모바일 앱&lt;/li&gt;
&lt;li data-end=&quot;652&quot; data-start=&quot;635&quot; data-section-id=&quot;1scggdw&quot;&gt;React/Vue 프론트엔드&lt;/li&gt;
&lt;li data-end=&quot;664&quot; data-start=&quot;653&quot; data-section-id=&quot;1erba11&quot;&gt;외부 서비스 연동&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1778283804273&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;return response()-&amp;gt;json($posts);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;api&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778283959457&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;routes/api.php&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로&amp;nbsp;/api&amp;nbsp; &amp;nbsp;를 추가로 가져간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 11 버젼부터는 자동생성이 아닙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** starter 구조가 많이 간소화됐습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 사용을 위해서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bootstrap/app.php&lt;/p&gt;
&lt;pre id=&quot;code_1778744089737&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-&amp;gt;withRouting(
    web: __DIR__.'/../routes/web.php',
    commands: __DIR__.'/../routes/console.php',
    health: '/up',
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778744130178&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-&amp;gt;withRouting(
    web: __DIR__.'/../routes/web.php',
    api: __DIR__.'/../routes/api.php',
    commands: __DIR__.'/../routes/console.php',
    health: '/up',
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Api/TruckRequestController.php&lt;/p&gt;
&lt;pre id=&quot;code_1778744523385&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Truck;

class TruckController extends Controller
{
    //
    public function index()
    {
        $trucks = Truck::all();
        return response()-&amp;gt;json($trucks);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;routes/api.php&lt;/p&gt;
&lt;pre id=&quot;code_1778284124490&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\TruckController;

Route::get('/truck', [TruckController::class, 'index'])-&amp;gt;name('truck.index');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://127.0.0.1:8000/api/truck&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;655&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l1Jw3/dJMcagyIXPo/4dtNH0yit3KPWPgerbPUz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l1Jw3/dJMcagyIXPo/4dtNH0yit3KPWPgerbPUz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l1Jw3/dJMcagyIXPo/4dtNH0yit3KPWPgerbPUz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl1Jw3%2FdJMcagyIXPo%2F4dtNH0yit3KPWPgerbPUz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;655&quot; height=&quot;598&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;655&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Model&lt;/p&gt;
&lt;pre id=&quot;code_1778814077732&quot; class=&quot;css&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;php artisan make:model TruckRequest -m&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;database/migrations/xxxx_create_truck_requests_table.php&lt;/p&gt;
&lt;pre id=&quot;code_1778814077732&quot; class=&quot;livescript&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&amp;lt;?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('truck_requests', function (Blueprint $table) {
            $table-&amp;gt;id();
            $table-&amp;gt;foreignId('user_id')-&amp;gt;constrained('users')-&amp;gt;comment('user id');
            $table-&amp;gt;string('name',50)-&amp;gt;nullable()-&amp;gt;comment('user name');
            $table-&amp;gt;string('phone',50)-&amp;gt;nullable()-&amp;gt;comment('user phone');
            $table-&amp;gt;datetime('request_date')-&amp;gt;nullable()-&amp;gt;comment('request date');
            $table-&amp;gt;string('start_address',100)-&amp;gt;nullable()-&amp;gt;comment('start address');
            $table-&amp;gt;string('end_address',100)-&amp;gt;nullable()-&amp;gt;comment('end address');
            $table-&amp;gt;string('weight',50)-&amp;gt;nullable()-&amp;gt;comment('weight');
            $table-&amp;gt;string('description',50)-&amp;gt;nullable()-&amp;gt;comment('description');
            $table-&amp;gt;string('status',1)-&amp;gt;nullable()-&amp;gt;comment('1: applying, 2: approved, 3: rejected');            
            $table-&amp;gt;timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('truck_requests');
    }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1778814077733&quot; class=&quot;ebnf&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;php artisan migrate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 컨트롤러 생성&lt;/p&gt;
&lt;pre id=&quot;code_1778814077734&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;php artisan make:controller Api/TruckRequestController -r

or 

php artisan make:controller Api/TruckRequestController --resource&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Api 를 붙인것은 폴더를 구분하고자 한 것일뿐 필수는 아닙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* -r&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;view&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;http://m.blade.phpm.blade.php&quot;&gt;resources/views/request/for&lt;/a&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;http://m.blade.phpm.blade.php&quot;&gt;m.blade.php&lt;/a&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778816449002&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Transportation HTML-5 Template &amp;lt;/title&amp;gt;
    &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&amp;gt;
    &amp;lt;link href=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot;&amp;gt;
    &amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div class=&quot;container mt-5&quot;&amp;gt;
        &amp;lt;h2&amp;gt;Request a Quote&amp;lt;/h2&amp;gt;

            &amp;lt;!-- form --&amp;gt;
            &amp;lt;form id=&quot;request_form&quot; method=&quot;POST&quot; class=&quot;contact-form&quot;&amp;gt;
                @csrf
                &amp;lt;div class=&quot;row &quot;&amp;gt;
                    &amp;lt;div class=&quot;col-lg-6 col-md-6 mb-3&quot;&amp;gt;
                        Name
                        &amp;lt;div class=&quot;input-form&quot;&amp;gt;
                            &amp;lt;input type=&quot;text&quot; name=&quot;name&quot; placeholder=&quot;Name&quot; class=&quot;form-control&quot;&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;col-lg-6 col-md-6 mb-3&quot;&amp;gt;
                        Email
                        &amp;lt;div class=&quot;input-form&quot;&amp;gt;
                            &amp;lt;input type=&quot;text&quot; name=&quot;email&quot; class=&quot;form-control&quot; placeholder=&quot;Email&quot;&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;col-lg-6 col-md-6 mb-3&quot;&amp;gt;
                        &amp;lt;label&amp;gt;Freight Type&amp;lt;/label&amp;gt;
                        &amp;lt;div class=&quot;select-items&quot;&amp;gt;
                            &amp;lt;select name=&quot;category&quot; class=&quot;form-control&quot;&amp;gt;
                                &amp;lt;option value=&quot;&quot;&amp;gt;선택&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;general&quot;&amp;gt;일반 화물&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;refrigerated&quot;&amp;gt;냉장&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;hazardous&quot;&amp;gt;위험물&amp;lt;/option&amp;gt;
                            &amp;lt;/select&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;col-lg-6 col-md-6 mb-3&quot;&amp;gt;
                        &amp;lt;label&amp;gt;Departure City&amp;lt;/label&amp;gt;
                        &amp;lt;div class=&quot;input-form&quot;&amp;gt;
                            &amp;lt;input type=&quot;text&quot; name=&quot;departure&quot; class=&quot;form-control&quot; placeholder=&quot;City of Departure&quot;&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;col-lg-6 col-md-6 col-sm-6&quot;&amp;gt;
                        &amp;lt;label&amp;gt;Destination&amp;lt;/label&amp;gt;
                        &amp;lt;div class=&quot;input-form&quot;&amp;gt;
                            &amp;lt;input type=&quot;text&quot; name=&quot;destination&quot; class=&quot;form-control&quot; placeholder=&quot;City of Destination&quot;&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;

                    &amp;lt;div class=&quot;col-lg-12 col-md-12 mb-3&quot;&amp;gt;
                        &amp;lt;label&amp;gt;Weight&amp;lt;/label&amp;gt;
                        &amp;lt;div class=&quot;input-form&quot;&amp;gt;
                            &amp;lt;input type=&quot;text&quot; name=&quot;weight&quot; class=&quot;form-control&quot; placeholder=&quot;Weight&quot;&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;!-- Checkbox --&amp;gt;
                    &amp;lt;div class=&quot;col-lg-12 mb-3&quot;&amp;gt;
                        &amp;lt;div class=&quot;radio-wrapper mb-30 mt-15&quot;&amp;gt;
                            &amp;lt;label&amp;gt;Extra services:&amp;lt;/label&amp;gt;
                            &amp;lt;div class=&quot;select-radio d-flex gap-3 flex-wrap&quot;&amp;gt;
                                &amp;lt;div class=&quot;checkbox d-flex align-items-center&quot;&amp;gt;
                                    &amp;lt;input id=&quot;checkbox-2&quot; name=&quot;service_express&quot; type=&quot;checkbox&quot;&amp;gt;
                                    &amp;lt;label for=&quot;checkbox-2&quot; class=&quot;radio-label ms-2 mb-0&quot;&amp;gt;Express Delivery&amp;lt;/label&amp;gt;
                                &amp;lt;/div&amp;gt;
                                &amp;lt;div class=&quot;checkbox d-flex align-items-center&quot;&amp;gt;
                                    &amp;lt;input id=&quot;checkbox-4&quot; name=&quot;service_insurance&quot; type=&quot;checkbox&quot;&amp;gt;
                                    &amp;lt;label for=&quot;checkbox-4&quot; class=&quot;radio-label ms-2 mb-0&quot;&amp;gt;Insurance&amp;lt;/label&amp;gt;
                                &amp;lt;/div&amp;gt;
                                &amp;lt;div class=&quot;checkbox d-flex align-items-center&quot;&amp;gt;
                                    &amp;lt;input id=&quot;checkbox-5&quot; name=&quot;service_packaging&quot; type=&quot;checkbox&quot;&amp;gt;
                                    &amp;lt;label for=&quot;checkbox-5&quot; class=&quot;radio-label ms-2 mb-0&quot;&amp;gt;Packaging&amp;lt;/label&amp;gt;
                                &amp;lt;/div&amp;gt;
                            &amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt; 
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/form&amp;gt;	
            &amp;lt;div id=&quot;response_message&quot; class=&quot;mt-3&quot;&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;!-- Button --&amp;gt;
            &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                &amp;lt;button type=&quot;button&quot; onclick=&quot;create_request()&quot; class=&quot;btn btn-primary&quot;&amp;gt;Request a Quote&amp;lt;/button&amp;gt;
            &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;script&amp;gt;
        function create_request() {
            var box = document.getElementById('response_message');
            box.textContent = '';

            fetch('/api/truck_request/request', {
                method: 'POST',
                body: new FormData(document.getElementById('request_form')),
                headers: {
                    Accept: 'application/json',
                    'X-Requested-With': 'XMLHttpRequest',
                },
            })
                .then(function (response) {
                    return response.json().then(function (data) {
                        if( response.ok ) {
                            box.className = 'mt-3 text-success';
                            box.textContent = '요청 성공';
                        } else {
                            box.className = 'mt-3 text-danger';
                            box.textContent = '요청 실패';
                        }
                        //box.className = 'mt-3 p-3 bg-light border rounded small';
                        box.textContent = JSON.stringify(data, null, 2);
                    });
                })
                .catch(function () {
                    box.className = 'mt-3 text-danger';
                    box.textContent = '요청 실패';
                });
        }
    &amp;lt;/script&amp;gt;
    

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1778816174337&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan make:controller RequestController -r&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1778816255309&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    public function create()
    {
        // form
        return view('request.form');
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;api/&lt;/p&gt;
&lt;pre id=&quot;code_1778817000444&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use App\Http\Controllers\Api\TruckRequestController;
...


Route::post('/truck_request/request', [TruckRequestController::class, 'store'])-&amp;gt;name('truck_request.store');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;route&lt;/p&gt;
&lt;pre id=&quot;code_1778816310439&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use App\Http\Controllers\RequestController;

Route::middleware('auth')-&amp;gt;group(function () {
    Route::get('/dashboard', [IndexController::class, 'dashboard'])-&amp;gt;name('dashboard');
    Route::get('/myphoto', [UserController::class, 'myphoto'])-&amp;gt;name('myphoto');
    Route::post('/myphoto', [UserController::class, 'myphoto_submit'])-&amp;gt;name('myphoto.submit');
    Route::post('/myphoto/delete', [UserController::class, 'myphoto_delete'])-&amp;gt;name('myphoto.delete');


    Route::get('/mytruck', [TruckController::class, 'mytruck'])-&amp;gt;name('mytruck');
    Route::get('/truck_form', [TruckController::class, 'truck_form'])-&amp;gt;name('truck_form');
    Route::post('/truck', [TruckController::class, 'truck_store'])-&amp;gt;name('truck.store');


    // request
    Route::get('/request_form', [RequestController::class, 'create'])-&amp;gt;name('request.create');
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Create&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;TruckRequestController&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778284789598&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;
use App\Models\TruckRequest;    
...    
    
    public function store(Request $request)
    {

        // Accept: application/json 이면 실패 시 자동 422 + { message, errors } JSON
        $validated = $request-&amp;gt;validate([
            'name' =&amp;gt; 'required|string|min:2|max:100',
            'email' =&amp;gt; 'required|email|max:100',
            'category' =&amp;gt; 'required|string|max:100',
            'weight' =&amp;gt; 'required|string|max:50',
            'departure' =&amp;gt; 'required|string|max:100',
            'destination' =&amp;gt; 'required|string|max:100',
        ], [
            'name.required' =&amp;gt; '이름을 입력해 주세요.',
            'email.required' =&amp;gt; '이메일을 입력해 주세요.',
            'category.required' =&amp;gt; '화물 유형을 선택해 주세요.',
            'weight.required' =&amp;gt; '중량을 입력해 주세요.',
            'departure.required' =&amp;gt; '출발지를 입력해 주세요.',
            'destination.required' =&amp;gt; '도착지를 입력해 주세요.',
        ]);
        //
        $truckRequest = TruckRequest::create([
            'name' =&amp;gt; $validated['name'],
            'email' =&amp;gt; $validated['email'],
            'category' =&amp;gt; $validated['category'],
            'weight' =&amp;gt; $validated['weight'],
            'departure' =&amp;gt; $validated['departure'],
            'destination' =&amp;gt; $validated['destination'],
            'service_express' =&amp;gt; $request-&amp;gt;boolean('service_express'),
            'service_insurance' =&amp;gt; $request-&amp;gt;boolean('service_insurance'),
            'service_packaging' =&amp;gt; $request-&amp;gt;boolean('service_packaging'),
            'status' =&amp;gt; '1',
        ]);

        if( $truckRequest ) {
            return response()-&amp;gt;json(['message' =&amp;gt; 'Truck request created successfully'], 201);
        } else {
            return response()-&amp;gt;json(['message' =&amp;gt; 'Truck request creation failed'], 400);
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;List&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;view&lt;/p&gt;
&lt;pre id=&quot;code_1778819431299&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&amp;gt;
    &amp;lt;title&amp;gt;Bootstrap demo&amp;lt;/title&amp;gt;
    &amp;lt;link href=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot; integrity=&quot;sha384-sRIl4kxILFvY47J16cr9ZwB07vP4J8+LH7qKQnuqkuIAvNWLzeN8tE5YBujZqJLB&quot; crossorigin=&quot;anonymous&quot;&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div class=&quot;container mt-5 col-lg-3 col-md-4 col-sm-12 mx-auto&quot;&amp;gt;
        &amp;lt;div class=&quot;row&quot;&amp;gt;   
            &amp;lt;div class=&quot;col text-end&quot;&amp;gt;

                    &amp;lt;div class=&quot;&quot;&amp;gt;
                        @if( isset($user) &amp;amp;&amp;amp; !empty($user) )
                            Welcome {{ $user['name'] }}
                            &amp;lt;a href=&quot;{{ route('mytruck') }}&quot;&amp;gt;My Truck&amp;lt;/a&amp;gt;
                            &amp;lt;a href=&quot;{{ route('signout') }}&quot;&amp;gt;Logout&amp;lt;/a&amp;gt;
                        @else
                            Welcome Guest
                            &amp;lt;a href=&quot;{{ route('login') }}&quot;&amp;gt;Login&amp;lt;/a&amp;gt; | 
                            &amp;lt;a href=&quot;{{ route('register') }}&quot;&amp;gt;Register&amp;lt;/a&amp;gt;
                        @endif
                    &amp;lt;/div&amp;gt; 

            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;row text-center mt-5&quot;&amp;gt;   
            &amp;lt;h1&amp;gt;
                Request List Page
            &amp;lt;/h1&amp;gt;
            &amp;lt;div class=&quot;row&quot; id=&quot;request-list&quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js&quot; integrity=&quot;sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI&quot; crossorigin=&quot;anonymous&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script&amp;gt;
        fetch('/api/truck_request', { headers: { Accept: 'application/json' } })
            .then(function (res) { return res.json(); })
            .then(function (items) {
                var list = document.getElementById('request-list');
                if (!list || !Array.isArray(items)) return;
                items.forEach(function (item) {
                    list.innerHTML +=
                        '&amp;lt;div class=&quot;col-md-12 card mb-2&quot;&amp;gt;&amp;lt;div class=&quot;card-body&quot;&amp;gt;' +
                        '&amp;lt;p&amp;gt;' + item.name + '&amp;lt;/p&amp;gt;' +
                        '&amp;lt;p&amp;gt;' + item.email + '&amp;lt;/p&amp;gt;' +
                        '&amp;lt;p&amp;gt;' + item.weight + '&amp;lt;/p&amp;gt;' +
                        '&amp;lt;p&amp;gt;' + item.departure + ' =&amp;gt; ' + item.destination + '&amp;lt;/p&amp;gt;' +
                        '&amp;lt;/div&amp;gt;' +  
                        '&amp;lt;div class=&quot;card-footer&quot;&amp;gt;' + item.created_at.split('T')[0] + '&amp;lt;/p&amp;gt;' +
                        '&amp;lt;/div&amp;gt;';
                    });
                })
                .catch(function (err) { console.error('Error:', err); });
        &amp;lt;/script&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app/Http/Controllers/Api/TruckRequestController.php&lt;/p&gt;
&lt;pre id=&quot;code_1778818765620&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    public function index()
    {
        //
        $truckRequests = TruckRequest::all();
        return response()-&amp;gt;json($truckRequests);
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설명만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Update&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1778284827955&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public function update(Request $request, $id)
{
    $post = TruckRequest::find($id);
    $post-&amp;gt;update($request-&amp;gt;all());

    return response()-&amp;gt;json($post);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Delete&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1778284866265&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public function destroy($id)
{
    Truck::destroy($id);

    return response()-&amp;gt;json([
        'message' =&amp;gt; '삭제 완료'
    ]);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Validation 는 동일합니다&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1778284919385&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$request-&amp;gt;validate([
    'title' =&amp;gt; 'required'
]);&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778285018102&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;GET /api/posts
POST /api/posts
PUT /api/posts/1
DELETE /api/posts/1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;POST Man&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;HTTP 상태&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;성공시&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778285055761&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;200 OK
201 Created&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;실패시&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778285067364&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;404 Not Found
422 Validation Error
500 Server Error&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;REST API&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Resource&lt;/p&gt;</description>
      <author>테디아저씨</author>
      <guid isPermaLink="true">https://teddystudyroom.tistory.com/52</guid>
      <comments>https://teddystudyroom.tistory.com/52#entry52comment</comments>
      <pubDate>Sat, 9 May 2026 09:05:48 +0900</pubDate>
    </item>
    <item>
      <title>Laravel 09. File Upload</title>
      <link>https://teddystudyroom.tistory.com/51</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Gemini_Generated_Image_gdwurggdwurggdwu.png&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dHsCTZ/dJMcahxAaMc/2pwZyB4ktqgL4Gkgrk3V41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dHsCTZ/dJMcahxAaMc/2pwZyB4ktqgL4Gkgrk3V41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dHsCTZ/dJMcahxAaMc/2pwZyB4ktqgL4Gkgrk3V41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdHsCTZ%2FdJMcahxAaMc%2F2pwZyB4ktqgL4Gkgrk3V41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1375&quot; height=&quot;768&quot; data-filename=&quot;Gemini_Generated_Image_gdwurggdwurggdwu.png&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;resources/member/myphoto.blade.php&lt;/p&gt;
&lt;pre id=&quot;code_1778194446462&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        &amp;lt;div class=&quot;row mt-5&quot;&amp;gt;   
            &amp;lt;h1&amp;gt;
                My Profile
            &amp;lt;/h1&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;row mt-2&quot;&amp;gt;  
            &amp;lt;div class=&quot;col-md-4&quot;&amp;gt;
                이름&amp;lt;br/&amp;gt;
                &amp;lt;span&amp;gt;{{ $user['name'] }}&amp;lt;/span&amp;gt;
            &amp;lt;/div&amp;gt;
            
            &amp;lt;div class=&quot;col-md-8&quot;&amp;gt;


                &amp;lt;form action=&quot;{{ route('myphoto.submit') }}&quot; method=&quot;POST&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
                    @csrf
                    &amp;lt;input type=&quot;file&quot; name=&quot;photo&quot; class=&quot;form-control&quot; accept=&quot;image/*&quot;&amp;gt;
                    &amp;lt;button type=&quot;submit&quot; class=&quot;btn btn-primary mt-2&quot;&amp;gt;업로드&amp;lt;/button&amp;gt;
                &amp;lt;/form&amp;gt;            
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Model&lt;/p&gt;
&lt;pre id=&quot;code_1778640889580&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan make:migration photo_to_users&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1778641493556&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::table('users', function (Blueprint $table) {
            //
            $table-&amp;gt;string('photo')-&amp;gt;nullable();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::table('users', function (Blueprint $table) {
            //
            $table-&amp;gt;dropColumn('photo');
        });
    }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;routes/web.php&lt;/p&gt;
&lt;pre id=&quot;code_1778639186196&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Route::middleware('auth')-&amp;gt;group(function () {
    Route::get('/dashboard', [IndexController::class, 'dashboard'])-&amp;gt;name('dashboard');
    
    Route::get('/myphoto', [UserController::class, 'myphoto'])-&amp;gt;name('myphoto');
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1778653719121&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    public function myphoto(){

        if( Auth::check() ){
            $user = Auth::user();
        } else {
            $user = [];
        }
        
        return view('member.myphoto', [ 'user' =&amp;gt; $user ]);
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UserController.php&lt;/p&gt;
&lt;pre id=&quot;code_1778641609486&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    public function myphoto_submit(Request $request)
    {
        
        $photo = $request-&amp;gt;file('photo');

        dd($photo);

    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dd 로 데이터를 확인하자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;414&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EXxli/dJMcabxorfb/KfEZNxlgLtm0lAzDeaKij0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EXxli/dJMcabxorfb/KfEZNxlgLtm0lAzDeaKij0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EXxli/dJMcabxorfb/KfEZNxlgLtm0lAzDeaKij0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEXxli%2FdJMcabxorfb%2FKfEZNxlgLtm0lAzDeaKij0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;414&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;414&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;파일 저장&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라라벨의&amp;nbsp; 스토리지를 직접 접근하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;심볼릭 링크 생성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;라라벨은 보안을 위해 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778642488349&quot; class=&quot;css&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;php artisan storage:link&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Why?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Storage 는 직접접근이 불가능합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br /&gt;Laravel Path&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;storage/app/public&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Web Path&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;public/storage&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;config/filesystem.php&lt;/p&gt;
&lt;pre id=&quot;code_1778643322320&quot; class=&quot;dart&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;'disks' =&amp;gt; [

    'public' =&amp;gt; [
        'driver' =&amp;gt; 'local',
        'root' =&amp;gt; storage_path('app/public'),
        'url' =&amp;gt; env('APP_URL').'/storage',
        'visibility' =&amp;gt; 'public',
    ],

]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UserController.php&lt;/p&gt;
&lt;pre id=&quot;code_1778195869855&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    public function myphoto_submit(Request $request)
    {
        $request-&amp;gt;validate([
            'photo' =&amp;gt; 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
        ]);
        
        $photo = $request-&amp;gt;file('photo');

        // folder, disk
        $path = $photo-&amp;gt;store('photos', 'public');    
    
    	// save file
        $user = Auth::user();
        
        // update to DB
        $user-&amp;gt;photo = $path;
        $user-&amp;gt;save();      

        return redirect()-&amp;gt;route('myphoto')-&amp;gt;with('success', 'Photo uploaded successfully');

    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Validation&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1778646421277&quot; class=&quot;coq&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;$request-&amp;gt;validate([
    'image' =&amp;gt; 'required|image|mimes:jpg,png,jpeg|max:2048'
]);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-section-id=&quot;1dp9rm5&quot; data-start=&quot;2110&quot; data-end=&quot;2127&quot;&gt;image &amp;rarr; 이미지 파일만&lt;/li&gt;
&lt;li data-section-id=&quot;xkrfut&quot; data-start=&quot;2128&quot; data-end=&quot;2144&quot;&gt;mimes &amp;rarr; 확장자 제한&lt;/li&gt;
&lt;li data-section-id=&quot;3u7xse&quot; data-start=&quot;2145&quot; data-end=&quot;2158&quot;&gt;max &amp;rarr; 용량 제한&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;파일저장&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$path = $photo-&amp;gt;store('photos', 'public');&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'photos'&amp;nbsp; :&amp;nbsp; saved folder&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'public'&amp;nbsp; :&amp;nbsp; used disk&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;파일확인&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;File&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;storage/app/public/images&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;디비저장&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1778204794026&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// update to DB
$user-&amp;gt;photo = $path;
$user-&amp;gt;save();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1778204863436&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@if( isset($user) &amp;amp;&amp;amp; !empty($user) &amp;amp;&amp;amp; isset($user['photo']) &amp;amp;&amp;amp; !empty($user['photo']) )
    &amp;lt;img src=&quot;{{ asset('storage/'.$user['photo']) }}&quot;&amp;gt;
@else
    &amp;lt;span&amp;gt;No photo&amp;lt;/span&amp;gt;
@endif&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;or&lt;/p&gt;
&lt;pre id=&quot;code_1778644254656&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//Controller
$img_url = &quot;&quot;;

//view
&amp;lt;img src=&quot;{{ asset($img_url) }}&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2127&quot; data-start=&quot;2110&quot; data-section-id=&quot;1dp9rm5&quot;&gt;&lt;b&gt;파일명변경&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1778204966127&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$fileName = time().'_'.$photo-&amp;gt;getClientOriginalName();
$path = $photo-&amp;gt;storeAs('photos', $fileName, 'public');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기타 다른 파일명사용&lt;/p&gt;
&lt;pre id=&quot;code_1778646636889&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$fileName = uniqid().'.'.$file-&amp;gt;getClientOriginalName();
// 663ab12cd.test.jpg

$fileName = uniqid().'.'.$file-&amp;gt;extension();
// 663ab12cd.jpg&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 주의 : 저장한 파일명을 그대로 디비에 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;파일삭제&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;views/member/myphoto.blade.php&lt;/p&gt;
&lt;pre id=&quot;code_1778648027574&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@if( isset($user) &amp;amp;&amp;amp; !empty($user) &amp;amp;&amp;amp; isset($user-&amp;gt;photo) &amp;amp;&amp;amp; !empty($user-&amp;gt;photo) )
    &amp;lt;img src=&quot;{{ asset('storage/'.$user['photo']) }}&quot; alt=&quot;프로필&quot; class=&quot;img-thumbnail mb-2 d-block&quot;&amp;gt;
    &amp;lt;form action=&quot;{{ route('myphoto.delete') }}&quot; method=&quot;post&quot; class=&quot;mb-3&quot;&amp;gt;
        @csrf
        &amp;lt;button type=&quot;submit&quot; class=&quot;btn btn-danger&quot;&amp;gt;삭제&amp;lt;/button&amp;gt;
    &amp;lt;/form&amp;gt;
@else
    &amp;lt;span&amp;gt;No photo&amp;lt;/span&amp;gt;
@endif&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;routes/web.php&lt;/p&gt;
&lt;pre id=&quot;code_1778647462518&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Route::delete('/myphoto/delete', [UserController::class, 'myphoto_delete'])-&amp;gt;name('myphoto.delete');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UserController.php&lt;/p&gt;
&lt;pre id=&quot;code_1778205079572&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use Illuminate\Support\Facades\Storage;
...



    public function myphoto_delete(Request $request)
    {
        $user = Auth::user();
        if( isset($user) &amp;amp;&amp;amp; !empty($user) &amp;amp;&amp;amp; isset($user-&amp;gt;photo) &amp;amp;&amp;amp; !empty($user-&amp;gt;photo) ){
            Storage::disk('public')-&amp;gt;delete($user-&amp;gt;photo);

            $user = Auth::user();
            $user-&amp;gt;photo = null;
            $user-&amp;gt;save();

        }

        return redirect()-&amp;gt;route('myphoto')-&amp;gt;with('success', 'Photo deleted successfully');
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;## 과제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Truck Image Upload&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&amp;nbsp;이미지의 경우 리사이징&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Hokma School :: Course 2 Laravel</category>
      <author>테디아저씨</author>
      <guid isPermaLink="true">https://teddystudyroom.tistory.com/51</guid>
      <comments>https://teddystudyroom.tistory.com/51#entry51comment</comments>
      <pubDate>Fri, 8 May 2026 09:07:27 +0900</pubDate>
    </item>
    <item>
      <title>Laravel 08. Authentication System</title>
      <link>https://teddystudyroom.tistory.com/50</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Gemini_Generated_Image_2lk0m32lk0m32lk0.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7I0xF/dJMcaa6czFL/0VdGEZEXAgxG05SD02s0E0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7I0xF/dJMcaa6czFL/0VdGEZEXAgxG05SD02s0E0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7I0xF/dJMcaa6czFL/0VdGEZEXAgxG05SD02s0E0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7I0xF%2FdJMcaa6czFL%2F0VdGEZEXAgxG05SD02s0E0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1376&quot; height=&quot;768&quot; data-filename=&quot;Gemini_Generated_Image_2lk0m32lk0m32lk0.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@ 시간이 된다면 blade 에 @push @stack 설명할것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Laravel은 기본적으로 회원, 로그인에 대한 정보를&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;595&quot; data-start=&quot;557&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;568&quot; data-start=&quot;557&quot; data-section-id=&quot;ypavhi&quot;&gt;users 테이블&lt;/li&gt;
&lt;li data-end=&quot;578&quot; data-start=&quot;569&quot; data-section-id=&quot;15pr1qh&quot;&gt;User 모델&lt;/li&gt;
&lt;li data-end=&quot;595&quot; data-start=&quot;579&quot; data-section-id=&quot;10bp1xe&quot;&gt;session 기반 로그인&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;으로 처리하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본으로 제공하는 컬럼은&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;809&quot; data-start=&quot;784&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;790&quot; data-start=&quot;784&quot; data-section-id=&quot;1j3bszz&quot;&gt;name&lt;/li&gt;
&lt;li data-end=&quot;798&quot; data-start=&quot;791&quot; data-section-id=&quot;16amjk4&quot;&gt;email&lt;/li&gt;
&lt;li data-end=&quot;809&quot; data-start=&quot;799&quot; data-section-id=&quot;1nl9mev&quot;&gt;password&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Anthentication&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Index ( with &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;bootstrap&lt;span&gt; )&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;resources/views/index.blade.php&lt;/p&gt;
&lt;pre id=&quot;code_1778039923219&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&amp;gt;
    &amp;lt;title&amp;gt;Bootstrap demo&amp;lt;/title&amp;gt;
    &amp;lt;link href=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot; integrity=&quot;sha384-sRIl4kxILFvY47J16cr9ZwB07vP4J8+LH7qKQnuqkuIAvNWLzeN8tE5YBujZqJLB&quot; crossorigin=&quot;anonymous&quot;&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div class=&quot;container mt-5 col-lg-3 col-md-4 col-sm-12 mx-auto&quot;&amp;gt;
        &amp;lt;div class=&quot;row&quot;&amp;gt;   
            &amp;lt;div class=&quot;col text-end&quot;&amp;gt;

                    &amp;lt;div class=&quot;&quot;&amp;gt;
                        Welcome Guest

                    &amp;lt;/div&amp;gt; 

            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;row text-center mt-5&quot;&amp;gt;   
            &amp;lt;h1&amp;gt;
                Index Page
            &amp;lt;/h1&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js&quot; integrity=&quot;sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI&quot; crossorigin=&quot;anonymous&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1778190100596&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;php artisan make:controller IndexController&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app/http/Controller/IndexController.php&lt;/p&gt;
&lt;pre id=&quot;code_1778041175899&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class IndexController extends Controller
{
    /**
     * Handle the incoming request.
     */
    public function index(Request $request)
    {
        //
        return view('index');
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Route&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;routes/web.php&lt;/p&gt;
&lt;pre id=&quot;code_1778191079211&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\IndexController;

Route::get('/', [IndexController::class, 'index'])-&amp;gt;name('index');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://127.0.0.1:8000&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;303&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kHtLS/dJMcaaLZLTG/6P9YVK2hdWKw1CDRWKf8ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kHtLS/dJMcaaLZLTG/6P9YVK2hdWKw1CDRWKf8ok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kHtLS/dJMcaaLZLTG/6P9YVK2hdWKw1CDRWKf8ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkHtLS%2FdJMcaaLZLTG%2F6P9YVK2hdWKw1CDRWKf8ok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;597&quot; height=&quot;303&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Register&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;example&amp;nbsp; &lt;a href=&quot;https://getbootstrap.com/docs/5.3/forms/overview/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://getbootstrap.com/docs/5.3/forms/overview/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;View&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;resources/views/member/register.blade.php&lt;/p&gt;
&lt;pre id=&quot;code_1777893642932&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;form method=&quot;post&quot; action=&quot;{{ route('signup') }}&quot; autocomplete=&quot;off&quot;&amp;gt;
        &amp;lt;div class=&quot;mb-3&quot;&amp;gt;
          &amp;lt;label for=&quot;name&quot; class=&quot;form-label&quot;&amp;gt;Name&amp;lt;/label&amp;gt;
          &amp;lt;input type=&quot;text&quot; class=&quot;form-control&quot; id=&quot;name&quot; name=&quot;name&quot;&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;mb-3&quot;&amp;gt;
          &amp;lt;label for=&quot;email&quot; class=&quot;form-label&quot;&amp;gt;Email&amp;lt;/label&amp;gt;
          &amp;lt;input type=&quot;email&quot; class=&quot;form-control&quot; id=&quot;email&quot; name=&quot;email&quot; aria-describedby=&quot;emailHelp&quot;&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;mb-3&quot;&amp;gt;
          &amp;lt;label for=&quot;password&quot; class=&quot;form-label&quot;&amp;gt;Password&amp;lt;/label&amp;gt;
          &amp;lt;input type=&quot;password&quot; class=&quot;form-control&quot; id=&quot;password&quot; name=&quot;password&quot;&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;button type=&quot;submit&quot; class=&quot;btn btn-primary&quot;&amp;gt;Submit&amp;lt;/button&amp;gt;
    &amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Controller&lt;/p&gt;
&lt;pre id=&quot;code_1777894438317&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan make:controller UserController&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app/http/Controller/UserController.php&lt;/p&gt;
&lt;pre id=&quot;code_1777894473491&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    //
    public function signup_form(){
        return view('member.register');
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Route&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;routes/web.php&lt;/p&gt;
&lt;pre id=&quot;code_1778190164648&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;use App\Http\Controllers\UserController;

Route::get('/register', [UserController::class, 'signup_form'])-&amp;gt;name('signup_form');
Route::post('/register', [UserController::class, 'signup_submit'])-&amp;gt;name('signup');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://127.0.0.1:8000/register&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;443&quot; data-origin-height=&quot;373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zX8lt/dJMcaiXtp2x/GCe5FAKeDEAk5sfBk7zc6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zX8lt/dJMcaiXtp2x/GCe5FAKeDEAk5sfBk7zc6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zX8lt/dJMcaiXtp2x/GCe5FAKeDEAk5sfBk7zc6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzX8lt%2FdJMcaiXtp2x%2FGCe5FAKeDEAk5sfBk7zc6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;443&quot; height=&quot;373&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;443&quot; data-origin-height=&quot;373&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app/http/Controller/UserController.php&lt;/p&gt;
&lt;pre id=&quot;code_1778192182583&quot; class=&quot;xml&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&amp;lt;?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Hash;

class UserController extends Controller
{
    //



    public function signup_form(){
        return view('member.register');
    }


    public function signup_submit(Request $request) {

        // $request-&amp;gt;validate([
        //     'name' =&amp;gt; 'required|min:2|max:20',
        //     'email' =&amp;gt; 'required|email',
        //     'password' =&amp;gt; 'required|min:8',
        // ]);

        $user = User::create([
            'name' =&amp;gt; $request-&amp;gt;name,
            'email' =&amp;gt; $request-&amp;gt;email,
            'password' =&amp;gt; Hash::make($request-&amp;gt;password),
        ]);

        if($user) {
            return redirect()-&amp;gt;route('index')-&amp;gt;with('success', 'User created successfully');
        } else {
            return redirect()-&amp;gt;route('register')-&amp;gt;with('error', 'User creation failed');
        }

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;go submit!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Login&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;resources/views/member/login.blade.php&lt;/p&gt;
&lt;pre id=&quot;code_1777895943225&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;form method=&quot;post&quot; action=&quot;{{ route('signin') }}&quot; autocomplete=&quot;off&quot;&amp;gt;
    &amp;lt;div class=&quot;mb-3&quot;&amp;gt;
      &amp;lt;label for=&quot;email&quot; class=&quot;form-label&quot;&amp;gt;Email&amp;lt;/label&amp;gt;
      &amp;lt;input type=&quot;email&quot; class=&quot;form-control&quot; id=&quot;email&quot; name=&quot;email&quot; aria-describedby=&quot;emailHelp&quot;&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;mb-3&quot;&amp;gt;
      &amp;lt;label for=&quot;password&quot; class=&quot;form-label&quot;&amp;gt;Password&amp;lt;/label&amp;gt;
      &amp;lt;input type=&quot;password&quot; class=&quot;form-control&quot; id=&quot;password&quot; name=&quot;password&quot;&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;button type=&quot;submit&quot; class=&quot;btn btn-primary&quot;&amp;gt;Submit&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;routes/web.php&lt;/p&gt;
&lt;pre id=&quot;code_1777896008346&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;..

Route::get('/login', [UserController::class, 'signin_form'])-&amp;gt;name('login');
Route::post('/login', [UserController::class, 'signin_submit'])-&amp;gt;name('signin');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app/http/Controller/UserController.php&lt;/p&gt;
&lt;pre id=&quot;code_1778040825317&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use Illuminate\Support\Facades\Auth;



    public function signin_form()
    {
        return view('member.login');
    }

    public function signin_submit(Request $request)
    {
        $request-&amp;gt;validate([
            'email' =&amp;gt; 'required|email',
            'password' =&amp;gt; 'required',
        ]);

        $user = User::where('email', $request-&amp;gt;email)-&amp;gt;first();

        if($user){
            // Hash::make($request-&amp;gt;password),

            // if ($user &amp;amp;&amp;amp; Hash::check($request-&amp;gt;password, $user-&amp;gt;password)) {
            //     // successful login
            //     return redirect()-&amp;gt;route('index')-&amp;gt;with('success', 'Login successful');
            // } else {
            //     // login failed
            //     return redirect()-&amp;gt;route('login')-&amp;gt;with('error', 'Invalid email or password');
            // }

            if(Auth::attempt([
                'email' =&amp;gt; $request-&amp;gt;email,
                'password' =&amp;gt; $request-&amp;gt;password
            ])){
                return redirect('/');
            }  

        } else {
            return redirect()-&amp;gt;route('login')-&amp;gt;with('error', 'Invalid email or password');
        }

    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;or&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1778042401310&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        $credentials = $request-&amp;gt;only('email', 'password');

        if (Auth::attempt($credentials)) {
            $request-&amp;gt;session()-&amp;gt;regenerate();
            return redirect()-&amp;gt;intended('/');
        }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Status&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IndexController.php&lt;/p&gt;
&lt;pre id=&quot;code_1778041325440&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use Illuminate\Support\Facades\Auth;

        if(Auth::check()){
            $user = Auth::user();
        } else {
            $user = [];
        }
        return view('index', [
            'user' =&amp;gt; isset($user) ? $user : null
        ]);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;resources/views/index.blade.php&lt;/p&gt;
&lt;pre id=&quot;code_1777897706195&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&amp;gt;
    &amp;lt;title&amp;gt;Bootstrap demo&amp;lt;/title&amp;gt;
    &amp;lt;link href=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot; integrity=&quot;sha384-sRIl4kxILFvY47J16cr9ZwB07vP4J8+LH7qKQnuqkuIAvNWLzeN8tE5YBujZqJLB&quot; crossorigin=&quot;anonymous&quot;&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div class=&quot;container mt-5 col-lg-3 col-md-4 col-sm-12 mx-auto&quot;&amp;gt;
        &amp;lt;div class=&quot;row&quot;&amp;gt;   
            &amp;lt;div class=&quot;col text-end&quot;&amp;gt;
                @if(isset($user) &amp;amp;&amp;amp; $user != null)
                    &amp;lt;div class=&quot;&quot;&amp;gt;Welcome {{ $user['name'] }} &amp;lt;/div&amp;gt;
                @else
                    &amp;lt;div class=&quot;&quot;&amp;gt;Welcome Guest
                        &amp;lt;a href=&quot;{{ route('login') }}&quot;&amp;gt;Login &amp;lt;/a&amp;gt;
                         |
                        &amp;lt;a href=&quot;{{ route('register') }}&quot;&amp;gt;Register &amp;lt;/a&amp;gt;
                    &amp;lt;/div&amp;gt;
                @endif
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;row text-center&quot;&amp;gt;   
            &amp;lt;h1&amp;gt;
                Index Page
            &amp;lt;/h1&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js&quot; integrity=&quot;sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI&quot; crossorigin=&quot;anonymous&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;logout&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;resources/views/index.blade.php&lt;/p&gt;
&lt;pre id=&quot;code_1777898356684&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;&quot;&amp;gt;Welcome {{ $user['name'] }}  &amp;lt;a href=&quot;{{ route('logout') }}&quot; class=&quot;&quot;&amp;gt;Logout&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;routes/web.php&lt;/p&gt;
&lt;pre id=&quot;code_1777898372655&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Route::get('/logout', [UserController::class, 'signout'])-&amp;gt;name('logout');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app/http/Controller/UserController.php&lt;/p&gt;
&lt;pre id=&quot;code_1777898404073&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public function signout(Request $request){
    //auth()-&amp;gt;logout();
    
    Auth::logout();
    
    $request-&amp;gt;session()-&amp;gt;invalidate();
    $request-&amp;gt;session()-&amp;gt;regenerateToken();
        
    return redirect()-&amp;gt;route('index');
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Middleware&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;사용자의 요청이 컨트롤러에 도착하기 전에 중간에서 검사하는 기능&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Gemini_Generated_Image_xt1a48xt1a48xt1a.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bO3ZMU/dJMb99TNgOw/R1yOkcrMO4SrAEbERgyVWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bO3ZMU/dJMb99TNgOw/R1yOkcrMO4SrAEbERgyVWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bO3ZMU/dJMb99TNgOw/R1yOkcrMO4SrAEbERgyVWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbO3ZMU%2FdJMb99TNgOw%2FR1yOkcrMO4SrAEbERgyVWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1408&quot; height=&quot;768&quot; data-filename=&quot;Gemini_Generated_Image_xt1a48xt1a48xt1a.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴때 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;278&quot; data-start=&quot;267&quot; data-section-id=&quot;esd1ud&quot;&gt;로그인 여부 확인&lt;/li&gt;
&lt;li data-end=&quot;290&quot; data-start=&quot;279&quot; data-section-id=&quot;ogjc21&quot;&gt;관리자 권한 확인&lt;/li&gt;
&lt;li data-end=&quot;302&quot; data-start=&quot;291&quot; data-section-id=&quot;158uhbh&quot;&gt;API 토큰 확인&lt;/li&gt;
&lt;li data-end=&quot;310&quot; data-start=&quot;303&quot; data-section-id=&quot;4rmse9&quot;&gt;로그 기록&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Laravel 기본 middleware&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;558&quot; data-start=&quot;551&quot; data-section-id=&quot;1xwolhp&quot; data-ke-size=&quot;size26&quot;&gt;auth&lt;/h2&gt;
&lt;p data-end=&quot;572&quot; data-start=&quot;560&quot; data-ke-size=&quot;size16&quot;&gt;로그인한 사용자만 허용&lt;/p&gt;
&lt;p data-end=&quot;572&quot; data-start=&quot;560&quot; data-ke-size=&quot;size16&quot;&gt;routes/web.php&lt;/p&gt;
&lt;pre id=&quot;code_1777901987322&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Route::middleware('auth')-&amp;gt;group(function () {
    Route::get('/dashboard');
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 로그인을 안했다면 로그인페이지로 이동합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것은 아래에 설정되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vendor/laravel/framework/src/Illuminate/Foundation/Configuration/ApplicationBuilder.php&lt;/p&gt;
&lt;pre id=&quot;code_1777945880049&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    public function withMiddleware(?callable $callback = null)
    {
        $this-&amp;gt;app-&amp;gt;afterResolving(HttpKernel::class, function ($kernel) use ($callback) {
            $middleware = (new Middleware)
                -&amp;gt;redirectGuestsTo(fn () =&amp;gt; route('login'));
                
                
                
                .....&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-end=&quot;692&quot; data-start=&quot;684&quot; data-section-id=&quot;xuyrzp&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;692&quot; data-start=&quot;684&quot; data-section-id=&quot;xuyrzp&quot; data-ke-size=&quot;size26&quot;&gt;guest&lt;/h2&gt;
&lt;p data-end=&quot;708&quot; data-start=&quot;694&quot; data-ke-size=&quot;size16&quot;&gt;로그인 안한 사용자만 허용&lt;/p&gt;
&lt;pre id=&quot;code_1777902006178&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Route::middleware('guest')-&amp;gt;group(function () {
    Route::get('/login');
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인여부&lt;/p&gt;
&lt;pre id=&quot;code_1777902257132&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class AdminMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  Closure(Request): (Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {
    	//  your codes....
        if (!auth()-&amp;gt;check()) {
            return redirect('/login');
        }
        
        return $next($request);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자구분을 위해서 type 컬럼을 하나 추가하고 기본은 9 가 입력되게 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1777944773481&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan make:migration add_type_to_users&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;database/migrations/2026_xx_xx_xxxxxx_add_type_to_users.php&lt;/p&gt;
&lt;pre id=&quot;code_1777944876236&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::table('users', function (Blueprint $table) {
            //
            $table-&amp;gt;integer('type')-&amp;gt;default(9)-&amp;gt;comment('1: admin, 9: user');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::table('users', function (Blueprint $table) {
            //
            $table-&amp;gt;dropColumn('type');
        });
    }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777947598613&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan migrate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 관리자 계정만들기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) admin 이라는 아이디로 가입합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 나중에는 관리자가 user 의 type을 변경하는 기능을 만들기로 하고, 지금은 수동으로&amp;nbsp; type=1 로 변경한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777951583827&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan make:middleware AdminMiddleware&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AdminMiddleware&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777902382007&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;


class AdminMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  Closure(Request): (Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {
        // 관리자
        if ( !auth()-&amp;gt;check() || auth()-&amp;gt;user()-&amp;gt;type != 1 ) {
            return redirect('/');
        }
        return $next($request);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Laravel 10 이하에서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;app/Http/Kernel.php&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이후에는&lt;span&gt;&amp;nbsp;&lt;/span&gt;bootstrap/app.php 에 통합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bootstrap/app.php&lt;/p&gt;
&lt;pre id=&quot;code_1777953179995&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    -&amp;gt;withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    -&amp;gt;withMiddleware(function (Middleware $middleware): void {
        // 미들웨어 별칭 등록 (기존 routeMiddleware 역할)
        $middleware-&amp;gt;alias([
            'admin' =&amp;gt; \App\Http\Middleware\AdminMiddleware::class,
        ]);

    })
    -&amp;gt;withExceptions(function (Exceptions $exceptions): void {
        //
    })-&amp;gt;create();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;route/web.php&lt;/p&gt;
&lt;pre id=&quot;code_1777953896181&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use App\Http\Controllers\AdminController;


Route::get('/admin', [AdminController::class, 'index'])-&amp;gt;name('admin.index')-&amp;gt;middleware('admin');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;controller&lt;/p&gt;
&lt;pre id=&quot;code_1778636698655&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan make:controller AdminController&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app/Http/Controllers/AdminController.php&lt;/p&gt;
&lt;pre id=&quot;code_1778636754813&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;

class AdminController extends Controller
{
    //
    public function index(){

        //Gate::authorize('admin-only');

        return view('admin.index');
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Gate 를 이용해서 처리할 수도 있습니다.&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-path-to-node=&quot;0&quot; data-index-in-node=&quot;6&quot;&gt;Gate&lt;/b&gt;는 사용자에게 특정 작업을 수행할 권한이 있는지 확인하는 가장 빠르고 직관적인 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만, Gate는 이미 들어온 요청에서 특정행동 권한을 판단할때 많이 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app/Providers/AppServiceProvider.php&lt;/p&gt;
&lt;pre id=&quot;code_1778638303404&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;use Illuminate\Support\Facades\Gate;
use App\Models\User;

public function boot(): void
{
    // 'admin'이라는 이름의 게이트 정의
    Gate::define('admin-only', function (User $user) {
        return $user-&amp;gt;type === 1; // true or false
    });
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) controller 를 이용하는 방법&lt;/p&gt;
&lt;pre id=&quot;code_1778638303405&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;Gate::authorize('admin-only');
// 이 한줄만으로 false 면 403 에러&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) route 를 이용하는 방법&lt;/p&gt;
&lt;pre id=&quot;code_1778638303405&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;Route::middleware('auth')-&amp;gt;group(function () {
    Route::get('/admin', [AdminController::class, 'index'])-&amp;gt;name('admin.index')-&amp;gt;middleware('can:admin-only');
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) view 에서 이용방법&lt;/p&gt;
&lt;pre id=&quot;code_1778638303405&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;&quot;&amp;gt;Welcome {{ $user['name'] }} 
    @can('admin-only')
        &amp;lt;a href=&quot;{{ route('admin.index') }}&quot; class=&quot;&quot;&amp;gt;Admin Index&amp;lt;/span&amp;gt;
    @endcan 
	&amp;lt;a href=&quot;{{ route('signout') }}&quot; class=&quot;&quot;&amp;gt;Logout&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Hokma School :: Course 2 Laravel</category>
      <author>테디아저씨</author>
      <guid isPermaLink="true">https://teddystudyroom.tistory.com/50</guid>
      <comments>https://teddystudyroom.tistory.com/50#entry50comment</comments>
      <pubDate>Wed, 29 Apr 2026 16:54:18 +0900</pubDate>
    </item>
    <item>
      <title>Laravel 07.  Form / Validation + git clone laravel project</title>
      <link>https://teddystudyroom.tistory.com/49</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Gemini_Generated_Image_q8oqe4q8oqe4q8oq.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cs5AVB/dJMcahYxnfh/KvvTRGp7q3noFsmCNwe4ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cs5AVB/dJMcahYxnfh/KvvTRGp7q3noFsmCNwe4ok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cs5AVB/dJMcahYxnfh/KvvTRGp7q3noFsmCNwe4ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcs5AVB%2FdJMcahYxnfh%2FKvvTRGp7q3noFsmCNwe4ok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1376&quot; height=&quot;768&quot; data-filename=&quot;Gemini_Generated_Image_q8oqe4q8oqe4q8oq.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Form 처리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;service_form.blade.php&lt;/p&gt;
&lt;pre id=&quot;code_1777379948403&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Transportation HTML-5 Template &amp;lt;/title&amp;gt;
    &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&amp;gt;
    &amp;lt;link href=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot;&amp;gt;
    &amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div class=&quot;container mt-5&quot;&amp;gt;
        &amp;lt;h2&amp;gt;Request a Quote&amp;lt;/h2&amp;gt;

            &amp;lt;!-- form --&amp;gt;
            &amp;lt;form action=&quot;&quot; method=&quot;POST&quot; class=&quot;contact-form&quot;&amp;gt;
                &amp;lt;div class=&quot;row &quot;&amp;gt;
                    &amp;lt;div class=&quot;col-lg-6 col-md-6 mb-3&quot;&amp;gt;
                        Name
                        &amp;lt;div class=&quot;input-form&quot;&amp;gt;
                            &amp;lt;input type=&quot;text&quot; name=&quot;name&quot; placeholder=&quot;Name&quot; class=&quot;form-control&quot;&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;col-lg-6 col-md-6 mb-3&quot;&amp;gt;
                        Email
                        &amp;lt;div class=&quot;input-form&quot;&amp;gt;
                            &amp;lt;input type=&quot;text&quot; name=&quot;email&quot; class=&quot;form-control&quot; placeholder=&quot;Email&quot;&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;col-lg-6 col-md-6 mb-3&quot;&amp;gt;
                        &amp;lt;label&amp;gt;Freight Type&amp;lt;/label&amp;gt;
                        &amp;lt;div class=&quot;select-items&quot;&amp;gt;
                            &amp;lt;select name=&quot;category&quot; class=&quot;form-control&quot; id=&quot;select1&quot;&amp;gt;
                                &amp;lt;option value=&quot;&quot;&amp;gt;Freight Type&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;&quot;&amp;gt;Catagories One&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;&quot;&amp;gt;Catagories Two&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;&quot;&amp;gt;Catagories Three&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;&quot;&amp;gt;Catagories Four&amp;lt;/option&amp;gt;
                            &amp;lt;/select&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;col-lg-6 col-md-6 mb-3&quot;&amp;gt;
                        &amp;lt;label&amp;gt;Weight&amp;lt;/label&amp;gt;
                        &amp;lt;div class=&quot;input-form&quot;&amp;gt;
                            &amp;lt;input type=&quot;text&quot; name=&quot;weight&quot; class=&quot;form-control&quot; placeholder=&quot;Weight&quot;&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;col-lg-6 col-md-6 mb-3&quot;&amp;gt;
                        &amp;lt;label&amp;gt;Departure City&amp;lt;/label&amp;gt;
                        &amp;lt;div class=&quot;input-form&quot;&amp;gt;
                            &amp;lt;input type=&quot;text&quot; name=&quot;departure&quot; class=&quot;form-control&quot; placeholder=&quot;City of Departure&quot;&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;col-lg-6 col-md-6 col-sm-6&quot;&amp;gt;
                        &amp;lt;label&amp;gt;Destination&amp;lt;/label&amp;gt;
                        &amp;lt;div class=&quot;input-form&quot;&amp;gt;
                            &amp;lt;input type=&quot;text&quot; name=&quot;destination&quot; class=&quot;form-control&quot; placeholder=&quot;City of Destination&quot;&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;

                    &amp;lt;!-- Checkbox --&amp;gt;
                    &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                        &amp;lt;div class=&quot;radio-wrapper mb-30 mt-15&quot;&amp;gt;
                            &amp;lt;label&amp;gt;Extra services:&amp;lt;/label&amp;gt;
                            &amp;lt;div class=&quot;select-radio d-flex gap-3 flex-wrap&quot;&amp;gt;
                                &amp;lt;div class=&quot;checkbox d-flex align-items-center&quot;&amp;gt;
                                    &amp;lt;input id=&quot;checkbox-2&quot; name=&quot;service_express&quot; type=&quot;checkbox&quot;&amp;gt;
                                    &amp;lt;label for=&quot;checkbox-2&quot; class=&quot;radio-label ms-2 mb-0&quot;&amp;gt;Express Delivery&amp;lt;/label&amp;gt;
                                &amp;lt;/div&amp;gt;
                                &amp;lt;div class=&quot;checkbox d-flex align-items-center&quot;&amp;gt;
                                    &amp;lt;input id=&quot;checkbox-4&quot; name=&quot;service_insurance&quot; type=&quot;checkbox&quot;&amp;gt;
                                    &amp;lt;label for=&quot;checkbox-4&quot; class=&quot;radio-label ms-2 mb-0&quot;&amp;gt;Insurance&amp;lt;/label&amp;gt;
                                &amp;lt;/div&amp;gt;
                                &amp;lt;div class=&quot;checkbox d-flex align-items-center&quot;&amp;gt;
                                    &amp;lt;input id=&quot;checkbox-5&quot; name=&quot;service_packaging&quot; type=&quot;checkbox&quot;&amp;gt;
                                    &amp;lt;label for=&quot;checkbox-5&quot; class=&quot;radio-label ms-2 mb-0&quot;&amp;gt;Packaging&amp;lt;/label&amp;gt;
                                &amp;lt;/div&amp;gt;
                            &amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt; 
                    &amp;lt;/div&amp;gt;
                    &amp;lt;!-- Button --&amp;gt;
                    &amp;lt;div class=&quot;col-lg-12&quot;&amp;gt;
                        &amp;lt;button name=&quot;submit&quot; class=&quot;btn btn-primary&quot;&amp;gt;Request a Quote&amp;lt;/button&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/form&amp;gt;	
    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;@csrf 필수 (보안)&lt;/h3&gt;
&lt;pre id=&quot;code_1777427910686&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@csrf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@csrf =&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;lt;input &lt;span&gt;type&lt;/span&gt;=&quot;&lt;span&gt;hidden&lt;/span&gt;&quot; &lt;span&gt;name&lt;/span&gt;=&quot;&lt;span&gt;_token&lt;/span&gt;&quot; &lt;span&gt;value&lt;/span&gt;=&quot;&lt;span&gt;CU3h53yTARcomovEc4f81QROJAORywMsmNJ7Qnb3&lt;/span&gt;&quot; &lt;span&gt;autocomplete&lt;/span&gt;=&quot;&lt;span&gt;off&lt;/span&gt;&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #ffffff; text-align: start;&quot;&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;********************************************&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Laravel 13 에서는 same-origin ( 요청을 한 사이트가 같을때 - 같은 도메인 )&amp;nbsp; @csrf 검증을 하지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;즉 _token 없이도 POST 가 통과할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;오히려&amp;nbsp;차단(토큰&amp;nbsp;강제)**하려면,&amp;nbsp;말씀드린&amp;nbsp;것처럼&amp;nbsp;기본&amp;nbsp;CSRF&amp;nbsp;미들웨어를&amp;nbsp;커스텀으로&amp;nbsp;교체해서&amp;nbsp;hasValidOrigin()&amp;nbsp;경로를&amp;nbsp;막아야&amp;nbsp;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;차단방법&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;커스텀&amp;nbsp;미들웨어&amp;nbsp;생성&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1778231085561&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan make:middleware StrictCsrfMiddleware.php&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app/Http/Middleware/StrictCsrfMiddleware.php&lt;/p&gt;
&lt;pre id=&quot;code_1778231035477&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\PreventRequestForgery;
class StrictCsrfMiddleware extends PreventRequestForgery
{
    protected function hasValidOrigin($request)
    {
        // same-origin 이어도 우회 통과 금지
        return false;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 미들웨어가 작동하도록&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;bootstrap/app.php&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778230981006&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$middleware-&amp;gt;web(replace: [
    \Illuminate\Foundation\Http\Middleware\PreventRequestForgery::class
        =&amp;gt; \App\Http\Middleware\StrictCsrfMiddleware::class,
]);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;********************************************&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;action&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;라라벨의 route name 을 사용&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1777428130214&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{{ route('service.store') }}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Validation (유효성 검사)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* DB 에러가 발생하기 전에 에러 발생요소를 차단합니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1777380057461&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public function store(Request $request)
{
    $validated = $request-&amp;gt;validate([
        'name' =&amp;gt; 'required|min:2|max:20',
        'email' =&amp;gt; 'required|email',
    ]);

    // Model Create
    

    return redirect()-&amp;gt;route('service.request')
        -&amp;gt;with('success', 'completed');
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;주요 Validation&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1043&quot; data-start=&quot;1025&quot; data-section-id=&quot;p8ji51&quot;&gt;required : 필수&lt;/li&gt;
&lt;li data-end=&quot;1043&quot; data-start=&quot;1025&quot; data-section-id=&quot;p8ji51&quot;&gt;min:2 : 최소 길이&lt;/li&gt;
&lt;li data-end=&quot;1043&quot; data-start=&quot;1025&quot; data-section-id=&quot;p8ji51&quot;&gt;max:255 : 최대 길이&lt;/li&gt;
&lt;li data-end=&quot;1082&quot; data-start=&quot;1064&quot; data-section-id=&quot;186o1yi&quot;&gt;email : 이메일 형식&lt;/li&gt;
&lt;li data-end=&quot;1107&quot; data-start=&quot;1083&quot; data-section-id=&quot;1okskfx&quot;&gt;unique:Request : 중복 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;에러 표시&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1777380239531&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@error('name')
    &amp;lt;div&amp;gt;{{ $message }}&amp;lt;/div&amp;gt;
@enderror



@error('email')
    &amp;lt;div&amp;gt;{{ $message }}&amp;lt;/div&amp;gt;
@enderror&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777382205538&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;return redirect()-&amp;gt;route('service.result')
    -&amp;gt;with('success', '등록 완료');&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Form Request 분리&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;validation 을 별도로 분리하여 처리합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777381435093&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan make:request StoreServiceRequest&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777381456965&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    public function rules()
    {
        return [
            'name' =&amp;gt; 'required|min:8|max:20',
        ];
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Controller가 훨씬 깔끔해짐.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Request 만 수정하에 요건을 변경 가능함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 단, 그럼 Store 용 Request 와 Update 용 Request 를 별도로 두는 것이 정석이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777381652573&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan make:request StoreServiceRequest
php artisan make:request UpdateServiceRequest&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777381791544&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class StorePostRequest extends FormRequest
{
    public function authorize()
    {
        // default 'false'
        return true;
    }

    public function rules()
    {
        return [
            'name' =&amp;gt; 'required|min:2|max:20',
            'email' =&amp;gt; 'required|email',
        ];
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Controller Modify&lt;/p&gt;
&lt;pre id=&quot;code_1777429517339&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use App\Http\Requests\StoreServiceRequest;
.....


// change to  StoreServiceRequest $request

public function store(StoreServiceRequest $request)
{
    $validated = $request-&amp;gt;validated(); // 이미 검증 끝난 데이터

    //ServiceModel::create($validated);
    return redirect()-&amp;gt;route('service.result')
        -&amp;gt;with('success', '등록 완료');
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;service_result.blade.php&lt;/p&gt;
&lt;pre id=&quot;code_1777449806942&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Transportation HTML-5 Template &amp;lt;/title&amp;gt;
    &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&amp;gt;
    &amp;lt;link href=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot;&amp;gt;
    &amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div class=&quot;container mt-5&quot;&amp;gt;
        &amp;lt;h2&amp;gt;Request a Quote&amp;lt;/h2&amp;gt;

        &amp;lt;!-- success message --&amp;gt;
        &amp;lt;div class=&quot;alert alert-success&quot;&amp;gt;
            Your request has been submitted successfully!
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 권한 처리까지 함께 처리&amp;nbsp; ( 다음시간 이후에 )&lt;/p&gt;
&lt;pre id=&quot;code_1777382049035&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public function authorize()
{
    return auth()-&amp;gt;check();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메세지 커스트마이징.&lt;/p&gt;
&lt;pre id=&quot;code_1777382098417&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public function messages(): array
{
    return [
        'name.required' =&amp;gt; '이름은 필수입니다.',
        'name.min' =&amp;gt; '이름은 최소 2자 이상이어야 합니다.',
        'name.max' =&amp;gt; '이름은 20자를 초과할 수 없습니다.',
    ];
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Git Clone&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라라벨 프로젝트를 git 으로 clone 하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777433748858&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// .  current dir
git clone https://github.com/{userAccount}/{RepositoryName}.git .&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777433638557&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;drwxr-xr-x@  5 b2g  staff   160B  4 29 12:32 app
-rwxr-xr-x@  1 b2g  staff   425B  4 29 12:32 artisan
drwxr-xr-x@  5 b2g  staff   160B  4 29 12:32 bootstrap
-rw-r--r--@  1 b2g  staff   2.8K  4 29 12:32 composer.json
-rw-r--r--@  1 b2g  staff   294K  4 29 12:32 composer.lock
drwxr-xr-x@ 12 b2g  staff   384B  4 29 12:32 config
drwxr-xr-x@  6 b2g  staff   192B  4 29 12:32 database
-rw-r--r--@  1 b2g  staff   424B  4 29 12:32 package.json
-rw-r--r--@  1 b2g  staff   1.3K  4 29 12:32 phpunit.xml
drwxr-xr-x@  7 b2g  staff   224B  4 29 12:32 public
-rw-r--r--@  1 b2g  staff   3.6K  4 29 12:32 README.md
drwxr-xr-x@  5 b2g  staff   160B  4 29 12:32 resources
drwxr-xr-x@  4 b2g  staff   128B  4 29 12:32 routes
drwxr-xr-x@  5 b2g  staff   160B  4 29 12:32 storage
drwxr-xr-x@  5 b2g  staff   160B  4 29 12:32 tests
-rw-r--r--@  1 b2g  staff   436B  4 29 12:32 vite.config.js&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777433804415&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan serve&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;result :: error&lt;/p&gt;
&lt;pre id=&quot;code_1777433787940&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Warning: require(/Users/b2g/Documents/work/hyunjucho/sample2/vendor/autoload.php): Failed to open stream: No such file or directory in /Users/b2g/Documents/work/hyunjucho/sample2/artisan on line 10

Fatal error: Uncaught Error: Failed opening required '/Users/b2g/Documents/work/hyunjucho/sample2/vendor/autoload.php' (include_path='.:/opt/homebrew/Cellar/php@8.3/8.3.21/share/php@8.3/pear') in /Users/b2g/Documents/work/hyunjucho/sample2/artisan:10
Stack trace:
#0 {main}
  thrown in /Users/b2g/Documents/work/hyunjucho/sample2/artisan on line 10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;checking .gitignore&lt;/p&gt;
&lt;pre id=&quot;code_1777433934208&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;*.log
.DS_Store
.env                      ---&amp;gt; important
.env.backup
.env.production
.phpactor.json
.phpunit.result.cache
/.fleet
/.idea
/.nova
/.phpunit.cache
/.vscode
/.zed
/auth.json
/node_modules
/public/build
/public/hot
/public/storage
/storage/*.key
/storage/pail
/vendor                   ---&amp;gt; important
_ide_helper.php
Homestead.json
Homestead.yaml
Thumbs.db&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-popup-corner=&quot;top-left&quot; data-enable-skip-handler=&quot;true&quot; data-anchor-corner=&quot;bottom-left&quot; data-propagate-tooltip-mouseover-events=&quot;true&quot; data-append-to-body=&quot;true&quot; data-show-delay-ms=&quot;250&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;.env&quot; and &quot;vendor&quot; are security sensitive files and are not uploaded to cloud services such as github.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) copy or make .env&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) down load vendor&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;checking composer.json&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;composer.json :: 프로젝트가 필요로 하는 패키지목록&lt;/p&gt;
&lt;pre id=&quot;code_1777434386257&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &quot;require&quot;: {
        &quot;php&quot;: &quot;^8.3&quot;,
        &quot;laravel/framework&quot;: &quot;^13.0&quot;,
        &quot;laravel/tinker&quot;: &quot;^3.0&quot;
    },&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;composer.lock :: 실제로 설치된 패키지목록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;composer.json 기준으로 패키지를 설치&lt;/p&gt;
&lt;pre id=&quot;code_1777434174963&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;composer install&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777434797564&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan serve&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* composer update :: composer.json 기준으로 패키지들을 최신버젼으로 업데이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 로컬에서 composer update&amp;nbsp; 하고 서버/배포환경에서 composer install 이 기본&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 패키지만 업데이트&lt;/p&gt;
&lt;pre id=&quot;code_1777434905364&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;composer update laravel/framework&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 패키지 설치&lt;/p&gt;
&lt;pre id=&quot;code_1777449609659&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;composer require guzzlehttp/guzzle&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 새로운 패키지를 설치하면 서버에서 composer install 을 해주어 패키지가 다운로드 되도록 해주어야 합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&quot;laravel/framework&quot;: &quot;^10.0&quot;

// &amp;gt;= 10.0.0 &amp;lt; 11.0.0
// 10.x.x는 허용
// 11은 안됨

&quot;laravel/framework&quot;: &quot;~10.0&quot;


// &amp;gt;= 10.0.0 &amp;lt; 10.1.0
// 10.0.x만 허용
// 10.1부터는 안됨&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** php 버젼등 다른환경에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;## 과제.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 내용을 참고해서 트럭 신청을 디비에 저장하고, 목록을 볼 수 있도록 해주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;## 다음시간&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음시간에는 드디어 회원인증 부분을 다루겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Hokma School :: Course 2 Laravel</category>
      <author>테디아저씨</author>
      <guid isPermaLink="true">https://teddystudyroom.tistory.com/49</guid>
      <comments>https://teddystudyroom.tistory.com/49#entry49comment</comments>
      <pubDate>Tue, 28 Apr 2026 22:18:25 +0900</pubDate>
    </item>
    <item>
      <title>Laravel 06. Eloquent ORM</title>
      <link>https://teddystudyroom.tistory.com/48</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Gemini_Generated_Image_el071cel071cel07.png&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfXFW8/dJMcafsODeK/CrcVpvTLPMDKb8q0YqmR2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfXFW8/dJMcafsODeK/CrcVpvTLPMDKb8q0YqmR2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfXFW8/dJMcafsODeK/CrcVpvTLPMDKb8q0YqmR2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfXFW8%2FdJMcafsODeK%2FCrcVpvTLPMDKb8q0YqmR2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1264&quot; height=&quot;842&quot; data-filename=&quot;Gemini_Generated_Image_el071cel071cel07.png&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;842&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Eloquent ( 읽기 쉬운 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ORM (Object Relational Mapping)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라라벨은 데이터를 객체로 만들어 다루게 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 PHP 에서 다음과 같은 sql 문으로 데이터를 가져옵니다.&lt;/p&gt;
&lt;pre id=&quot;code_1776996795534&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM trucks;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Model&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot; data-ke-align=&quot;alignLeft&quot; data-start=&quot;567&quot; data-end=&quot;636&quot;&gt;
&lt;tbody data-start=&quot;593&quot; data-end=&quot;636&quot;&gt;
&lt;tr data-start=&quot;593&quot; data-end=&quot;608&quot;&gt;
&lt;td style=&quot;background-color: #9b9b9b; color: #ffffff;&quot; data-start=&quot;593&quot; data-end=&quot;599&quot; data-col-size=&quot;sm&quot;&gt;테이블&lt;/td&gt;
&lt;td style=&quot;background-color: #9b9b9b; color: #ffffff;&quot; data-col-size=&quot;sm&quot; data-start=&quot;599&quot; data-end=&quot;608&quot;&gt;Model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-start=&quot;609&quot; data-end=&quot;624&quot;&gt;
&lt;td style=&quot;background-color: #efefef;&quot; data-start=&quot;609&quot; data-end=&quot;618&quot; data-col-size=&quot;sm&quot;&gt;행(row)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-start=&quot;618&quot; data-end=&quot;624&quot;&gt;객체&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-start=&quot;625&quot; data-end=&quot;636&quot;&gt;
&lt;td style=&quot;background-color: #efefef;&quot; data-start=&quot;625&quot; data-end=&quot;630&quot; data-col-size=&quot;sm&quot;&gt;컬럼&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9;&quot; data-col-size=&quot;sm&quot; data-start=&quot;630&quot; data-end=&quot;636&quot;&gt;속성&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라라벨에서는&lt;/p&gt;
&lt;pre id=&quot;code_1776996840359&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Truck::all();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델생성&lt;/p&gt;
&lt;pre id=&quot;code_1776996917473&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan make:model TruckKind&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대문자로 시작하고, 두개 단어를 쓸때는 각각 대문자를 써주면 _ 로 구분된 테이블이 생성됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 위치는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app/Models/TruckKind.php&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본구조&lt;/p&gt;
&lt;pre id=&quot;code_1776997242010&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class TruckKind extends Model
{
    //


}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통은 migration 파일을 함께 생성하여 사용합니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 삭제하고 다시 만들어보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1776997717806&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan make:model TruckKind -m&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;migration 파일을 확인합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1776998142769&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;   INFO  Model [app/Models/TruckKind.php] created successfully.  

   INFO  Migration [database/migrations/2026_04_24_023239_create_truck_kinds_table.php] created successfully.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;migration 수정하여 테이블 설계&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1776998070251&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('truck_kinds', function (Blueprint $table) {
            $table-&amp;gt;id();
            $table-&amp;gt;string('name',30)-&amp;gt;comment(&quot;trunk kind name&quot;);
            $table-&amp;gt;integer('seq')-&amp;gt;default(0)-&amp;gt;comment(&quot;sequence&quot;);
            $table-&amp;gt;string('description')-&amp;gt;nullable()-&amp;gt;comment(&quot;description&quot;);
            $table-&amp;gt;timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('truck_kinds');
    }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1776997658957&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan migrate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CRUD 기본&lt;/p&gt;
&lt;pre id=&quot;code_1776997926966&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$truck = new TruckKind();
$truct-&amp;gt;name = 'Pickup truck';
$truct-&amp;gt;seq = 1;
$truct-&amp;gt;description = 'A pickup truck is a type of light-duty truck that combines the comfort of a passenger car with the cargo capacity of a truck. It features a cabin for the driver at the front and an open cargo area, known as a truck bed, at the rear.';
$truct-&amp;gt;save();   // or $truct-&amp;gt;add();


TruckKind::create([
    'name' =&amp;gt; 'Tank truck',
    'seq' =&amp;gt; 2,
    'description' =&amp;gt; 'A pickup truck is a type of light-duty truck that combines the comfort of a passenger car with the cargo capacity of a truck. It features a cabin for the driver at the front and an open cargo area, known as a truck bed, at the rear.'
]);


// error  fillable


DB::table('truck_kinds')-&amp;gt;insert(['name'=&amp;gt;'Box truck', 'seq'=&amp;gt;3, description=&amp;gt;'']);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;859&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEXFle/dJMcadBHbAC/M2pJi4VBs0RjsFzb0O9kvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEXFle/dJMcadBHbAC/M2pJi4VBs0RjsFzb0O9kvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEXFle/dJMcadBHbAC/M2pJi4VBs0RjsFzb0O9kvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEXFle%2FdJMcadBHbAC%2FM2pJi4VBs0RjsFzb0O9kvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;859&quot; height=&quot;246&quot; data-origin-width=&quot;859&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;create는 fillable 설정이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화이트리스트&lt;/p&gt;
&lt;pre id=&quot;code_1776999875545&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class TruckKind extends Model
{
    //

    protected $fillable = ['name', 'seq', 'description'];
   
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안을 위해 허용된 컬럼만 입력할 수 있게 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블랙리스트&lt;/p&gt;
&lt;pre id=&quot;code_1777000112937&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// User Model

protected $guarded = ['id', 'is_admin'];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f0f2f5; color: #0a0a0a; text-align: start;&quot;&gt;$user-&amp;gt;save(); / &lt;span style=&quot;background-color: #f0f2f5; color: #0a0a0a; text-align: start;&quot;&gt;$user-&amp;gt;add();&amp;nbsp; //&amp;nbsp; 보호 받지 않고 저장이 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Create&amp;nbsp; 와&amp;nbsp; insert&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #001d35; text-align: start;&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;요약 및 차이점 비교&lt;span data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-wiz-uids=&quot;F8HRWc_4n,F8HRWc_4o&quot; data-sfc-root=&quot;c&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=F8HRWc_4m/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span style=&quot;color: #0a0a0a;&quot; data-processed=&quot;true&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot; data-processed=&quot;true&quot; data-ved=&quot;2ahUKEwjbxvXLuoWUAxVSslYBHWrgOP0Q-q4QegQICxAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-processed=&quot;true&quot; data-animation-nesting=&quot;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-processed=&quot;true&quot;&gt;
&lt;tr data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;
&lt;td style=&quot;color: #0a0a0a;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #0a0a0a;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;Eloquent (모델) :: &lt;span style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot;&gt;create()&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #0a0a0a;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;Query Builder (DB) :: &lt;span style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot;&gt;insert()&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #0a0a0a;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;Eloquent (관계) :: &lt;span style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot;&gt;save() (add)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;
&lt;td style=&quot;color: #0a0a0a;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;속도&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #0a0a0a;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;보통&lt;/td&gt;
&lt;td style=&quot;color: #0a0a0a;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;매우 빠름&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #0a0a0a;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;보통&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;
&lt;td style=&quot;color: #0a0a0a;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;타임스탬프&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #0a0a0a;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;자동 설정&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #0a0a0a;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;수동 설정 필요&lt;/td&gt;
&lt;td style=&quot;color: #0a0a0a;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;자동 설정&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;
&lt;td style=&quot;color: #0a0a0a;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;모델 이벤트&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #0a0a0a;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;트리거됨&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #0a0a0a;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;작동 안 함&lt;/td&gt;
&lt;td style=&quot;color: #0a0a0a;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;트리거됨&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;
&lt;td style=&quot;color: #0a0a0a;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;대량 할당&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #0a0a0a;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;fillable&lt;span&gt;&amp;nbsp;&lt;/span&gt;보호&lt;/td&gt;
&lt;td style=&quot;color: #0a0a0a;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;보호 안 됨&lt;/td&gt;
&lt;td style=&quot;color: #0a0a0a;&quot; colspan=&quot;undefined&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;해당 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Update&lt;/p&gt;
&lt;pre id=&quot;code_1777000222066&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$truck_kind = TruckKind::find(1);
$truck_kind-&amp;gt;name = &quot;Dump truck&quot;;
$truck_kind-&amp;gt;save();
//$truck_kind-&amp;gt;update();

or 

TruckKind::where('id', 1)-&amp;gt;update([
    'name' =&amp;gt; 'Dump truck 2'
]);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Delete&lt;/p&gt;
&lt;pre id=&quot;code_1777000380368&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$truck_kind = TruckKind::find(1);
$truck_kind-&amp;gt;delete();

or 

TruckKind::destroy(1);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Relationships&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;make truck&lt;/p&gt;
&lt;pre id=&quot;code_1777004350389&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('trucks', function (Blueprint $table) {
            $table-&amp;gt;id();
            $table-&amp;gt;foreignId('user_id')-&amp;gt;constrained('users')-&amp;gt;onDelete('cascade');
            $table-&amp;gt;foreignId('truck_kind_id')-&amp;gt;constrained('truck_kinds')-&amp;gt;onDelete('cascade');
            $table-&amp;gt;string('name',30)-&amp;gt;comment(&quot;truck my name&quot;);
            $table-&amp;gt;timestamps();
            
            // -&amp;gt;constrained('users')  관계를 설정
            // -&amp;gt;constrained()  자동설정
            // -&amp;gt;onDelete('cascade'); 삭제시 지동삭제
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('trucks');
    }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1:N 관계&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777004655496&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// User Model

public function trucks()
{
    return $this-&amp;gt;hasMany(Truck::class);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1777004779397&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// controller

$user = User::find(1);
$user-&amp;gt;trucks; // 내가 등록한 목록&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777004706165&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Truck Model

public function user()
{
    return $this-&amp;gt;belongsTo(User::class);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1777005182461&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// controller

$post = Truck::find(1);
$post-&amp;gt;user; // 작성자&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1:1 관계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;User &amp;lt;-&amp;gt; Profile&lt;/p&gt;
&lt;pre id=&quot;code_1777005242854&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//User Model 


public function profile()
{
    return $this-&amp;gt;hasOne(Profile::class);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777005279277&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Profile Model

public function user()
{
    return $this-&amp;gt;belongsTo(User::class);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;With 를 이용하여 속성(프로퍼티)으로 사용하기&lt;/p&gt;
&lt;pre id=&quot;code_1777005363950&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$trucks = Truck::with('user')-&amp;gt;get();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;과제.&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;User 객체를 선언하고 해당 사용자가 가진 트럭 목록을 만들어주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;( 아직 로그인을 공부하지 않았기 때문에 임의의 유저로 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Quiz.&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨트롤러에 public function 이 의미하는 것과&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;public 외에 다른것을 사용할 수 있다면 그 차이는 무엇인가요?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Hokma School :: Course 2 Laravel</category>
      <author>테디아저씨</author>
      <guid isPermaLink="true">https://teddystudyroom.tistory.com/48</guid>
      <comments>https://teddystudyroom.tistory.com/48#entry48comment</comments>
      <pubDate>Fri, 24 Apr 2026 11:11:44 +0900</pubDate>
    </item>
    <item>
      <title>Laravel 05. Database Design &amp;amp; Migrations</title>
      <link>https://teddystudyroom.tistory.com/47</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Gemini_Generated_Image_uilqnzuilqnzuilq.png&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cu3Sig/dJMcagkVh18/uXEwHYQ7FaybQ1RhF8G8vK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cu3Sig/dJMcagkVh18/uXEwHYQ7FaybQ1RhF8G8vK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cu3Sig/dJMcagkVh18/uXEwHYQ7FaybQ1RhF8G8vK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcu3Sig%2FdJMcagkVh18%2FuXEwHYQ7FaybQ1RhF8G8vK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1264&quot; height=&quot;842&quot; data-filename=&quot;Gemini_Generated_Image_uilqnzuilqnzuilq.png&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;842&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;데이터베이스 설계&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;데이터를 어떤 형태로 저장할지 미리 정의하는 것&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;367&quot; data-start=&quot;354&quot; data-section-id=&quot;cpd3sx&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;posts 테이블&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;컬럼 타입 설명
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;544&quot; data-start=&quot;369&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;544&quot; data-start=&quot;409&quot;&gt;
&lt;tr data-end=&quot;430&quot; data-start=&quot;409&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;414&quot; data-start=&quot;409&quot;&gt;id&lt;/td&gt;
&lt;td data-end=&quot;423&quot; data-start=&quot;414&quot; data-col-size=&quot;sm&quot;&gt;bigint&lt;/td&gt;
&lt;td data-end=&quot;430&quot; data-start=&quot;423&quot; data-col-size=&quot;sm&quot;&gt;기본키&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;454&quot; data-start=&quot;431&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;439&quot; data-start=&quot;431&quot;&gt;title&lt;/td&gt;
&lt;td data-end=&quot;448&quot; data-start=&quot;439&quot; data-col-size=&quot;sm&quot;&gt;string&lt;/td&gt;
&lt;td data-end=&quot;454&quot; data-start=&quot;448&quot; data-col-size=&quot;sm&quot;&gt;제목&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;478&quot; data-start=&quot;455&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;465&quot; data-start=&quot;455&quot;&gt;content&lt;/td&gt;
&lt;td data-end=&quot;472&quot; data-start=&quot;465&quot; data-col-size=&quot;sm&quot;&gt;text&lt;/td&gt;
&lt;td data-end=&quot;478&quot; data-start=&quot;472&quot; data-col-size=&quot;sm&quot;&gt;내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;511&quot; data-start=&quot;479&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;492&quot; data-start=&quot;479&quot;&gt;created_at&lt;/td&gt;
&lt;td data-end=&quot;504&quot; data-start=&quot;492&quot; data-col-size=&quot;sm&quot;&gt;timestamp&lt;/td&gt;
&lt;td data-end=&quot;511&quot; data-start=&quot;504&quot; data-col-size=&quot;sm&quot;&gt;생성일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;544&quot; data-start=&quot;512&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;525&quot; data-start=&quot;512&quot;&gt;updated_at&lt;/td&gt;
&lt;td data-end=&quot;537&quot; data-start=&quot;525&quot; data-col-size=&quot;sm&quot;&gt;timestamp&lt;/td&gt;
&lt;td data-end=&quot;544&quot; data-start=&quot;537&quot; data-col-size=&quot;sm&quot;&gt;수정일&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Migration (테이블 생성)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;라라벨은 Sql 문으로 테이블을 생성하는 것이 아니라 코드로 생성합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1776811929469&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan make:migration create_posts_table&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1776812043142&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('posts', function (Blueprint $table) {
            $table-&amp;gt;id();
            $table-&amp;gt;timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('posts');
    }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 모델과 생김새가 같은데 Model 을 Extend 하는 Post Model 이 별도로 생성되지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1776812251852&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public function up()
{
    Schema::create('posts', function (Blueprint $table) {
        $table-&amp;gt;id();
        $table-&amp;gt;string('title');
        $table-&amp;gt;text('content');
        $table-&amp;gt;timestamps();
    });
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DataType&lt;/p&gt;
&lt;pre id=&quot;code_1776818255046&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$table-&amp;gt;id();  // 열 이름을 지정하지 않는다.

$table-&amp;gt;bigIncrements('id');

$table-&amp;gt;id();  // 열 이름을 지정하지 않는다.

$table-&amp;gt;integer('votes');
$table-&amp;gt;bigInteger('votes');
$table-&amp;gt;binary('photo');  // File to DB

$table-&amp;gt;boolean('confirmed');
$table-&amp;gt;char('name', length: 100);
$table-&amp;gt;dateTimeTz('created_at', precision: 0);
$table-&amp;gt;dateTime('created_at', precision: 0);
$table-&amp;gt;decimal('amount', total: 8, places: 2);
$table-&amp;gt;double('amount');
$table-&amp;gt;enum('difficulty', ['easy', 'hard']);
$table-&amp;gt;float('amount');
$table-&amp;gt;float('amount', precision: 53);
$table-&amp;gt;text('description');


$table-&amp;gt;json('options');

## 
$table-&amp;gt;foreignId('user_id');
$table-&amp;gt;foreignIdFor(User::class);

## 
$table-&amp;gt;timestamps();
$table-&amp;gt;string('name',50);
$table-&amp;gt;string('image')-&amp;gt;nullable();
$table-&amp;gt;boolean('is_active')-&amp;gt;default(true);
$table-&amp;gt;string('subject')-&amp;gt;after(&quot;title&quot;);


Schema::table('users', function (Blueprint $table) {
    $table-&amp;gt;renameColumn('from', 'to');
});
Schema::table('users', function (Blueprint $table) {
    $table-&amp;gt;dropColumn('votes');
});
Schema::table('users', function (Blueprint $table) {
    $table-&amp;gt;dropColumn(['votes', 'avatar', 'location']);
});

$table-&amp;gt;index(['account_id', 'created_at']);
$table-&amp;gt;unique('email', 'unique_email');

$table-&amp;gt;softDeletes('deleted_at', precision: 0);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작성한&amp;nbsp; migration 을 실행 -&amp;gt; 실제 테이블을 생성&lt;/p&gt;
&lt;pre id=&quot;code_1776812274689&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan migrate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RollBack - 다시 되돌리기&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1776812337956&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan migrate:rollback&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 주의&amp;nbsp; rollback 을 두번 이상 진행하다가 migrate하면 동시에 이후 migrate 가 진행되고 순번이 같아지므로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 rollback 에서 동시에 rollback 하니 주의해주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1776815048312&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 전체 롤백
php artisan migrate:reset


# 롤백후 재실행
php artisan migrate:refresh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1776813934956&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$posts = DB::select('select * from posts where id = ?', [1])

DB::insert('insert into post (id, title, contents) values (?, ?, ?)', [1, 'My Post', 'My Contents' ]);

$affected = DB::update('update posts set title = 'User Post' where id = ?',  [1] );

$deleted = DB::delete('delete from posts');

DB::statement('drop table users');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반드시 아래 페이지 Databas &amp;gt; Getting Started 를 한번 봐주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 타입을 따로 살펴보지 않겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://laravel.com/docs/13.x/database&quot;&gt;https://laravel.com/docs/13.x/database&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 존재여부&lt;/p&gt;
&lt;pre id=&quot;code_1776815139931&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (Schema::hasTable('users')) {
    // The &quot;users&quot; table exists...
}
 
if (Schema::hasColumn('users', 'email')) {
    // The &quot;users&quot; table exists and has an &quot;email&quot; column...
}
 
if (Schema::hasIndex('users', ['email'], 'unique')) {
    // The &quot;users&quot; table exists and has a unique index on the &quot;email&quot; column...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1776815210869&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Schema::create('users', function (Blueprint $table) {
    $table-&amp;gt;engine('InnoDB');
 
    // ...
});


Schema::create('users', function (Blueprint $table) {
    $table-&amp;gt;charset('utf8mb4');
    $table-&amp;gt;collation('utf8mb4_unicode_ci');
 
    // ...
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1776815377575&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## update 
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
 
Schema::table('users', function (Blueprint $table) {
    $table-&amp;gt;integer('votes');
});


## rename, drop
use Illuminate\Support\Facades\Schema;

Schema::rename($from, $to);

Schema::drop('users');
Schema::dropIfExists('users');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Seeding&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;테이블에 테스트 데이터를 자동으로 넣는다&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정데이터는 이미 저장되어 있어야 하는 데이터가 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 미용실에서 서비스 상품들&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 쇼핑몰에서 제품데이터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사이트를 이전할때 이전의 데이터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 관리자의 아이디,패스워드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1776815850680&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan make:seeder PostSeeder&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 시더파일 확인 후 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;databases/seeders/PostSeeder.php&lt;/p&gt;
&lt;pre id=&quot;code_1776815877149&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use Illuminate\Support\Facades\DB;

public function run()
{
    DB::table('posts')-&amp;gt;insert([
        'title' =&amp;gt; '첫 글',
        'content' =&amp;gt; '내용입니다',
    ]);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행&lt;/p&gt;
&lt;pre id=&quot;code_1776815906424&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan db:seed --class=PostSeeder&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마이그래이션과 함께 시더 실행&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776815938226&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan migrate:fresh --seed&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 시더를 만들어 놓으면 다른서버에서 동일하게 데이터를 준비할때 유용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제 )&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 초기설정을 위해 지역데이터를 시더로 저장하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. make model&lt;/p&gt;
&lt;pre id=&quot;code_1776816504773&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan make:model Area -m&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-m : 마이그래이션 파일을 추가해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이그래이션 수정&lt;/p&gt;
&lt;pre id=&quot;code_1776816778033&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        Schema::create('areas', function (Blueprint $table) {
            $table-&amp;gt;id();
            $table-&amp;gt;string('area1', 50);
            $table-&amp;gt;string('area2', 50);
            $table-&amp;gt;string('area3', 50);
            $table-&amp;gt;timestamps();
        });&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이그래이션 실행&lt;/p&gt;
&lt;pre id=&quot;code_1776816841259&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan migrate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시더 생성&lt;/p&gt;
&lt;pre id=&quot;code_1776816311218&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan make:seeder AreaSeeder&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TSV 형태를 시더로 DB에 넣어봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pakistan_area.tsv&lt;/p&gt;
&lt;pre id=&quot;code_1776834910533&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;state	city	district
Punjab	Lahore	Gulberg
Punjab	Lahore	Model Town
Punjab	Lahore	Johar Town
Punjab	Faisalabad	Jaranwala
Punjab	Faisalabad	Samundri
Punjab	Rawalpindi	Taxila
Punjab	Rawalpindi	Murree
Punjab	Multan	Shujabad
Punjab	Multan	Jalalpur Pirwala
Sindh	Karachi	Gulshan-e-Iqbal
Sindh	Karachi	Clifton
Sindh	Karachi	Saddar
Sindh	Hyderabad	Latifabad
Sindh	Hyderabad	Qasimabad
Sindh	Sukkur	Rohri
Sindh	Sukkur	Pano Aqil
Sindh	Larkana	Ratodero
Sindh	Larkana	Dokri&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AreaSeeder.php&lt;/p&gt;
&lt;pre id=&quot;code_1776834991666&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class AreaSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        //

        $csvFile = fopen('database/seeders/seederData/pakistan_area.tsv', &quot;r&quot;);
        $isFirstRow = true; // Flag to skip the first row

        while (($data = fgetcsv($csvFile, 1000, &quot;\t&quot;)) !== FALSE) {
            if ($isFirstRow) {
                $isFirstRow = false; // Skip the first row
                continue;
            }

            \App\Models\Area::create([
                'area1' =&amp;gt; $data[0],
                'area2' =&amp;gt; $data[1],
                'area3' =&amp;gt; $data[2],
            ]);
        }


    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시더 실행&lt;/p&gt;
&lt;pre id=&quot;code_1776816360171&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan db:seed --class=AreaSeeder&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;**&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과제1. 국가에서 제공하는 주소데이터를 시더로 만들어 저장할것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과제2. 트럭의 적재용량을 시더로 만들어 저장할 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;**&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 시간에 모델과 사용법을 공부하도록 하겠습니다.&lt;/p&gt;</description>
      <author>테디아저씨</author>
      <guid isPermaLink="true">https://teddystudyroom.tistory.com/47</guid>
      <comments>https://teddystudyroom.tistory.com/47#entry47comment</comments>
      <pubDate>Wed, 22 Apr 2026 09:38:01 +0900</pubDate>
    </item>
    <item>
      <title>Laravel 04. Blade Templete</title>
      <link>https://teddystudyroom.tistory.com/45</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ChatGPT Image 2026년 4월 17일 오후 08_25_49.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRZ42t/dJMcad2IUmh/7hB2Ozsyb5G07TeR5P161K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRZ42t/dJMcad2IUmh/7hB2Ozsyb5G07TeR5P161K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRZ42t/dJMcad2IUmh/7hB2Ozsyb5G07TeR5P161K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRZ42t%2FdJMcad2IUmh%2F7hB2Ozsyb5G07TeR5P161K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1024&quot; data-filename=&quot;ChatGPT Image 2026년 4월 17일 오후 08_25_49.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-section-id=&quot;1vwfzrr&quot; data-start=&quot;487&quot; data-end=&quot;508&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-section-id=&quot;1vwfzrr&quot; data-start=&quot;487&quot; data-end=&quot;508&quot;&gt;Blade는 Laravel의 템플릿 엔진입니다.&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1.&amp;nbsp; 기본 사용방법&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본위치&lt;/p&gt;
&lt;pre id=&quot;code_1776087119739&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resources/views&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 확장자&lt;/p&gt;
&lt;pre id=&quot;code_1776087136704&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.blade.php&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수의 출력&lt;/p&gt;
&lt;pre id=&quot;code_1776087155044&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;h2&amp;gt;{{ $name }}&amp;lt;/h2&amp;gt;

Lagacy PHP
&amp;lt;?php echo $name; ?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.&amp;nbsp; 왜 blade 는 별도의 문법을 가지고 있는가?&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;b&gt;1) 가독성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PHP&lt;/p&gt;
&lt;pre id=&quot;code_1776389717453&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php if ($user) { ?&amp;gt;
&amp;lt;?php foreach ($items as $item) { ?&amp;gt;
&amp;lt;?php } ?&amp;gt;
&amp;lt;?php } ?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BLADE&lt;/p&gt;
&lt;pre id=&quot;code_1776389761095&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@if($user)
    @foreach($items as $item)
    @endforeach
@endif&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2) HTML 중심 개발 가능&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;874&quot; data-start=&quot;858&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;866&quot; data-start=&quot;858&quot; data-section-id=&quot;tmmjkk&quot;&gt;마크업 중심&lt;/li&gt;
&lt;li data-end=&quot;874&quot; data-start=&quot;867&quot; data-section-id=&quot;20bg5s&quot;&gt;협업 쉬움&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3) 추가기능&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 권한&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터가 없을때&lt;/p&gt;
&lt;pre id=&quot;code_1776389894207&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@auth
..
@endauth

@guest
..
@endguest

@isset($data)
..
@endisset

@forelse($items as $item)
..
@empty
....
@endforelse&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffc1c8; background-color: #000000;&quot;&gt;&lt;b&gt;* * * * Huda * * * *&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3.&amp;nbsp; 블래이드 문법&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 조건문&lt;/h4&gt;
&lt;pre id=&quot;code_1776087297302&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@if($memner_kind == &quot;T&quot;)
    &amp;lt;p&amp;gt;선생님 입니다.&amp;lt;/p&amp;gt;
@else
    &amp;lt;p&amp;gt;선생님이 아닙니다.&amp;lt;/p&amp;gt;
@endif&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1776087347670&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@if($memner_kind == &quot;T&quot;)
    &amp;lt;p&amp;gt;선생님 입니다.&amp;lt;/p&amp;gt;
@elseif($memner_kind == &quot;S&quot;)
    &amp;lt;p&amp;gt;학생 입니다.&amp;lt;/p&amp;gt;
@else
    &amp;lt;p&amp;gt;Guest 입니다.&amp;lt;/p&amp;gt;
@endif&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) 반복문&lt;/h4&gt;
&lt;pre id=&quot;code_1776087434965&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## for 기본 반복문
@for($i = 0; $i &amp;lt; 5; $i++)
    &amp;lt;p&amp;gt;{{ $i }}&amp;lt;/p&amp;gt;
@endfor


## while
@php $i = 0; @endphp
@while($i &amp;lt; 5)
    &amp;lt;p&amp;gt;{{ $i }}&amp;lt;/p&amp;gt;
    @php $i++; @endphp
@endwhile


# for, while 은 변수를 잘못쓰면 무한루프 위험이 있습니다.


## 실무에서 더 많이 사용됨
@foreach($posts as $post)
    &amp;lt;p&amp;gt;{{ $post-&amp;gt;title }}&amp;lt;/p&amp;gt;
@endforeach

## foreach 에서는 값이 있을때만 출력이 있기 때문에
## 사용자가 무슨 문제가 있는지 확인이 어렵다.

## 실제로는 아래 처럼 많이 사용한다.
@if(count($posts) &amp;gt; 0)
    @foreach($posts as $post)
        &amp;lt;p&amp;gt;{{ $post-&amp;gt;title }}&amp;lt;/p&amp;gt;
    @endforeach
@else
    &amp;lt;p&amp;gt;게시글이 없습니다&amp;lt;/p&amp;gt;
@endif


## 실무에서 많이 쓰는 형태...
@forelse($posts as $post)
    &amp;lt;p&amp;gt;{{ $post-&amp;gt;title }}&amp;lt;/p&amp;gt;
@empty
    &amp;lt;p&amp;gt;게시글이 없습니다&amp;lt;/p&amp;gt;
@endforelse

## 데이터 없으면 @empty 실행&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) 기타&lt;/h4&gt;
&lt;pre id=&quot;code_1776087618874&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 값이 존재할때 ( 변수가 존재하고, null 이 아닐때 )
@isset($data)
    &amp;lt;p&amp;gt;데이터가 있습니다&amp;lt;/p&amp;gt;
@endisset


@isset($user)
    &amp;lt;p&amp;gt;{{ $user-&amp;gt;name }}&amp;lt;/p&amp;gt;
@endisset


# Lagacy PHP
if (isset($user)) { 

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4) 레이아웃 구성 (layout, section)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;@extends @section&amp;nbsp; @yield&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 레이아웃 파일&amp;nbsp; views/layouts/app.blade.php&lt;/p&gt;
&lt;pre id=&quot;code_1776088910042&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;My App&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;header&amp;gt;헤더&amp;lt;/header&amp;gt;

@yield('content')

&amp;lt;footer&amp;gt;푸터&amp;lt;/footer&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 컨텐츠 파일&amp;nbsp; views/posts.blade.php&lt;/p&gt;
&lt;pre id=&quot;code_1776088927036&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@extends('layouts.app')

@section('content')
    &amp;lt;h1&amp;gt;Board&amp;lt;/h1&amp;gt;
    ...
    ...    
    ...
@endsection&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Gemini_Generated_Image_81mrwn81mrwn81mr.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DOS2J/dJMcaiC8S1V/V9nWfBMrYq2XuZTjc422u1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DOS2J/dJMcaiC8S1V/V9nWfBMrYq2XuZTjc422u1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DOS2J/dJMcaiC8S1V/V9nWfBMrYq2XuZTjc422u1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDOS2J%2FdJMcaiC8S1V%2FV9nWfBMrYq2XuZTjc422u1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1376&quot; height=&quot;768&quot; data-filename=&quot;Gemini_Generated_Image_81mrwn81mrwn81mr.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- include 사용&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* layout 에서 include 사용 ( header . footer ) 부분을 따로 분리해줄수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1776089270810&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;My App&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

@include('partials.header')

@yield('content')

@include('partials.footer')

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 자식 템플릿 @section 안과 밖에서도 사용 할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1776089231551&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@extends('layouts.app')

@section('content')

&amp;lt;h1&amp;gt;Board&amp;lt;/h1&amp;gt;

@include('board.skin')
.....
.....
.....
@endsection&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;@push&amp;nbsp; @stack&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1777512728349&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;My App&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

@include('partials.header')

@yield('content')

@include('partials.footer')

&amp;lt;script&amp;gt;
.....
&amp;lt;/script&amp;gt;
@stack('javascript')
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777512865711&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@extends('layouts.app')

@section('content')

&amp;lt;h1&amp;gt;Board&amp;lt;/h1&amp;gt;


@push
&amp;lt;script&amp;gt;
.....
.....
.....
&amp;lt;/script&amp;gt;
@endpush

@endsection&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Gemini_Generated_Image_wqarykwqarykwqar (1).png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5pEWC/dJMcajosadd/2l93fd1eWJkst9VRGaD6sK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5pEWC/dJMcajosadd/2l93fd1eWJkst9VRGaD6sK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5pEWC/dJMcajosadd/2l93fd1eWJkst9VRGaD6sK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5pEWC%2FdJMcajosadd%2F2l93fd1eWJkst9VRGaD6sK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1376&quot; height=&quot;768&quot; data-filename=&quot;Gemini_Generated_Image_wqarykwqarykwqar (1).png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1776088991912&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@extends &amp;rarr; 부모 템플릿 상속

@section &amp;rarr; 내용정의
@yield &amp;rarr; 이부분에 내용이 교체

@push -&amp;gt; 내용정의
@stack -&amp;gt; 이부분에 내용이 누적&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폴더 구조는 아래 처럼 구성하는 것을 추천합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1776089371074&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resources/views/
 ├── partials/
 │     ├── header.blade.php
 │     └── footer.blade.php
 ├── layouts/
 │     └── app.blade.php
 └── posts/
       └── index.blade.php&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시 ) 템플릿을 이용해서 실제 만들어 보면서 설명하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.templatemonster.com/monsterone/free-download/?id=248666%EF%BB%BF&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.templatemonster.com/monsterone/free-download/?id=248666%EF%BB%BF&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776395894569&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;page&quot; data-og-title=&quot;MonsterONE Free Download&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.templatemonster.com&quot; data-og-source-url=&quot;https://www.templatemonster.com/monsterone/free-download/?id=248666%EF%BB%BF&quot; data-og-url=&quot;https://www.templatemonster.com/monsterone/free-download/?id=248666%EF%BB%BF&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b22Wgg/dJMb9hC2Zqm/kNR69mhrJKFK5FKiLg2WJ0/img.jpg?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675,https://scrap.kakaocdn.net/dn/bc7Mbm/dJMb8U8VgTb/HLgrebuZv6gPsRdBj1j4D1/img.jpg?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675&quot;&gt;&lt;a href=&quot;https://www.templatemonster.com/monsterone/free-download/?id=248666%EF%BB%BF&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.templatemonster.com/monsterone/free-download/?id=248666%EF%BB%BF&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b22Wgg/dJMb9hC2Zqm/kNR69mhrJKFK5FKiLg2WJ0/img.jpg?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675,https://scrap.kakaocdn.net/dn/bc7Mbm/dJMb8U8VgTb/HLgrebuZv6gPsRdBj1j4D1/img.jpg?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MonsterONE Free Download&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.templatemonster.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;템플릿으로 빠르게 개발할때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) html&amp;nbsp; 파일들은 /resources/views/&amp;nbsp; 로 옮긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 파일은 /resources/views/ 에서는 .blade.php 로 변경한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) js, css 등은 경로를 접근할 수 있는 /public 에 옮긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) .blade.php 에서 js, css 의 경로를 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) 레이아웃을 분리한다.&amp;nbsp; -&amp;gt; 공통적인 영역처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;580&quot; data-end=&quot;587&quot;&gt;실습과 과제&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;588&quot; data-end=&quot;606&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot; data-section-id=&quot;19aw3kp&quot; data-start=&quot;588&quot; data-end=&quot;606&quot;&gt;부트스트랩 템플릿을 blade 템플릿 구조로 만들어보기&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Hokma School :: Course 2 Laravel</category>
      <author>테디아저씨</author>
      <guid isPermaLink="true">https://teddystudyroom.tistory.com/45</guid>
      <comments>https://teddystudyroom.tistory.com/45#entry45comment</comments>
      <pubDate>Mon, 13 Apr 2026 23:10:42 +0900</pubDate>
    </item>
    <item>
      <title>Laravel 03. Controller</title>
      <link>https://teddystudyroom.tistory.com/44</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ChatGPT Image 2026년 4월 17일 오후 08_41_09.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7RiZy/dJMcagSJ7Nf/jP7mk8S7tCn8B0kYKxVJ9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7RiZy/dJMcagSJ7Nf/jP7mk8S7tCn8B0kYKxVJ9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7RiZy/dJMcagSJ7Nf/jP7mk8S7tCn8B0kYKxVJ9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7RiZy%2FdJMcagSJ7Nf%2FjP7mk8S7tCn8B0kYKxVJ9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1024&quot; data-filename=&quot;ChatGPT Image 2026년 4월 17일 오후 08_41_09.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Controller&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;로직을 처리하는 부분&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;사용자 요청을 받아 모델(Model)과 상호작용하고, 결과를 뷰(View)나 JSON으로 반환하는 '중간 관리자' 역할을 수행&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1.1 컨트롤러 생성&lt;/h3&gt;
&lt;pre id=&quot;code_1776424922026&quot; class=&quot;css&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;php artisan make:controller PostController



# INFO  Controller [app/Http/Controllers/PostController.php] created successfully.&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;생성위치 app/Http/Controllers/PostController.php&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1.2 컨트롤러 구조&lt;/h3&gt;
&lt;pre id=&quot;code_1776424922026&quot; class=&quot;scala&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&amp;lt;?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ShipmentController extends Controller
{
    //
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1.3 Route 와&amp;nbsp; Controller&lt;/h3&gt;
&lt;pre id=&quot;code_1776424922026&quot; class=&quot;elixir&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;Route::get('/posts', [ShipmentController::class, 'index']);   // 목록
Route::get('/posts/create', [ShipmentController::class, 'create']); // 작성폼
Route::post('/posts', [ShipmentController::class, 'store']); // 저장&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1776424922026&quot; class=&quot;xml&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&amp;lt;?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ShipmentController extends Controller
{
    public function index(Request $request)
    {
         return 'Posts List'
    }
    
    public function create(Request $request)
    {
         return 'Post Form'
    }
    
    public function store(Request $request)
    {
         return 'Post Save'
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* Request $request&amp;nbsp; 설명&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&quot;Request는 사용자가 보낸 모든 데이터를 담고 있는 객체&quot;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1776424922027&quot; class=&quot;elixir&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 일반적인 방식
$request-&amp;gt;title

# 추천하는 방식
$request-&amp;gt;input('title')

# 모든 데이터
$request-&amp;gt;all()&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;기타사용자정보&lt;/p&gt;
&lt;pre id=&quot;code_1776424922027&quot; class=&quot;elixir&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;$request-&amp;gt;ip();

$request-&amp;gt;getClientIp();&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1.4 __invoke&amp;nbsp; 단일 작업 컨트롤러 (Single Action Controller)&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;특정 컨트롤러가 하나의 기능(예: 대시보드 표시, 결제 처리 등)만 수행한다면 여러 메서드를 만들 필요가 없습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이때 __invoke 메서드를 사용합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1776424922027&quot; class=&quot;gauss&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;// 단일작업 컨트롤러 생성

php artisan make:controller CarController --invokable&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;생성된 모양&lt;/p&gt;
&lt;pre id=&quot;code_1776424922027&quot; class=&quot;xml&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&amp;lt;?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ShipmentController extends Controller
{
    /**
     * Handle the incoming request.
     */
    public function __invoke(Request $request)
    {
        //
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사용시 function 을 지정하지 않고 사용합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1776424922028&quot; class=&quot;ruby&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;Route::get('/', ShipmentController::class);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&quot;Laravel is an object-oriented (OOP) based framework, and all functions are composed of classes.&quot;&lt;/b&gt;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;ldquo;Laravel은 객체지향(OOP) 기반 프레임워크이며, 모든 기능은 Class로 구성되어 있다&amp;rdquo;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1776424922028&quot; class=&quot;scala&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&amp;lt;?php

class ShipmentController extends Controller&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1776424922028&quot; class=&quot;scala&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&amp;lt;?php

class User extends Model&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그외에도 서비스, 미들웨어 등도 모두 class 로 되어있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;클래스는&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-section-id=&quot;s5wbat&quot; data-start=&quot;510&quot; data-end=&quot;523&quot;&gt;1. 재사용 가능&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;524&quot; data-end=&quot;542&quot;&gt;&amp;rarr; 같은 코드를 여러 곳에서 사용&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-section-id=&quot;4m0y5u&quot; data-start=&quot;544&quot; data-end=&quot;554&quot;&gt;2. 구조화&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;555&quot; data-end=&quot;568&quot;&gt;&amp;rarr; 역할별로 나누기 쉬움&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-section-id=&quot;750g6y&quot; data-start=&quot;570&quot; data-end=&quot;580&quot;&gt;3. 확장성&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;581&quot; data-end=&quot;594&quot;&gt;&amp;rarr; 기능을 추가하기 쉬움&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;581&quot; data-end=&quot;594&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;581&quot; data-end=&quot;594&quot;&gt;클래스 vs 객체&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;581&quot; data-end=&quot;594&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;581&quot; data-end=&quot;594&quot;&gt;클래스는 설계도이고, 객체는 그 설계도대로 사용되는것&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;581&quot; data-end=&quot;594&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;581&quot; data-end=&quot;594&quot;&gt;중요한 이야기는 나중에 모델을 공부할때 하도록 하겠습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;581&quot; data-end=&quot;594&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;581&quot; data-end=&quot;594&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;581&quot; data-end=&quot;594&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;581&quot; data-end=&quot;594&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;581&quot; data-end=&quot;594&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;581&quot; data-end=&quot;594&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;581&quot; data-end=&quot;594&quot;&gt;RESTful&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Hokma School :: Course 2 Laravel</category>
      <author>테디아저씨</author>
      <guid isPermaLink="true">https://teddystudyroom.tistory.com/44</guid>
      <comments>https://teddystudyroom.tistory.com/44#entry44comment</comments>
      <pubDate>Mon, 13 Apr 2026 22:18:16 +0900</pubDate>
    </item>
    <item>
      <title>Laravel 02. Routing</title>
      <link>https://teddystudyroom.tistory.com/43</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCZI4t/dJMcafGcIgV/Pulj9nuru2mtbEAqL4yXr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCZI4t/dJMcafGcIgV/Pulj9nuru2mtbEAqL4yXr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCZI4t/dJMcafGcIgV/Pulj9nuru2mtbEAqL4yXr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCZI4t%2FdJMcafGcIgV%2FPulj9nuru2mtbEAqL4yXr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1024&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Route&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.1&amp;nbsp; why Route ?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PHP 프로젝트에서 우리는 /경로/php파일명을 URL 로 접근할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/aboutus/aboutus01.php&lt;/p&gt;
&lt;pre id=&quot;code_1775778194483&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;파일
/aboutus/aboutus01.php   

브라우저 경로
http://url.com/aboutus/aboutus01.php&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) 복잡한 URL 을 간결하게 바꿀수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://teddy.school.com/board/list.php?board_id=study&quot;&gt;http://teddy.school.com/board/list.php?board_id=study&amp;amp;step=view&amp;amp;bid=23&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; http://teddy.school.com/board/study/23&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) 보안을 위해 직접 php 파일에 접근을 차단한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://url.com/aboutus/aboutus01.php&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://url.com/aboutus.php&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://url.com/aboutus.blade.php&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://url.com/aboutus.blade.php&lt;/a&gt;&amp;nbsp; &amp;nbsp;( x )&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- php 프로젝트를 알수 있다. -&amp;gt; php 취약점 활용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 경로를 알수 있다 -&amp;gt; 백도어등의 프로그램을 심어 자신이 심은 php 파일을 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* Route 는 사용자의 URL 접근을 해석해서 Route 가 알고 있는 파일을 실행해준다.&lt;/b&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;b&gt;1.&lt;/b&gt;2. Route 살펴보기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;routes/web.php&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775777494906&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;view() 함수는 우리가 1강에서 이야기한 view 페이지를 보여주는 명령입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) 바로 Text 를 보내줄수도 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775780791552&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Route::get('/aboutus', function () {
    return 'We are Hokma Teacher!';
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) 라우트에서 직접 로직을 만들고 결과를 리턴할 수도 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775783634942&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Route::get('/addition', function () {
    $result = 2 + 3;    
    return &quot;The result of 2 + 3 is: &quot; . $result;
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) Html&amp;nbsp; 로 작성한 view 를 지정할 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775780849751&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Route::get('/services', function () {
    return view('services');
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 여기서 잠깐 존재하지 않는 경로를 호출하면&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;없는 경로에 접근해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://127.0.0.1:8000/school&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B50kQ/dJMcaaZa0O6/9K5MghiKdYNtnUFykC1nUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B50kQ/dJMcaaZa0O6/9K5MghiKdYNtnUFykC1nUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B50kQ/dJMcaaZa0O6/9K5MghiKdYNtnUFykC1nUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB50kQ%2FdJMcaaZa0O6%2F9K5MghiKdYNtnUFykC1nUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;789&quot; height=&quot;508&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;404 에러, 페이지가 존재하지 않다고 알려줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3)&lt;span&gt;&amp;nbsp;&lt;/span&gt;리다이렉트&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775781738665&quot; class=&quot;actionscript&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;Route::get('/school', function () {
    return redirect('/service');
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4) Controller 에게 처리를 지시하기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775782872777&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\LectureController;


# 컨트롤어와 function 을 지정해준다.
Route::get('/lectures', [LectureController::class, 'lectureIndex']);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#&amp;nbsp;컨트롤러를&amp;nbsp;사용할때는&amp;nbsp;web.php&amp;nbsp;상단에&amp;nbsp;LectureController&amp;nbsp;를&amp;nbsp;use&amp;nbsp;해&amp;nbsp;주어야&amp;nbsp;한다&lt;br /&gt;# 컨트롤러의 자세한 내용은 다음시간에 공부하고 모양만 확인해보겠습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app/Http/Controller/LectureController.php&lt;/p&gt;
&lt;pre id=&quot;code_1775783015601&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php
namespace App\Http\Controllers;

class LectureController extends Controller
{
    public function lectureIndex()
    {
        return 'This is the lecture page.';
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5) 매개변수사용하기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775783903561&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Route::get('/article/{id}', function ($id) {
    return 'Article '.$id;
});&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* 만약 id&amp;nbsp; 없이 url 을 호출하면&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;404 를 보내줍니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* 선택적 매개변수&lt;/p&gt;
&lt;pre id=&quot;code_1775784201043&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#id 가 있을수도, 없을수도 있습니다.
Route::get('/article/{id?}', function ($id=null) {
    return 'Article '.$id;
});&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;둘 이상의 매개변수를 사용할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1775784411514&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Route::get('/article/{id}/comments/{commentId}', function ($id=null, $commentId=null) {
    return 'Article '.($id). ' - Comment '.($commentId);
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5) 정규식 제약조건&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775784953849&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Route::get('/program/{name}', function ($name) {
    return &quot;Program's name &quot; . $name;
})-&amp;gt;where('name', '[A-Za-z]+');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://127.0.0.1:8000/program/php&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://127.0.0.1:8000/program/php8&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 숫자도 허용하려면&lt;/p&gt;
&lt;pre id=&quot;code_1775785223939&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Route::get('/program/{name}', function ($name) {
    return &quot;Program's name &quot; . $name;
})-&amp;gt;where('name', '[A-Za-z0-9]+');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;* 기타&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775785312815&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Route::get('/user/{id}', function ($id) {
    //
})-&amp;gt;where('id', '[0-9]+');

Route::get('/user/{id}/{name}', function ($id, $name) {
    //
})-&amp;gt;where(['id' =&amp;gt; '[0-9]+', 'name' =&amp;gt; '[a-z]+']);


Route::get('/user/{id}/{name}', function ($id, $name) {
    //
})-&amp;gt;whereNumber('id')-&amp;gt;whereAlpha('name');

Route::get('/user/{name}', function ($name) {
    //
})-&amp;gt;whereAlphaNumeric('name');

Route::get('/user/{id}', function ($id) {
    //
})-&amp;gt;whereUuid('id');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;## 매개변수를 사용할때&lt;/p&gt;
&lt;pre id=&quot;code_1775786231852&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$url = route('profile',['id'=&amp;gt;1, 'name'=&amp;gt;'Teddy']);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는&amp;nbsp; Controller 를 통해 처리하는 방식을 주로 사용하게 될겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6) method&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775787827010&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Route::get('/aboutus', function () {
    return 'We are Hokma Teacher!';
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Route 에서 사용한&amp;nbsp; get 은 어떤 의미일까요?&lt;/p&gt;
&lt;pre id=&quot;code_1775788027559&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Route::get('/signup', [UserController::class, 'signupForm'])-&amp;gt;name(&quot;signup&quot;);
Route::post('/signup', [UserController::class, 'signup'])-&amp;gt;name(&quot;signupok&quot;);
Route::post('/signupByOTP', [UserController::class, 'signupByOTP']);

Route::get('/register', [LoginController::class, 'registerForm'])-&amp;gt;name('register');
Route::post('/register/confirm', [LoginController::class, 'registerConfirm'])-&amp;gt;name('register.confirm');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네. route 에서는 get 방식으로 접근하는 경로, post 로만 접근하는 경로를 지정할 수있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* /signup&amp;nbsp; get, post 접근 가능여부를 직접 진행해볼것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026.04.15&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1776223369885&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Route::get('/user/profile/{id}', function ($id) {
    return &quot;$id Profile Page&quot;;
})-&amp;gt;name('profile');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;7) naming&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776222674948&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;Route::get('/user/profile/{id}', function ($id) {
    return &quot;$id Profile Page&quot;;
})-&amp;gt;name('profile');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;## 컨트롤러등에서 URL 등을 대체해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1776222674948&quot; class=&quot;arcade&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;$url = route('profile');
return &quot;User Index Page. Profile URL: &quot; . $url;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 부터 운송플랫폼을 기준으로 설명하도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;8) prepix&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 shipment 기능의 라우트를 작성해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1775788259013&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// post 라우트
Route::get('/shipment', [ShipmentController::class, 'index']);
Route::get('/shipment/form', [ShipmentController::class, 'form']);
Route::post('/shipment/update', [ShipmentController::class, 'update']);
Route::post('/shipment/delete', [ShipmentController::class, 'delete']);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각&amp;nbsp; URL 을 브라우저로 확인해봅니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공통된 경로를 하나로 묶어 그룹화하여 간결하고 체계적으로 관리할수 있게 해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1775788459976&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// &amp;nbsp;Prefix 를 이용함

Route::prefix('shipment')-&amp;gt;name('shipment.')-&amp;gt;group(function () {

    // post 라우트
    Route::get('/', [ShipmentController::class, 'index']);
    Route::get('/form', [ShipmentController::class, 'form']);
    Route::post('/update', [ShipmentController::class, 'update']);
    Route::post('/delete', [ShipmentController::class, 'delete']);

});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨트롤러를 그룹화할 수도 있습니다. ( 저는 실무에서 사용해본적이 없는데 이런것도 있네요 )&lt;/p&gt;
&lt;pre id=&quot;code_1775788712700&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Route::post('shipment/items', [ShopController::class, 'index']);


Route::prefix('shipment')-&amp;gt;controller(ShipmentController::class)-&amp;gt;group(function () {
    Route::get('/items', 'index');   // /shop/items
    Route::get('/item/{id}', 'show'); // /shop/item/{id}
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;** 라우트에 대한 질문이 있으신가요?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-end=&quot;594&quot; data-start=&quot;581&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;594&quot; data-start=&quot;581&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Hokma School :: Course 2 Laravel</category>
      <author>테디아저씨</author>
      <guid isPermaLink="true">https://teddystudyroom.tistory.com/43</guid>
      <comments>https://teddystudyroom.tistory.com/43#entry43comment</comments>
      <pubDate>Fri, 10 Apr 2026 12:22:59 +0900</pubDate>
    </item>
    <item>
      <title>Laravel 01.  라라벨 소개와 설치</title>
      <link>https://teddystudyroom.tistory.com/42</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b64RBg/dJMcaakyBwG/1kHqBWFNlIO4u00mm5p7KK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b64RBg/dJMcaakyBwG/1kHqBWFNlIO4u00mm5p7KK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b64RBg/dJMcaakyBwG/1kHqBWFNlIO4u00mm5p7KK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb64RBg%2FdJMcaakyBwG%2F1kHqBWFNlIO4u00mm5p7KK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1024&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Who am I...&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;I&amp;nbsp;started&amp;nbsp;development&amp;nbsp;in&amp;nbsp;2001.&lt;br /&gt;I have been working as an independent freelancer since 2006.&lt;br /&gt;Recently, starting in 2024, I developed business software for a global company called Deloitte for two years.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Currently,&amp;nbsp;I&amp;nbsp;am&amp;nbsp;developing&amp;nbsp;school&amp;nbsp;systems&amp;nbsp;(PHP,&amp;nbsp;Laravel)&amp;nbsp;and&amp;nbsp;O2O&amp;nbsp;platforms&amp;nbsp;(Flutter).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;PHP + Javascript ( Shopping malls, communities, web builders, etc )&lt;br /&gt;Python Automation ( Public institution data registration, crawling, etc )&lt;br /&gt;Flutter IOS, Android App ( Dictionaries, O2O services, etc )&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Laravel 은?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Laravel&amp;nbsp;is&amp;nbsp;an&amp;nbsp;open-source&amp;nbsp;web&amp;nbsp;framework&amp;nbsp;based&amp;nbsp;on&amp;nbsp;the&amp;nbsp;PHP&amp;nbsp;language.&amp;nbsp;Designed&amp;nbsp;to&amp;nbsp;enable&amp;nbsp;the&amp;nbsp;rapid&amp;nbsp;and&amp;nbsp;efficient&amp;nbsp;development&amp;nbsp;of&amp;nbsp;modern&amp;nbsp;web&amp;nbsp;applications,&amp;nbsp;it&amp;nbsp;is&amp;nbsp;one&amp;nbsp;of&amp;nbsp;the&amp;nbsp;most&amp;nbsp;popular&amp;nbsp;PHP&amp;nbsp;frameworks&amp;nbsp;worldwide.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라라벨(Laravel)은 PHP 언어를 기반으로 하는 오픈 소스 &lt;b data-index-in-node=&quot;40&quot; data-path-to-node=&quot;0&quot;&gt;웹 프레임워크&lt;/b&gt;입니다. 현대적인 웹 애플리케이션을 빠르고 효율적으로 개발할 수 있도록 설계되었으며, 전 세계적으로 가장 인기 있는 PHP 프레임워크 중 하나입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Framework ?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;It's&amp;nbsp;like&amp;nbsp;having&amp;nbsp;the&amp;nbsp;basic&amp;nbsp;framework&amp;nbsp;prepared&amp;nbsp;in&amp;nbsp;advance!&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;기본 뼈대를 미리 만들어 놓은 것!&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;건축공사를 할때 공통적으로 미리 꼭 해놔야 하는&amp;nbsp;기초공사, 전기, 수도.하수등 배관 등을 기본으로 제공을 해주는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;집, 사무실, 상가등 원하는 건축물을 만들때 빠르게&amp;nbsp; 완성 가능.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;기초공사, 전기, 수도.하수등 배관&lt;span&gt; 등의 키트를 제공하는 걸 프레임워크 라고 합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;u&gt;&lt;b&gt;In&amp;nbsp;software&amp;nbsp;development&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;Basic structure (MVC pattern)&lt;br /&gt;Frequently used functions (Login, DB connection)&lt;br /&gt;Basic functions&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;=&amp;gt;&amp;nbsp;Enables&amp;nbsp;rapid&amp;nbsp;and&amp;nbsp;consistent&amp;nbsp;development&amp;nbsp;according&amp;nbsp;to&amp;nbsp;a&amp;nbsp;defined&amp;nbsp;method&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;소프트웨어 개발에서는&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;기본구조 ( MVC 패턴 )&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;자주쓰는기능 ( 로그인, DB 연결 )&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;기본 Function&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;=&amp;gt; 정해진 방식대로 빠르게 일관성있게 개발가능&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Frameworks&amp;nbsp;for&amp;nbsp;each&amp;nbsp;language&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;Java =&amp;gt; Spring Boot&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;Javascript =&amp;gt; &lt;span data-path-to-node=&quot;4,2,0,0&quot;&gt;&lt;/span&gt;&lt;span data-path-to-node=&quot;4,2,1,0&quot;&gt;Express.js&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;Python =&amp;gt; Django&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;PHP =&amp;gt; Laravel, CodeIgniter&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Features&amp;nbsp;of&amp;nbsp;the&amp;nbsp;Laravel&amp;nbsp;Framework&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;Clean&amp;nbsp;and&amp;nbsp;easy-to-read&amp;nbsp;code&amp;nbsp;(Expressive&amp;nbsp;Syntax)&lt;br /&gt;2. Powerful features (Built-in Features)&lt;br /&gt;3. Thorough separation of MVC structure&lt;br /&gt;4. Massive ecosystem and community'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Laravel 프레임워크의 특징&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 깔끔하고 읽기 쉬운 코드 (Expressive Syntax)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 강력한 기능들 (Built-in Features)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. MVC 구조의 철저한 분리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 거대한 생태계와 커뮤니티&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 깔끔하고 읽기 쉬운 코드 (Expressive Syntax)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PHP&lt;/p&gt;
&lt;pre id=&quot;code_1775607942509&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php
// 1. DB 연결 설정
$host = '127.0.0.1';
$db   = 'my_database';
$user = 'root';
$pass = 'password';
$charset = 'utf8mb4';

$dsn = &quot;mysql:host=$host;dbname=$db;charset=$charset&quot;;
$options = [
    PDO::ATTR_ERRMODE            =&amp;gt; PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE =&amp;gt; PDO::FETCH_ASSOC,
];

try {
     $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
     throw new \PDOException($e-&amp;gt;getMessage(), (int)$e-&amp;gt;getCode());
}

// 2. 쿼리 실행 및 데이터 가져오기
$email = 'user@example.com';
$stmt = $pdo-&amp;gt;prepare(&quot;SELECT * FROM users WHERE email = ?&quot;);
$stmt-&amp;gt;execute([$email]);
$user = $stmt-&amp;gt;fetch();

// 3. 결과 사용
echo $user['name'];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Laravel&lt;/p&gt;
&lt;pre id=&quot;code_1775607976701&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

// 이메일로 사용자 한 명을 찾아서 가져오기
$user = User::where('email', 'user@example.com')-&amp;gt;first();

// 결과 사용
echo $user-&amp;gt;name;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 강력한 기능들 (Built-in Features)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1)&lt;span&gt; 라우팅 &amp;amp;&amp;nbsp; 컨트롤러 사용&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;간편하게 URL 처리하고 응답한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2) 미들웨어 ( Middleware )&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;요청을 처리하기 전후에 특정로직을 실행하도록 해준다 ( 로그인, 권한부여 )&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) Eloquent ORM&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스 레코드를 단순한 PHP 객체로 다룰 수 있게 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) Blade 템플릿 기본제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;상속과 컴포넌트:&lt;/b&gt; @extends, @section 등을 이용해 레이아웃을 재사용할 수 있습니다. 예를 들어, 헤더와 푸터를 한 곳에서 관리하고 본문만 갈아 끼우는 방식입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1) 부모 Layout&lt;/p&gt;
&lt;pre id=&quot;code_1775608931012&quot; class=&quot;xml&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt; Hokma Academy - @yield('title') &amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;nav&amp;gt;
        &amp;lt;a href=&quot;/&quot;&amp;gt;홈&amp;lt;/a&amp;gt; | 
		&amp;lt;a href=&quot;/aboutus&quot;&amp;gt;About Us&amp;lt;/a&amp;gt; | 
  		&amp;lt;a href=&quot;/services&quot;&amp;gt;Services&amp;lt;/a&amp;gt; | 
		&amp;lt;a href=&quot;/contactus&quot;&amp;gt;ContactUs&amp;lt;/a&amp;gt; | 
		&amp;lt;a href=&quot;/mypage&quot;&amp;gt;Mypage&amp;lt;/a&amp;gt;
    &amp;lt;/nav&amp;gt;

    &amp;lt;div class=&quot;container&quot;&amp;gt;
        @yield('content')
    &amp;lt;/div&amp;gt;

    &amp;lt;footer&amp;gt;
        &amp;lt;p&amp;gt;&amp;copy; 2026 Hokma Academy&amp;lt;/p&amp;gt;
    &amp;lt;/footer&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2) 자식페이지&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1775608931013&quot; class=&quot;django&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;@extends('layouts.app') {{-- 부모 레이아웃 확장 --}}

@section('title', '내 프로필 페이지') {{-- 짧은 내용은 두 번째 인자로 --}}

@section('content')
    &amp;lt;h1&amp;gt;회원 정보&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;이름: {{ $user-&amp;gt;name }}&amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;이메일: {{ $user-&amp;gt;email }}&amp;lt;/p&amp;gt;
    &amp;lt;button&amp;gt;정보 수정&amp;lt;/button&amp;gt;
@endsection&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;기존의 PHP 는 include 를 사용하고, 레이아웃 부분부분에 원하는 데이터를 지정하기는 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;성능:&lt;/b&gt; Blade 코드는 순수 PHP 코드로 컴파일되어 캐싱되기 때문에 속도가 매우 빠릅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. MVC 구조의 철저한 분리&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MVC&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #242424; text-align: start;&quot;&gt;아키텍처 패턴&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UmMHl/dJMcahYhh8N/ojYa1sDHMjtZ7H12LDtkB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UmMHl/dJMcahYhh8N/ojYa1sDHMjtZ7H12LDtkB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UmMHl/dJMcahYhh8N/ojYa1sDHMjtZ7H12LDtkB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUmMHl%2FdJMcahYhh8N%2FojYa1sDHMjtZ7H12LDtkB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1408&quot; height=&quot;736&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;736&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. 문서화, 거대한 생태계와 커뮤니티&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) 문서화 - 버젼에 따라 잘 정리된 문서를 업데이트 해줍니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://laravel.com/&quot;&gt;https://laravel.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1775610081304&quot; contenteditable=&quot;false&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b5slCW/dJMb87NXf2i/mBvvvASKUfqDky5c5Brx91/img.png?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260,https://scrap.kakaocdn.net/dn/cBDIBo/dJMb81fTrxF/gOxdeoqINnwPihjbkVioqK/img.png?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260,https://scrap.kakaocdn.net/dn/cfKxMA/dJMb86O2Box/HAYjPaEZzcoBPxMdIGIK4K/img.jpg?width=206&amp;amp;height=206&amp;amp;face=58_71_156_178&quot; data-og-url=&quot;https://laravel.com/&quot; data-og-source-url=&quot;https://laravel.com/&quot; data-og-host=&quot;laravel.com&quot; data-og-description=&quot;Laravel is a PHP web application framework with expressive, elegant syntax. We've already laid the foundation &amp;mdash; freeing you to create without sweating the small things.&quot; data-og-title=&quot;Laravel - The clean stack for Artisans and agents&quot; data-og-type=&quot;website&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://laravel.com/&quot; data-source-url=&quot;https://laravel.com/&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;Laravel - The clean stack for Artisans and agents&lt;/p&gt;
&lt;p style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;Laravel is a PHP web application framework with expressive, elegant syntax. We've already laid the foundation &amp;mdash; freeing you to create without sweating the small things.&lt;/p&gt;
&lt;p style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;laravel.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1444&quot; data-origin-height=&quot;884&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpubTK/dJMcadBu8Wc/qTmaQJi7KkvuwTYaTH27l0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpubTK/dJMcadBu8Wc/qTmaQJi7KkvuwTYaTH27l0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpubTK/dJMcadBu8Wc/qTmaQJi7KkvuwTYaTH27l0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpubTK%2FdJMcadBu8Wc%2FqTmaQJi7KkvuwTYaTH27l0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1444&quot; height=&quot;884&quot; data-origin-width=&quot;1444&quot; data-origin-height=&quot;884&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) Laracasts 와 같은 교육/커뮤니티 플랫폼이 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://laracasts.com/&quot;&gt;https://laracasts.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1775609750444&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Learn Laravel | Laracasts&quot; data-og-description=&quot;Want to learn Laravel and PHP from the coding wizards who know it best?&quot; data-og-host=&quot;laracasts.com&quot; data-og-source-url=&quot;https://laracasts.com/&quot; data-og-url=&quot;https://laracasts.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jzH2D/dJMb87f7ipP/gk07AMNG2Z91gfmVuTbqf1/img.jpg?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675&quot;&gt;&lt;a href=&quot;https://laracasts.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://laracasts.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jzH2D/dJMb87f7ipP/gk07AMNG2Z91gfmVuTbqf1/img.jpg?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Learn Laravel | Laracasts&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Want to learn Laravel and PHP from the coding wizards who know it best?&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;laracasts.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Teddy's Think...&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) DB ( mysql, mssql, oracle... )&amp;nbsp; &amp;nbsp;- raw 쿼리 사용외에는 동일&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2) 크로스 사이트 스크립팅 ( Xss ) 및 크로스 사이트 요청 위조 ( CSRF ) 방어 기능 내장&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3) 다양한 패키지를 편리하게 설치하고 사용&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 예) sns 연동, QR 코드생성, 권한관리&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;4) 단점! - 많은 기능을 포함하고 있어서 속도가 조금 느리다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&amp;lt; Developers only need to focus on developing service logic. &amp;gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;개발자는 서비스 로직 개발에만 집중하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 강의에서 laravel 설치를 위한 composer 를 설치하는 과정은 다루지 않겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;0. Laravel 설치 환경이 구축되었는지 확인&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1775571712219&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php -v
composer -V&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. Laravel 설치 방법&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1775568400616&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;composer global require laravel/installer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. Laravel 프로젝트 생성&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1775568781771&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 현재 디렉토리 하위에 myapp 이라는 폴더를 만들고 laravel 프로젝트를 생성합니다.

# 초보자를 위한 방법
laravel new myapp

or

# 정확한 버젼선택이 가능한 방법
composer create-project laravel/laravel myapp


# 현재 디렉토리에 프로젝트를 생성

laravel new .
composer create-project laravel/laravel .&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;307&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEz1oN/dJMcagZl6ND/FA4J14Xho6M46VTNWX6b3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEz1oN/dJMcagZl6ND/FA4J14Xho6M46VTNWX6b3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEz1oN/dJMcagZl6ND/FA4J14Xho6M46VTNWX6b3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEz1oN%2FdJMcagZl6ND%2FFA4J14Xho6M46VTNWX6b3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;612&quot; height=&quot;307&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;307&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) Which starter kit would you like to install?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기초 과정에서는 None 을 선택합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;77&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbIrIj/dJMcaduKnLZ/gHw6ljHTQ2ju67wvMxFZxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbIrIj/dJMcaduKnLZ/gHw6ljHTQ2ju67wvMxFZxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbIrIj/dJMcaduKnLZ/gHw6ljHTQ2ju67wvMxFZxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbIrIj%2FdJMcaduKnLZ%2FgHw6ljHTQ2ju67wvMxFZxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;608&quot; height=&quot;77&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;77&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) Which testing framework do you prefer?&lt;br /&gt;테스트 코드를 Pest 로 작성할 것인지, PHPUnit ( PHP OOP 표준 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;69&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kVFst/dJMcafzpzqB/oFMHo1he0HYalK7OpuanA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kVFst/dJMcafzpzqB/oFMHo1he0HYalK7OpuanA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kVFst/dJMcafzpzqB/oFMHo1he0HYalK7OpuanA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkVFst%2FdJMcafzpzqB%2FoFMHo1he0HYalK7OpuanA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;595&quot; height=&quot;69&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;69&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) Do you want to install Laravel Boost to improve AI assisted coding?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Laravel Boost ?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1775571221585&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Creating a &quot;laravel/laravel&quot; project at &quot;./sample&quot;
Installing laravel/laravel (v13.1.2)
  - Downloading laravel/laravel (v13.1.2)
  - Installing laravel/laravel (v13.1.2): Extracting archive
Created project in /Users/b2g/Documents/work/hyunjucho/sample
Loading composer repositories with package information
Updating dependencies
Lock file operations: 107 installs, 0 updates, 0 removals
  - Locking brick/math (0.14.8)
  - Locking carbonphp/carbon-doctrine-types (3.2.0)
  - Locking dflydev/dot-access-data (v3.0.3)
  - Locking doctrine/inflector (2.1.0)
  - Locking doctrine/lexer (3.0.1)
  - Locking dragonmantank/cron-expression (v3.6.0)
  - Locking egulias/email-validator (4.0.4)
  - Locking fakerphp/faker (v1.24.1)
  - Locking filp/whoops (2.18.4)
  - Locking fruitcake/php-cors (v1.4.0)
  - Locking graham-campbell/result-type (v1.1.4)
  - Locking guzzlehttp/guzzle (7.10.0)
  - Locking guzzlehttp/promises (2.3.0)
  - Locking guzzlehttp/psr7 (2.9.0)
  - Locking guzzlehttp/uri-template (v1.0.5)
  - Locking hamcrest/hamcrest-php (v2.1.1)
  - Locking laravel/framework (v13.4.0)
  - Locking laravel/pail (v1.2.6)
  - Locking laravel/pint (v1.29.0)
  - Locking laravel/prompts (v0.3.16)
  - Locking laravel/serializable-closure (v2.0.11)
  - Locking laravel/tinker (v3.0.0)
  - Locking league/commonmark (2.8.2)
  - Locking league/config (v1.2.0)
  - Locking league/flysystem (3.33.0)
  - Locking league/flysystem-local (3.31.0)
  - Locking league/mime-type-detection (1.16.0)
  - Locking league/uri (7.8.1)
  - Locking league/uri-interfaces (7.8.1)
  - Locking mockery/mockery (1.6.12)
  - Locking monolog/monolog (3.10.0)
  - Locking myclabs/deep-copy (1.13.4)
  - Locking nesbot/carbon (3.11.4)
  - Locking nette/schema (v1.3.5)
  - Locking nette/utils (v4.1.3)
  - Locking nikic/php-parser (v5.7.0)
  - Locking nunomaduro/collision (v8.9.3)
  - Locking nunomaduro/termwind (v2.4.0)
  - Locking phar-io/manifest (2.0.4)
  - Locking phar-io/version (3.2.1)
  - Locking phpoption/phpoption (1.9.5)
  - Locking phpunit/php-code-coverage (12.5.3)
  - Locking phpunit/php-file-iterator (6.0.1)
  - Locking phpunit/php-invoker (6.0.0)
  - Locking phpunit/php-text-template (5.0.0)
  - Locking phpunit/php-timer (8.0.0)
  - Locking phpunit/phpunit (12.5.16)
  - Locking psr/clock (1.0.0)
  - Locking psr/container (2.0.2)
  - Locking psr/event-dispatcher (1.0.0)
  - Locking psr/http-client (1.0.3)
  - Locking psr/http-factory (1.1.0)
  - Locking psr/http-message (2.0)
  - Locking psr/log (3.0.2)
  - Locking psr/simple-cache (3.0.0)
  - Locking psy/psysh (v0.12.22)
  - Locking ralouphie/getallheaders (3.0.3)
  - Locking ramsey/collection (2.1.1)
  - Locking ramsey/uuid (4.9.2)
  - Locking sebastian/cli-parser (4.2.0)
  - Locking sebastian/comparator (7.1.4)
  - Locking sebastian/complexity (5.0.0)
  - Locking sebastian/diff (7.0.0)
  - Locking sebastian/environment (8.0.4)
  - Locking sebastian/exporter (7.0.2)
  - Locking sebastian/global-state (8.0.2)
  - Locking sebastian/lines-of-code (4.0.0)
  - Locking sebastian/object-enumerator (7.0.0)
  - Locking sebastian/object-reflector (5.0.0)
  - Locking sebastian/recursion-context (7.0.1)
  - Locking sebastian/type (6.0.3)
  - Locking sebastian/version (6.0.0)
  - Locking staabm/side-effects-detector (1.0.5)
  - Locking symfony/clock (v7.4.8)
  - Locking symfony/console (v7.4.8)
  - Locking symfony/css-selector (v7.4.8)
  - Locking symfony/deprecation-contracts (v3.6.0)
  - Locking symfony/error-handler (v7.4.8)
  - Locking symfony/event-dispatcher (v7.4.8)
  - Locking symfony/event-dispatcher-contracts (v3.6.0)
  - Locking symfony/finder (v7.4.8)
  - Locking symfony/http-foundation (v7.4.8)
  - Locking symfony/http-kernel (v7.4.8)
  - Locking symfony/mailer (v7.4.8)
  - Locking symfony/mime (v7.4.8)
  - Locking symfony/polyfill-ctype (v1.33.0)
  - Locking symfony/polyfill-intl-grapheme (v1.33.0)
  - Locking symfony/polyfill-intl-idn (v1.33.0)
  - Locking symfony/polyfill-intl-normalizer (v1.33.0)
  - Locking symfony/polyfill-mbstring (v1.33.0)
  - Locking symfony/polyfill-php80 (v1.33.0)
  - Locking symfony/polyfill-php83 (v1.33.0)
  - Locking symfony/polyfill-php84 (v1.33.0)
  - Locking symfony/polyfill-php85 (v1.33.0)
  - Locking symfony/polyfill-uuid (v1.33.0)
  - Locking symfony/process (v7.4.8)
  - Locking symfony/routing (v7.4.8)
  - Locking symfony/service-contracts (v3.6.1)
  - Locking symfony/string (v7.4.8)
  - Locking symfony/translation (v7.4.8)
  - Locking symfony/translation-contracts (v3.6.1)
  - Locking symfony/uid (v7.4.8)
  - Locking symfony/var-dumper (v7.4.8)
  - Locking theseer/tokenizer (2.0.1)
  - Locking tijsverkoyen/css-to-inline-styles (v2.4.0)
  - Locking vlucas/phpdotenv (v5.6.3)
  - Locking voku/portable-ascii (2.0.3)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 107 installs, 0 updates, 0 removals
  - Downloading symfony/http-foundation (v7.4.8)
  - Downloading symfony/string (v7.4.8)
  - Downloading symfony/console (v7.4.8)
  - Downloading nunomaduro/termwind (v2.4.0)
  - Downloading symfony/css-selector (v7.4.8)
  - Downloading symfony/var-dumper (v7.4.8)
  - Downloading symfony/uid (v7.4.8)
  - Downloading symfony/routing (v7.4.8)
  - Downloading symfony/process (v7.4.8)
  - Downloading symfony/mime (v7.4.8)
  - Downloading symfony/event-dispatcher (v7.4.8)
  - Downloading symfony/mailer (v7.4.8)
  - Downloading symfony/error-handler (v7.4.8)
  - Downloading symfony/http-kernel (v7.4.8)
  - Downloading league/uri-interfaces (7.8.1)
  - Downloading league/uri (7.8.1)
  - Downloading league/flysystem (3.33.0)
  - Downloading laravel/serializable-closure (v2.0.11)
  - Downloading laravel/framework (v13.4.0)
  - Downloading laravel/pail (v1.2.6)
  - Downloading laravel/tinker (v3.0.0)
  - Downloading nunomaduro/collision (v8.9.3)
  - Downloading staabm/side-effects-detector (1.0.5)
  - Downloading sebastian/version (6.0.0)
  - Downloading sebastian/type (6.0.3)
  - Downloading sebastian/recursion-context (7.0.1)
  - Downloading sebastian/object-reflector (5.0.0)
  - Downloading sebastian/object-enumerator (7.0.0)
  - Downloading sebastian/global-state (8.0.2)
  - Downloading sebastian/exporter (7.0.2)
  - Downloading sebastian/environment (8.0.4)
  - Downloading sebastian/diff (7.0.0)
  - Downloading sebastian/comparator (7.1.4)
  - Downloading sebastian/cli-parser (4.2.0)
  - Downloading phpunit/php-timer (8.0.0)
  - Downloading phpunit/php-text-template (5.0.0)
  - Downloading phpunit/php-invoker (6.0.0)
  - Downloading phpunit/php-file-iterator (6.0.1)
  - Downloading theseer/tokenizer (2.0.1)
  - Downloading sebastian/lines-of-code (4.0.0)
  - Downloading sebastian/complexity (5.0.0)
  - Downloading phpunit/php-code-coverage (12.5.3)
  - Downloading phpunit/phpunit (12.5.16)
  - Installing doctrine/inflector (2.1.0): Extracting archive
  - Installing doctrine/lexer (3.0.1): Extracting archive
  - Installing dragonmantank/cron-expression (v3.6.0): Extracting archive
  - Installing symfony/deprecation-contracts (v3.6.0): Extracting archive
  - Installing psr/container (2.0.2): Extracting archive
  - Installing fakerphp/faker (v1.24.1): Extracting archive
  - Installing symfony/polyfill-mbstring (v1.33.0): Extracting archive
  - Installing symfony/http-foundation (v7.4.8): Extracting archive
  - Installing fruitcake/php-cors (v1.4.0): Extracting archive
  - Installing psr/http-message (2.0): Extracting archive
  - Installing psr/http-client (1.0.3): Extracting archive
  - Installing ralouphie/getallheaders (3.0.3): Extracting archive
  - Installing psr/http-factory (1.1.0): Extracting archive
  - Installing guzzlehttp/psr7 (2.9.0): Extracting archive
  - Installing guzzlehttp/promises (2.3.0): Extracting archive
  - Installing guzzlehttp/guzzle (7.10.0): Extracting archive
  - Installing symfony/polyfill-php80 (v1.33.0): Extracting archive
  - Installing guzzlehttp/uri-template (v1.0.5): Extracting archive
  - Installing symfony/polyfill-intl-normalizer (v1.33.0): Extracting archive
  - Installing symfony/polyfill-intl-grapheme (v1.33.0): Extracting archive
  - Installing symfony/polyfill-ctype (v1.33.0): Extracting archive
  - Installing symfony/string (v7.4.8): Extracting archive
  - Installing symfony/service-contracts (v3.6.1): Extracting archive
  - Installing symfony/console (v7.4.8): Extracting archive
  - Installing nunomaduro/termwind (v2.4.0): Extracting archive
  - Installing voku/portable-ascii (2.0.3): Extracting archive
  - Installing phpoption/phpoption (1.9.5): Extracting archive
  - Installing graham-campbell/result-type (v1.1.4): Extracting archive
  - Installing vlucas/phpdotenv (v5.6.3): Extracting archive
  - Installing symfony/css-selector (v7.4.8): Extracting archive
  - Installing tijsverkoyen/css-to-inline-styles (v2.4.0): Extracting archive
  - Installing symfony/var-dumper (v7.4.8): Extracting archive
  - Installing symfony/polyfill-uuid (v1.33.0): Extracting archive
  - Installing symfony/uid (v7.4.8): Extracting archive
  - Installing symfony/routing (v7.4.8): Extracting archive
  - Installing symfony/process (v7.4.8): Extracting archive
  - Installing symfony/polyfill-php85 (v1.33.0): Extracting archive
  - Installing symfony/polyfill-php84 (v1.33.0): Extracting archive
  - Installing symfony/polyfill-intl-idn (v1.33.0): Extracting archive
  - Installing symfony/mime (v7.4.8): Extracting archive
  - Installing psr/event-dispatcher (1.0.0): Extracting archive
  - Installing symfony/event-dispatcher-contracts (v3.6.0): Extracting archive
  - Installing symfony/event-dispatcher (v7.4.8): Extracting archive
  - Installing psr/log (3.0.2): Extracting archive
  - Installing egulias/email-validator (4.0.4): Extracting archive
  - Installing symfony/mailer (v7.4.8): Extracting archive
  - Installing symfony/error-handler (v7.4.8): Extracting archive
  - Installing symfony/http-kernel (v7.4.8): Extracting archive
  - Installing symfony/finder (v7.4.8): Extracting archive
  - Installing ramsey/collection (2.1.1): Extracting archive
  - Installing brick/math (0.14.8): Extracting archive
  - Installing ramsey/uuid (4.9.2): Extracting archive
  - Installing psr/simple-cache (3.0.0): Extracting archive
  - Installing symfony/translation-contracts (v3.6.1): Extracting archive
  - Installing symfony/translation (v7.4.8): Extracting archive
  - Installing symfony/polyfill-php83 (v1.33.0): Extracting archive
  - Installing psr/clock (1.0.0): Extracting archive
  - Installing symfony/clock (v7.4.8): Extracting archive
  - Installing carbonphp/carbon-doctrine-types (3.2.0): Extracting archive
  - Installing nesbot/carbon (3.11.4): Extracting archive
  - Installing monolog/monolog (3.10.0): Extracting archive
  - Installing league/uri-interfaces (7.8.1): Extracting archive
  - Installing league/uri (7.8.1): Extracting archive
  - Installing league/mime-type-detection (1.16.0): Extracting archive
  - Installing league/flysystem-local (3.31.0): Extracting archive
  - Installing league/flysystem (3.33.0): Extracting archive
  - Installing nette/utils (v4.1.3): Extracting archive
  - Installing nette/schema (v1.3.5): Extracting archive
  - Installing dflydev/dot-access-data (v3.0.3): Extracting archive
  - Installing league/config (v1.2.0): Extracting archive
  - Installing league/commonmark (2.8.2): Extracting archive
  - Installing laravel/serializable-closure (v2.0.11): Extracting archive
  - Installing laravel/prompts (v0.3.16): Extracting archive
  - Installing laravel/framework (v13.4.0): Extracting archive
  - Installing laravel/pail (v1.2.6): Extracting archive
  - Installing laravel/pint (v1.29.0): Extracting archive
  - Installing nikic/php-parser (v5.7.0): Extracting archive
  - Installing psy/psysh (v0.12.22): Extracting archive
  - Installing laravel/tinker (v3.0.0): Extracting archive
  - Installing hamcrest/hamcrest-php (v2.1.1): Extracting archive
  - Installing mockery/mockery (1.6.12): Extracting archive
  - Installing filp/whoops (2.18.4): Extracting archive
  - Installing nunomaduro/collision (v8.9.3): Extracting archive
  - Installing staabm/side-effects-detector (1.0.5): Extracting archive
  - Installing sebastian/version (6.0.0): Extracting archive
  - Installing sebastian/type (6.0.3): Extracting archive
  - Installing sebastian/recursion-context (7.0.1): Extracting archive
  - Installing sebastian/object-reflector (5.0.0): Extracting archive
  - Installing sebastian/object-enumerator (7.0.0): Extracting archive
  - Installing sebastian/global-state (8.0.2): Extracting archive
  - Installing sebastian/exporter (7.0.2): Extracting archive
  - Installing sebastian/environment (8.0.4): Extracting archive
  - Installing sebastian/diff (7.0.0): Extracting archive
  - Installing sebastian/comparator (7.1.4): Extracting archive
  - Installing sebastian/cli-parser (4.2.0): Extracting archive
  - Installing phpunit/php-timer (8.0.0): Extracting archive
  - Installing phpunit/php-text-template (5.0.0): Extracting archive
  - Installing phpunit/php-invoker (6.0.0): Extracting archive
  - Installing phpunit/php-file-iterator (6.0.1): Extracting archive
  - Installing theseer/tokenizer (2.0.1): Extracting archive
  - Installing sebastian/lines-of-code (4.0.0): Extracting archive
  - Installing sebastian/complexity (5.0.0): Extracting archive
  - Installing phpunit/php-code-coverage (12.5.3): Extracting archive
  - Installing phar-io/version (3.2.1): Extracting archive
  - Installing phar-io/manifest (2.0.4): Extracting archive
  - Installing myclabs/deep-copy (1.13.4): Extracting archive
  - Installing phpunit/phpunit (12.5.16): Extracting archive
47 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating optimized autoload files
78 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
No security vulnerability advisories found.
&amp;gt; @php -r &quot;file_exists('.env') || copy('.env.example', '.env');&quot;

   INFO  Application key set successfully.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;47&amp;nbsp;package&amp;nbsp;suggestions&amp;nbsp;were&amp;nbsp;added&amp;nbsp;by&amp;nbsp;new&amp;nbsp;dependencies,&amp;nbsp;use&amp;nbsp;`composer&amp;nbsp;suggest`&amp;nbsp;to&amp;nbsp;see&amp;nbsp;details.&lt;br /&gt;Generating&amp;nbsp;optimized&amp;nbsp;autoload&amp;nbsp;files&lt;br /&gt;( 종속성을 검토하여 47개 패키지를 설치했습니다. )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;78&amp;nbsp;packages&amp;nbsp;you&amp;nbsp;are&amp;nbsp;using&amp;nbsp;are&amp;nbsp;looking&amp;nbsp;for&amp;nbsp;funding.&lt;br /&gt;Use&amp;nbsp;the&amp;nbsp;`composer&amp;nbsp;fund`&amp;nbsp;command&amp;nbsp;to&amp;nbsp;find&amp;nbsp;out&amp;nbsp;more!&lt;br /&gt;( 라라벨 78개 패키지가 후원을 기다리고 있다. )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;No&amp;nbsp;security&amp;nbsp;vulnerability&amp;nbsp;advisories&amp;nbsp;found.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;( 보안 취약점 경고가 발견되지 않았습니다. )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;nbsp;@php&amp;nbsp;-r&amp;nbsp;&quot;file_exists('.env')&amp;nbsp;||&amp;nbsp;copy('.env.example',&amp;nbsp;'.env');&quot;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위 명령을 포함해 다양한 방법으로 .env.example 를 복사해 .env 를 만들어 주세요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;70&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4pQ7N/dJMcajobwLV/sUKkMmC7eVjyrNGLK7ZTb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4pQ7N/dJMcajobwLV/sUKkMmC7eVjyrNGLK7ZTb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4pQ7N/dJMcajobwLV/sUKkMmC7eVjyrNGLK7ZTb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4pQ7N%2FdJMcajobwLV%2FsUKkMmC7eVjyrNGLK7ZTb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;608&quot; height=&quot;70&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;70&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;nbsp;@php&amp;nbsp;-r&amp;nbsp;&quot;file_exists('.env')&amp;nbsp;||&amp;nbsp;copy('.env.example',&amp;nbsp;'.env');&quot;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위 명령을 포함해 다양한 방법으로 .env.example 를 복사해 .env 를 만들어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.env&amp;nbsp;&lt;br /&gt;프로젝트에서 환경변수를 모아둡니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;개발환경, 테스트환경, 프로덕트 환경등에서 .env는 달라질수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번 시간에는 자세한 내용 하나하나 보지는 않겠습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bj69yI/dJMcai3TKDo/hGMgXav2MzgvVjnnnPSKIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bj69yI/dJMcai3TKDo/hGMgXav2MzgvVjnnnPSKIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bj69yI/dJMcai3TKDo/hGMgXav2MzgvVjnnnPSKIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbj69yI%2FdJMcai3TKDo%2FhGMgXav2MzgvVjnnnPSKIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;608&quot; height=&quot;125&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만, Laravel 프로젝트 생성을 완료하기 위해서 데이터베이스 설정을 하고 실행하는 것까지 진행하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;63&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lhLi0/dJMcag59e0V/kqU7CIQIQbKfFhKZVlNl21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lhLi0/dJMcag59e0V/kqU7CIQIQbKfFhKZVlNl21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lhLi0/dJMcag59e0V/kqU7CIQIQbKfFhKZVlNl21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlhLi0%2FdJMcag59e0V%2FkqU7CIQIQbKfFhKZVlNl21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;608&quot; height=&quot;63&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;63&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 디비설정&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1775573506942&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DB_CONNECTION=sqlite
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=laravel
# DB_USERNAME=root
# DB_PASSWORD=&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부분을 아래 처럼 변경합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1775572623666&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=sample
DB_USERNAME=sample
DB_PASSWORD=&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에서 .env 를 수정한 뒤에 Yes를 선택하고 엔터를 누른다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1cYhm/dJMcadBu1yU/rsjpItI0KkZqMxN1kpOglK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1cYhm/dJMcadBu1yU/rsjpItI0KkZqMxN1kpOglK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1cYhm/dJMcadBu1yU/rsjpItI0KkZqMxN1kpOglK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1cYhm%2FdJMcadBu1yU%2FrsjpItI0KkZqMxN1kpOglK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;608&quot; height=&quot;64&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. Migrate 실행&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1775572270234&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  Creating migration table ............................................ 24.69ms DONE

   INFO  Running migrations.

  0001_01_01_000000_create_users_table ................................ 59.01ms DONE
  0001_01_01_000001_create_cache_table ................................ 17.01ms DONE
  0001_01_01_000002_create_jobs_table ................................. 20.75ms DONE&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB 확인해 본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 기타&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;67&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOlbzU/dJMcafzpzFk/MK77QFGSt4hk4kGgqeFbr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOlbzU/dJMcafzpzFk/MK77QFGSt4hk4kGgqeFbr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOlbzU/dJMcafzpzFk/MK77QFGSt4hk4kGgqeFbr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOlbzU%2FdJMcafzpzFk%2FMK77QFGSt4hk4kGgqeFbr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;595&quot; height=&quot;67&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;67&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;153&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0dRMO/dJMcahjIdlj/sTRRAWDpYlkLty5qL4QY7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0dRMO/dJMcahjIdlj/sTRRAWDpYlkLty5qL4QY7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0dRMO/dJMcahjIdlj/sTRRAWDpYlkLty5qL4QY7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0dRMO%2FdJMcahjIdlj%2FsTRRAWDpYlkLty5qL4QY7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;595&quot; height=&quot;153&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;153&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. 폴더구조확인&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 폴더를 확인하지는 않습니다. 다만 중요한 폴더를 살펴봅시다.&lt;/p&gt;
&lt;pre id=&quot;code_1775576372838&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sample/
 ├── app/
 ├── routes/
 ├── resources/
 ├── public/
 ├── artisan
 └── composer.json&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6. 실행&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;라라벨은 개발용 웹서버를 지원합니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775572128275&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; cd sample

&amp;gt; php artisan serve                                

INFO  Server running on [http://127.0.0.1:8000].

Press Ctrl+C to stop the server&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저로 확인해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://127.0.0.1:8000&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1007&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tiTXt/dJMcagZl8Aw/tAPGtkcX4zoE0KNpwYrnd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tiTXt/dJMcagZl8Aw/tAPGtkcX4zoE0KNpwYrnd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tiTXt/dJMcagZl8Aw/tAPGtkcX4zoE0KNpwYrnd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtiTXt%2FdJMcagZl8Aw%2FtAPGtkcX4zoE0KNpwYrnd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1007&quot; height=&quot;493&quot; data-origin-width=&quot;1007&quot; data-origin-height=&quot;493&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1007&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1n3dY/dJMcacWXxjC/LXaWe3NjXOcbPNq4ywEn4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1n3dY/dJMcacWXxjC/LXaWe3NjXOcbPNq4ywEn4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1n3dY/dJMcacWXxjC/LXaWe3NjXOcbPNq4ywEn4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1n3dY%2FdJMcacWXxjC%2FLXaWe3NjXOcbPNq4ywEn4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1007&quot; height=&quot;493&quot; data-origin-width=&quot;1007&quot; data-origin-height=&quot;493&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 프로젝트를 실행할때&amp;nbsp; &amp;nbsp; http://127.0.0.1:8001&amp;nbsp; , http://127.0.0.1:8002&amp;nbsp; 실행확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7. 기타 설치방법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 특정환경에서는 불가능 ( 저도 안되요.. mac )&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775576817675&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;laravel new myapp --version=10.*

or 

laravel new myapp --version=10.0

## 특정환경에서는 작동안함.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 이방법을 사용하기로 합시다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775576849803&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 특정버젼 설치
composer create-project laravel/laravel myapp &quot;10.3.0&quot;

# * 를 사용하여 해당 이하 최종버젼
composer create-project laravel/laravel myapp &quot;12.*&quot;
composer create-project laravel/laravel myapp &quot;11.*&quot;
composer create-project laravel/laravel myapp &quot;10.*&quot;
composer create-project laravel/laravel myapp &quot;9.*&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 위 방법은 설치만 진행하므로&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;composer 를 이용해 설치하기&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;.env db 설정&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;DB 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8. 간단한 페이지를 추가&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step 0. welcome 페이지 확인&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgcSAz/dJMcad2BcDL/YgyHFoe7ZLEvf0Ik8KYWwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgcSAz/dJMcad2BcDL/YgyHFoe7ZLEvf0Ik8KYWwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgcSAz/dJMcad2BcDL/YgyHFoe7ZLEvf0Ik8KYWwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgcSAz%2FdJMcad2BcDL%2FYgyHFoe7ZLEvf0Ik8KYWwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;842&quot; height=&quot;472&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Step 1. Routing 테스트&lt;/p&gt;
&lt;pre id=&quot;code_1775577575849&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Route::get('/', function () {
    return &quot;Hello Teddy!&quot;;
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;접속확인 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;http://127.0.0.1:8000&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Step 2. View 에 연결하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;resources/views/hello.blade.php&lt;/p&gt;
&lt;pre id=&quot;code_1775577448659&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Hello&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;Hello Hokma Academy!&amp;lt;/h1&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;routes/web.php&lt;/p&gt;
&lt;pre id=&quot;code_1775577678309&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Route::get('/hello', function () {
    return view('hello');
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;http://localhost:8000/hello&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coyxHq/dJMcaaY9lCA/k4BtE1vxwuv0zfhqQsKCPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coyxHq/dJMcaaY9lCA/k4BtE1vxwuv0zfhqQsKCPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coyxHq/dJMcaaY9lCA/k4BtE1vxwuv0zfhqQsKCPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoyxHq%2FdJMcaaY9lCA%2Fk4BtE1vxwuv0zfhqQsKCPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1024&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 만약 시간이 남는다면 아래와 같은 디렉토리 구조를 prefix 를 이용해 구성해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/aboutus&lt;br /&gt;/aboutus/team&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;/aboutus/history&lt;/p&gt;
&lt;pre id=&quot;code_1775618602222&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Route::prefix('aboutus')-&amp;gt;group(function () {

    Route::get('/', function () {
        return view('aboutus.index');
    });

    Route::get('/team', function () {
        return view('aboutus.team');
    });

    Route::get('/history', function () {
        return view('aboutus.history');
    });

});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;ldquo;URL 구조는 파일이 아니라 Route가 만든다&amp;rdquo;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;과제&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 다음페이지들을 만들고 라우트를 연결해주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/aboutus&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/services&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/reservation&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/contactus&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;다음시간&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Routing &amp;amp; Controller&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;WampServer&amp;nbsp; 를 이용하여 라라벨프로젝트 사용하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;root Dir 을&amp;nbsp; public&amp;nbsp; 으로 설정해주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;구조둘러보기&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;405&quot; data-origin-height=&quot;905&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kn1EG/dJMcagkMUZ9/kcllQZKGkKc3MUy1HBblt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kn1EG/dJMcagkMUZ9/kcllQZKGkKc3MUy1HBblt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kn1EG/dJMcagkMUZ9/kcllQZKGkKc3MUy1HBblt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKn1EG%2FdJMcagkMUZ9%2FkcllQZKGkKc3MUy1HBblt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;405&quot; height=&quot;905&quot; data-origin-width=&quot;405&quot; data-origin-height=&quot;905&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Artisan&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Artisan은 Laravel을 명령어로 제어하는 도구 (CLI 도구)이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;artisan 은 다양한 명령을 가지고 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1775794224152&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;398&quot; data-start=&quot;383&quot; data-section-id=&quot;61xf20&quot;&gt;Controller 생성&lt;/li&gt;
&lt;li data-end=&quot;409&quot; data-start=&quot;399&quot; data-section-id=&quot;njz1yj&quot;&gt;Model 생성&lt;/li&gt;
&lt;li data-end=&quot;421&quot; data-start=&quot;410&quot; data-section-id=&quot;ximwxa&quot;&gt;DB 마이그레이션&lt;/li&gt;
&lt;li data-end=&quot;429&quot; data-start=&quot;422&quot; data-section-id=&quot;u9jxbx&quot;&gt;서버 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1775794410565&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 컨트롤러 생성
php artisan make:controller StudentController

# 모델생성
php artisan make:model Student

# 마이그래이션 생성
php artisan make:migration create_students_table


# 한번에 모든걸 생성
php artisan make:model Teacher -mcr


# 서버실행
php artisan serve&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-section-id=&quot;61xf20&quot; data-start=&quot;383&quot; data-end=&quot;398&quot;&gt;커멘드를 만들고 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하자면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Artisan = Laravel CLI 도구&lt;br /&gt;코드 생성 자동화&lt;br /&gt;개발 속도 핵심 요소&lt;br /&gt;직접 명령어도 만들 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Hokma School :: Course 2 Laravel</category>
      <author>테디아저씨</author>
      <guid isPermaLink="true">https://teddystudyroom.tistory.com/42</guid>
      <comments>https://teddystudyroom.tistory.com/42#entry42comment</comments>
      <pubDate>Wed, 8 Apr 2026 01:16:52 +0900</pubDate>
    </item>
  </channel>
</rss>