뷰
번역일: 2026년 6월 20일
뷰
소개
라우트나 컨트롤러에서 HTML 전체를 문자열로 직접 반환하는 것은 현실적이지 않습니다. 뷰를 사용하면 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 / Vue로 뷰 작성하기
많은 개발자들이 PHP 기반의 Blade 대신 React나 Vue로 프론트엔드 템플릿을 작성하는 것을 선호합니다. Laravel은 Inertia 덕분에 이를 손쉽게 지원합니다. Inertia는 SPA 구축의 복잡함 없이 React / Vue 프론트엔드와 Laravel 백엔드를 자연스럽게 연결해 주는 라이브러리입니다.
스타터 킷인 Breeze와 Jetstream은 Inertia 기반의 Laravel 프로젝트를 빠르게 시작할 수 있는 좋은 출발점을 제공합니다. 또한 Laravel Bootcamp에서는 Vue와 React 예제를 포함하여 Inertia를 활용한 Laravel 애플리케이션 전체 구축 과정을 확인할 수 있습니다.
뷰 생성 및 렌더링
뷰는 resources/views 디렉터리에 .blade.php 확장자를 가진 파일을 직접 생성하거나, make:view Artisan 명령어를 사용해 만들 수 있습니다.
php artisan make:view greeting.blade.php 확장자는 해당 파일이 Blade 템플릿임을 프레임워크에 알려줍니다. Blade 템플릿에는 HTML과 함께 값 출력, 조건문, 반복문 등을 간결하게 작성할 수 있는 Blade 디렉티브가 포함됩니다.
뷰를 만든 뒤에는 라우트나 컨트롤러에서 전역 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; ?>)
view 헬퍼에 배열 전체를 넘기는 대신, 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');
}
}뷰 컴포저
뷰 컴포저는 특정 뷰가 렌더링될 때마다 자동으로 실행되는 콜백 또는 클래스 메서드입니다. 여러 라우트나 컨트롤러에서 동일한 뷰를 반환하면서 항상 특정 데이터가 필요한 경우, 뷰 컴포저를 사용하면 그 로직을 한 곳에 깔끔하게 정리할 수 있습니다.
비유: 뷰 컴포저는 "뷰가 화면에 나타나기 직전에 실행되는 훅"이라고 생각하면 이해하기 쉽습니다.
뷰 컴포저는 보통 서비스 프로바이더 안에서 등록합니다. 아래 예시에서는 App\Providers\ViewServiceProvider를 별도로 생성했다고 가정합니다.
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 ViewServiceProvider 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) {
// ...
});
}
}WARNING
뷰 컴포저 등록을 위한 새 서비스 프로바이더를 생성했다면, config/app.php의 providers 배열에 해당 서비스 프로바이더를 추가해야 합니다.
컴포저를 등록하면, 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
);composer 메서드는 와일드카드 문자 *도 지원합니다. 모든 뷰에 컴포저를 적용하려면 다음과 같이 사용하세요.
use Illuminate\Support\Facades;
use Illuminate\View\View;
Facades\View::composer('*', function (View $view) {
// ...
});뷰 크리에이터
뷰 크리에이터는 뷰 컴포저와 매우 유사하지만, 뷰가 렌더링되기 직전이 아니라 인스턴스화된 직후 즉시 실행된다는 차이가 있습니다. 뷰 크리에이터를 등록하려면 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