<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>만들고, 퍼오고, 공유하고</title>
    <link>https://devlink.tistory.com/</link>
    <description>개발, 디자인, 마케팅 관련 자료실 입니다.</description>
    <language>ko</language>
    <pubDate>Sat, 30 May 2026 18:22:43 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>BIZLAB</managingEditor>
    <image>
      <title>만들고, 퍼오고, 공유하고</title>
      <url>https://tistory1.daumcdn.net/tistory/2869532/attach/13bf20c61f864b0eab15536cab35d89b</url>
      <link>https://devlink.tistory.com</link>
    </image>
    <item>
      <title>날짜 검색시 date_format() 쓰면 인덱스 안탐</title>
      <link>https://devlink.tistory.com/1095</link>
      <description>&lt;pre id=&quot;code_1771913973981&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$date_condition .= ($date_condition ? ' and ' : '') . &quot;
(
	(A.cs_inflow_date BETWEEN '&quot;.$step_sdate.&quot; 00:00:00' AND '&quot;.$step_edate.&quot; 23:59:59')
	OR
	(A.cs_join_date BETWEEN '&quot;.$step_sdate.&quot; 00:00:00' AND '&quot;.$step_edate.&quot; 23:59:59')
	OR
	(A.cs_join_deposit_date BETWEEN '&quot;.$step_sdate.&quot; 00:00:00' AND '&quot;.$step_edate.&quot; 23:59:59')
)
&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>BIZLAB</author>
      <guid isPermaLink="true">https://devlink.tistory.com/1095</guid>
      <comments>https://devlink.tistory.com/1095#entry1095comment</comments>
      <pubDate>Tue, 24 Feb 2026 15:20:17 +0900</pubDate>
    </item>
    <item>
      <title>라라벨 캐시 사용하기</title>
      <link>https://devlink.tistory.com/1089</link>
      <description>&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_1770949290152&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use Illuminate\Support\Facades\Cache;


$spam_words = Cache::remember('spam_words', 600, function () {
    return DB::table('TB_Spam')
        -&amp;gt;whereNotNull('sp_word')
        -&amp;gt;where('sp_word','&amp;lt;&amp;gt;','')
        -&amp;gt;pluck('sp_word');
});&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-end=&quot;546&quot; data-start=&quot;514&quot; data-ke-size=&quot;size26&quot;&gt;  1️⃣ 'spam_words' 는 캐시 키 이름&lt;/h2&gt;
&lt;p data-end=&quot;560&quot; data-start=&quot;548&quot; data-ke-size=&quot;size16&quot;&gt;메모리에 저장할 이름.&lt;/p&gt;
&lt;h2 data-end=&quot;586&quot; data-start=&quot;567&quot; data-ke-size=&quot;size26&quot;&gt;  2️⃣ 600은 초 단위&lt;/h2&gt;
&lt;p data-end=&quot;598&quot; data-start=&quot;588&quot; data-ke-size=&quot;size16&quot;&gt;600초 = 10분&lt;/p&gt;
&lt;p data-end=&quot;619&quot; data-start=&quot;600&quot; data-ke-size=&quot;size16&quot;&gt;  10분 동안은 DB 안 조회함&lt;/p&gt;
&lt;h2 data-end=&quot;641&quot; data-start=&quot;626&quot; data-ke-size=&quot;size26&quot;&gt;  3️⃣ 동작 방식&lt;/h2&gt;
&lt;h3 data-end=&quot;654&quot; data-start=&quot;643&quot; data-ke-size=&quot;size23&quot;&gt;  첫 요청&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;704&quot; data-start=&quot;656&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;677&quot; data-start=&quot;656&quot;&gt;'spam_words' 캐시에 없음&lt;/li&gt;
&lt;li data-end=&quot;688&quot; data-start=&quot;678&quot;&gt;DB 조회 실행&lt;/li&gt;
&lt;li data-end=&quot;696&quot; data-start=&quot;689&quot;&gt;결과 저장&lt;/li&gt;
&lt;li data-end=&quot;704&quot; data-start=&quot;697&quot;&gt;결과 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;726&quot; data-start=&quot;706&quot; data-ke-size=&quot;size23&quot;&gt;  10분 안의 다음 요청들&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;764&quot; data-start=&quot;728&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;736&quot; data-start=&quot;728&quot;&gt;캐시에 있음&lt;/li&gt;
&lt;li data-end=&quot;748&quot; data-start=&quot;737&quot;&gt;DB 조회 안 함&lt;/li&gt;
&lt;li data-end=&quot;764&quot; data-start=&quot;749&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;p data-ke-size=&quot;size16&quot;&gt;.env 파일 에서 캐시 드라이버 file로 변경&lt;/p&gt;
&lt;pre id=&quot;code_1770961223760&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CACHE_DRIVER=file&lt;/code&gt;&lt;/pre&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_1770961287192&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan config:clear
php artisan config:cache
php artisan cache:clear&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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_1770961429752&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo chown -R apache:apache storage
sudo chown -R apache:apache bootstrap/cache


sudo chmod -R 775 storage
sudo chmod -R 775 bootstrap/cache&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;17&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T5ynf/dJMcai3gNZp/AnMezTyVuvT3Tc8WyCdpkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T5ynf/dJMcai3gNZp/AnMezTyVuvT3Tc8WyCdpkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T5ynf/dJMcai3gNZp/AnMezTyVuvT3Tc8WyCdpkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT5ynf%2FdJMcai3gNZp%2FAnMezTyVuvT3Tc8WyCdpkK%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;481&quot; height=&quot;17&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;17&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;ec2-user로 실행이 안될수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;apache 그룹에 ec2-user 계정이 없다면 추가&lt;/p&gt;
&lt;pre id=&quot;code_1770961689040&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo usermod -aG apache ec2-user

실행 후

SSH 재접속 필요&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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_1770961392224&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;storage/framework/cache/data&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-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>[ Web 관련 ]/Laravel 12.5.0</category>
      <author>BIZLAB</author>
      <guid isPermaLink="true">https://devlink.tistory.com/1089</guid>
      <comments>https://devlink.tistory.com/1089#entry1089comment</comments>
      <pubDate>Fri, 13 Feb 2026 11:22:13 +0900</pubDate>
    </item>
    <item>
      <title>블레이드에서 DB row에 조건 사용해서 값 조회 하기</title>
      <link>https://devlink.tistory.com/1076</link>
      <description>&lt;pre id=&quot;code_1759285431144&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{{$data-&amp;gt;where('idx', $row-&amp;gt;idx)-&amp;gt;pluck('name')-&amp;gt;first() ?? ''}}
{{$data-&amp;gt;where('idx', $row-&amp;gt;idx)-&amp;gt;first()-&amp;gt;name ?? ''}}&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_1759285545398&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@foreach ($data-&amp;gt;where('idx', $row_main-&amp;gt;idx) as $row)
	{{$row-&amp;gt;name}}
@endforeach&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>[ Web 관련 ]/Laravel 12.5.0</category>
      <author>BIZLAB</author>
      <guid isPermaLink="true">https://devlink.tistory.com/1076</guid>
      <comments>https://devlink.tistory.com/1076#entry1076comment</comments>
      <pubDate>Wed, 1 Oct 2025 11:25:51 +0900</pubDate>
    </item>
    <item>
      <title>GET 전송시 빈 값은 파라미터 전달하지 않기</title>
      <link>https://devlink.tistory.com/1074</link>
      <description>&lt;pre id=&quot;code_1757915500613&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function search_submit(frm){
    const elements = frm.elements;

    //빈 값은 넘기지 않음
    for (let i = 0; i &amp;lt; elements.length; i++) {
        const el = elements[i];

        // 공통 필터링 기준
        const tag = el.tagName.toLowerCase();
        const type = el.type ? el.type.toLowerCase() : '';

        // name이 없으면 skip
        if (!el.name) continue;

        // 1. 텍스트, textarea, select: 빈 값 제거
        if (
            (tag === 'input' &amp;amp;&amp;amp; ['text', 'search', 'number', 'email', 'date'].includes(type)) ||
            tag === 'textarea' ||
            tag === 'select'
        ) {
            if (el.value.trim() === '') {
                el.removeAttribute('name');
            }
        }

        // 2. checkbox, radio: 체크 안 된 것 제거
        if ((type === 'checkbox' || type === 'radio') &amp;amp;&amp;amp; !el.checked) {
            el.removeAttribute('name');
        }
    }

    f.submit();
    return false;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>[ Web 관련 ]/jQuery</category>
      <author>BIZLAB</author>
      <guid isPermaLink="true">https://devlink.tistory.com/1074</guid>
      <comments>https://devlink.tistory.com/1074#entry1074comment</comments>
      <pubDate>Mon, 15 Sep 2025 14:51:48 +0900</pubDate>
    </item>
    <item>
      <title>세션 체크 미들웨어 샘플 (팝업 처리도-)</title>
      <link>https://devlink.tistory.com/1073</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;라우터 url에 popup 추가하는게 편함&lt;/p&gt;
&lt;pre id=&quot;code_1757898211213&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php
namespace App\Http\Middleware;

use App\Helper\ReturnMessage;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Session;


class CheckSessionValue
{

    public function handle(Request $request, Closure $next)
    {
        Log::info(&quot;  CheckSessionValue handle() 호출됨&quot;);

        $return_message = new ReturnMessage();

        // 현재 요청의 URL을 가져옵니다.
        $currentUrl = trim($request-&amp;gt;getPathInfo());
        //dd($currentUrl);

        // 만약 현재 URL이 로그인 페이지인 경우, 세션 체크를 하지 않고 통과시킵니다.
        if ($currentUrl === 'login') {
            return $next($request);
        }


        if (!Session::has('uid')) {

            // URL에 'popup' 이 포함되어 있는지 체크
            $isPopup = str_contains($currentUrl, 'popup');
            if ($isPopup) {
                return response(
                    '&amp;lt;script&amp;gt;
                    alert(&quot;세션이 만료되었습니다. 다시 로그인 해주세요.&quot;);
                    if (window.opener) {
                        window.opener.location.reload();
                    }
                    window.close();
                &amp;lt;/script&amp;gt;',
                    200
                )-&amp;gt;header('Content-Type', 'text/html; charset=UTF-8');
            }


            // 일반 요청이면 로그인 페이지로 리다이렉트
            return redirect()-&amp;gt;route('login');
        }

        return $next($request);
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>[ Web 관련 ]/Laravel 12.5.0</category>
      <author>BIZLAB</author>
      <guid isPermaLink="true">https://devlink.tistory.com/1073</guid>
      <comments>https://devlink.tistory.com/1073#entry1073comment</comments>
      <pubDate>Mon, 15 Sep 2025 10:04:20 +0900</pubDate>
    </item>
    <item>
      <title>라라벨 공통 함수 사용 (글로벌 헬퍼 함수)</title>
      <link>https://devlink.tistory.com/1071</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; app/helpers.php 파일 생성&lt;/b&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;- DB사용도 가능하지만 빠르게 처리가 가능한 경우에만 사용 (DB연결은 컨트롤러가 더 적합)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 블레이드, 컨트롤러에서 특별히 임포트 하지 않아도 바로 사용가능 ( 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;Laravel에서 helpers.php는 Laravel 애플리케이션이 &lt;b&gt;부팅되기 전이 아니라 부팅 중에 로드되기 때문에&lt;/b&gt;,&lt;br /&gt;DB, Config, Carbon, Auth 등 Laravel의 모든 Facade나 클래스를 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;686&quot; data-start=&quot;650&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;헬퍼는 &quot;로직이 단순할 때만&quot; DB를 써야 함&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;767&quot; data-start=&quot;687&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;767&quot; data-start=&quot;687&quot;&gt;헬퍼는 보통 &lt;b&gt;빠르게 결과 반환&lt;/b&gt;해야 하기 때문에, 복잡한 DB 로직이 들어가면 &lt;b&gt;성능 문제나 예외 처리 이슈&lt;/b&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;p data-ke-size=&quot;size16&quot;&gt;1. app/helpers.php 파일 생성&lt;/p&gt;
&lt;pre id=&quot;code_1756863491674&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

use Carbon\Carbon;

if (!function_exists('diff_days_from_today')) {
    function diff_days_from_today($date)
    {
        if (!$date) return null;

        try {
            $created = Carbon::parse($date)-&amp;gt;startOfDay();
            $today = Carbon::now()-&amp;gt;startOfDay();
            return $created-&amp;gt;diffInDays($today) + 1;
        } catch (\Exception $e) {
            return 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;if (!function_exists('diff_days_from_today')) { ... }&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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. composer.json에 자동 로딩 등록&lt;/p&gt;
&lt;pre id=&quot;code_1756863518705&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;autoload&quot;: {
	&quot;psr-4&quot;: {
		&quot;App\\&quot;: &quot;app/&quot;,
		&quot;Database\\Factories\\&quot;: &quot;database/factories/&quot;,
		&quot;Database\\Seeders\\&quot;: &quot;database/seeders/&quot;
	},
	&quot;files&quot;: [
		&quot;app/helpers.php&quot;  &amp;lt;------- 이맇게 추가
	]
},&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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. composer dump-autoload 실행 (필수)&lt;/p&gt;
&lt;pre id=&quot;code_1756863617143&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;composer dump-autoload&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 블레이드에서 사용&lt;/p&gt;
&lt;pre id=&quot;code_1756863539769&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{{ diff_days_from_today($row-&amp;gt;cs_created_at) }}일차&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 컨트롤러에서 사용&lt;/p&gt;
&lt;pre id=&quot;code_1756863653688&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use App\Http\Controllers\Controller;

class CounselController extends Controller
{
    public function index()
    {
        $createdAt = '2024-08-30';

        $days = diff_days_from_today($createdAt); // &amp;larr; 헬퍼 함수 사용

        return view('counsel.index', compact('days'));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1756863666566&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{{ $days }}일차&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&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-end=&quot;1085&quot; data-start=&quot;1078&quot; data-ke-size=&quot;size26&quot;&gt;✅ 정리&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1271&quot; data-start=&quot;1087&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;항목&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1170&quot; data-start=&quot;1115&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1127&quot; data-start=&quot;1115&quot;&gt;컨트롤러에서 사용&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1170&quot; data-start=&quot;1127&quot;&gt;그냥 diff_days_from_today($date) 호출하면 됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1217&quot; data-start=&quot;1171&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1185&quot; data-start=&quot;1171&quot;&gt;use 문 필요?&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1217&quot; data-start=&quot;1185&quot;&gt;❌ 불필요 (전역 함수이기 때문에 바로 사용 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1271&quot; data-start=&quot;1218&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1223&quot; data-start=&quot;1218&quot;&gt;조건&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1271&quot; data-start=&quot;1223&quot;&gt;composer.json에 등록되어 있고, dump-autoload 완료&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;h2 data-end=&quot;170&quot; data-start=&quot;137&quot; data-ke-size=&quot;size26&quot;&gt;✅ 전역(Global)으로 모든 곳에서 호출 가능&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;432&quot; data-start=&quot;172&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;사용 위치&lt;/td&gt;
&lt;td&gt;사용 가능 여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;281&quot; data-start=&quot;246&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;273&quot; data-start=&quot;246&quot;&gt;Blade 템플릿 (.blade.php)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;281&quot; data-start=&quot;273&quot;&gt;✅ 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;312&quot; data-start=&quot;282&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;304&quot; data-start=&quot;282&quot;&gt;Controller&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;312&quot; data-start=&quot;304&quot;&gt;✅ 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;343&quot; data-start=&quot;313&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;335&quot; data-start=&quot;313&quot;&gt;Middleware&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;343&quot; data-start=&quot;335&quot;&gt;✅ 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;374&quot; data-start=&quot;344&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;366&quot; data-start=&quot;344&quot;&gt;Command&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;374&quot; data-start=&quot;366&quot;&gt;✅ 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;405&quot; data-start=&quot;375&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;397&quot; data-start=&quot;375&quot;&gt;Seeder / Factory&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;405&quot; data-start=&quot;397&quot;&gt;✅ 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;432&quot; data-start=&quot;406&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;424&quot; data-start=&quot;406&quot;&gt;어디든 PHP 코드&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;432&quot; data-start=&quot;424&quot;&gt;✅ 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;</description>
      <category>[ Web 관련 ]/Laravel 12.5.0</category>
      <author>BIZLAB</author>
      <guid isPermaLink="true">https://devlink.tistory.com/1071</guid>
      <comments>https://devlink.tistory.com/1071#entry1071comment</comments>
      <pubDate>Wed, 3 Sep 2025 10:43:28 +0900</pubDate>
    </item>
    <item>
      <title>라라벨 모든 view에 데이터 공통으로 전달하기</title>
      <link>https://devlink.tistory.com/1068</link>
      <description>&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;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;?php

namespace App\Providers;

use App\Helper\Common;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\View;
use Illuminate\Support\Facades\Route;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     */
    public function register(): void
    {
        //
    }

    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {


        // 모든 뷰에 공통 데이터 전달하되, 로그인 페이지 제외
        View::composer('*', function ($view) {
            // 현재 라우트 이름 가져오기
            $routeName = Route::currentRouteName();

            // 제외할 라우트 이름 목록
            $excludedRoutes = ['login'];

            if (in_array($routeName, $excludedRoutes)) {
                // 로그인 페이지면 데이터 전달 안함
                return;
            }

            $common = new Common();
            $mainMenus = $common-&amp;gt;getMenuData();


            // 로그인 페이지가 아니면 공통 데이터 전달
            $view-&amp;gt;with('mainMenus', $mainMenus);
            // 여기에 더 공통 데이터 추가 가능
        });
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>[ Web 관련 ]/Laravel 12.5.0</category>
      <author>BIZLAB</author>
      <guid isPermaLink="true">https://devlink.tistory.com/1068</guid>
      <comments>https://devlink.tistory.com/1068#entry1068comment</comments>
      <pubDate>Fri, 29 Aug 2025 18:57:58 +0900</pubDate>
    </item>
    <item>
      <title>라라벨 클래스가 잘 로드되는지 체크</title>
      <link>https://devlink.tistory.com/1067</link>
      <description>&lt;p data-ke-size=&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;302&quot; data-start=&quot;282&quot;&gt;클래스가 오토로드되는지 확인할 때&lt;/li&gt;
&lt;li data-end=&quot;328&quot; data-start=&quot;303&quot;&gt;모델, 컨트롤러, 서비스 객체 테스트할 때&lt;/li&gt;
&lt;li data-end=&quot;350&quot; data-start=&quot;329&quot;&gt;데이터베이스 쿼리 바로 실행해볼 때&lt;/li&gt;
&lt;li data-end=&quot;380&quot; data-start=&quot;351&quot;&gt;Laravel 내부 로직을 실시간으로 디버깅할 때&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;pre id=&quot;code_1756447613639&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan tinker&lt;/code&gt;&lt;/pre&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_1756447706166&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;new \App\Http\Middleware\TestAdmin;&lt;/code&gt;&lt;/pre&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_1756447840366&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;= App\Http\Middleware\TestAdmin {#5323}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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_1756447752646&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;exit&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 Ctrl + D&lt;/p&gt;</description>
      <category>[ Web 관련 ]/Laravel 12.5.0</category>
      <author>BIZLAB</author>
      <guid isPermaLink="true">https://devlink.tistory.com/1067</guid>
      <comments>https://devlink.tistory.com/1067#entry1067comment</comments>
      <pubDate>Fri, 29 Aug 2025 15:09:21 +0900</pubDate>
    </item>
    <item>
      <title>css 에서 변수(커스텀 프로퍼티) 사용</title>
      <link>https://devlink.tistory.com/1058</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. CSS 변수(커스텀 프로퍼티)를 쓸 때는 &lt;b&gt;반드시 앞에 -- 를 붙여야 함&lt;/b&gt;&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_1755744438184&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.g-6, .gy-6 {
    --bs-gutter-y: 1.5rem;
}&lt;/code&gt;&lt;/pre&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;b&gt;자식 요소&lt;/b&gt; 또는 &lt;b&gt;같은 선택자 내부&lt;/b&gt;에서 사용 가능&lt;/p&gt;
&lt;pre id=&quot;code_1755744478471&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.g-6 {
  padding-bottom: var(--bs-gutter-y);
}

.g-6 &amp;gt; .child {
  margin-top: var(--bs-gutter-y);
}&lt;/code&gt;&lt;/pre&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_1755744623112&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.other-class {
  padding-top: var(--bs-gutter-y); /* ❌ 작동 안 함 */
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전역 변수로 사용하고 싶을땐 아래 처럼 사용 (:root가 일반적이고 명확 함)&lt;/p&gt;
&lt;pre id=&quot;code_1755744655623&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;:root {
  --bs-gutter-y: 1.5rem;
}

html {
  --bs-gutter-y: 1.5rem;
}

body {
  --bs-gutter-y: 1.5rem;
}

html, body {
  --bs-gutter-y: 1.5rem;
}

등등..&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>웹 개발 강의 자료 (비공개)/css</category>
      <author>BIZLAB</author>
      <guid isPermaLink="true">https://devlink.tistory.com/1058</guid>
      <comments>https://devlink.tistory.com/1058#entry1058comment</comments>
      <pubDate>Thu, 21 Aug 2025 11:53:58 +0900</pubDate>
    </item>
    <item>
      <title>AWS에서 SMTP를 사용해서 메일 보내기 (with Laravel)</title>
      <link>https://devlink.tistory.com/1053</link>
      <description>&lt;h2 data-end=&quot;94&quot; data-start=&quot;75&quot; data-ke-size=&quot;size26&quot;&gt;1. 구글 SMTP 기본 정보&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;215&quot; data-start=&quot;96&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;125&quot; data-start=&quot;96&quot;&gt;SMTP 서버: smtp.gmail.com&lt;/li&gt;
&lt;li data-end=&quot;154&quot; data-start=&quot;126&quot;&gt;포트: 587 (TLS), 465 (SSL)&lt;/li&gt;
&lt;li data-end=&quot;196&quot; data-start=&quot;155&quot;&gt;인증 필요: 네, Gmail 계정과 비밀번호 또는 앱 비밀번호 사용&lt;/li&gt;
&lt;li data-end=&quot;215&quot; data-start=&quot;197&quot;&gt;보안: TLS/SSL 필수&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;220&quot; data-start=&quot;217&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;251&quot; data-start=&quot;222&quot; data-ke-size=&quot;size26&quot;&gt;2. AWS에서 구글 SMTP 사용 시 주의사항&lt;/h2&gt;
&lt;h3 data-end=&quot;275&quot; data-start=&quot;253&quot; data-ke-size=&quot;size23&quot;&gt;(1) AWS 보안 그룹 설정&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;488&quot; data-start=&quot;276&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;382&quot; data-start=&quot;276&quot;&gt;AWS 인스턴스의 &lt;b&gt;보안 그룹(Security Group)&lt;/b&gt; 에서&lt;br /&gt;Outbound(아웃바운드) 규칙에 SMTP 포트 (보통 587 또는 465)로 인터넷 연결 허용 필요&lt;/li&gt;
&lt;li data-end=&quot;488&quot; data-start=&quot;383&quot;&gt;예:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;488&quot; data-start=&quot;392&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;409&quot; data-start=&quot;392&quot;&gt;Protocol: TCP&lt;/li&gt;
&lt;li data-end=&quot;440&quot; data-start=&quot;412&quot;&gt;Port Range: 587 (또는 465)&lt;/li&gt;
&lt;li data-end=&quot;488&quot; data-start=&quot;443&quot;&gt;Destination: 0.0.0.0/0 (또는 구글 SMTP IP 대역)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;515&quot; data-start=&quot;490&quot; data-ke-size=&quot;size23&quot;&gt;(2) VPC 네트워크 ACL 확인&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;573&quot; data-start=&quot;516&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;573&quot; data-start=&quot;516&quot;&gt;VPC 네트워크 ACL에서 아웃바운드/인바운드 규칙이 SMTP 포트를 막고 있지 않은지 확인하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;601&quot; data-start=&quot;575&quot; data-ke-size=&quot;size23&quot;&gt;(3) AWS EC2 기본 정책 확인&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;721&quot; data-start=&quot;602&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;658&quot; data-start=&quot;602&quot;&gt;AWS는 기본적으로 포트 25(기본 SMTP 포트)를 차단하는 경우가 많음 (스팸 방지 목적)&lt;/li&gt;
&lt;li data-end=&quot;721&quot; data-start=&quot;659&quot;&gt;587이나 465 포트는 보통 차단하지 않으나, 만약 문제 있으면 AWS 지원에 문의해서 해제 요청 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;726&quot; data-start=&quot;723&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;748&quot; data-start=&quot;728&quot; data-ke-size=&quot;size26&quot;&gt;3. Gmail 계정 보안 설정&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;985&quot; data-start=&quot;750&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;792&quot; data-start=&quot;750&quot;&gt;기본적으로 구글은 외부 앱에서 로그인 시 보안을 엄격하게 제한합니다.&lt;/li&gt;
&lt;li data-end=&quot;929&quot; data-start=&quot;793&quot;&gt;Gmail 계정을 이용할 때는 다음 중 하나 필요:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;929&quot; data-start=&quot;828&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;885&quot; data-start=&quot;828&quot;&gt;&lt;b&gt;2단계 인증 활성화 후 앱 비밀번호 생성&lt;/b&gt; &amp;rarr; Laravel 메일 설정에 앱 비밀번호 사용&lt;/li&gt;
&lt;li data-end=&quot;929&quot; data-start=&quot;888&quot;&gt;혹은 &quot;보안 수준이 낮은 앱 허용&quot; (2022년 이후 대부분 막힘)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;985&quot; data-start=&quot;930&quot;&gt;개인 Gmail 계정보다는 G Suite(구 Google Workspace) 계정을 권장합니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Laravel .env 예시&lt;/h2&gt;
&lt;pre id=&quot;code_1755162749745&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=your-email@gmail.com
MAIL_PASSWORD=your-app-password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=your-email@gmail.com
MAIL_FROM_NAME=&quot;Your App Name&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;90&quot; data-start=&quot;48&quot; data-ke-size=&quot;size26&quot;&gt;1. Artisan 커맨드로 메일 테스트하기 (Laravel 9 이상)&lt;/h2&gt;
&lt;p data-end=&quot;142&quot; data-start=&quot;92&quot; data-ke-size=&quot;size16&quot;&gt;Laravel 9.23부터 내장된 mail:send 명령어로 간단하게 테스트 가능해요.&lt;/p&gt;
&lt;p data-end=&quot;159&quot; data-start=&quot;144&quot; data-ke-size=&quot;size16&quot;&gt;터미널에서 아래 명령 실행:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;php artisan mail:send --to=받는사람이메일@example.com&lt;/span&gt;&lt;/span&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;h2 data-end=&quot;290&quot; data-start=&quot;266&quot; data-ke-size=&quot;size26&quot;&gt;2. 직접 메일 전송하는 코드 작성하기&lt;/h2&gt;
&lt;h3 data-end=&quot;321&quot; data-start=&quot;292&quot; data-ke-size=&quot;size23&quot;&gt;(1) 테스트용 Mailable 클래스 만들기&lt;/h3&gt;
&lt;pre id=&quot;code_1755162812105&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php artisan make:mail TestMail&lt;/code&gt;&lt;/pre&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/Mail/TestMail.php 파일 열어서 build() 메서드 수정:&lt;/p&gt;
&lt;pre id=&quot;code_1755162828881&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\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class TestMail extends Mailable
{
    use Queueable, SerializesModels;

    public function build()
    {
        return $this-&amp;gt;subject('메일 테스트')  // 메일 제목
                    -&amp;gt;view('emails.test'); // 뷰 파일 지정
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;791&quot; data-start=&quot;775&quot; data-ke-size=&quot;size23&quot;&gt;(2) 메일 뷰 만들기&lt;/h3&gt;
&lt;p data-end=&quot;839&quot; data-start=&quot;793&quot; data-ke-size=&quot;size16&quot;&gt;resources/views/emails/test.blade.php 파일 생성:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1755162850033&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;메일 테스트&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;이것은 Laravel 메일 테스트입니다.&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;메일이 정상적으로 발송되면 잘 작동하는 것입니다.&amp;lt;/p&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;h3 data-end=&quot;1046&quot; data-start=&quot;1017&quot; data-ke-size=&quot;size23&quot;&gt;(3) 라우트나 컨트롤러에 테스트용 코드 추가&lt;/h3&gt;
&lt;p data-end=&quot;1079&quot; data-start=&quot;1048&quot; data-ke-size=&quot;size16&quot;&gt;예: routes/web.php 에 아래 코드 추가:&lt;/p&gt;
&lt;pre id=&quot;code_1755162867242&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\Mail;
use App\Mail\TestMail;

Route::get('/mail-test', function () {
    Mail::to('받는사람이메일@example.com')-&amp;gt;send(new TestMail());
    return '메일을 보냈습니다!';
});&lt;/code&gt;&lt;/pre&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://your-app-url/mail-test 접속하면 메일 발송 시도&lt;/p&gt;</description>
      <category>[ 서버 &amp;amp; DB 관련 ]/AWS</category>
      <author>BIZLAB</author>
      <guid isPermaLink="true">https://devlink.tistory.com/1053</guid>
      <comments>https://devlink.tistory.com/1053#entry1053comment</comments>
      <pubDate>Thu, 14 Aug 2025 18:15:28 +0900</pubDate>
    </item>
  </channel>
</rss>