Skip to main content

패키지란

Laravel에서 패키지란 애플리케이션에 기능을 추가하는 Composer 패키지입니다. 패키지에는 크게 두 종류가 있습니다.
  • 독립형 패키지 — Laravel에 의존하지 않는 범용 PHP 라이브러리(예: Carbon, Pest)
  • Laravel 패키지 — 라우트, 컨트롤러, 뷰, 설정 등 Laravel과 통합된 기능을 가진 패키지
이 가이드에서는 후자, 즉 Laravel 전용 패키지 개발을 다룹니다. 패키지 개발에는 서비스 프로바이더, 파사드, 설정 파일의 배포 등 Laravel의 내부 구조에 대한 깊은 이해가 필요합니다.
패키지 테스트를 작성할 때는 Orchestra Testbench를 사용합니다. 일반 Laravel 애플리케이션과 같은 방식으로 패키지 테스트를 작성할 수 있습니다.

패키지 자동 감지

Laravel은 패키지를 설치할 때 composer.jsonextra.laravel 섹션을 읽어 서비스 프로바이더와 파사드를 자동으로 등록합니다.
이 설정을 추가하면, 사용자가 bootstrap/providers.php를 수동으로 편집하지 않아도 패키지가 자동으로 로드됩니다.
이 자동 감지가 어떻게 구현되고 언제 캐시가 재구성되는지는 패키지 자동 감지의 내부 구조에서 자세히 설명합니다.

자동 감지 비활성화

사용자 측에서 특정 패키지의 자동 감지를 비활성화하고 싶다면 애플리케이션의 composer.json에 설정합니다.

서비스 프로바이더의 역할

서비스 프로바이더는 패키지의 진입점입니다. 뷰, 설정, 마이그레이션, 라우트 등의 리소스를 Laravel에 등록하는 처리를 여기에 집중시킵니다. 서비스 프로바이더는 Illuminate\Support\ServiceProvider를 상속하며, registerboot라는 두 개의 메서드를 갖습니다.
register 메서드 내에서 이벤트 리스너, 라우트, 뷰 등을 등록하지 마세요. 아직 로드되지 않은 다른 서비스 프로바이더의 서비스를 실수로 사용하게 될 수 있습니다. 바인딩 이외의 처리는 반드시 boot 메서드에서 수행합니다.

설정 파일 배포

publishes() — 파일 공개하기

boot 메서드에서 publishes()를 호출하면, 사용자가 vendor:publish 명령으로 설정 파일을 자신의 애플리케이션에 복사할 수 있게 됩니다.
배포 후 설정값은 일반적인 config 접근과 동일한 방식으로 가져올 수 있습니다.

mergeConfigFrom() — 기본값과 병합

register 메서드에서 mergeConfigFrom()을 사용하면, 사용자가 설정 파일을 배포하지 않은 경우에도 패키지의 기본값이 사용됩니다.
mergeConfigFrom()은 중첩된 배열의 깊은 레벨까지는 병합하지 않습니다. 다차원 배열을 가진 설정에서는 사용자가 일부만 정의한 경우 나머지 옵션이 병합되지 않을 수 있습니다.

태그로 배포 그룹 분리하기

publishes()의 두 번째 인수에 태그를 지정하면, 사용자가 필요한 리소스만 선택하여 배포할 수 있습니다.

라우트 등록

loadRoutesFrom()을 사용하여 라우트 파일을 로드합니다. 애플리케이션의 라우트 캐시가 활성화된 경우 자동으로 건너뜁니다.
라우트 파일에서는 패키지의 컨트롤러를 지정합니다.

마이그레이션 배포

publishesMigrations()를 사용하면 마이그레이션 파일을 배포할 수 있습니다. 배포 시 Laravel이 자동으로 타임스탬프를 업데이트합니다.

뷰 배포

loadViewsFrom() — 뷰 등록하기

loadViewsFrom()으로 뷰 디렉터리를 등록합니다. 두 번째 인수의 네임스페이스를 사용해 package::view 형식으로 뷰를 참조합니다.
등록 후 뷰는 패키지 네임스페이스로 참조합니다.
Laravel은 뷰를 두 곳에서 찾습니다. 먼저 애플리케이션의 resources/views/vendor/courier 디렉터리를 확인하고, 없으면 패키지의 뷰 디렉터리를 사용합니다. 이를 통해 사용자가 뷰를 커스터마이즈할 수 있습니다.

뷰 배포하기

Blade 컴포넌트 등록

컴포넌트를 패키지에 포함하는 경우, boot 메서드에서 등록합니다.
컴포넌트 네임스페이스를 사용하여 일괄 등록할 수도 있습니다.

번역 파일 배포

loadTranslationsFrom()으로 번역 파일을 등록합니다. 번역은 package::file.key 형식으로 참조합니다.
JSON 번역 파일을 사용하는 경우 loadJsonTranslationsFrom()을 사용합니다.

명령어 등록

패키지의 Artisan 명령어는 commands() 메서드로 등록합니다. 콘솔 환경에서만 등록하는 것이 일반적입니다.

optimize 명령어와 통합

패키지가 자체 캐시를 갖는 경우, optimizes() 메서드로 php artisan optimizephp artisan optimize:clear에 통합할 수 있습니다.

about 명령어에 정보 추가

php artisan about의 출력에 패키지 정보를 추가하려면 AboutCommand::add()를 사용합니다.

파사드 생성

파사드를 사용하면 서비스 컨테이너의 바인딩을 정적 메서드처럼 호출할 수 있습니다.
1

서비스 클래스 만들기

2

파사드 클래스 만들기

Illuminate\Support\Facades\Facade를 상속하고, getFacadeAccessor()에서 서비스 컨테이너의 바인딩 키를 반환합니다.
3

서비스 프로바이더에서 바인딩하기

4

composer.json에 등록하기

파사드 메서드에 PHPDoc의 @method 애노테이션을 붙이면 IDE 자동완성이 활성화됩니다.

DeferrableProvider — 지연 로딩 구현

서비스 컨테이너에 바인딩만 수행하는 프로바이더는 DeferrableProvider 인터페이스를 구현함으로써 지연 로딩을 실현할 수 있습니다. 서비스가 실제로 필요해질 때까지 프로바이더가 로드되지 않기 때문에 애플리케이션 성능이 향상됩니다.
Laravel은 지연 프로바이더가 제공하는 서비스 목록을 컴파일하여 저장합니다. provides()에 나열된 서비스가 해결될 때만 프로바이더가 로드됩니다.
리소스 등록(뷰, 라우트, 이벤트 리스너 등)이 필요한 프로바이더에는 DeferrableProvider를 사용하지 마세요. 지연 로딩되면 해당 리소스가 등록되지 않은 채로 남게 됩니다.

패키지 테스트

패키지를 단독으로 테스트할 때는 Orchestra Testbench를 사용합니다. 일반 Laravel 애플리케이션 안에 있는 것처럼 패키지 테스트를 작성할 수 있습니다.
테스트 케이스에서 getPackageProviders()를 오버라이드하여 패키지의 서비스 프로바이더를 등록합니다.

Composer에 배포

패키지를 Packagist에 배포하기 위한 모범 사례입니다. composer.json의 기본 설정
illuminate/support에 의존함으로써, illuminate/framework 전체가 아닌 Laravel의 필요한 컴포넌트만 의존성에 포함할 수 있습니다. 패키지의 의존성 트리를 작게 유지합시다.
디렉터리 구조 예시

관련 페이지

서비스 프로바이더

서비스 프로바이더의 registerboot 메서드, 지연 프로바이더의 상세 내용을 확인합니다.

버전 호환성 관리

Laravel과 PHP 메이저 버전 업그레이드에 대응하는 전략과 GitHub Actions 테스트 매트릭스 설정을 설명합니다.
마지막 수정일 2026년 8월 2일