> 백엔드 개발 > PHP 튜토리얼 > PHP 음식 및 의류 부모 3-php는 HHVM을 사용하여 고성능을 달성합니다.

PHP 음식 및 의류 부모 3-php는 HHVM을 사용하여 고성능을 달성합니다.

WBOY
풀어 주다: 2016-08-08 09:22:32
원래의
1273명이 탐색했습니다.

상사가 항상 자바 프로그래머를 모집하라고 하면 어떻게 해야 하나요...?

그(늙은이)는 외부의 다른 진영의 엔지니어들과 너무 많은 이야기를 나눈 후 항상 나에게 와서 묻곤 했고, 당신은 항상 PHP(프레임워크)를 사용하고 있지만,

하지만 앞으로는 우리 웹 사이트 로드가 올라갑니다... PHP가 성능 측면에서 처리할 수 없거나 보안이 jsp(실제로는 java)만큼 좋지 않은 경우 어떻게 해야 합니까?

바빠서 이만 말할게... (지금 생각해보면 좀 단순하고 투박한 것 같은데...?)

내(원본) ) 답변은 다음과 같습니다.

귀하께서 제기하신 질문은 잘못된 제안입니다. 성능(부하)은 전혀 문제가 되지 않기 때문입니다...

이유는 매우 간단합니다. 장사는 O2O 장사인데 성능이 좋아지면(부하가 온다) 오프라인 고객들도 와야 한다는 뜻인데...

그렇다면 (만약) 우리가 바보가 아니라면 (우리가 특별히 바보가 아니라면) 현금 흐름이 가능해야 합니다...

제가 시사하는 바는: 사업을 시작하면 돈이 있어야 하고 PHP를 사용해도 충분한 하드웨어 장비를 구입할 수 있어야 한다는 것입니다. 부하가 높은 온라인 운영...

이제 곰곰히 생각해보니 좀 더 엄밀하게 생각해 봐야 할 것 같습니다...

이제 PHP의 성능과 부하 문제를 분석해 보겠습니다... ( 특히 자바캠프의 솔루션과 비교해 보세요) )

우선

모든 컴퓨터 언어 중 PHP 언어의 순위 변화를 살펴보겠습니다

"TIOBE 프로그래밍 언어 순위"에 따르면(목록은 통계적으로 제한이 있지만 여전히 좋은 참고 자료입니다) 2010년에 PHP는 세계 프로그래밍 언어 중 3위를 차지했습니다. PC 인터넷 시대에 웹 분야에서는 PHP 언어가 가장 강력한 언어라고 볼 수 있습니다.


한때 PHP 프로그래머들 사이에 떠도는 농담이 있었습니다.

어떤 여자: 이 포럼의 모든 사람을 만들 수 있습니다. 싸우면 같이 밥 먹을게
PHP 프로그래머: PHP는 세계 최고의 언어입니다!
어떤 포럼이 온갖 말다툼으로 폭발했다...
어떤 여자: 내가 설득했으니까 가자!
PHP 프로그래머: 오늘은 아닙니다. PHP가 최고의 언어임에 틀림없다고 설득해야 합니다.

자, 본론으로 들어가겠습니다. 언어 자체는 좋거나 나쁘지 않습니다. 단지 사용되는 시나리오에서 다양한 문제를 해결할 뿐입니다. 인터넷 시대는 모바일 인터넷이 등장하면서 불과 4년 만에 모바일 기술의 발전이 전 세계를 휩쓸었습니다. 동시에 다양한 언어가 등장하고 있으며 한때 영광이었던 PHP는 원래 프로그래밍 언어 목록(2014년 12월 목록)에서 6위로 떨어졌습니다. 그 결과, PHP를 욕하는 목소리가 속속 등장했습니다.


그런데 Niao 형제(PHP 언어 개발자 중 한 명인 Hui Xinchen)가 2014년 Qcon에서 데이터를 공유하여 세계 100만 위 안에 들었습니다. 웹사이트 중 81.3%가 PHP를 웹 서버 스크립트 언어로 사용하고 있는데, 이는 2013년 같은 기간의 78.3%와 비교됩니다. 즉, 웹 서비스에서 PHP의 사용은 줄어들지 않았지만, 모바일 인터넷 물결에서는 다른 언어 기술 응용 프로그램이 많이 추가되어 희석되었습니다.

최근 PHP7과 HHVM의 성능 비교가 뜨거운 논란을 불러일으키고 있습니다. 어느 쪽이 PHP 성능 향상의 미래인지 모두가 논의하고 주목하고 있습니다.

HHVM(HipHop Virtual Machine)의 유래

HHVM은 JIT 컴파일 등의 기술을 활용해 PHP 코드의 실행 성능을 획기적으로 향상시키는 오픈소스 PHP 가상머신이다. 현재 네이티브 PHP 코드 버전의 실행 성능이 5~10배 향상될 수 있다는 소문이 있습니다.

HHVM은 Facebook에서 시작되었습니다. Facebook의 초기 코드 중 상당수는 PHP를 사용하여 개발되었습니다. 그러나 비즈니스가 급속히 발전하면서 PHP 실행 효율성이 점점 더 분명한 문제가 되었습니다. 페이스북은 실행 효율성을 최적화하기 위해 2008년부터 PHP 실행 엔진인 HipHop을 사용하기 시작했습니다. 이는 원래 페이스북의 대용량 PHP 코드를 C++로 변환하여 성능을 향상하고 리소스를 절약할 수 있도록 설계되었습니다. HipHop을 사용한 PHP 코드의 성능이 여러 번 향상되었습니다. 이후 페이스북은 힙합 플랫폼을 오픈소스화해 점차적으로 현재의 HHVM으로 발전시켰다.

1. PHP는 왜 느린가요?

PHP는 C/C++ 수준 언어보다 느립니다. 사실 PHP 언어는 원래 컴퓨팅 집약적인 애플리케이션 시나리오를 해결하도록 설계되지 않았습니다. PHP는 개발 효율성을 높이기 위해 실행 효율성을 희생한다는 것을 대략적으로 이해할 수 있습니다.

우리는 PHP의 가장 큰 특징이 약한 유형 기능이라는 것을 알고 있습니다. 즉, 변수를 마음대로 정의한 다음 이를 다양한 유형의 데이터에 마음대로 할당할 수 있다는 것입니다. C 언어에서 int 정수를 예로 들어보겠습니다.

int num = 200; // 일반적으로 4바이트

그러나 PHP가 동일한 변수를 정의하는 경우 실제 해당 저장 구조는 다음과 같습니다. :


이 구조는 C 변수보다 훨씬 많은 메모리를 차지합니다. PHP에서는 다음과 같이 정의됩니다.

$a = 200;/ /이 변수는 실제로 C 변수에 비해 저장 공간을 몇 배나 차지합니다.

사실 PHP의 경우 어떤 종류의 데이터가 저장되든 위에서 언급한 '킬링(killing)' 구조를 이용해 구현됩니다. PHP 프로그래머의 변수 유형 "침입"과 호환되기 위해 PHP는 개발자에게는 친숙했지만 실행 엔진에는 잔인했습니다. 단일 변수의 메모리 소비는 아직 명확하지 않을 수 있습니다. PHP 배열을 사용하면 복잡성이 기하급수적으로 증가합니다(배열 구현은 HashTable입니다). 그런 다음 Zend 엔진이 실행되면 이러한 PHP 코드는 opcode(PHP의 중간 바이트 코드, 형식이 어셈블리와 다소 유사)로 컴파일되고 Zend 엔진에 의해 한 줄씩 해석되고 실행됩니다.

문자열 연결 작업이든 단순한 배열 수정 등이든 거의 "PHP 프로그래머의 한 마디만 하면 Zend 엔진이 무너진다"는 리듬에 가깝습니다. 따라서 동일한 작업에 대해 PHP는 C보다 CPU, 메모리 등 시스템 리소스를 더 많이 소비합니다. 또한 자동 메모리 재활용, 변수 유형 판단 등이 있어 시스템 리소스 소비가 증가합니다.

예를 들어, 순수 PHP에 구현된 빠른 정렬 기능과 기본 정렬 기능을 사용하여 10,000개의 정수를 정렬하여 시간이 많이 걸리는 비교 결과는 다음과 같습니다.


기본 정렬에는 3.44ms가 걸리는 반면, 우리가 직접 구현한 PHP 함수 정렬에는 68.79ms가 걸립니다. 우리는 둘 사이의 실행 효율성에 큰 차이가 있음을 발견했습니다. 내 테스트 방법은 전체 PHP 스크립트의 시작부터 끝까지의 시간이 아닌 함수가 실행되기 전후의 시간 간격을 계산하는 것입니다. PHP 스크립트 시작 및 종료 프로세스 자체에는 일련의 초기화 및 정리 작업이 포함되며, 이 작업에도 많은 시간이 소요됩니다.


일반적으로 PHP 실행 효율성 순위는 다음과 같습니다.

  1. 가장 빠른 것은 PHP 언어 구조(isset, echo 등), PHP 언어의 일부입니다(전혀 함수가 아닙니다).
  2. 그럼 더 빠른 것은 PHP의 기본 기능과 확장 기능입니다. Zend API를 기반으로 하는 PHP 확장은 C로 기능을 구현하며 실행 효율성은 C++/Java와 동일합니다.
  3. 정말 느린 것은 PHP를 통해 직접 작성하는 코드와 함수입니다. 예를 들어 순수 PHP로 구현된 상대적으로 무거운 프레임워크를 사용하는 경우 프레임워크 자체에 많은 모듈이 있기 때문에 언어 수준에서 실행 효율성이 저하되고 더 많은 메모리를 차지하게 됩니다. (국내 Yaf 프레임워크를 확장하여 구현하기 때문에 순수 PHP로 작성된 프레임워크에 비해 실행 효율성이 훨씬 빠릅니다.)


정상에서 상황에 따라, 특히 웹 시스템 트래픽이 상대적으로 큰 시나리오에서는 복잡한 논리 계산이 포함된 기능을 구현하기 위해 PHP를 사용하지 않는 것이 좋습니다. 따라서 PHP 프로그래머는 PHP의 다양한 기본 기능과 다양한 확장에 대해 비교적 폭넓게 이해해야 합니다. 특정 기능 구현 시나리오에서는 이를 구현하기 위해 복잡한 PHP 코드 스택을 직접 작성하는 대신 더 많은 기본 솔루션(기본 인터페이스 또는 확장)을 찾아야 합니다. 기능의 종류.

PHP 확장 개발 능력이 충분하다면 이러한 유형의 비즈니스 기능을 PHP 확장으로 다시 작성하면 코드 실행 효율성도 크게 향상됩니다. 이것은 매우 좋은 방법이며 PHP 최적화에도 널리 사용됩니다. 그러나 자체 작성 PHP 비즈니스 개발의 단점도 분명합니다.

  1. 확장 개발에는 시간이 오래 걸리고 요구 사항이 변경되면 수정이 복잡해집니다. 작성이 잘못되면 웹 서비스의 안정성에 영향을 미칠 수 있습니다. (예를 들어 Apache의 작업자 모드에서 다중 스레드 시나리오에서 중단되면 동일한 프로세스의 다른 일반 하위 스레드에 영향을 미칩니다. 다중 스레드 웹 모드인 경우 쓰기 확장이 스레드 안전을 지원해야 합니다. )
  2. PHP 버전을 업그레이드할 때 확장 기능이 추가 호환성 작업을 수행해야 할 수도 있습니다.
  3. 인원 변경 후 유지관리 및 인수 비용도 상대적으로 높습니다.

실제로 일선 인터넷 기업들 사이에서는 PHP 확장을 추가하는 것이 아니라 C/C++로 독립적으로 서비스 서버를 작성하고 PHP가 서비스 서버와 통신하는 것이 더 일반적인 해결책입니다. 소켓을 통해 비즈니스 처리는 PHP 자체를 비즈니스와 결합하지 않습니다.

그러나 웹 서비스의 성능 병목 현상의 대부분은 네트워크 전송 및 기타 서비스 서버(예: MySQL 등)의 시간 소모에 있습니다. PHP 실행에 소요되는 시간은 극히 일부분입니다. 전체적인 시간이 많이 소요되므로 비즈니스 관점에서 보면 그 영향이 명확하지 않을 수 있습니다.

2. HHVM이 PHP 실행 성능을 향상시키는 방법

HHVM이 PHP 성능을 향상시키는 방법은 Zend 엔진을 교체하여 PHP 중간 바이트코드(HHVM이 자체 형식의 중간 바이트코드를 생성함)를 생성하는 것입니다. JIT를 통해 실행을 위해 기계어 코드로 변환됩니다(Just In Time, Just-In-Time 컴파일은 소프트웨어 최적화 기술로, 바이트코드가 실행 중일 때 기계어 코드로 컴파일된다는 의미). Zend 엔진의 기본 접근 방식은 먼저 이를 opcode로 컴파일한 다음 하나씩 실행하는 것입니다. 일반적으로 각 명령은 C 언어 수준 함수에 해당합니다. 다수의 반복되는 opcode(순수 PHP로 작성된 코드 및 함수)를 생성하면 Zend는 이러한 C 코드를 하나씩 여러 번 실행합니다. JIT가 하는 일은 한 단계 더 나아가 런타임에 반복적으로 실행되는 다수의 바이트코드를 기계어 코드로 컴파일하여 실행 효율성을 높이는 것입니다. 일반적으로 JIT를 트리거하는 조건은 코드나 함수가 여러 번 호출된다는 것입니다.


일반적인 PHP 코드는 변수의 유형을 고정할 수 없기 때문에 유형을 결정하는 별도의 논리 코드를 추가해야 합니다. 이 PHP 코드는 CPU 실행에 도움이 되지 않습니다. 그리고 최적화. 따라서 HHVM은 일반적으로 변수 유형을 수정하고 가상 머신의 컴파일 및 실행을 용이하게 하기 위해 Hack 작성 방법(특정 기능과 호환되도록 추가된 추가 기술 코드)이 포함된 PHP 코드를 "협력"해야 합니다. PHP는 모든 유형을 하나의 형식으로 수용하는 것을 추구하는 반면 Hack은 특정 유형으로 수용되는 모든 것을 표시할 수 있습니다.

PHP 코드 Hack 작성 예:


위 예에서는 PHP 코드가 주로 변수 유형으로 추가됩니다. Hack 글쓰기의 전체적인 방향은 기존의 '동적' 글쓰기 방식을 '정적' 글쓰기 방식으로 변경하여 HHVM과 협력하는 것입니다.

HHVM은 높은 성능으로 많은 주목을 받았고, 일부 1위 인터넷 기업들도 이를 따라잡기 시작했다. 순수 언어 실행 성능 테스트 결과로 볼 때, HHVM은 개발 중인 PHP7 버전보다 훨씬 앞서 있습니다.


그러나 특정 비즈니스 시나리오의 관점에서 볼 때 HHVM과 PHP7의 격차는 그리 크지 않습니다. WordPress 오픈 소스 블로그 홈페이지를 테스트 시나리오로 사용합니다. , 그들은 현재 격차가 크지 않습니다.


그러나 PHP7은 아직 개발 중입니다. 사용 가능한 기술 솔루션으로 판단하면 현재 HHVM이 약간 더 좋습니다. 그러나 HHVM의 배포 및 적용에는 몇 가지 문제가 있습니다.

  1. 서비스 배포가 복잡하고 일정한 유지 관리 비용이 발생합니다.
  2. PHP 네이티브 코드는 완전히 지원되지 않으며 PHP 확장도 제대로 호환되어야 합니다.
  3. HHVM은 새로운 가상 머신으로 장시간 실행 시 메모리 누수가 발생할 수 있습니다. (일류 인터넷 업체에서는 이 기술을 적용할 때 자체적으로 패치를 해서 메모리 누수를 해결한다고 합니다.)

HHVM은 결국 비교적 새로운 오픈소스 프로젝트라 아직은 시간이 좀 걸립니다. 성숙하다.

PHP7의 성능 혁신

이번 버전에서는 PHP가 오랫동안 비판을 받아온 성능 문제가 대폭 개선되었습니다. 해당 버전에는 PHP6가 없다고 하는데, 이후에는 혼란을 피하기 위해 대부분의 기능이 PHP7에서 구현될 예정입니다. (몇 년 전에는 PHP6에 관한 책도 읽었습니다.)

1. PHP7 소개

2015년 10월까지는 PHP7의 정식 버전이 출시되지 않을 수도 있지만, 테스트 버전은 내년 6월 출시 후 3~4개월간 품질보증을 거친다.

PHP 커뮤니티의 프로젝트 계획은 다음과 같습니다.


아직 개발 중인 프로젝트이므로 표에서 기능 설명을 볼 수 있는 것은 모두 상대적으로 모호합니다. 확실히 더 많은 기능이 있지만 아직 발표되지 않았습니다. 다음은 PHP 커뮤니티에서 가져온 것입니다. PHP7은 개발 중인 프로젝트이므로 정확하지 않을 수 있지만 살펴보는 데 방해가 되는 것은 아닙니다.

  1. PHPNG(PHP 차세대, 차세대 PHP), Zend 실행 엔진 자체에 대한 다양한 성능 최적화, 그중 JIT가 Zend Opcache 구성 요소에서 구현될 수 있습니다.
  2. AST(Abstract Syntax Tree, Abstract Syntax Tree)는 인터프리터에서 직접 opcode를 내보내는 방식을 대체하기 위해 PHP 컴파일 프로세스에 미들웨어를 도입하는 것을 목표로 합니다. 인터프리터와 컴파일러를 분리하면 많은 Hack 코드를 줄일 수 있으며 동시에 구현을 더 쉽게 이해하고 유지 관리할 수 있습니다.
  3. 균일 변수 구문(통합 변수 구문)은 내부적으로 일관되고 완전한 변수 구문을 도입하여 PHP 파서가 다양한 유형의 변수를 더 완벽하게 지원할 수 있도록 합니다. 변수 $$a 등과 같은 일부 변수의 사용법을 조정해야 합니다.
  4. NaN, Infinity, <<, >> 등 정수 의미론(정수 의미론)을 지원하고 list() 등의 일관성을 수정합니다.

위 기능 중 가장 기대되는 것은 PHPng의 성능 최적화입니다. PHP 커뮤니티에서 일부 성능 속도 테스트 데이터를 공개했습니다. 데이터 관점에서 보면 PHPng의 실행 성능은 프로젝트 초기에 비해 거의 두 배 향상되었습니다. 이 결과는 이미 매우 좋습니다. 더욱이 가장 중요한 것은 아직 완료되지 않은 PHP7 최적화 계획이 많다는 것입니다. 모든 것이 완료되면 더 높은 성능의 PHP7을 볼 수 있을 것이라고 믿습니다.

이 속도 테스트 데이터는 PHP 커뮤니티(wiki.php.net/phpng)에서 가져온 것이며, 데이터의 일부가 가로채어졌습니다.


현재 PHP5.6 버전에서는 10월 PHPNG의 성능 향상이 매우 뚜렷했습니다:


간단한 번역:

  • 종합 테스트 속도가 35% 향상되었습니다.
  • 실제 적용 시나리오에서는 20%~70% 속도 향상이 있습니다(워드프레스 홈페이지는 60% 향상됨)
  • 메모리 소비 감소
  • 가장 일반적으로 사용되는 지원 SAPI
  • 리소스 할당에 바인딩된 대부분의 PHP 확장 지원(69개 완료, 6개 마이그레이션 예정)
  • HHVM3.3.0

PHP와 비슷한 실행 속도를 제공합니다. 약한 타입 논란

PHP에는 논란의 여지가 많은 기능이 있지만, 언어 버전이 출시되고 개선되면서 기능과 특징에 대한 비판이 줄어들기 시작했습니다. 그러나 PHP의 "약한 유형" 기능은 분명히 더 논란의 여지가 있었습니다. HHVM이 Hack을 통해 "약한 유형" 기능을 직접 "제거"했다는 사실에서 HHVM이 "약한 유형" 기능을 좋아하지 않는다는 것을 알 수 있습니다. 그러나 많은 PHP 프로그래머의 눈에는 이것이 PHP의 중요한 장점 중 하나입니다. PHP의 변수는 캐주얼하고 우아하게 설계되었으며 모든 것을 수용할 수 있습니다. 언어가 더 단순해 보이지 않나요?

실제로 일부 사람들은 이것이 심각한 문제라고 생각하며 "약한 타이핑"에 대한 비판은 다음과 같습니다.

  1. "엄격한" 언어에서는 일반적으로 미리 정의되어 있습니다. 변수의 타입은 처음부터 끝까지 정해져 있고, 사용 범위도 정해져 있다. PHP 변수의 경우 일반적으로 이름만 볼 수 있으며 대부분의 유형은 미리 정의할 수 없으며 마음대로 변경할 수 있습니다. (메모리 할당 관리가 쉽지 않음)
  2. 약형 기능과 호환되기 위해서는 PHP가 유형 판단, 유형 변환, 저장 방법 등을 포함하여 많은 양의 호환 코드를 구현해야 하는데, 이는 언어의 내부 복잡성을 증가시킵니다. (낮은 실행 효율성)
  3. 변수의 유형을 제어할 수 없습니다. 실행 과정에서 "암시적 유형 변환"이 많이 발생하여 예측할 수 없는 결과가 쉽게 발생할 수 있습니다. (PHP 타입 변환은 꼭 숙지해야 하는 포인트라는 점을 여기서 강조할 필요가 있습니다. 다양한 타입을 서로 변환하는 것은 특히 PHP를 처음 접하는 학생들에게 많은 문제를 일으킬 수 있습니다.)

그들은 둘 중 어느 것도 "당신이 보는 것이 당신이 얻는 것"이라는 단순성을 따르지 않으며 엄격한 문법을 ​​가진 언어가 더 효율적이고 "이해"하기 쉽다고 믿습니다.

Javascript와 같은 언어도 이 문제에 대해 동일한 기능을 수행하기 때문에 비슷한 비판을 받았습니다. 그러나 언어가 결국 대규모로 사용된다면 그 언어에는 반드시 그 이유가 있을 것입니다. PHP는 웹 서비스 개발을 위해 선택되는 스크립팅 언어가 되었고, Javascript가 웹 프론트엔드 분야를 직접적으로 지배하게 되었습니다. 개발자들이 이를 선택했다는 것은 우연이 아닙니다. 프로그래밍 언어는 인간과 기계 사이의 다리이며, 궁극적으로 추구하는 것은 “누구나 프로그래밍할 수 있다”라는 원대한 목표를 달성하는 것입니다.

언어 개발의 역사를 통틀어 우리는 0과 1이라는 기계어에서 시작하여 어셈블리 언어, C 언어, 동적 스크립팅 언어 PHP로 발전했습니다. 실행 효율성은 기하급수적으로 감소하지만 학습 임계값도 기하급수적으로 감소합니다. PHP 언어는 C의 메모리 관리 및 포인터의 복잡성을 보호할 뿐만 아니라 변수 유형의 복잡성도 더욱 보호합니다. 프로젝트 개발의 효율성을 높이고 학습의 문턱을 낮추는 동시에 일정량의 실행 성능을 희생합니다. 그런 다음 HHVM의 Hack은 변수의 복잡성을 다시 도입하면서 "원시로의 복귀" 느낌을 줍니다. 물론, 서로 다른 언어는 서로 다른 시나리오의 문제를 해결하므로 일반화할 수 없습니다.


요약

HHVM의 PHP 성능 향상이 인상적이며, 열심히 일하는 PHP7이 매우 기대됩니다. 둘 다 훌륭한 오픈 소스 프로젝트이며 지속적으로 발전하고 발전하고 있습니다. 현재로서는 PHP7의 공식 버전이 출시되려면 아직 시간이 많이 걸리기 때문에 현재 성능 최적화 솔루션으로 선택하는 것은 당연히 HHVM입니다. 그러나 개인적으로 저는 PHP7이 PHP 코드와 이전 버전과 더 호환되기 때문에 더 낙관적입니다. 둘 사이에 성능 차이가 크지 않다면 더 간단한 것을 선택하겠습니다.

참고 자료:

  • https://wiki.php.net/rfc/php7timeline
  • https://wiki.php.net/phpng
  • http://hhvm.com/

위 내용은 컨텐츠 측면을 포함하여 고성능을 달성하기 위해 HHVM을 사용하여 PHP Food 및 Clothing Parent 3-php를 소개했습니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

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