뷰
업데이트됨번역일: 2026년 9월 17일
이 페이지는 원문이 업데이트되어 번역이 갱신되었습니다.
- 원문 수정
- 2026년 9월 17일
- 번역 갱신
- 2026년 9월 17일
뷰
소개
라우트나 컨트롤러에서 HTML 문서 전체를 문자열로 직접 반환하는 것은 실용적이지 않습니다. 다행히 뷰(view)를 사용하면 모든 HTML을 별도의 파일로 분리해서 관리할 수 있습니다.
뷰는 컨트롤러 또는 애플리케이션 로직과 화면 표시 로직을 분리하는 역할을 하며, resources/views 디렉터리에 저장됩니다. Laravel에서는 보통 Blade 템플릿 언어로 뷰 템플릿을 작성합니다. 간단한 뷰는 다음과 같은 모습입니다.
<!-- resources/views/greeting.blade.php 에 저장된 뷰 -->
<html>
<body>
<h1>Hello, {{ $name }}</h1>
</body>
</html>이 뷰는 resources/views/greeting.blade.php에 저장되어 있으므로, 전역 view 헬퍼를 사용해 다음과 같이 반환할 수 있습니다.
Route::get('/', function () {
return view('greeting', ['name' => 'James']);
});NOTE
Blade 템플릿 작성법이 더 궁금하신가요? Blade 문서에서 자세한 내용을 확인해 보세요.
React / Svelte / Vue로 뷰 작성하기
Blade를 이용한 PHP 기반 템플릿 대신, 많은 개발자들이 React, Svelte, Vue로 프론트엔드 템플릿을 작성하는 방식을 선호하기 시작했습니다. Laravel은 Inertia라는 라이브러리를 통해 이러한 작업을 매끄럽게 지원합니다. Inertia를 사용하면 SPA를 구축할 때 흔히 겪는 복잡함 없이도 React / Svelte / Vue 프론트엔드를 Laravel 백엔드와 쉽게 연결할 수 있습니다.
React, Svelte, Vue 스타터 키트를 사용하면 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' => 'James']);
});View 파사드를 사용해도 뷰를 반환할 수 있습니다.
use Illuminate\Support\Facades\View;
return View::make('greeting', ['name' => 'James']);여기서 볼 수 있듯, view 헬퍼의 첫 번째 인수는 resources/views 디렉터리 내 뷰 파일의 이름에 해당합니다. 두 번째 인수는 해당 뷰에서 사용할 수 있도록 전달되는 데이터 배열입니다. 이 예제에서는 name 변수를 전달했으며, 이 값은 Blade 문법을 통해 뷰에 출력됩니다.
중첩된 뷰 디렉터리
뷰는 resources/views 디렉터리 내의 하위 디렉터리에 중첩해서 저장할 수도 있습니다. 이렇게 중첩된 뷰는 "점(dot)" 표기법으로 참조합니다. 예를 들어 뷰가 resources/views/admin/profile.blade.php에 저장되어 있다면, 다음과 같이 애플리케이션의 라우트나 컨트롤러에서 반환할 수 있습니다.
return view('admin.profile', $data);WARNING
뷰 디렉터리 이름에는 . 문자를 사용하면 안 됩니다.
가장 먼저 존재하는 뷰 생성하기
View 파사드의 first 메서드를 사용하면, 주어진 뷰 배열 중 가장 먼저 실제로 존재하는 뷰를 생성할 수 있습니다. 이는 애플리케이션이나 패키지에서 뷰를 커스터마이징하거나 재정의(override)할 수 있게 허용할 때 유용합니다.
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' => 'Victoria']);이런 방식으로 정보를 전달할 때, 데이터는 키/값 쌍으로 이루어진 배열이어야 합니다. 뷰에 데이터를 전달한 후에는 <?php echo $name; ?>처럼 데이터의 키를 사용해 뷰 안에서 각 값에 접근할 수 있습니다.
view 헬퍼 함수에 데이터 배열 전체를 전달하는 대신, with 메서드를 사용해 뷰에 개별 데이터를 하나씩 추가할 수도 있습니다. with 메서드는 뷰 객체의 인스턴스를 반환하므로, 뷰를 반환하기 전에 메서드를 계속 체이닝할 수 있습니다.
return view('greeting')
->with('name', 'Victoria')
->with('occupation', 'Astronaut');모든 뷰에 데이터 공유하기
경우에 따라 애플리케이션에서 렌더링되는 모든 뷰에 특정 데이터를 공유해야 할 때가 있습니다. 이런 경우 View 파사드의 share 메서드를 사용하면 됩니다. 일반적으로 share 메서드 호출은 서비스 프로바이더의 boot 메서드 안에 작성합니다. App\Providers\AppServiceProvider 클래스에 작성해도 되고, 별도의 서비스 프로바이더를 새로 만들어 그곳에 작성해도 됩니다.
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
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());
}
}보시다시피 모든 뷰 컴포저는 서비스 컨테이너를 통해 해석(resolve)되므로, 컴포저의 생성자에서 필요한 의존성을 자유롭게 타입힌트로 지정할 수 있습니다.
여러 뷰에 컴포저 연결하기
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)"는 뷰 컴포저와 매우 유사하지만, 뷰가 렌더링되기 직전이 아니라 뷰 인스턴스가 생성된 직후에 즉시 실행된다는 차이가 있습니다. 뷰 크리에이터를 등록하려면 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