본문으로 건너뛰기
버전: master

뷰 (Views)

소개 (Introduction)

물론 라우트나 컨트롤러에서 전체 HTML 문서 문자열을 직접 반환하는 방식은 실용적이지 않습니다. 다행히도 뷰(View) 를 사용하면 모든 HTML을 별도의 파일로 분리하여 관리할 수 있습니다.

뷰는 컨트롤러 / 애플리케이션 로직과 화면 표시(presentation) 로직을 분리합니다. 뷰 파일은 resources/views 디렉터리에 저장됩니다. Laravel에서는 보통 Blade 템플릿 언어를 사용하여 뷰 템플릿을 작성합니다. 간단한 뷰 예시는 다음과 같습니다.

<!-- View stored in 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 documentation을 참고하여 시작하십시오.

React / Svelte / Vue에서 뷰 작성하기

많은 개발자들은 Blade를 사용해 PHP로 프런트엔드 템플릿을 작성하기보다는 React, Svelte, 또는 Vue를 사용해 템플릿을 작성하는 방식을 선호하기 시작했습니다. Laravel은 Inertia 덕분에 이러한 방식을 매우 쉽게 구현할 수 있습니다. Inertia는 일반적인 SPA 구축 과정의 복잡함 없이 React / Svelte / Vue 프런트엔드를 Laravel 백엔드와 간단하게 연결할 수 있도록 해주는 라이브러리입니다.

Laravel의 React, Svelte, Vue 애플리케이션 스타터 키트는 Inertia 기반 Laravel 애플리케이션을 시작하기 위한 훌륭한 출발점을 제공합니다.

뷰 생성 및 렌더링 (Creating and Rendering Views)

애플리케이션의 resources/views 디렉터리에 .blade.php 확장자를 가진 파일을 생성하거나 make:view Artisan 명령어를 사용하여 뷰를 생성할 수 있습니다.

php artisan make:view greeting

.blade.php 확장자는 해당 파일이 Blade template를 포함하고 있음을 프레임워크에 알려줍니다. Blade 템플릿은 HTML과 함께 Blade 지시어(Directive)를 포함할 수 있으며, 이를 통해 값 출력, if 문 작성, 데이터 반복 처리 등을 쉽게 할 수 있습니다.

뷰를 생성한 후에는 전역 view 헬퍼를 사용하여 애플리케이션의 라우트나 컨트롤러에서 해당 뷰를 반환할 수 있습니다.

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

또는 View 파사드(Facade)를 사용해 반환할 수도 있습니다.

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 메서드를 사용하면 주어진 뷰 배열 중 존재하는 첫 번째 뷰를 생성할 수 있습니다. 이 기능은 애플리케이션이나 패키지에서 뷰를 사용자 정의하거나 덮어쓸 수 있도록 허용할 때 유용합니다.

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')) {
// ...
}

뷰에 데이터 전달 (Passing Data to Views)

앞의 예제에서 보았듯이, 배열 형태의 데이터를 전달하여 뷰에서 사용할 수 있게 만들 수 있습니다.

return view('greetings', ['name' => 'Victoria']);

이 방식으로 데이터를 전달할 때는 키 / 값 쌍(key / value pairs) 을 가진 배열이어야 합니다. 뷰에 데이터를 전달하면 뷰 내부에서 해당 키를 사용하여 값에 접근할 수 있습니다. 예를 들어 <?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;

class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*/
public function register(): void
{
// ...
}

/**
* Bootstrap any application services.
*/
public function boot(): void
{
View::share('key', 'value');
}
}

View Composer

View Composer는 뷰가 렌더링될 때 호출되는 콜백 또는 클래스 메서드입니다. 특정 뷰가 렌더링될 때마다 데이터를 바인딩해야 한다면 View Composer를 사용해 해당 로직을 하나의 위치에 정리할 수 있습니다. 특히 하나의 뷰가 여러 라우트나 컨트롤러에서 반환되며 항상 동일한 데이터가 필요할 때 유용합니다.

일반적으로 View Composer는 애플리케이션의 service providers 중 하나에 등록합니다. 이 예제에서는 App\Providers\AppServiceProvider에 등록한다고 가정합니다.

View 파사드의 composer 메서드를 사용해 View Composer를 등록할 수 있습니다. Laravel에는 클래스 기반 View Composer를 위한 기본 디렉터리가 제공되지 않으므로 원하는 구조로 자유롭게 정리할 수 있습니다. 예를 들어 app/View/Composers 디렉터리를 만들어 모든 View Composer를 저장할 수 있습니다.

<?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
{
/**
* Register any application services.
*/
public function register(): void
{
// ...
}

/**
* Bootstrap any application services.
*/
public function boot(): void
{
// Using class-based composers...
Facades\View::composer('profile', ProfileComposer::class);

// Using closure-based composers...
Facades\View::composer('welcome', function (View $view) {
// ...
});

Facades\View::composer('dashboard', function (View $view) {
// ...
});
}
}

Composer를 등록하면 profile 뷰가 렌더링될 때마다 App\View\Composers\ProfileComposer 클래스의 compose 메서드가 실행됩니다. Composer 클래스 예시는 다음과 같습니다.

<?php

namespace App\View\Composers;

use App\Repositories\UserRepository;
use Illuminate\View\View;

class ProfileComposer
{
/**
* Create a new profile composer.
*/
public function __construct(
protected UserRepository $users,
) {}

/**
* Bind data to the view.
*/
public function compose(View $view): void
{
$view->with('count', $this->users->count());
}
}

모든 View Composer는 service container를 통해 해결(resolve)되므로 Composer 생성자에서 필요한 의존성을 타입 힌트로 선언할 수 있습니다.

여러 뷰에 Composer 연결

composer 메서드의 첫 번째 인수로 뷰 배열을 전달하면 하나의 View Composer를 여러 뷰에 동시에 연결할 수 있습니다.

use App\Views\Composers\MultiComposer;
use Illuminate\Support\Facades\View;

View::composer(
['profile', 'dashboard'],
MultiComposer::class
);

또한 composer 메서드는 와일드카드 *를 지원하므로 모든 뷰에 Composer를 연결할 수도 있습니다.

use Illuminate\Support\Facades;
use Illuminate\View\View;

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

View Creator

View "Creator"는 View Composer와 매우 유사하지만, 뷰가 렌더링되기 직전이 아니라 뷰 인스턴스가 생성되는 즉시 실행된다는 차이가 있습니다.

View Creator를 등록하려면 creator 메서드를 사용합니다.

use App\View\Creators\ProfileCreator;
use Illuminate\Support\Facades\View;

View::creator('profile', ProfileCreator::class);

뷰 최적화 (Optimizing Views)

기본적으로 Blade 템플릿 뷰는 요청 시(on demand) 컴파일됩니다. 뷰를 렌더링하는 요청이 실행되면 Laravel은 먼저 컴파일된 뷰가 존재하는지 확인합니다. 파일이 존재하면 컴파일되지 않은 원본 뷰가 컴파일된 뷰보다 더 최근에 수정되었는지 확인합니다. 만약 컴파일된 뷰가 없거나 원본 뷰가 더 최근에 수정되었다면 Laravel은 뷰를 다시 컴파일합니다.

요청 중에 뷰를 컴파일하면 성능에 약간의 영향을 줄 수 있습니다. 따라서 Laravel은 애플리케이션에서 사용하는 모든 뷰를 미리 컴파일(precompile) 할 수 있도록 view:cache Artisan 명령어를 제공합니다. 성능 향상을 위해 배포 과정(deployment process)의 일부로 이 명령어를 실행하는 것이 좋습니다.

php artisan view:cache

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

php artisan view:clear