라라벨 설계 컨셉 (서비스 컨테이너, 서비스 프로바이더, 파사드)

hannni·2023년 5월 17일
0

Laravel

목록 보기
14/16

🔎 서비스 컨테이너

서비스 컨테이너는 라라벨의 기능 중 하나로, 객체의 의존성을 관리하고 주입하는 역할을 합니다. 서비스 컨테이너는 서비스 프로바이더를 통해 등록된 서비스를 관리하며, 필요한 시점에 해당 서비스를 인스턴스화하여 제공합니다.

✏️ 서비스 프로바이더(Service Provider)

라라벨의 서비스 컨테이너에 서비스를 등록하는 역할을 합니다. 서비스 프로바이더는 register() 메서드를 구현하여 서비스를 컨테이너에 등록하고, boot() 메서드를 구현하여 서비스가 등록된 이후에 추가적인 초기화 작업을 수행할 수 있습니다.

✏️ 서비스 클래스(Service Class)

실제로 비즈니스 로직이나 기능을 구현하는 클래스입니다. 서비스 클래스는 서비스 프로바이더에 의해 등록되고, 의존성 주입(Dependency Injection)을 통해 필요한 곳에서 사용됩니다. 주로 애플리케이션의 핵심 비즈니스 로직을 담당하는 클래스로 사용됩니다.

✏️ 파사드 (Facade)

서비스 컨테이너에 등록된 서비스를 편리하게 사용하기 위한 정적인 인터페이스입니다. 파사드는 서비스 컨테이너와 서비스 클래스 사이에서 동작하며, 개발자에게 직관적이고 간결한 문법으로 서비스를 사용할 수 있도록 합니다. 파사드는 실제로 서비스의 메서드를 호출하고 반환하는 동적인 프록시 역할을 수행하며, 서비스 컨테이너에 등록된 서비스를 대표하는 역할을 합니다.

Facade 클래스는 protected static function getFacadeAccessor() 메서드를 제공합니다. 이 메서드를 자식 파사드 클래스에서 오버라이드하여 어떤 서비스를 대표하는지를 지정할 수 있습니다.

📖 흐름 이해를 위한 예시 코드

  1. 서비스 프로바이더 등록 (AppServiceProvider.php)
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->bind('inventory', function ($app) {
            return new InventoryService();
        });
    }
}
  1. 서비스 클래스 (LoggerService.php)
class InventoryService
{
    public function checkStock($productId)
    {
        // 재고 확인 로직
    }
}
  1. 파사드 클래스 (LoggerFacade.php)
use Illuminate\Support\Facades\Facade;

class InventoryFacade extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'inventory';
    }
}

파사드 사용 (예시 코드)

use InventoryFacade;

// 재고 확인
$productId = 1;
$stock = InventoryFacade::checkStock($productId);

위 코드에서 InventoryFacade는 InventoryService를 래핑한 파사드입니다.

InventoryFacade 클래스는 getFacadeAccessor() 메서드를 오버라이드하여 'inventory'를 반환하고 있습니다. 이는 InventoryFacade가 inventory라는 서비스를 대표한다는 것을 의미합니다.

서비스 프로바이더에서 inventory를 바인딩하여 서비스 컨테이너에 등록한 후, InventoryFacade를 사용하여 재고 확인과 같은 작업을 수행할 수 있습니다.
파사드를 사용하면 InventoryService 클래스를 직접 참조하는 대신 파사드를 통해 편리하게 서비스를 호출할 수 있습니다.

출처 : https://laravel.kr/docs/9.x/container, ChatGPT

0개의 댓글