> PHP 프레임워크 > ThinkPHP > ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.

ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.

咔咔
풀어 주다: 2020-12-01 13:41:01
원래의
2119명이 탐색했습니다.

머리말

글이 길어져서 새로운 글로 작성하겠습니다.

이전 글에서는 다음과 같은 내용을 설명해 드렸습니다.

  • 라우팅에 대한 초기 이해에 대한 간단한 분석
  • 라우트를 정의하여 외관에 대해 이야기해보겠습니다
  • 라우트 정의 규칙 메서드에서 $this->group이 정확히 수행하는 작업은 무엇인가요?
  • 라우팅 규칙 전처리
  • 라우팅 식별자 구문 분석 및 생성에 대한 빠른 액세스

하지만 라우팅에 대해서는 아직 설명할 내용이 많고 다음 내용을 분석해 보겠습니다.

  • 경로 구성(즉, 경로 파일의 반환에서)
  • 디스패치가 처음 만났을 때
  • route-check는 URL 라우팅을 감지합니다
  • . . . . . . . . . . . . .

다음 내용을 하나씩 자세히 설명하겠습니다.

또한 참고하실 수 있도록 라우팅에 대한 실행 다이어그램도 제공합니다.

ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
라우팅 실행 과정

1. 먼저 디스패치에 대한 이해와 URL 라우팅 감지를 위한 경로 확인

이 부분의 내용은 실행 애플리케이션 내부에 있습니다. 다음으로 카카가 여러분을 데려갈 것입니다. 간단한 과정을 통해 서로 알아가세요.

이 섹션에서는 소스 코드에 대한 설명이 없으며 기사의 나머지 부분을 설명하기 위해 사용되므로 디스패치가 무엇인지 알아야 합니다.

아래 그림은 라우팅 초기화 후 실행을 계속하기 위해 상위 레이어로 돌아가는 과정을 보여줍니다.

그러면 라우팅 감지가 실행됩니다.

ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
초기 실행 위치 디스패치

라우팅 테스트는 다음 그림을 사용합니다

ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
라우팅 테스트 사용 사례

그러면 이 스케줄링 정보를 인쇄할 수 있습니다

ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
데이터 인쇄
ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
결과 인쇄

위 사진에는 발송 관련 값이 ​​​​인쇄되어 있습니다

다음으로 routeCheck방법

ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
routeCheck

에 대한 간단한 미리보기를 진행하겠습니다. 이 단계에서 캐시가 처리되고 Dispatch 객체를 반환한다는 것은 분명합니다.

이 작품의 소스 코드를 간단히 살펴보실 수 있으며 그다지 중요하지 않습니다.

route-check는 URL 라우팅을 감지합니다

하지만 여전히 이 내용을 간략하게 살펴봐야 합니다.

보기 전에 전달된 두 매개 변수가 무엇인지 명확히 해야 합니다.

매개변수 1: 라우팅 규칙 매개변수 2: 필수 라우팅이 구성되었는지 확인

ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
디스패치 객체 반환

매개변수의 의미를 알고 나면 확인 방법으로 이동하여 알아내야 합니다.

ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
URL 라우팅 감지

이 방법에서는 도메인 이름 라우팅 자동 감지와 관련하여 데이터가 어떻게 보이는지 인쇄해 보겠습니다.

실제로 반환된 결과는 이전 리소스 경로 마운트 방법과 동일합니다.

ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
결과를 인쇄합니다

그러면 pathinfo 구분 기호가 사용됩니다. URL에서 /를 |

로 변경하면 됩니다. 구성 파일 획득 경로가 완전히 일치하는지

최종 실행은 기본 경로 분석을 사용하는 것입니다

여기의 세부 사항은 라우팅에 대한 세부 사항이 너무 많아서 하나씩 자세히 분석됩니다. 필요합니다. 시간이 많이 걸립니다.

이번 글은 여기까지입니다. 무엇이 실행되고 무엇이 최종적으로 반환되는지만 알면 됩니다.

2. 요청 클래스를 찾는 방법

이전 섹션에서 $result = $domain->check($this->request, $url, $completeMatch);에서는 이 부분의 콘텐츠를 실행합니다.

우리는 이 방법이 여기서 무엇을 수행하는지 상관하지 않습니다.

하지만 신경쓰셔야 할 것은$this->request 발견되어 실행되는지 여부입니다.

가장 먼저 볼 수 있는 것은 Route 클래스에 요청 속성이 존재한다는 것입니다.

ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
객체의 속성을 요청하세요

그런 다음 Route 생성자로 오세요. 그곳에서 새로운 세계를 발견하게 될 것입니다.

여기에서는 ArrayAccess를 사용하여 배열처럼 객체에 접근하는데, $app에 request 속성이 존재하지 않으므로 컨테이너 클래스의 __get 매직 메소드가 __get 메소드에서 호출됩니다. 첫 번째 매개변수는 request이며 요청 인스턴스는 결국 반환됩니다.

ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
Constructor

여기의 $app은 실제로 종속성 주입을 통해 들어오는 App 인스턴스입니다.

너무 많은 소스 코드를 읽은 후에 App 클래스가 컨테이너 클래스인 Container 클래스를 상속한다는 것을 알아야 합니다.

컨테이너 클래스 하단에는 여러 가지 매직 메소드가 있습니다.

여기서는 __get 메소드에만 주의하면 됩니다.

ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
Magic method

__get 메소드는 존재하지 않는 속성에 접근할 때 실행되는 함수입니다.

즉, make 메소드가 결국 실행된다는 것입니다.

ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
컨테이너 클래스의 make 메소드

이 메소드는 일련의 작업을 거쳐 최종적으로 Request 인스턴스를 반환합니다.

그리고 이 인스턴스를 컨테이너에 저장하고 다음에 사용할 때 직접 가져옵니다.

컨테이너 클래스의 make 메소드는 컨테이너 클래스에서 특히 중요한 메소드이면서 soul 메소드이기도 합니다.

전체 프레임워크의 인스턴스는 컨테이너를 통해 반환되므로 이 방법의 중요성은 말할 필요도 없습니다.

Kaka는 이전에도 컨테이너에 대해 매우 깊은 이해를 갖고 있었으며 이를 기사 형식으로 모든 사람에게 제시했습니다.

3. 도메인 이름 라우팅 감지

먼저 프로세스를 그려보고 프로세스의 리듬을 따라가겠습니다.

ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
라우팅 도메인 이름 탐지 흐름도

먼저 확인해야 할 것은 실행 애플리케이션에서 도메인 이름 라우팅 탐지가 수행된다는 점입니다.

상위 실행 프로세스는 엔트리 파일이 있는 곳입니다.

ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
어플리케이션 실행

먼저 코드는 routeCheck이 방법에서는 먼저 이 파일을 살펴보세요. routeCheck这个方法里边,那么就先看这个文件。

先看注释,对这个方法的解释就是URL路由检测。

在这个方法里边先是会对路由缓存进行检测,这块内容就是关于Cache的。

在这个方法里边最重要的的就是路由检测 返回一个Dispatch对象

먼저 댓글을 보세요. 이 방법에 대한 설명은 URL 라우팅 감지입니다.
ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.이 방법에서는 라우팅 캐시가 먼저 감지됩니다. 이 내용은 캐시에 관한 것입니다.
이 방법에서 가장 중요한 것은 경로 감지 메소드는 Dispatch 객체를 반환합니다.

🎜URL 라우팅 감지🎜🎜🎜그럼 이 방법을 살펴보겠습니다. 🎜

먼저 명확히 해야 할 것은 전달된 두 매개변수가 무엇인지입니다.

  • $path : string(4) "blog"
  • $must : bool(false)
ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
Route 감지

는 URL 라우팅을 감지할 때 다음 작업을 수행합니다.

  • pathinfo 구분 기호: URL의 /를 |
  • 경로가 정확히 일치하는지 확인하세요.
  • 도메인 이름 라우팅 감지
  • 기본 경로 확인

그런 다음 확인만 하면 됩니다. 도메인 이름 라우팅 프로세스에 대한 심층 분석.

처음 두 실행은 문자열 처리에 불과합니다. 살펴보고 결국 무엇이 반환될지 알아보세요.

ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
URL 라우팅 감지

또한 도메인 이름 라우팅 감지 실행에서 세 가지 매개변수의 의미를 명확히 합니다.

  • $this->request: 컨테이너 클래스의 __get 매직 메소드를 통해 컨테이너 클래스의 make 메소드가 실행되고, 최종적으로 요청의 인스턴스 객체가 반환됩니다. 이 열은 보이지 않습니다섹션 6의 기사<code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba(27,31,35,.05); font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(271, 93, 108);">第六节的文章
  • $url : string(4) "blog"
  • $completeMatch : 路由是否完全匹配

来到$result = $domain->check($this->request, $url, $completeMatch);

$url: string(4) "blog "🎜🎜🎜🎜$completeMatch: 경로가 🎜🎜🎜🎜과 완전히 일치하는지 여부는 $result = $domain->check($this->request, $url, $completeMatch);이 섹션의 초점은 다음과 같습니다. 🎜🎜이 방법에서는 다음 프로세스가 실행되며 중요한 실행 프로세스가 심층적으로 분석됩니다. 🎜
  • 라우팅 별칭 감지: checkRouteAlias
  • URL 바인딩 감지: checkUrlBind
  • 라우팅 매개변수 판단
  • 도메인 이름 미들웨어 추가
  • 그룹 라우팅 감지: parent::check
ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
도메인 이름 라우팅 감지

경로 별칭 감지: checkRouteAlias

매개변수 설명

  • $request: 요청 클래스의 인스턴스
  • $url: 통과된 블로그

이 방법에는 두 가지가 있습니다 지식 명확히 해야 할 점

  • strpos: 문자열에서 처음 나타나는 위치 찾기
  • strstr: strstr은 string1에서 string2가 처음 나타나는 위치를 가리키는 포인터를 반환합니다. strstr("Helloworld!" , "world");?>nOutput: nworld!
  • 먼저 URL 주소가 처리됩니다. 블로그
  • 로 돌아가 별칭 라우팅 정의를 가져옵니다. NULL
  • 리소스 라우팅 블로그를 예로 들어 보겠습니다. 그리고 false를 반환합니다
ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
라우트 별칭 감지

라우트 별칭 감지 방법이 있으니 살펴봐야 합니다

파라미터는 위 사진에서 전달한 블로그입니다

ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
별칭 경로 정의 가져오기

이 메서드에서 가장 먼저 분명히 해야 할 것은 이 메서드가 클래스thinkphp/library/think/Route.phpthinkphp/library/think/Route.php

并且此类使用了thinkroute下的所有类

这个方法就会把从检测路由过来的blog然后会在Route类中的alias属性里边进行获取,如果不存在则会返回NULL

这个别名的使用会在下文中提到

ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
获取别名路由定义

来到检测别名路由的最后return $item ? $item->check($request, $url) : false;也就是这行代码,从上图中就可以知道,这个item就是NULL

并且最终将这个NULL给返回回去。

检测URL绑定:checkUrlBind

参数说明

  • $request : request类的实例
  • $url : 传过来的 blog

在这个方法中只对下图咔咔圈出来的地方进行详解。

ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
检测URL绑定

来到方法getBind

그리고 이 클래스는 thinkroute 아래의 모든 클래스를 사용합니다🎜🎜이 메서드는 탐지 블로그에서 라우팅됩니다. 그런 다음 Route 클래스의 별칭 속성에서 검색됩니다. 존재하지 않으면 NULL이 반환됩니다. 이 별칭의 사용은 아래에서 언급됩니다🎜🎜ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.🎜별칭 경로 정의 가져오기🎜🎜🎜별칭 경로 감지 끝으로return $item ? $item->check($request, $url) : false ;위 그림에서 볼 수 있듯이 이 항목은 NULL🎜🎜이며 이 NULL이 결국 반환됩니다. 🎜🎜URL 바인딩 감지: checkUrlBind🎜🎜매개변수 설명🎜
  • $request: 요청 클래스의 인스턴스
  • $url: 전달된 블로그
🎜 , 아래 사진에 동그라미 친 부분만 자세히 설명하겠습니다. 🎜🎜ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.🎜URL 감지 바인딩 🎜🎜🎜은 getBind 라우팅 바인딩을 읽은 후 KaKa가 수신 매개변수를 인쇄한 것을 볼 수 있습니다. 🎜

이 방법은 thinkphp/library/think/route / Domain.php 클래스에서 이 클래스는 라우팅 규칙을 설정할 때 $This->group에서 사용된다는 점을 기억하세요. 모르는 경우 라우팅 기사의 첫 번째 섹션을 읽어보세요. thinkphp/library/think/route/Domain.php这个类里边,还记得在设置路由规则的$This->group就是使用的这个类,不知道的可以去看路由文章的第一节。

同时在这个方法中会进行一次subDomain

동시에 이 메소드는 subDomain code>현재 하위 도메인 이름을 가져옵니다. <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"></p>이 방법은 결국 www를 반환하게 되며, 주로 첫 번째 원으로 표시된 부분을 살펴봅니다. <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"></p>요청 클래스의 호스트 메소드를 통해 현재 도메인 이름을 가져온 후 분할합니다. <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"></p>반환 데이터: array(1) { [0] =>n string(3) "www"n}<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"></p>하위 도메인 이름에 값 할당: $this->subDomain<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"></p>최종 결과를 반환하고 반환 하위 도메인 이름: www<figure data-tool="mdnice编辑器" style="margin: 0; margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center; border-radius: 16px; overflow: hidden;"> <img src="https://img.php.cn/upload/image/298/771/135/1606795677271859.png" title="1606795677271859.png" alt="ThinkPHP는 URL 라우팅 심층 분석을 감지합니다."><figcaption style="max-width:90%"></figcaption>현재 하위 도메인 이름 가져오기</figure><p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"></p>그런 다음 상위 계층이 획득한 현재 하위 도메인 이름 WWW를 판단하는 상위 계층으로 돌아갑니다. <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"></p>일부는 모두 판단 처리입니다. 왜냐하면 www만 반환되기 때문입니다. <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"></p>아래 판단은 라우팅 바인딩을 기반으로 합니다. 여기서는 가장 일반적인 NULL만 반환하면 됩니다. <figure data-tool="mdnice编辑器" style="margin: 0; margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center; border-radius: 16px; overflow: hidden;"><img src="https://img.php.cn/upload/image/485/525/920/1606795680508886.png" title="1606795680508886.png" alt="ThinkPHP는 URL 라우팅 심층 분석을 감지합니다."><figcaption style="max-width:90%"></figcaption>이 내린 판단은 하위 레이어에서 NULL이 반환된다는 것을 알고 있으므로 여기서의 판단도 성립되지 않으므로 상위 레이어에 반환되는 최종 결과는 false입니다. </figure><p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"></p> <figure data-tool="mdnice编辑器" style="margin: 0; margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center; border-radius: 16px; overflow: hidden;">URL 바인딩 감지<img src="https://img.php.cn/upload/image/315/355/403/1606795691202713.png" title="1606795691202713.png" alt="ThinkPHP는 URL 라우팅 심층 분석을 감지합니다."><figcaption style="max-width:90%"></figcaption></figure>라우팅 매개변수 결정<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"><span style="font-weight: 700; color: rgb(248, 57, 41);"><p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">위 그림에 따르면 실행 프로세스는 결국 <code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background로 돌아갑니다. -color: rgba(27,31,35,.05); 글꼴 계열: Operator Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all; 색상: rgb(271, 93, 108); >thinkphp/ library/think/route/Domain.php이 방법은thinkphp/library/think/route/Domain.php这个方法check检测域名路由。

然后开始进行判断路由参数。

没有路由参数跳过不执行。

存在路由参数:执行方法setRouteVars :设置路由变量  这个参数是在框架版本5.1.5以上才可以使用,由于咔咔使用的版本有点低,就不对其详解了。

ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
检测域名路由
ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
文档

添加域名中间件

关于中间件这里也不对其进行解释,因为后期会新开一篇文章来详解,本文还是以路由为重点哈!

检测分组路由

接着就会来到检测域名路由的最后一个流程,执行代码return parent::check($request, $url, $completeMatch);

会跳转到类文件:thinkphp/library/think/route/RuleGroup.php

그런 다음 라우팅 매개변수 판단을 시작하세요.

라우팅 매개변수가 없으면 건너뛰어 실행되지 않습니다. 🎜🎜라우팅 매개변수가 있습니다: setRouteVars 메소드 실행: 라우팅 변수 설정 이 매개변수는 프레임워크 버전 5.1.5 이상에서만 사용할 수 있습니다. Kaka에서 사용하는 버전이 약간 낮기 때문에 자세히 설명하지 않겠습니다. 🎜
ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
도메인 이름 라우팅 감지
문서
🎜도메인 이름 미들웨어 추가🎜🎜미들웨어 정보는 여기에서 얻었습니다. 나중에 새 기사를 열어 자세히 설명할 것이기 때문에 설명하지 마세요. 이 기사는 여전히 라우팅에 중점을 두고 있습니다. 🎜🎜그룹 라우팅 감지🎜🎜그런 다음 도메인 이름 라우팅을 감지하는 마지막 프로세스에 와서 실행합니다. 코드 return parent::check($request, $url , $completeMatch);🎜🎜 클래스로 점프합니다파일: thinkphp/library/think/route/RuleGroup.php, 왜냐하면 Domain 클래스가 RuleGroup 클래스를 상속하기 때문입니다. 🎜🎜매개변수 설명🎜
  • $request: 요청 클래스의 인스턴스
  • $url: 전달된 블로그
  • $completeMatch: 경로가 완전히 일치하는지 여부

이 방법에서 KaKa는 여기에서 그중 하나만 일치합니다. 그룹화 매개변수를 병합하는 과정, 즉 프로세스를 자세히 설명합니다.

이 방법도 실행 과정 전체의 주요 라인이고 나머지는 감지 및 판단을위한 방법이기 때문입니다.

ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
그룹화 매개변수 병합

IV. 요약

라우팅에 대해 두 편의 글을 썼는데 소스 코드를 오랫동안 읽어도 아직 끝나지 않았습니다. 이해하기 어려운 부분.

클래스가 차례로 연결됩니다. 라우팅은 여기서 일시적으로 학습되며, 나중에 다른 소스 코드를 읽을 때 다른 내용이 추가됩니다.

라우팅 글에서 주로 실행되는 흐름도를 주의 깊게 읽어야 합니다.

ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.
실행 흐름도

라우팅 규칙 등록 시 최종적으로 반환되는 것은 그룹 속성을 통한 Domain 클래스입니다. 여기에 있는 내용은 명확해야 합니다.

라우팅 시 도메인 이름 구성 과정과 도메인 이름 구성 시기를 주로 알아보세요.

라우팅 파일의 반환 배열과 라우팅 파일을 가져오는 과정에 대한 명확한 아이디어가 있어야 합니다.

그럼 앞서 배운 ArrayAccess를 복습하고 배열과 같은 객체에 접근해 보겠습니다.

컨테이너의 매직 메소드 __get 메소드 이 매직 메소드에는 주로 클래스의 인스턴스를 반환하고 컨테이너에 저장하는 데 사용되는 make 메소드가 있습니다.

이제 라우팅 측면에 대한 내용은 한 글로 마치겠습니다.

배움에 대한 끈기, 블로그에 대한 끈기, 공유에 대한 끈기는 Kaka가 경력을 시작한 이래로 항상 지켜온 신념입니다. Kaka의 Nuoda 인터넷 기사가 여러분에게 조금이나마 도움이 되기를 바랍니다. 카카예요 다음호에서 만나요 .

위 내용은 ThinkPHP는 URL 라우팅 심층 분석을 감지합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿