메인 콘텐츠로 건너뛰기

서비스 프로바이더란

서비스 프로바이더는 Laravel 애플리케이션 전체의 부트스트래핑의 중심이 되는 장소입니다. 여러분 자신의 애플리케이션도, Laravel의 모든 핵심 서비스도 서비스 프로바이더를 통해 부트스트랩됩니다. “부트스트래핑”이란 서비스 컨테이너로의 바인딩, 이벤트 리스너, 미들웨어, 라우트 등록 등 다양한 것을 등록하는 것을 의미합니다. 서비스 프로바이더는 애플리케이션의 설정을 수행하는 중심적인 장소입니다. Laravel은 내부적으로 메일러, 큐, 캐시 같은 핵심 서비스를 부트스트랩하기 위해 많은 서비스 프로바이더를 사용하고 있습니다. 이 프로바이더들의 다수는 “지연” 프로바이더로, 모든 요청에서 로드되는 것이 아니라 제공하는 서비스가 실제로 필요할 때만 로드됩니다. 사용자 정의 서비스 프로바이더는 모두 bootstrap/providers.php 파일에서 등록합니다.
Laravel이 요청을 어떻게 처리하는지 자세히 알고 싶은 경우, 요청 라이프사이클 문서를 참조해 주세요.

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

모든 서비스 프로바이더는 Illuminate\Support\ServiceProvider 클래스를 상속합니다. 대부분의 서비스 프로바이더에는 register 메서드와 boot 메서드가 포함됩니다. 새 프로바이더를 생성하려면 make:provider Artisan 명령을 사용합니다. Laravel은 자동으로 새 프로바이더를 bootstrap/providers.php에 등록합니다.
php artisan make:provider RiakServiceProvider

register 메서드

register 메서드 안에서는 서비스 컨테이너로의 바인딩만 수행해 주세요. 이벤트 리스너, 라우트, 그 밖의 기능을 register 메서드 안에서 등록하려고 하지 마세요. 아직 로드되지 않은 서비스 프로바이더가 제공하는 서비스를 잘못해서 사용해 버릴 가능성이 있습니다.
<?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'));
        });
    }
}
서비스 프로바이더의 메서드 안에서는 항상 $this->app 프로퍼티를 통해 서비스 컨테이너에 접근할 수 있습니다.

bindings 프로퍼티와 singletons 프로퍼티

많은 단순한 바인딩을 등록하는 경우, 각 바인딩을 수동으로 등록하는 대신 bindings 프로퍼티와 singletons 프로퍼티를 사용할 수 있습니다. 프레임워크가 서비스 프로바이더를 로드하면 이 프로퍼티들을 자동으로 체크해 바인딩을 등록합니다.
<?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 메서드에서 수행합니다. 이 메서드는 다른 모든 서비스 프로바이더가 등록된 후에 호출됩니다. 즉, 프레임워크가 등록한 다른 모든 서비스에 접근할 수 있습니다.
<?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 () {
            // ...
        });
    }
}
register 메서드와 boot 메서드의 역할을 혼동하지 마세요. 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,
];
Laravel 13에서는 config/app.phpproviders 배열이 아닌 bootstrap/providers.php에서 서비스 프로바이더를 등록합니다. make:provider 명령을 사용하면 자동으로 추가됩니다.
make:provider Artisan 명령을 실행하면 Laravel은 자동으로 파일에 프로바이더를 추가합니다. 수동으로 프로바이더 클래스를 생성한 경우에는 수동으로 클래스를 배열에 추가해 주세요.
<?php

return [
    App\Providers\AppServiceProvider::class,
    App\Providers\ComposerServiceProvider::class,
];

커스텀 서비스 프로바이더 생성

실제로 커스텀 서비스 프로바이더를 만들어 봅시다.
1

프로바이더를 생성한다

Artisan 명령으로 서비스 프로바이더를 생성합니다.
php artisan make:provider PaymentServiceProvider
2

register 메서드에서 바인딩한다

생성된 프로바이더의 register 메서드에 바인딩을 작성합니다.
<?php

namespace App\Providers;

use App\Contracts\PaymentGateway;
use App\Services\StripePaymentGateway;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Support\ServiceProvider;

class PaymentServiceProvider extends ServiceProvider
{
    /**
     * 애플리케이션 서비스를 등록한다
     */
    public function register(): void
    {
        $this->app->singleton(PaymentGateway::class, function (Application $app) {
            return new StripePaymentGateway(
                config('services.stripe.secret')
            );
        });
    }

    /**
     * 애플리케이션 서비스를 부트스트랩한다
     */
    public function boot(): void
    {
        // 부트스트랩 시의 처리가 있으면 여기에 작성
    }
}
3

bootstrap/providers.php에 등록한다

make:provider를 사용한 경우에는 자동 등록됩니다. 수동인 경우에는 추가해 주세요.
<?php

return [
    App\Providers\AppServiceProvider::class,
    App\Providers\PaymentServiceProvider::class,
];

지연 프로바이더(Deferred Providers)

프로바이더가 서비스 컨테이너로의 바인딩만 등록하는 경우, 등록된 바인딩이 실제로 필요해질 때까지 그 등록을 지연시킬 수 있습니다. 이러한 지연 프로바이더의 로드를 늦춤으로써 모든 요청에서 파일 시스템에서 로드되지 않게 되어 애플리케이션의 성능이 향상됩니다. 지연 프로바이더를 만들려면 \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(config('riak'));
            });
    }

    /**
     * 프로바이더가 제공하는 서비스를 가져온다
     *
     * @return array<int, string>
     */
    public function provides(): array
    {
        return [Connection::class];
    }
}
지연 프로바이더는 애플리케이션 전체가 아닌 특정 기능에서만 사용하는 서비스에 적합합니다. 불필요한 서비스의 로드를 피함으로써 성능을 최적화할 수 있습니다.

다음 단계

서비스 컨테이너

서비스 컨테이너의 구조와 바인딩의 상세 내용을 확인합니다.
마지막 수정일 2026년 7월 13일