패키지란
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라는 두 개의 메서드를 갖습니다.
설정 파일 배포
publishes() — 파일 공개하기
boot 메서드에서 publishes()를 호출하면, 사용자가 vendor:publish 명령으로 설정 파일을 자신의 애플리케이션에 복사할 수 있게 됩니다.
mergeConfigFrom() — 기본값과 병합
register 메서드에서 mergeConfigFrom()을 사용하면, 사용자가 설정 파일을 배포하지 않은 경우에도 패키지의 기본값이 사용됩니다.
태그로 배포 그룹 분리하기
publishes()의 두 번째 인수에 태그를 지정하면, 사용자가 필요한 리소스만 선택하여 배포할 수 있습니다.
라우트 등록
loadRoutesFrom()을 사용하여 라우트 파일을 로드합니다. 애플리케이션의 라우트 캐시가 활성화된 경우 자동으로 건너뜁니다.
마이그레이션 배포
publishesMigrations()를 사용하면 마이그레이션 파일을 배포할 수 있습니다. 배포 시 Laravel이 자동으로 타임스탬프를 업데이트합니다.
뷰 배포
loadViewsFrom() — 뷰 등록하기
loadViewsFrom()으로 뷰 디렉터리를 등록합니다. 두 번째 인수의 네임스페이스를 사용해 package::view 형식으로 뷰를 참조합니다.
resources/views/vendor/courier 디렉터리를 확인하고, 없으면 패키지의 뷰 디렉터리를 사용합니다. 이를 통해 사용자가 뷰를 커스터마이즈할 수 있습니다.
뷰 배포하기
Blade 컴포넌트 등록
컴포넌트를 패키지에 포함하는 경우,boot 메서드에서 등록합니다.
번역 파일 배포
loadTranslationsFrom()으로 번역 파일을 등록합니다. 번역은 package::file.key 형식으로 참조합니다.
loadJsonTranslationsFrom()을 사용합니다.
명령어 등록
패키지의 Artisan 명령어는commands() 메서드로 등록합니다. 콘솔 환경에서만 등록하는 것이 일반적입니다.
optimize 명령어와 통합
패키지가 자체 캐시를 갖는 경우,optimizes() 메서드로 php artisan optimize와 php artisan optimize:clear에 통합할 수 있습니다.
about 명령어에 정보 추가
php artisan about의 출력에 패키지 정보를 추가하려면 AboutCommand::add()를 사용합니다.
파사드 생성
파사드를 사용하면 서비스 컨테이너의 바인딩을 정적 메서드처럼 호출할 수 있습니다.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 테스트 매트릭스 설정을 설명합니다.