Laravel 서비스 제공자

1 개요[ | ]

Service Providers
서비스 제공자

https://laravel.com/docs/11.x/providers

2 소개[ | ]

서비스 제공자는 모든 Laravel 애플리케이션 부트스트래핑의 중심입니다. 여러분의 애플리케이션뿐만 아니라 Laravel의 핵심 서비스 모두 서비스 제공자를 통해 부트스트랩됩니다.

그렇다면 "부트스트랩"이란 무엇을 의미할까요? 일반적으로 이는 서비스 컨테이너 바인딩, 이벤트 리스너, 미들웨어, 라우트 등을 등록하는 것을 의미합니다. 서비스 제공자는 애플리케이션을 구성하는 중심 장소입니다.

Laravel은 메일러, 큐, 캐시 등 핵심 서비스를 부트스트랩하기 위해 내부적으로 수십 개의 서비스 제공자를 사용합니다. 이러한 제공자 중 많은 수가 "연기된" 제공자로, 제공하는 서비스가 실제로 필요할 때만 로드되며 모든 요청에서 로드되지는 않습니다.

사용자 정의 서비스 제공자는 모두 bootstrap/providers.php 파일에 등록됩니다. 다음 문서에서는 자체 서비스 제공자를 작성하고 이를 Laravel 애플리케이션에 등록하는 방법을 설명합니다.

Laravel이 요청을 처리하고 내부적으로 작동하는 방식에 대해 더 알고 싶다면 Laravel 요청 생명주기에 대한 문서를 참조하십시오.

3 서비스 제공자 작성하기[ | ]

모든 서비스 제공자는 Illuminate\Support\ServiceProvider 클래스를 확장합니다. 대부분의 서비스 제공자는 register 메소드와 boot 메소드를 포함합니다. register 메소드 내에서는 서비스 컨테이너에 항목을 바인딩하는 것만 수행해야 합니다. register 메소드 내에서 이벤트 리스너, 라우트 또는 기타 기능을 등록하려고 시도해서는 안 됩니다.

Artisan CLI는 make:provider 명령어를 통해 새로운 제공자를 생성할 수 있습니다. Laravel은 bootstrap/providers.php 파일에 새로운 제공자를 자동으로 등록합니다:

php artisan make:provider RiakServiceProvider

3.1 regsiter 메소드[ | ]

앞서 언급했듯이, register 메소드 내에서는 서비스 컨테이너에 바인딩하는 작업만 수행해야 합니다. 이 메소드 내에서 이벤트 리스너, 라우트 또는 다른 기능을 등록하려고 해서는 안 됩니다. 그렇지 않으면 아직 로드되지 않은 서비스 제공자에 의해 제공된 서비스를 실수로 사용할 수 있습니다.

기본 서비스 제공자를 살펴보겠습니다. 서비스 제공자의 모든 메서드 내에서 $app 속성에 접근할 수 있으며, 이를 통해 서비스 컨테이너에 접근할 수 있습니다:

<?php

namespace App\Providers;

use App\Services\Riak\Connection;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Support\ServiceProvider;

class RiakServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     */
    public function register(): void
    {
        $this->app->singleton(Connection::class, function (Application $app) {
            return new Connection(config('riak'));
        });
    }
}

이 서비스 제공자는 register 메소드만 정의하고 있으며, 이 메소드를 사용하여 서비스 컨테이너에 App\Services\Riak\Connection의 구현을 정의합니다. Laravel의 서비스 컨테이너에 익숙하지 않은 경우, 해당 문서를 참고하세요.

bindingssingletons 속성

서비스 제공자가 여러 간단한 바인딩을 등록하는 경우, 각 컨테이너 바인딩을 수동으로 등록하는 대신 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,
    ];
}

3.2 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 () {
            // ...
        });
    }
}
boot 메소드 의존성 주입

서비스 프로바이더의 boot 메소드에 대해 의존성을 타입 힌트할 수 있습니다. 서비스 컨테이너는 필요한 모든 의존성을 자동으로 주입합니다:

use Illuminate\Contracts\Routing\ResponseFactory;

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

4 제공자 등록하기[ | ]

모든 서비스 제공자는 bootstrap/providers.php 설정 파일에 등록됩니다. 이 파일은 애플리케이션의 서비스 제공자의 클래스 이름을 포함하는 배열을 반환합니다:

<?php

// 이 파일은 Laravel에 의해 자동으로 생성됩니다...

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

make:provider Artisan 명령어를 호출하면, Laravel은 생성된 제공자를 bootstrap/providers.php 파일에 자동으로 추가합니다. 그러나 제공자 클래스를 수동으로 생성한 경우, 제공자 클래스를 배열에 수동으로 추가해야 합니다:

<?php

// 이 파일은 Laravel에 의해 자동으로 생성됩니다...

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

5 연기된 제공자[ | ]

만약 제공자가 서비스 컨테이너바인딩만 등록하고 있다면, 등록된 바인딩이 실제로 필요할 때까지 등록을 연기할 수 있습니다. 이러한 제공자의 로딩을 연기하면 파일시스템에서 매 요청마다 로드되지 않으므로 애플리케이션의 성능이 향상됩니다.

Laravel은 연기된 서비스 제공자가 제공하는 모든 서비스 목록과 해당 서비스 제공자 클래스의 이름을 컴파일하여 저장합니다. 그런 다음 이러한 서비스 중 하나를 해결하려고 시도할 때만 Laravel이 서비스 제공자를 로드합니다.

제공자의 로딩을 지연하려면 \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];
    }
}
문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}