패키지란
Laravel에서 패키지란 애플리케이션에 기능을 추가하는 Composer 패키지입니다. 패키지에는 크게 두 종류가 있습니다.- 독립형 패키지 — Laravel에 의존하지 않는 범용 PHP 라이브러리(예: Carbon, Pest)
- Laravel 패키지 — 라우트, 컨트롤러, 뷰, 설정 등 Laravel과 통합된 기능을 가진 패키지
패키지 테스트를 작성할 때는 Orchestra Testbench를 사용합니다. 일반 Laravel 애플리케이션과 같은 방식으로 패키지 테스트를 작성할 수 있습니다.
패키지 자동 감지
Laravel은 패키지를 설치할 때composer.json의 extra.laravel 섹션을 읽어 서비스 프로바이더와 파사드를 자동으로 등록합니다.
bootstrap/providers.php를 수동으로 편집하지 않아도 패키지가 자동으로 로드됩니다.
이 자동 감지가 어떻게 구현되고 언제 캐시가 재구성되는지는 패키지 자동 감지의 내부 구조에서 자세히 설명합니다.
자동 감지 비활성화
사용자 측에서 특정 패키지의 자동 감지를 비활성화하고 싶다면 애플리케이션의composer.json에 설정합니다.
서비스 프로바이더의 역할
서비스 프로바이더는 패키지의 진입점입니다. 뷰, 설정, 마이그레이션, 라우트 등의 리소스를 Laravel에 등록하는 처리를 여기에 집중시킵니다. 서비스 프로바이더는Illuminate\Support\ServiceProvider를 상속하며, register와 boot라는 두 개의 메서드를 갖습니다.
callAfterResolving()의 실행 시점과 중복 적용에 견디는 설계를 해설합니다.
Octane이나 큐 워커에서도 상태를 이월하지 않는 등록 방법은 패키지 서비스의 라이프사이클 설계를 참고하세요. scoped()의 내부 구현과 singleton이 보유하는 의존성의 주의점을 해설합니다.
설정 파일 배포
publishes() — 파일 공개하기
boot 메서드에서 publishes()를 호출하면, 사용자가 vendor:publish 명령으로 설정 파일을 자신의 애플리케이션에 복사할 수 있게 됩니다.
mergeConfigFrom() — 기본값과 병합
register 메서드에서 mergeConfigFrom()을 사용하면, 사용자가 설정 파일을 배포하지 않은 경우에도 패키지의 기본값이 사용됩니다.
태그로 배포 그룹 분리하기
publishes()의 두 번째 인수에 태그를 지정하면, 사용자가 필요한 리소스만 선택하여 배포할 수 있습니다.
라우트 등록
loadRoutesFrom()을 사용하여 라우트 파일을 로드합니다. 애플리케이션의 라우트 캐시가 활성화된 경우 자동으로 건너뜁니다.
마이그레이션 배포
publishesMigrations()를 사용하면 마이그레이션 파일을 배포 대상으로 등록할 수 있습니다. Laravel 13의 기본 구성에서는 database.migrations.update_date_on_publish가 활성화되어 있으므로, 배포 시 파일 이름의 타임스탬프가 업데이트됩니다. 설정이 비활성화되어 있거나 존재하지 않으면 이 업데이트는 수행되지 않습니다.
뷰 배포
loadViewsFrom() — 뷰 등록하기
loadViewsFrom()으로 뷰 디렉터리를 등록합니다. 두 번째 인수의 네임스페이스를 사용해 package::view 형식으로 뷰를 참조합니다.
resources/views/vendor/courier 디렉터리를 확인하고, 없으면 패키지의 뷰 디렉터리를 사용합니다. 이를 통해 사용자가 뷰를 커스터마이즈할 수 있습니다.
구현상의 검색 순서와 파일 단위 폴백, 배포된 템플릿에 변경을 전달하는 방법, Blade 캐시와의 차이는 패키지 뷰의 덮어쓰기와 업데이트에서 설명합니다.
뷰 배포하기
Blade 컴포넌트 등록
컴포넌트를 패키지에 포함하는 경우,boot 메서드에서 등록합니다.
공개 에셋 배포
패키지의 JavaScript·CSS·이미지를 배포하려면publishes()로 public_path('vendor/courier') 등으로의 복사를 등록합니다. 패키지를 업데이트해도 이미 공개된 파일은 자동으로 바뀌지 않습니다.
태그와 프로바이더에 의한 대상 범위 지정, --force와 --existing의 차이, 삭제된 파일의 처리, laravel-assets를 통한 업데이트는 패키지의 공개 에셋과 업데이트에서 해설합니다.
번역 파일 배포
loadTranslationsFrom()으로 번역 파일을 등록합니다. 번역은 package::file.key 형식으로 참조합니다.
loadJsonTranslationsFrom()을 사용합니다.
명령어 등록
패키지의 Artisan 명령어는commands() 메서드로 등록합니다. 콘솔 환경에서만 등록하는 것이 일반적입니다.
optimize 명령어와 통합
패키지가 자체 캐시를 갖는 경우,optimizes() 메서드로 php artisan optimize와 php artisan optimize:clear에 통합할 수 있습니다.
--except를 통한 제외, 표준 태스크와의 실행 순서, 실패 시 종료 코드는 패키지 캐시와 optimize 통합에서 해설합니다.
about 명령어에 정보 추가
php artisan about의 출력에 패키지 정보를 추가하려면 AboutCommand::add()를 사용합니다.
--only와 JSON 출력, 비밀 정보를 포함하지 않는 설계, 테스트에서의 등록 상태는 패키지 진단 정보를 about에 추가하기에서 설명합니다.
파사드 생성
파사드를 사용하면 서비스 컨테이너의 바인딩을 정적 메서드처럼 호출할 수 있습니다.1
서비스 클래스 만들기
2
파사드 클래스 만들기
Illuminate\Support\Facades\Facade를 상속하고, getFacadeAccessor()에서 서비스 컨테이너의 바인딩 키를 반환합니다.3
서비스 프로바이더에서 바인딩하기
4
composer.json에 등록하기
@method 애노테이션을 붙이면 IDE 자동완성이 활성화됩니다.
DeferrableProvider — 지연 로딩 구현
서비스 컨테이너에 바인딩만 수행하는 프로바이더는DeferrableProvider 인터페이스를 구현함으로써 지연 로딩을 실현할 수 있습니다. 서비스가 실제로 필요해질 때까지 프로바이더가 로드되지 않기 때문에 애플리케이션 성능이 향상됩니다.
provides()에 나열된 서비스가 해결될 때만 프로바이더가 로드됩니다.
패키지 테스트
패키지를 단독으로 테스트할 때는 Orchestra Testbench를 사용합니다. 일반 Laravel 애플리케이션 안에 있는 것처럼 패키지 테스트를 작성할 수 있습니다.getPackageProviders()를 오버라이드하여 패키지의 서비스 프로바이더를 등록합니다.
Composer에 배포
패키지를 Packagist에 배포하기 위한 모범 사례입니다.composer.json의 기본 설정
관련 페이지
서비스 프로바이더
서비스 프로바이더의
register와 boot 메서드, 지연 프로바이더의 상세 내용을 확인합니다.버전 호환성 관리
Laravel과 PHP 메이저 버전 업그레이드에 대응하는 전략과 GitHub Actions 테스트 매트릭스 설정을 설명합니다.