본문 바로가기

번역일: 2026년 6월 20일

소개

라우트나 컨트롤러에서 HTML 문자열 전체를 직접 반환하는 것은 현실적이지 않습니다. 뷰(View)는 HTML을 별도의 파일로 분리해 관리할 수 있게 해주는 편리한 방법입니다.

뷰는 컨트롤러(비즈니스 로직)와 화면 표현 로직을 분리하며, resources/views 디렉토리에 저장됩니다. Laravel에서 뷰 템플릿은 주로 Blade 템플릿 언어로 작성합니다. 간단한 뷰 파일은 다음과 같은 모습입니다.

<!-- resources/views/greeting.blade.php에 저장된 뷰 --> <html> <body> <h1>안녕하세요, {{ $name }}!</h1> </body> </html>

이 뷰는 resources/views/greeting.blade.php에 저장되어 있으므로, 전역 view 헬퍼 함수를 사용해 다음과 같이 반환할 수 있습니다.

Route::get('/', function () { return view('greeting', ['name' => '홍길동']); });

NOTE

Blade 템플릿 작성 방법이 궁금하다면 Blade 문서를 참고하세요.

React / Svelte / Vue로 뷰 작성하기

Blade 대신 React, Svelte, Vue로 프론트엔드 템플릿을 작성하려는 개발자도 많습니다. Laravel은 Inertia 덕분에 이 작업을 간단하게 처리할 수 있습니다. Inertia는 SPA 특유의 복잡한 API 설계 없이 React / Svelte / Vue 프론트엔드와 Laravel 백엔드를 자연스럽게 연결해주는 라이브러리입니다.

React, Svelte, Vue 애플리케이션 스타터 킷을 활용하면 Inertia 기반의 Laravel 프로젝트를 빠르게 시작할 수 있습니다.

뷰 생성 및 렌더링

뷰를 만들려면 resources/views 디렉토리에 .blade.php 확장자를 가진 파일을 직접 생성하거나, 다음 Artisan 명령어를 사용합니다.

php artisan make:view greeting

.blade.php 확장자는 Laravel 프레임워크에게 해당 파일이 Blade 템플릿임을 알려줍니다. Blade 템플릿은 HTML과 함께, 값 출력·조건문·반복문 등을 쉽게 작성할 수 있는 Blade 지시어(directive)를 포함합니다.

뷰를 만들었다면 라우트나 컨트롤러에서 전역 view 헬퍼 함수를 통해 반환할 수 있습니다.

Route::get('/', function () { return view('greeting', ['name' => '홍길동']); });

View 파사드를 사용해 반환할 수도 있습니다.

use Illuminate\Support\Facades\View; return View::make('greeting', ['name' => '홍길동']);

view 헬퍼의 첫 번째 인수는 resources/views 디렉토리 기준의 뷰 파일 이름이고, 두 번째 인수는 뷰에 전달할 데이터 배열입니다. 위 예시에서는 name 변수를 전달하며, 뷰에서는 Blade 문법으로 이 값을 출력합니다.

중첩 뷰 디렉토리

뷰는 resources/views 하위 디렉토리에 중첩해서 저장할 수 있습니다. 중첩된 뷰를 참조할 때는 .(점) 표기법을 사용합니다. 예를 들어, 뷰가 resources/views/admin/profile.blade.php에 저장되어 있다면 다음과 같이 반환합니다.

return view('admin.profile', $data);

WARNING

뷰 디렉토리 이름에는 . 문자를 사용할 수 없습니다.

존재하는 첫 번째 뷰 반환하기

View 파사드의 first 메서드를 사용하면, 전달한 뷰 배열 중 실제로 존재하는 첫 번째 뷰를 반환합니다. 애플리케이션이나 패키지에서 뷰를 커스터마이즈하거나 덮어쓸 수 있도록 할 때 유용합니다.

use Illuminate\Support\Facades\View; return View::first(['custom.admin', 'admin'], $data);

뷰 존재 여부 확인하기

특정 뷰가 존재하는지 확인하려면 View 파사드의 exists 메서드를 사용합니다. 뷰가 존재하면 true를 반환합니다.

use Illuminate\Support\Facades\View; if (View::exists('admin.profile')) { // ... }

뷰에 데이터 전달하기

앞선 예시에서 본 것처럼, 배열 형태로 데이터를 뷰에 전달할 수 있습니다.

return view('greetings', ['name' => '김철수']);

이 방식으로 전달된 데이터는 키/값 쌍의 배열이어야 하며, 뷰 내에서 해당 키를 변수명으로 사용해 <?php echo $name; ?>과 같이 접근할 수 있습니다.

배열 전체를 한 번에 전달하는 대신, with 메서드를 체이닝해 데이터를 개별적으로 추가할 수도 있습니다. with 메서드는 뷰 객체 인스턴스를 반환하므로 메서드 체이닝이 가능합니다.

return view('greeting') ->with('name', '김철수') ->with('occupation', '개발자');

모든 뷰에 데이터 공유하기

애플리케이션에서 렌더링되는 모든 뷰에 동일한 데이터를 공유해야 할 때가 있습니다. View 파사드의 share 메서드를 사용하면 됩니다. 일반적으로 서비스 프로바이더의 boot 메서드 안에서 호출합니다. App\Providers\AppServiceProvider에 추가하거나, 별도의 서비스 프로바이더를 만들어 관리해도 됩니다.

<?php namespace App\Providers; use Illuminate\Support\Facades\View; class AppServiceProvider extends ServiceProvider { /** * 애플리케이션 서비스를 등록합니다. */ public function register(): void { // ... } /** * 애플리케이션 서비스를 부트스트랩합니다. */ public function boot(): void { View::share('key', 'value'); } }

뷰 컴포저

뷰 컴포저(View Composer)는 특정 뷰가 렌더링될 때마다 자동으로 호출되는 콜백 또는 클래스 메서드입니다. 어떤 뷰가 렌더링될 때마다 항상 특정 데이터를 바인딩해야 한다면, 뷰 컴포저를 사용해 그 로직을 한곳에 모을 수 있습니다. 여러 라우트나 컨트롤러에서 동일한 뷰를 사용하고, 매번 같은 데이터가 필요한 경우에 특히 유용합니다.

뷰 컴포저는 보통 서비스 프로바이더 안에서 등록합니다. 아래 예시에서는 App\Providers\AppServiceProvider를 사용합니다.

View 파사드의 composer 메서드로 뷰 컴포저를 등록합니다. Laravel은 클래스 기반 뷰 컴포저를 위한 기본 디렉토리를 제공하지 않으므로, 원하는 방식으로 구성할 수 있습니다. 예를 들어 app/View/Composers 디렉토리를 만들어 관리하는 것이 일반적입니다.

<?php namespace App\Providers; use App\View\Composers\ProfileComposer; use Illuminate\Support\Facades; use Illuminate\Support\ServiceProvider; use Illuminate\View\View; class AppServiceProvider extends ServiceProvider { /** * 애플리케이션 서비스를 등록합니다. */ public function register(): void { // ... } /** * 애플리케이션 서비스를 부트스트랩합니다. */ public function boot(): void { // 클래스 기반 컴포저 등록 Facades\View::composer('profile', ProfileComposer::class); // 클로저 기반 컴포저 등록 Facades\View::composer('welcome', function (View $view) { // ... }); Facades\View::composer('dashboard', function (View $view) { // ... }); } }

이제 컴포저를 등록했으므로, profile 뷰가 렌더링될 때마다 App\View\Composers\ProfileComposer 클래스의 compose 메서드가 실행됩니다. 컴포저 클래스 예시는 다음과 같습니다.

<?php namespace App\View\Composers; use App\Repositories\UserRepository; use Illuminate\View\View; class ProfileComposer { /** * 새 프로필 컴포저 인스턴스를 생성합니다. */ public function __construct( protected UserRepository $users, ) {} /** * 뷰에 데이터를 바인딩합니다. */ public function compose(View $view): void { $view->with('count', $this->users->count()); } }

모든 뷰 컴포저는 서비스 컨테이너를 통해 의존성이 주입되므로, 생성자에서 필요한 의존성을 타입힌트로 선언해 사용할 수 있습니다.

여러 뷰에 컴포저 연결하기

composer 메서드의 첫 번째 인수로 뷰 이름 배열을 전달하면, 여러 뷰에 한 번에 컴포저를 연결할 수 있습니다.

use App\Views\Composers\MultiComposer; use Illuminate\Support\Facades\View; View::composer( ['profile', 'dashboard'], MultiComposer::class );

* 와일드카드를 사용하면 모든 뷰에 컴포저를 연결할 수도 있습니다.

use Illuminate\Support\Facades; use Illuminate\View\View; Facades\View::composer('*', function (View $view) { // ... });

뷰 크리에이터

뷰 크리에이터(View Creator)는 뷰 컴포저와 매우 유사하지만, 렌더링 직전이 아니라 뷰 인스턴스가 생성된 직후 즉시 실행된다는 점이 다릅니다. 크리에이터를 등록하려면 creator 메서드를 사용합니다.

use App\View\Creators\ProfileCreator; use Illuminate\Support\Facades\View; View::creator('profile', ProfileCreator::class);

뷰 최적화

기본적으로 Blade 뷰는 요청이 들어올 때 필요에 따라 컴파일됩니다. 뷰를 렌더링하는 요청이 실행되면 Laravel은 컴파일된 뷰 파일이 존재하는지 확인합니다. 파일이 있으면, 원본 뷰 파일이 컴파일된 파일보다 최근에 수정되었는지도 확인합니다. 컴파일된 파일이 없거나 원본이 더 최근에 수정된 경우, Laravel이 뷰를 다시 컴파일합니다.

요청 처리 중에 뷰를 컴파일하면 성능에 약간의 부담이 생길 수 있습니다. 이를 해결하기 위해 Laravel은 view:cache Artisan 명령어를 제공합니다. 이 명령어는 애플리케이션에서 사용하는 모든 뷰를 미리 컴파일합니다. 성능 향상을 위해 배포 프로세스에 이 명령어를 포함시키는 것을 권장합니다.

php artisan view:cache

뷰 캐시를 삭제하려면 view:clear 명령어를 사용합니다.

php artisan view:clear

이 문서는 Laravel 공식 문서(MIT)를 한국 개발자를 위해 번역·재구성한 것입니다.

번역일: 2026년 6월 20일