<?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>Tue, 30 Jun 2026 05:00:29 +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 11. API Token Authentication</title>
      <link>https://teddystudyroom.tistory.com/54</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Gemini_Generated_Image_nhgx3rnhgx3rnhgx.png&quot; data-origin-width=&quot;1377&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n2YCz/dJMcagS41uN/3tcmuFEZOQB8hmvvSrdDW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n2YCz/dJMcagS41uN/3tcmuFEZOQB8hmvvSrdDW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n2YCz/dJMcagS41uN/3tcmuFEZOQB8hmvvSrdDW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn2YCz%2FdJMcagS41uN%2F3tcmuFEZOQB8hmvvSrdDW1%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;1377&quot; height=&quot;768&quot; data-filename=&quot;Gemini_Generated_Image_nhgx3rnhgx3rnhgx.png&quot; data-origin-width=&quot;1377&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;WEB 브라우저 로그인&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span&gt;&amp;rarr; Session 저장&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;rarr; 로그인 유지&lt;/span&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;&lt;span&gt;모바일앱 / 외부API&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Flutter&lt;/span&gt;&lt;br /&gt;&lt;span&gt;React Native&lt;/span&gt;&lt;br /&gt;&lt;span&gt;외부 서비스&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;rarr; Token 인증&lt;/p&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;table style=&quot;border-collapse: collapse; width: 100%; height: 96px;&quot; border=&quot;1&quot; data-end=&quot;608&quot; data-start=&quot;496&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;Session&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;Token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot; data-end=&quot;559&quot; data-start=&quot;537&quot;&gt;
&lt;td style=&quot;height: 20px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;547&quot; data-start=&quot;537&quot;&gt;브라우저 중심&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot; data-end=&quot;559&quot; data-start=&quot;547&quot; data-col-size=&quot;sm&quot;&gt;앱/API 중심&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;쿠키 사용&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;Token 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot; data-end=&quot;580&quot; data-start=&quot;560&quot;&gt;
&lt;td style=&quot;height: 20px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;568&quot; data-start=&quot;560&quot;&gt;서버 상태 저장&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot; data-end=&quot;580&quot; data-start=&quot;568&quot; data-col-size=&quot;sm&quot;&gt;Stateless 가능&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Gemini_Generated_Image_ovo5zmovo5zmovo5.png&quot; data-origin-width=&quot;1377&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d1NqGH/dJMcagldd6R/7KKDV5CmslGtuknsL5Xew0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d1NqGH/dJMcagldd6R/7KKDV5CmslGtuknsL5Xew0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d1NqGH/dJMcagldd6R/7KKDV5CmslGtuknsL5Xew0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd1NqGH%2FdJMcagldd6R%2F7KKDV5CmslGtuknsL5Xew0%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;1377&quot; height=&quot;768&quot; data-filename=&quot;Gemini_Generated_Image_ovo5zmovo5zmovo5.png&quot; data-origin-width=&quot;1377&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;h1 data-end=&quot;723&quot; data-start=&quot;699&quot; data-section-id=&quot;15a7nx7&quot;&gt;Laravel Sanctum&amp;nbsp;&lt;/h1&gt;
&lt;p data-end=&quot;786&quot; data-start=&quot;725&quot; data-ke-size=&quot;size16&quot;&gt;Laravel 공식 API 인증 패키지&lt;br /&gt;&lt;span&gt;&lt;span&gt;Laravel Sanctum&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;install package&lt;/p&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;composer require laravel/sanctum&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;migration to my project&lt;/p&gt;
&lt;pre id=&quot;code_1779200002110&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan vendor:publish --tag=sanctum-migrations

// old version
// php artisan vendor:publish --provider=&quot;Laravel\Sanctum\SanctumServiceProvider&quot;&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_1778847274120&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Client&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;client 접근을 허용하기 위해서 도메인을 가져야 합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;vscode 의 extenstion&amp;nbsp; &amp;nbsp;[ Live Server ] 를 사용하겠습니다.&lt;/b&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;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Install Extension&amp;nbsp; &quot;Live Server&quot;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1181&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdCcMZ/dJMcaicmHHb/KliW2SNYaOXYYIXWcr60qK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdCcMZ/dJMcaicmHHb/KliW2SNYaOXYYIXWcr60qK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdCcMZ/dJMcaicmHHb/KliW2SNYaOXYYIXWcr60qK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdCcMZ%2FdJMcaicmHHb%2FKliW2SNYaOXYYIXWcr60qK%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;1181&quot; height=&quot;604&quot; data-origin-width=&quot;1181&quot; data-origin-height=&quot;604&quot;/&gt;&lt;/span&gt;&lt;/figure&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Start Live Server&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nX0Zz/dJMcacb6B8j/ezrI288HKFaLWhFzsV8cy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nX0Zz/dJMcacb6B8j/ezrI288HKFaLWhFzsV8cy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nX0Zz/dJMcacb6B8j/ezrI288HKFaLWhFzsV8cy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnX0Zz%2FdJMcacb6B8j%2FezrI288HKFaLWhFzsV8cy0%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;385&quot; height=&quot;88&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;New window &amp;amp;&amp;amp; Open New Folder&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;login.html&lt;/p&gt;
&lt;pre id=&quot;code_1779200769382&quot; class=&quot;bash&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;!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;h1 class=&quot;text-center mb-4&quot;&amp;gt;Login&amp;lt;/h1&amp;gt;
        &amp;lt;form method=&quot;post&quot; id=&quot;loginForm&quot; action=&quot;&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;div id=&quot;response_message&quot;&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;mt-3&quot;&amp;gt;  
                &amp;lt;button type=&quot;button&quot; onclick=&quot;login()&quot; class=&quot;btn btn-primary&quot;&amp;gt;Submit&amp;lt;/button&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/form&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;
        function login() {
            var box = document.getElementById('response_message');
            box.textContent = '';

            fetch('http://127.0.0.1:8000/api/login', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                    'Accept': 'application/json',
                },
                body: JSON.stringify({
                    email: document.getElementById('email').value,
                    password: document.getElementById('password').value,
                }),
            })
            .then(function (response) {
                console.log(response);
                return response.json().then(function (data) {
                    console.log(data);
                    if( response.ok ) {
                        box.className = 'mt-3 text-success';
                        box.textContent = '요청 성공';
                        localStorage.setItem('token', data.token);
                        localStorage.setItem('userName', data.user.name);
                        location.href = '/dashboard.html';
                    } else {
                        box.className = 'mt-3 text-danger';
                        if (data.errors) {
                            Object.values(data.errors).flat().forEach(function (message) {
                                box.textContent += message + '\n';
                            });
                        } else {
                            box.textContent = data.message || '요청 실패';
                        }
                    }
                });
            })
            .catch(function () {
                box.className = 'mt-3 text-danger';
                box.textContent = '요청 실패2';
            });
        }
    &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 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;http://127.0.0.1:5500/login.html&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;507&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkDpMX/dJMcacXsOiH/UDCzFaONRYel1Ak5ryA861/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkDpMX/dJMcacXsOiH/UDCzFaONRYel1Ak5ryA861/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkDpMX/dJMcacXsOiH/UDCzFaONRYel1Ak5ryA861/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkDpMX%2FdJMcacXsOiH%2FUDCzFaONRYel1Ak5ryA861%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;507&quot; height=&quot;376&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;/figure&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 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;&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;br /&gt;routes/api.php&lt;/p&gt;
&lt;pre id=&quot;code_1779200411552&quot; class=&quot;php&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\Api\AuthController;

Route::post('/login', [AuthController::class, 'login'])-&amp;gt;name('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;User Model&lt;/p&gt;
&lt;pre id=&quot;code_1778847617536&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use Laravel\Sanctum\HasApiTokens;


#[Fillable(['name', 'email', 'password'])]
#[Hidden(['password', 'remember_token'])]


class User extends Authenticatable
{
    use HasApiTokens;
}&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;make controller for login&lt;/p&gt;
&lt;pre id=&quot;code_1779246339267&quot; class=&quot;gauss&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/AuthController&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/Controllers/Api/AuthController.php&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1778847706578&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 Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;

class AuthController extends Controller
{

    public function login(Request $request)
    {
        $validator = Validator::make($request-&amp;gt;all(), [
            'email' =&amp;gt; 'required|email',
            'password' =&amp;gt; 'required',
        ],[
            'email.required' =&amp;gt; 'email required!',
            'email.email' =&amp;gt; 'email format is not valid!',
            'password.required' =&amp;gt; 'password required!',
        ]);

        if ($validator-&amp;gt;fails()) {
            return response()-&amp;gt;json([
                'message' =&amp;gt; 'validation failed!',
                'errors' =&amp;gt; $validator-&amp;gt;errors(),
            ], 422);
        }

        // 로그인 검사
        if (!Auth::attempt([
            'email' =&amp;gt; $request-&amp;gt;email,
            'password' =&amp;gt; $request-&amp;gt;password
        ])) {

            return response()-&amp;gt;json([
                'message' =&amp;gt; '로그인 실패'
            ], 401);
        }

        // 로그인 성공 사용자
        $user = Auth::user();

        // 토큰 생성
        $token = $user-&amp;gt;createToken('api-token')-&amp;gt;plainTextToken;

        // 응답
        return response()-&amp;gt;json([
            'token' =&amp;gt; $token,
            '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;config/cors.php&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1779200236134&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

return [
    'paths' =&amp;gt; ['api/*', 'sanctum/csrf-cookie'],
    'allowed_methods' =&amp;gt; ['*'],
    'allowed_origins' =&amp;gt; [
        'http://127.0.0.1:8001',
    ],
    'allowed_origins_patterns' =&amp;gt; [],
    'allowed_headers' =&amp;gt; ['*'],
    'exposed_headers' =&amp;gt; [],
    'max_age' =&amp;gt; 0,
    'supports_credentials' =&amp;gt; true,
];&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;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;3044&quot; data-start=&quot;2757&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-is-last-node=&quot;&quot; data-end=&quot;3044&quot; data-start=&quot;2779&quot;&gt;
&lt;tr data-end=&quot;2802&quot; data-start=&quot;2779&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2787&quot; data-start=&quot;2779&quot;&gt;paths&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2802&quot; data-start=&quot;2787&quot;&gt;CORS 적용 URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2839&quot; data-start=&quot;2803&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2821&quot; data-start=&quot;2803&quot;&gt;allowed_methods&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2839&quot; data-start=&quot;2821&quot;&gt;허용 HTTP Method&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2871&quot; data-start=&quot;2840&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2858&quot; data-start=&quot;2840&quot;&gt;allowed_origins&lt;/td&gt;
&lt;td data-end=&quot;2871&quot; data-start=&quot;2858&quot; data-col-size=&quot;sm&quot;&gt;허용 프론트 주소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2909&quot; data-start=&quot;2872&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2899&quot; data-start=&quot;2872&quot;&gt;allowed_origins_patterns&lt;/td&gt;
&lt;td data-end=&quot;2909&quot; data-start=&quot;2899&quot; data-col-size=&quot;sm&quot;&gt;정규식 허용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2940&quot; data-start=&quot;2910&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2928&quot; data-start=&quot;2910&quot;&gt;allowed_headers&lt;/td&gt;
&lt;td data-end=&quot;2940&quot; data-start=&quot;2928&quot; data-col-size=&quot;sm&quot;&gt;허용 요청 헤더&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2977&quot; data-start=&quot;2941&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2959&quot; data-start=&quot;2941&quot;&gt;exposed_headers&lt;/td&gt;
&lt;td data-end=&quot;2977&quot; data-start=&quot;2959&quot; data-col-size=&quot;sm&quot;&gt;JS 에 노출할 응답 헤더&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3005&quot; data-start=&quot;2978&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2988&quot; data-start=&quot;2978&quot;&gt;max_age&lt;/td&gt;
&lt;td data-end=&quot;3005&quot; data-start=&quot;2988&quot; data-col-size=&quot;sm&quot;&gt;OPTIONS 캐시 시간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-is-last-node=&quot;&quot; data-end=&quot;3044&quot; data-start=&quot;3006&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3029&quot; data-start=&quot;3006&quot;&gt;supports_credentials&lt;/td&gt;
&lt;td data-is-last-node=&quot;&quot; data-end=&quot;3044&quot; data-start=&quot;3029&quot; data-col-size=&quot;sm&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;response&lt;/p&gt;
&lt;pre id=&quot;code_1778847740678&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;token&quot;: &quot;1|asdasdasd...&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;LocalStorage&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 브라우저에 데이터를 저장하는 웹 저장소(Web Storage) 기능입니다.&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;3. 숫자, 객체도 문자열로 변환하여 저장하고, 꺼내서 변환해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1779245318484&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// save
localStorage.setItem('{key}', '{value}');

// load
const keyName = localStorage.getItem('{key}');

// delete
localStorage.removeItem('{key}');

// delete all  :: 도메인별로 구분된다. ( 127.0.0.1:8000, 127.0.0.1:8001 서로 읽거나 쓰지 못함.)
localStorage.clear();



// Object


const user = {
  name: 'teddy',
  age: 20
};

localStorage.setItem('user', JSON.stringify(user));

const user = JSON.parse(localStorage.getItem('user'));&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;로컬스토리지에 토큰저장&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;save token to local storage ( javascript )&lt;/p&gt;
&lt;pre id=&quot;code_1778849460573&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;localStorage.setItem('token', data.token);
localStorage.setItem('userName', data.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;&lt;b&gt;Client Server&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dashboard.html&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1779202604346&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;h1 class=&quot;text-center mb-4&quot;&amp;gt;Dashboard&amp;lt;/h1&amp;gt;
        &amp;lt;p class=&quot;text-center mb-4&quot;&amp;gt;Welcome, &amp;lt;span id=&quot;userName&quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;
        &amp;lt;button type=&quot;button&quot; onclick=&quot;logout()&quot; class=&quot;btn btn-primary&quot;&amp;gt;Logout&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;script&amp;gt;

        var token = localStorage.getItem('token');

        if( token ) {
            var userName = localStorage.getItem('userName');
            document.getElementById('userName').textContent = userName;
        } else {
            location.href = '/login.html';
        }
        
        function logout() {
            localStorage.removeItem('token');
            localStorage.removeItem('userName');
            location.href = '/login.html';
        }

    &amp;lt;/script&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;http://127.0.0.1:5500/login.html&lt;/p&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;use local storage token&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778849559040&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const token = localStorage.getItem('token');
const userName = localStorage.getItem('userName');&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_1778849595335&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fetch('/api/profile', {
 headers:{
   Authorization:`Bearer ${token}`
 }
})&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;* Bearer 는 Oath2.0 에서 자주 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Sanctum 이나 JWT 등도 &quot;Bearer&quot; 를 사용합니다.&lt;/p&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;delete Token&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1778849718533&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
    function logout() {
        localStorage.removeItem('token');
        localStorage.removeItem('userName');
        location.href = '/login';
    }
&amp;lt;/script&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;Token 으로 사용자 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dashboard.html&lt;/p&gt;
&lt;pre id=&quot;code_1779227755006&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;button type=&quot;button&quot; onclick=&quot;getProfile()&quot; class=&quot;btn btn-primary&quot; data-bs-toggle=&quot;offcanvas&quot; data-bs-target=&quot;#staticBackdrop&quot; aria-controls=&quot;staticBackdrop&quot;&amp;gt;MyProfile&amp;lt;/button&amp;gt;





&amp;lt;div class=&quot;offcanvas offcanvas-start&quot; data-bs-backdrop=&quot;static&quot; tabindex=&quot;-1&quot; id=&quot;staticBackdrop&quot; aria-labelledby=&quot;staticBackdropLabel&quot;&amp;gt;
&amp;lt;div class=&quot;offcanvas-header&quot;&amp;gt;
  &amp;lt;h5 class=&quot;offcanvas-title&quot; id=&quot;staticBackdropLabel&quot;&amp;gt;My Profile&amp;lt;/h5&amp;gt;
  &amp;lt;button type=&quot;button&quot; class=&quot;btn-close&quot; data-bs-dismiss=&quot;offcanvas&quot; aria-label=&quot;Close&quot;&amp;gt;&amp;lt;/button&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;offcanvas-body&quot;&amp;gt;
  &amp;lt;div&amp;gt;
        &amp;lt;p&amp;gt;Name: &amp;lt;span id=&quot;profileName&quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt;Email: &amp;lt;span id=&quot;profileEmail&quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt;&amp;lt;span id=&quot;profilePhoto&quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;


&amp;lt;script&amp;gt;
// add script
function getProfile() {
    fetch('http://127.0.0.1:8000/api/profile', {
        method: 'GET',
        headers: {
            'Content-Type': 'application/json',
            'Accept': 'application/json',
            'Authorization': 'Bearer ' + token,
        },
    })
    .then(function (response) {
        console.log(response);
        return response.json().then(function (data) {
            document.getElementById('profileName').textContent = data.name;
            document.getElementById('profileEmail').textContent = data.email;
            document.getElementById('profilePhoto').innerHTML = '&amp;lt;img src=&quot;' + data.photo + '&quot; width=&quot;150&quot; alt=&quot;Profile Photo&quot;&amp;gt;';
            console.log(data);
        });
    })
    .catch(function (error) {
        console.log(error);
    });
}

&amp;lt;/script&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/AuthController.php&lt;/p&gt;
&lt;pre id=&quot;code_1779230479240&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public function profile(Request $request)
{

    $user = Auth::user();

    $profile = [
        'id' =&amp;gt; $user-&amp;gt;id,
        'name' =&amp;gt; $user-&amp;gt;name,
        'email' =&amp;gt; $user-&amp;gt;email,
        'photo' =&amp;gt; $user-&amp;gt;photo,
    ];

    if( isset($profile['photo']) &amp;amp;&amp;amp; $profile['photo'] != null){
        $profile['photo'] = url('storage/' . $profile['photo']);
    } else {
        $profile['photo'] = null;
    }

    return response()-&amp;gt;json($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;routes/api.php&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;// 비교확인할것.&lt;/p&gt;
&lt;pre id=&quot;code_1779229627610&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Route::get('/profile', [AuthController::class, 'profile'])-&amp;gt;name('profile');



// auto Make Auth
Route::middleware('auth:sanctum')-&amp;gt;group(function () {
    Route::get('/profile', [AuthController::class, 'profile'])-&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;&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;or&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에서도 revoke 가능&lt;/p&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&lt;/p&gt;
&lt;pre id=&quot;code_1778847781922&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Route::middleware('auth:sanctum')-&amp;gt;group(function () {
    Route::get('/profile', function (Request $request) {
        return $request-&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;JWT ( Other Token Package )&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1247&quot; data-start=&quot;1237&quot; data-section-id=&quot;19ei68p&quot;&gt;여러 서버 연동&lt;/li&gt;
&lt;li data-end=&quot;1257&quot; data-start=&quot;1248&quot; data-section-id=&quot;1e3k7yw&quot;&gt;마이크로서비스&lt;/li&gt;
&lt;li data-end=&quot;1270&quot; data-start=&quot;1258&quot; data-section-id=&quot;990ir8&quot;&gt;외부 파트너 API&lt;/li&gt;
&lt;li data-end=&quot;1279&quot; data-start=&quot;1271&quot; data-section-id=&quot;5ejxcr&quot;&gt;SSO 구조&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Sanctum&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토큰 &amp;rarr; 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;&lt;b&gt;JWT&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;토큰 자체에 정보 포함&lt;/span&gt;&lt;br /&gt;&lt;span&gt;DB 조회 없이 검증 가능&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&gt;비유하자면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Sanctum &lt;/b&gt;출입증 번호&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;JWT &lt;/b&gt;출입증 자체에 정보 내장&lt;/p&gt;
&lt;div style=&quot;background-color: #121314; color: #bbbebf;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;doctype&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;utf-8&quot;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;viewport&quot;&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;content&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;width=device-width, initial-scale=1&quot;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;Bootstrap demo&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;link&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;href&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;&lt;a href=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css&quot;&gt;https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css&lt;/a&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;rel&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;stylesheet&quot;&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;integrity&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;sha384-sRIl4kxILFvY47J16cr9ZwB07vP4J8+LH7qKQnuqkuIAvNWLzeN8tE5YBujZqJLB&quot;&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;crossorigin&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;anonymous&quot;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;container mt-5 col-lg-3 col-md-4 col-sm-12 mx-auto&quot;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;text-center mb-4&quot;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;Login&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;form&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;method&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;post&quot;&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;loginForm&quot;&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;action&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;autocomplete&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;off&quot;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;mb-3&quot;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;email&quot;&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;form-label&quot;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;Email&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;email&quot;&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;form-control&quot;&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;email&quot;&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;email&quot;&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;aria-describedby&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;emailHelp&quot;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;mb-3&quot;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;form-label&quot;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;Password&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;form-control&quot;&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;password&quot;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;response_message&quot;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;mt-3&quot;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;button&quot;&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;onclick&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #d2a8ff;&quot;&gt;login&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;()&quot;&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;btn btn-primary&quot;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt;Submit&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;form&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;src&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;&lt;a href=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js&quot;&gt;https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js&lt;/a&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;integrity&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI&quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;crossorigin&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;&quot;anonymous&quot;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ff7b72;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d2a8ff;&quot;&gt;login&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ff7b72;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;box&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #79c0ff;&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #d2a8ff;&quot;&gt;getElementById&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;'response_message'&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;box&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #79c0ff;&quot;&gt;textContent&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;''&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;fetch&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;'http://127.0.0.1:8000/api/login'&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;, {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;method&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;'POST'&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;headers&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;'Content-Type'&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;'application/json'&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;'Accept'&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;'application/json'&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; },&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #79c0ff;&quot;&gt;JSON&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #d2a8ff;&quot;&gt;stringify&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;({&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;email&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #79c0ff;&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #d2a8ff;&quot;&gt;getElementById&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;'email'&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;).value,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;password&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #79c0ff;&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #d2a8ff;&quot;&gt;getElementById&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;'password'&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;).value,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; }),&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; })&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; .&lt;/span&gt;&lt;span style=&quot;color: #d2a8ff;&quot;&gt;then&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ff7b72;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #ffa657;&quot;&gt;response&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #79c0ff;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #d2a8ff;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffa657;&quot;&gt;response&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffa657;&quot;&gt;response&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #d2a8ff;&quot;&gt;json&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color: #d2a8ff;&quot;&gt;then&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ff7b72;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #ffa657;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #79c0ff;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #d2a8ff;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffa657;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;( &lt;/span&gt;&lt;span style=&quot;color: #ffa657;&quot;&gt;response&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #79c0ff;&quot;&gt;ok&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; ) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;box&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #79c0ff;&quot;&gt;className&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;'mt-3 text-success'&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;box&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #79c0ff;&quot;&gt;textContent&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;'요청 성공'&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #8b949e;&quot;&gt;//localStorage.setItem('token', data.token);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #8b949e;&quot;&gt;//localStorage.setItem('userName', data.user.name);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #8b949e;&quot;&gt;//location.href = '/dashboard.html';&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;box&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #79c0ff;&quot;&gt;className&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;'mt-3 text-danger'&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #ffa657;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;.errors) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Object&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #d2a8ff;&quot;&gt;values&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffa657;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;.errors).&lt;/span&gt;&lt;span style=&quot;color: #d2a8ff;&quot;&gt;flat&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color: #d2a8ff;&quot;&gt;forEach&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ff7b72;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #ffa657;&quot;&gt;message&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;box&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #79c0ff;&quot;&gt;textContent&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffa657;&quot;&gt;message&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #d7ba7d;&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; });&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;box&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #79c0ff;&quot;&gt;textContent&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffa657;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;.message &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;'요청 실패'&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; });&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; })&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; .&lt;/span&gt;&lt;span style=&quot;color: #d2a8ff;&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ff7b72;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; () {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;box&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #79c0ff;&quot;&gt;className&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;'mt-3 text-danger'&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;box&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #79c0ff;&quot;&gt;textContent&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a5d6ff;&quot;&gt;'요청 실패2'&lt;/span&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; });&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c9d1d9;&quot;&gt; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #bbbebf;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #7ee787;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Hokma School :: Course 2 Laravel</category>
      <category>보</category>
      <author>테디아저씨</author>
      <guid isPermaLink="true">https://teddystudyroom.tistory.com/54</guid>
      <comments>https://teddystudyroom.tistory.com/54#entry54comment</comments>
      <pubDate>Fri, 15 May 2026 21:04:10 +0900</pubDate>
    </item>
    <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;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&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;브라우저요청 =&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_1779024841478&quot; class=&quot;php&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;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 style=&quot;color: #000000;&quot; 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_1779024841479&quot; class=&quot;&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&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 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000;&quot; 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-ke-list-type=&quot;disc&quot; data-start=&quot;627&quot; data-end=&quot;664&quot;&gt;
&lt;li data-section-id=&quot;e8zvsp&quot; data-start=&quot;627&quot; data-end=&quot;634&quot;&gt;모바일 앱&lt;/li&gt;
&lt;li data-section-id=&quot;1scggdw&quot; data-start=&quot;635&quot; data-end=&quot;652&quot;&gt;React/Vue 프론트엔드&lt;/li&gt;
&lt;li data-section-id=&quot;1erba11&quot; data-start=&quot;653&quot; data-end=&quot;664&quot;&gt;외부 서비스 연동&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1779024841479&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;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_1779024841480&quot; class=&quot;&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;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_1779024841480&quot; class=&quot;less&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;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_1779024841480&quot; class=&quot;less&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;gt;withRouting(
    web: __DIR__.'/../routes/web.php',
    api: __DIR__.'/../routes/api.php',      // add this line
    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;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;간단한 예시&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;주소데이터를 API로&amp;nbsp; 보내주기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일&amp;nbsp;&lt;/b&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;&lt;b&gt;database/seeders/seederData/&lt;/b&gt;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;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;&lt;b&gt;Migration 수정&lt;/b&gt;&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;&lt;b&gt;make table&lt;/b&gt;&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;app/Models/Address.php&lt;/p&gt;
&lt;pre id=&quot;code_1778842459555&quot; class=&quot;scala&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\Models;

use Illuminate\Database\Eloquent\Model;

class Address extends Model
{
    //
    protected $fillable = [
        'id',
        'wikiDataId', 
        'type', 
        'city', 
        'name', 
        'country', 
        'countryCode', 
        'region', 
        'regionCode', 
        'regionWdId', 
        'latitude', 
        'longitude', 
        'population'];
   
}&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;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;make seeder&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;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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;API 만들기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;routes/api.php&lt;/p&gt;
&lt;pre id=&quot;code_1778842654515&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\AddressController;

Route::get('/address', [AddressController::class, 'index'])-&amp;gt;name('address.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;make Controller&lt;/p&gt;
&lt;pre id=&quot;code_1778842815551&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 AddressController&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/Controllers/AddressController.php&lt;/p&gt;
&lt;pre id=&quot;code_1778842717738&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 App\Models\Address;

class AddressController extends Controller
{
    //
    public function index(request $request)
    {
        $addresses = Address::all();
        return response()-&amp;gt;json($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;http://127.0.0.1:8000/api/address&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Zposj/dJMcacpB1PJ/49gXIayH9nU96RVmkVx6g0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Zposj/dJMcacpB1PJ/49gXIayH9nU96RVmkVx6g0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Zposj/dJMcacpB1PJ/49gXIayH9nU96RVmkVx6g0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZposj%2FdJMcacpB1PJ%2F49gXIayH9nU96RVmkVx6g0%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;546&quot; height=&quot;606&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;606&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;정상적으로 json 데이를 확인할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;API CRUD&lt;/b&gt;&lt;/h3&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;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;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;?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;nullable()-&amp;gt;constrained('users')-&amp;gt;nullOnDelete();
            $table-&amp;gt;string('name', 100)-&amp;gt;nullable()-&amp;gt;comment('name');
            $table-&amp;gt;string('email', 100)-&amp;gt;nullable()-&amp;gt;comment('email');
            $table-&amp;gt;string('phone', 100)-&amp;gt;nullable()-&amp;gt;comment('phone');
            $table-&amp;gt;string('category', 100)-&amp;gt;nullable()-&amp;gt;comment('freight type');
            $table-&amp;gt;string('weight', 50)-&amp;gt;nullable();
            $table-&amp;gt;string('departure', 100)-&amp;gt;nullable()-&amp;gt;comment('departure city');
            $table-&amp;gt;string('destination', 100)-&amp;gt;nullable()-&amp;gt;comment('destination city');
            $table-&amp;gt;boolean('service_express')-&amp;gt;default(false)-&amp;gt;comment('express delivery');
            $table-&amp;gt;boolean('service_insurance')-&amp;gt;default(false)-&amp;gt;comment('insurance');
            $table-&amp;gt;boolean('service_packaging')-&amp;gt;default(false)-&amp;gt;comment('packaging');
            $table-&amp;gt;string('status', 1)-&amp;gt;default('1')-&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;make Controller&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;size18&quot;&gt;&lt;b&gt;method list&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;index() // 목록&lt;/span&gt;&lt;br /&gt;&lt;span&gt;create() // 작성폼&lt;/span&gt;&lt;br /&gt;&lt;span&gt;store() // 저장&lt;/span&gt;&lt;br /&gt;&lt;span&gt;show() // 상세&lt;/span&gt;&lt;br /&gt;&lt;span&gt;edit() // 수정폼&lt;/span&gt;&lt;br /&gt;&lt;span&gt;update() // 수정&lt;/span&gt;&lt;br /&gt;&lt;span&gt;destroy() // 삭제&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;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-12 col-md-12 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;
                        Phone
                        &amp;lt;div class=&quot;input-form&quot;&amp;gt;
                            &amp;lt;input type=&quot;text&quot; name=&quot;phone&quot; class=&quot;form-control&quot; placeholder=&quot;Phone&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;
                        Phone
                        &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;General&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;refrigerated&quot;&amp;gt;Refrigerated&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;hazardous&quot;&amp;gt;Hazardous&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-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;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 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', {
                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 = '요청 성공';
                            location.href = '/request';
                        } else {
                            response.error.forEach(function (error) {
                                box.textContent += error.message + '\n';
                            });
                            box.className = 'mt-3 text-danger';
                        }
                        //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 = '요청 실패2';
                });
        }
    &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;make Controller for not API&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;p data-ke-size=&quot;size16&quot;&gt;app/Http/Controllers/RequestController.php&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.php&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;Store&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;app/Http/Controllers/Api/TruckRequestController.php&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',
            'phone' =&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; 'input name is required',   
            'email.required' =&amp;gt; 'input email is required',
            'phone.required' =&amp;gt; 'input phone is required',
            'weight.required' =&amp;gt; 'input weight is required',
            'departure.required' =&amp;gt; 'input departure is required',
            'destination.required' =&amp;gt; 'input destination is required',
        ]);
        //
        $truckRequest = TruckRequest::create([
            //'user_id' =&amp;gt; auth()-&amp;gt;user()-&amp;gt;id,
            'name' =&amp;gt; $validated['name'],
            'email' =&amp;gt; $validated['email'],
            'phone' =&amp;gt; $validated['phone'],
            'weight' =&amp;gt; $validated['weight'],
            'departure' =&amp;gt; $validated['departure'],
            'destination' =&amp;gt; $validated['destination'],
            'category' =&amp;gt; $request-&amp;gt;category,
            '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'), 
        ]);

        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 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;List Page&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;resources/views/request/index.blade.php&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-sm-12 mx-auto&quot;&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 mb-3&quot;&amp;gt;
                &amp;lt;div class=&quot;col-12 text-end&quot;&amp;gt;
                    &amp;lt;a href=&quot;{{ route('request.create') }}&quot; class=&quot;btn btn-primary&quot;&amp;gt;Create Request&amp;lt;/a&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&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-12 card mb-2&quot;&amp;gt;' +
                        '&amp;lt;div class=&quot;card-body&quot;&amp;gt;' +
                        '&amp;lt;div class=&quot;d-flex flex-wrap gap-3 justify-content-between align-items-center&quot;&amp;gt;' +
                        '&amp;lt;span&amp;gt;' + item.name + '&amp;lt;/span&amp;gt;' +
                        '&amp;lt;span&amp;gt;' + item.email + '&amp;lt;/span&amp;gt;' +
                        '&amp;lt;span&amp;gt;' + item.weight + '&amp;lt;/span&amp;gt;' +
                        '&amp;lt;span&amp;gt;' + item.departure + ' =&amp;gt; ' + item.destination + '&amp;lt;/span&amp;gt;' +
                        '&amp;lt;span class=&quot;text-muted small&quot;&amp;gt;' + item.created_at.split('T')[0] + '&amp;lt;/span&amp;gt;' +
                        '&amp;lt;/div&amp;gt;' +
                        '&amp;lt;/div&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app/Http/Controllers/RequestController.php&lt;/p&gt;
&lt;pre id=&quot;code_1778844865259&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public function index()
{
    //
    // form
    return view('request.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;routes/web.php&lt;/p&gt;
&lt;pre id=&quot;code_1778844996695&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Route::get('/request_form', [RequestController::class, 'create'])-&amp;gt;name('request.create');

// add to list page
Route::get('/request', [RequestController::class, 'index'])-&amp;gt;name('request.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;htttp://127.0.0.1:8000/request&lt;/p&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;Change&amp;nbsp;to&amp;nbsp;list&amp;nbsp;page&amp;nbsp;upon&amp;nbsp;success&lt;/p&gt;
&lt;pre id=&quot;code_1779027589792&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//box.textContent = JSON.stringify(data, null, 2);

location.href = '/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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;List Api&lt;/b&gt;&lt;/h3&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;routes/api.php&lt;/p&gt;
&lt;pre id=&quot;code_1778845282025&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Route::post('/truck_request', [TruckRequestController::class, 'store'])-&amp;gt;name('truck_request.store');
Route::get('/truck_request', [TruckRequestController::class, 'index'])-&amp;gt;name('truck_request.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;http://127.0.0.1:8000/api/truck_request&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;670&quot; data-origin-height=&quot;725&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OgEll/dJMcadoqyUJ/0KkMv1YlW63vYyGyDAL9Qk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OgEll/dJMcadoqyUJ/0KkMv1YlW63vYyGyDAL9Qk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OgEll/dJMcadoqyUJ/0KkMv1YlW63vYyGyDAL9Qk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOgEll%2FdJMcadoqyUJ%2F0KkMv1YlW63vYyGyDAL9Qk%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;670&quot; height=&quot;725&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;725&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;http://127.0.0.1:8000/request&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;772&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W2RFp/dJMcagZOuJS/dvvnLvkkDXzNMfERKbdqy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W2RFp/dJMcagZOuJS/dvvnLvkkDXzNMfERKbdqy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W2RFp/dJMcagZOuJS/dvvnLvkkDXzNMfERKbdqy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW2RFp%2FdJMcagZOuJS%2FdvvnLvkkDXzNMfERKbdqy0%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;772&quot; height=&quot;286&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;286&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;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Show&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;routes/web.php&lt;/p&gt;
&lt;pre id=&quot;code_1779060961079&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Route::get('/request/{id}', [RequestController::class, 'show'])-&amp;gt;name('request.show');&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;views/request/index.blade.php&lt;/p&gt;
&lt;pre id=&quot;code_1779060911261&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; '&amp;lt;span&amp;gt;' + item.name + '&amp;lt;/span&amp;gt;' +                        

to

 '&amp;lt;a href=&quot;{{ route('request.show', item.id) }}&quot;&amp;gt;&amp;lt;span&amp;gt;' + item.name + '&amp;lt;/span&amp;gt;&amp;lt;/a&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/RequestController.php&lt;/p&gt;
&lt;pre id=&quot;code_1779061139745&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\Models\TruckRequest;

...


public function show(string $id)
{
    $truck_request = TruckRequest::findOrFail($id);
    return view('request.detail', ['truck_request' =&amp;gt; $truck_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;resources/views/request/detail.blade.php&lt;/p&gt;
&lt;pre id=&quot;code_1779071374018&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;div class=&quot;row &quot;&amp;gt;
                    &amp;lt;div class=&quot;col-lg-12 col-md-12 mb-3&quot;&amp;gt;
                        Name
                        &amp;lt;div class=&quot;input-form&quot;&amp;gt;
                            {{ $truck_request-&amp;gt;name }}
                        &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;
                        Phone
                        &amp;lt;div class=&quot;input-form&quot;&amp;gt;
                            {{ $truck_request-&amp;gt;phone }}
                        &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;
                            {{ $truck_request-&amp;gt;email }}
                        &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;
                           {{ $truck_request-&amp;gt;category }}
                        &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;
                            {{ $truck_request-&amp;gt;weight }}
                        &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;
                            {{ $truck_request-&amp;gt;departure }}
                        &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;
                            {{ $truck_request-&amp;gt;destination }}
                        &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;
                                {{ $truck_request-&amp;gt;service_express ? 'Express Delivery' : '' }}
                                {{ $truck_request-&amp;gt;service_insurance ? 'Insurance' : '' }}
                                {{ $truck_request-&amp;gt;service_packaging ? 'Packaging' : '' }}
                            &amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt; 
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&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;a href=&quot;{{ route('request.edit', $truck_request-&amp;gt;id) }}&quot; class=&quot;btn btn-primary&quot;&amp;gt;Modify&amp;lt;/a&amp;gt;
                &amp;lt;a href=&quot;{{ route('request.index') }}&quot; class=&quot;btn btn-primary&quot;&amp;gt;List&amp;lt;/a&amp;gt;
            &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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Edit Form&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;resources/views/request/edit.blade.php&lt;/p&gt;
&lt;pre id=&quot;code_1779072566719&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 id=&quot;request_form&quot; method=&quot;POST&quot; class=&quot;contact-form&quot;&amp;gt;
                @csrf
                &amp;lt;input type=&quot;hidden&quot; name=&quot;id&quot; value=&quot;{{ $truck_request['id'] }}&quot;&amp;gt;
                &amp;lt;div class=&quot;row &quot;&amp;gt;
                    &amp;lt;div class=&quot;col-lg-12 col-md-12 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; value=&quot;{{ $truck_request['name'] }}&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;
                        Phone
                        &amp;lt;div class=&quot;input-form&quot;&amp;gt;
                            &amp;lt;input type=&quot;text&quot; name=&quot;phone&quot; class=&quot;form-control&quot; placeholder=&quot;Phone&quot; value=&quot;{{ $truck_request['phone'] }}&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;email&quot; name=&quot;email&quot; class=&quot;form-control&quot; placeholder=&quot;Email&quot; value=&quot;{{ $truck_request['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;Type&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;general&quot; {{ $truck_request['category'] == 'general' ? 'selected' : '' }}&amp;gt;General&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;refrigerated&quot; {{ $truck_request['category'] == 'refrigerated' ? 'selected' : '' }}&amp;gt;Refrigerated&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;hazardous&quot; {{ $truck_request['category'] == 'hazardous' ? 'selected' : '' }}&amp;gt;Hazardous&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-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; value=&quot;{{ $truck_request['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; value=&quot;{{ $truck_request['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; value=&quot;{{ $truck_request['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 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; {{ $truck_request['service_express'] ? 'checked' : '' }}&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; {{ $truck_request['service_insurance'] ? 'checked' : '' }}&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; {{ $truck_request['service_packaging'] ? 'checked' : '' }}&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/update', {
                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) {
                        console.log(data);
                        if( response.ok ) {
                            box.className = 'mt-3 text-success';
                            box.textContent = '요청 성공';
                            location.href = '/request';
                        } else {
                            response.error.forEach(function (error) {
                                box.textContent += error.message + '\n';
                            });
                            box.className = 'mt-3 text-danger';
                        }
                        //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 = '요청 실패2';
                });
        }
    &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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Update&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;routes/api.php&lt;/p&gt;
&lt;pre id=&quot;code_1779071798279&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Route::post('/truck_request/update', [TruckRequestController::class, 'update'])-&amp;gt;name('truck_request.update');&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_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)
    {
        //
        // Accept: application/json 이면 실패 시 자동 422 + { message, errors } JSON
        $validated = $request-&amp;gt;validate([
            'id' =&amp;gt; 'required|integer',
            'name' =&amp;gt; 'required|string|min:2|max:100',
            'email' =&amp;gt; 'required|email|max:100',
            'phone' =&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',
        ], [
            'id.required' =&amp;gt; 'input id is required',
            'name.required' =&amp;gt; 'input name is required',   
            'email.required' =&amp;gt; 'input email is required',
            'phone.required' =&amp;gt; 'input phone is required',
            'weight.required' =&amp;gt; 'input weight is required',
            'departure.required' =&amp;gt; 'input departure is required',
            'destination.required' =&amp;gt; 'input destination is required',
        ]);

        $truckRequest = TruckRequest::findOrFail($request-&amp;gt;input('id'));
        $truckRequest-&amp;gt;name = $validated['name'];
        $truckRequest-&amp;gt;phone = $validated['phone'];
        $truckRequest-&amp;gt;email = $validated['email'];
        $truckRequest-&amp;gt;weight = $validated['weight'];
        $truckRequest-&amp;gt;departure = $validated['departure'];
        $truckRequest-&amp;gt;destination = $validated['destination'];
        $truckRequest-&amp;gt;category = $request-&amp;gt;category;
        $truckRequest-&amp;gt;service_express = $request-&amp;gt;boolean('service_express');
        $truckRequest-&amp;gt;service_insurance = $request-&amp;gt;boolean('service_insurance');
        $truckRequest-&amp;gt;service_packaging = $request-&amp;gt;boolean('service_packaging');
        $updated = $truckRequest-&amp;gt;save();

        if( $updated ) {
            return response()-&amp;gt;json(['message' =&amp;gt; 'Truck request updated successfully'], 200);
        } else {
            return response()-&amp;gt;json(['message' =&amp;gt; 'Truck request update failed'], 400);
        }        
        
    }&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;resources/views/request/detail.blade.php&lt;/p&gt;
&lt;pre id=&quot;code_1779073736280&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;col-lg-12&quot;&amp;gt;
    &amp;lt;a href=&quot;{{ route('request.edit', ['id' =&amp;gt; $truck_request['id']]) }}&quot; class=&quot;btn btn-primary&quot;&amp;gt;Modify&amp;lt;/a&amp;gt;
    &amp;lt;a href=&quot;{{ route('request.index') }}&quot; class=&quot;btn btn-primary&quot;&amp;gt;List&amp;lt;/a&amp;gt;

    &amp;lt;!-- delete button --&amp;gt;
    &amp;lt;button type=&quot;button&quot; onclick=&quot;delete_request()&quot; class=&quot;btn btn-primary&quot;&amp;gt;Delete&amp;lt;/button&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;form id=&quot;request_form&quot; method=&quot;POST&quot; class=&quot;contact-form&quot;&amp;gt;
    @csrf                
    &amp;lt;input type=&quot;hidden&quot; name=&quot;id&quot; value=&quot;{{ $truck_request['id'] }}&quot;&amp;gt;
&amp;lt;/form&amp;gt;




&amp;lt;script&amp;gt;
    function delete_request() {
        var box = document.getElementById('response_message');
        box.textContent = '';
        fetch('/api/truck_request/delete', {
            method: 'POST',
            headers: {
                Accept: 'application/json',
                'X-Requested-With': 'XMLHttpRequest',
            },
        })
            .then(function (response) {
                return response.json().then(function (data) {
                    console.log(data);
                    if( response.ok ) {
                        box.className = 'mt-3 text-success';
                        box.textContent = '요청 성공';
                        location.href = '/request';
                    } else {
                        response.error.forEach(function (error) {
                            box.textContent += error.message + '\n';
                        });
                        box.className = 'mt-3 text-danger';
        }
    }
            })
            .catch(function () {
                box.className = 'mt-3 text-danger';
                box.textContent = '요청 실패2';
            });
&amp;lt;/script&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/api.php&lt;/p&gt;
&lt;pre id=&quot;code_1779073887767&quot; class=&quot;bash&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::post('/truck_request/delete', [TruckRequestController::class, 'destroy'])-&amp;gt;name('truck_request.destroy');&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_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(Request $request)
{
    //
    // Accept: application/json 이면 실패 시 자동 422 + { message, errors } JSON
    $validated = $request-&amp;gt;validate([
        'id' =&amp;gt; 'required|integer',
    ], [
        'id.required' =&amp;gt; 'input id is required',
    ]);
    $truckRequest = TruckRequest::findOrFail($request-&amp;gt;input('id'));
    $deleted = $truckRequest-&amp;gt;delete();
    if( $deleted ) {
        return response()-&amp;gt;json(['message' =&amp;gt; 'Truck request deleted successfully'], 200);
    } else {
        return response()-&amp;gt;json(['message' =&amp;gt; 'Truck request deletion failed'], 400);
    }
}&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;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;</description>
      <category>Hokma School :: Course 2 Laravel</category>
      <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>
  </channel>
</rss>