본문 바로가기

서비스 프로바이더

번역일: 2026년 6월 20일

서비스 프로바이더

소개

서비스 프로바이더는 Laravel 애플리케이션 부트스트래핑의 핵심입니다. 여러분이 만든 애플리케이션은 물론, Laravel의 모든 핵심 서비스도 서비스 프로바이더를 통해 초기화됩니다.

여기서 "부트스트래핑"이란 무엇을 의미할까요? 간단히 말해, 서비스 컨테이너 바인딩, 이벤트 리스너, 미들웨어, 라우트 등을 등록하는 모든 작업을 뜻합니다. 서비스 프로바이더는 애플리케이션의 설정과 초기화를 한 곳에서 관리하는 중심축 역할을 합니다.

Laravel 프로젝트의 config/app.php 파일을 열어보면 providers 배열을 확인할 수 있습니다. 이 배열에 나열된 클래스들이 애플리케이션 시작 시 로드되는 서비스 프로바이더입니다. 기본값으로 메일러, 큐, 캐시 등 Laravel 핵심 컴포넌트를 담당하는 프로바이더들이 등록되어 있습니다. 이 중 상당수는 "지연(deferred) 프로바이더"로, 매 요청마다 로드되는 것이 아니라 실제로 해당 서비스가 필요한 시점에만 로드됩니다.

이 문서에서는 직접 서비스 프로바이더를 작성하고 애플리케이션에 등록하는 방법을 알아봅니다.

NOTE

Laravel이 요청을 처리하는 내부 동작 흐름이 궁금하다면 요청 라이프사이클 문서를 참고하세요.

서비스 프로바이더 작성하기

모든 서비스 프로바이더는 Illuminate\Support\ServiceProvider 클래스를 상속합니다. 대부분의 프로바이더는 registerboot 두 메서드를 가집니다. register 메서드에서는 서비스 컨테이너에 바인딩을 등록하는 작업만 수행해야 합니다. 이벤트 리스너, 라우트, 그 밖의 다른 기능은 절대 register 메서드 안에서 등록하지 마세요.

새 서비스 프로바이더는 Artisan CLI로 생성할 수 있습니다.

php artisan make:provider RiakServiceProvider

register 메서드

앞서 언급했듯, register 메서드 안에서는 서비스 컨테이너 바인딩 등록만 해야 합니다. 이벤트 리스너, 라우트, 그 밖의 기능을 이 메서드 안에서 등록하려 하면, 아직 로드되지 않은 서비스 프로바이더가 제공하는 서비스를 실수로 사용하게 될 수 있습니다.

기본적인 서비스 프로바이더 예시를 살펴보겠습니다. 프로바이더 내 어디서든 $app 프로퍼티를 통해 서비스 컨테이너에 접근할 수 있습니다.

<?php namespace App\Providers; use App\Services\Riak\Connection; use Illuminate\Contracts\Foundation\Application; use Illuminate\Support\ServiceProvider; class RiakServiceProvider extends ServiceProvider { /** * 애플리케이션 서비스를 등록합니다. */ public function register(): void { $this->app->singleton(Connection::class, function (Application $app) { return new Connection(config('riak')); }); } }

이 프로바이더는 register 메서드만 정의하고, 그 안에서 App\Services\Riak\Connection의 구현체를 서비스 컨테이너에 싱글턴으로 바인딩합니다. 서비스 컨테이너가 아직 생소하다면 서비스 컨테이너 문서를 먼저 읽어보세요.

`bindings`와 `singletons` 프로퍼티

등록해야 할 단순 바인딩이 많다면, register 메서드에서 하나씩 직접 등록하는 대신 bindingssingletons 프로퍼티를 활용할 수 있습니다. 프레임워크가 프로바이더를 로드할 때 이 프로퍼티들을 자동으로 확인하여 바인딩을 등록해줍니다.

<?php namespace App\Providers; use App\Contracts\DowntimeNotifier; use App\Contracts\ServerProvider; use App\Services\DigitalOceanServerProvider; use App\Services\PingdomDowntimeNotifier; use App\Services\ServerToolsProvider; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { /** * 등록할 컨테이너 바인딩 목록. * * @var array */ public $bindings = [ ServerProvider::class => DigitalOceanServerProvider::class, ]; /** * 등록할 컨테이너 싱글턴 목록. * * @var array */ public $singletons = [ DowntimeNotifier::class => PingdomDowntimeNotifier::class, ServerProvider::class => ServerToolsProvider::class, ]; }

boot 메서드

예를 들어 뷰 컴포저를 등록해야 한다면 boot 메서드를 사용해야 합니다. boot 메서드는 다른 모든 서비스 프로바이더의 register가 완료된 이후에 호출됩니다. 따라서 프레임워크에 등록된 모든 서비스를 이 시점에는 안전하게 사용할 수 있습니다.

register vs boot 한 줄 요약 register는 컨테이너 바인딩 등록만, boot는 등록된 서비스를 활용하는 초기화 작업에 사용하세요.

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

boot 메서드의 의존성 주입

boot 메서드에서도 타입 힌트를 사용해 의존성을 주입받을 수 있습니다. 서비스 컨테이너가 필요한 의존성을 자동으로 주입해줍니다.

use Illuminate\Contracts\Routing\ResponseFactory; /** * 애플리케이션 서비스를 부트스트랩합니다. */ public function boot(ResponseFactory $response): void { $response->macro('serialized', function (mixed $value) { // ... }); }

프로바이더 등록하기

모든 서비스 프로바이더는 config/app.php 파일의 providers 배열에 등록됩니다. 이 배열에는 애플리케이션에서 로드할 서비스 프로바이더 클래스 이름을 나열합니다. 기본적으로 메일러, 큐, 캐시 등 Laravel 핵심 컴포넌트를 담당하는 프로바이더들이 등록되어 있습니다.

직접 만든 프로바이더를 등록하려면 배열에 추가하면 됩니다.

'providers' => ServiceProvider::defaultProviders()->merge([ // 기타 서비스 프로바이더 App\Providers\ComposerServiceProvider::class, ])->toArray(),

지연 프로바이더

프로바이더가 서비스 컨테이너에 바인딩을 등록하는 역할 한다면, 해당 바인딩이 실제로 필요해지는 시점까지 로드를 미룰 수 있습니다. 이를 **지연 로딩(deferred loading)**이라 하며, 매 요청마다 불필요하게 파일을 읽지 않아도 되므로 애플리케이션 성능이 향상됩니다.

Laravel은 지연 프로바이더가 제공하는 서비스 목록을 미리 컴파일해 저장해둡니다. 그리고 해당 서비스를 실제로 resolve하려 할 때 비로소 프로바이더를 로드합니다.

지연 로딩을 적용하려면 \Illuminate\Contracts\Support\DeferrableProvider 인터페이스를 구현하고, provides 메서드에서 이 프로바이더가 등록하는 서비스 컨테이너 바인딩 목록을 반환하면 됩니다.

<?php namespace App\Providers; use App\Services\Riak\Connection; use Illuminate\Contracts\Foundation\Application; use Illuminate\Contracts\Support\DeferrableProvider; use Illuminate\Support\ServiceProvider; class RiakServiceProvider extends ServiceProvider implements DeferrableProvider { /** * 애플리케이션 서비스를 등록합니다. */ public function register(): void { $this->app->singleton(Connection::class, function (Application $app) { return new Connection($app['config']['riak']); }); } /** * 이 프로바이더가 제공하는 서비스 목록을 반환합니다. * * @return array<int, string> */ public function provides(): array { return [Connection::class]; } }

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

번역일: 2026년 6월 20일