본문 바로가기

서비스 프로바이더

번역일: 2026년 6월 20일

서비스 프로바이더

소개

서비스 프로바이더는 Laravel 애플리케이션 부트스트래핑의 핵심 장소입니다. 여러분이 직접 작성한 애플리케이션 코드는 물론, Laravel의 모든 핵심 서비스도 서비스 프로바이더를 통해 초기화됩니다.

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

Laravel은 내부적으로 메일러, 큐, 캐시 등 핵심 서비스를 초기화하기 위해 수십 개의 서비스 프로바이더를 사용합니다. 이 중 상당수는 "지연(deferred)" 프로바이더로, 매 요청마다 로드되지 않고 실제로 해당 서비스가 필요할 때만 로드됩니다.

사용자가 직접 정의한 서비스 프로바이더는 모두 bootstrap/providers.php 파일에 등록합니다. 이 문서에서는 서비스 프로바이더를 직접 작성하고 Laravel 애플리케이션에 등록하는 방법을 살펴봅니다.

NOTE

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

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

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

Artisan CLI로 새 프로바이더를 생성할 수 있습니다. Laravel은 생성된 프로바이더를 bootstrap/providers.php 파일에 자동으로 추가합니다.

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` 프로퍼티

등록할 바인딩이 단순하고 많다면, 각각을 직접 등록하는 대신 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 메서드가 실행된 이후에 호출됩니다. 따라서 이 시점에는 프레임워크가 등록한 모든 서비스를 안전하게 사용할 수 있습니다.

<?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 () { // ... }); } }

NOTE

registerboot의 차이를 한 줄로 정리하면 이렇습니다. register는 "무엇을 컨테이너에 묶을지" 선언하는 단계, boot는 "이미 등록된 서비스를 활용해 기능을 초기화하는" 단계입니다.

boot 메서드의 의존성 주입

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

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

프로바이더 등록하기

모든 서비스 프로바이더는 bootstrap/providers.php 파일에 등록합니다. 이 파일은 애플리케이션의 서비스 프로바이더 클래스명 배열을 반환합니다.

<?php return [ App\Providers\AppServiceProvider::class, ];

make:provider Artisan 명령어를 실행하면 Laravel이 생성된 프로바이더를 bootstrap/providers.php 파일에 자동으로 추가합니다. 프로바이더 클래스를 직접 만들었다면 아래와 같이 배열에 수동으로 추가해야 합니다.

<?php
return [
App\Providers\AppServiceProvider::class,
App\Providers\ComposerServiceProvider::class, //
];

지연 프로바이더

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

Laravel은 지연 서비스 프로바이더가 제공하는 서비스 목록과 해당 프로바이더 클래스명을 컴파일하여 저장해 둡니다. 그리고 그 서비스 중 하나를 실제로 resolve하려 할 때에만 해당 프로바이더를 로드합니다.

프로바이더 로딩을 지연하려면 \Illuminate\Contracts\Support\DeferrableProvider 인터페이스를 구현하고, provides 메서드를 정의하면 됩니다. 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일