의존성 주입과 PHP 8의 간결성: Laravel 12 활용법
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
Laravel 프레임워크를 사용하는 PHP 개발자, 특히 Laravel 11에서 12로 업그레이드를 계획 중인 개발자
핵심 요약
- 생성자 속성 프로모션(Constructor Property Promotion)은 PHP 8에서 도입된 기능으로, 의존성 주입(DI) 코드의 중복을 제거하고 가독성을 향상시킴
- Laravel 12의 서비스 컨테이너는 타입 힌트 기반 자동 해상(Type Hint-based Resolution)을 통해 프로모티드 속성을 자동으로 주입함
- 코드 줄 수 감소와 일관된 의존성 정의가 주요 이점으로,
protected UserService $service
처럼 단일 라인으로 속성 선언, 매개변수 정의, 할당을 처리 가능 public readonly
속성 사용으로 불변성 강화 가능(PHP 8.1+)
섹션별 세부 요약
1. 생성자 속성 프로모션의 정의
- PHP 8에서 클래스 속성을 생성자 시그니처 내부에서 선언·초기화 가능
- 기존 방식:
```php
protected UserService $service;
public function __construct(UserService $service) { $this->service = $service; }
```
- 프로모션 방식:
```php
public function __construct(protected UserService $service) {}
```
- 중복 줄 수 감소: 속성 선언, 매개변수 정의, 할당을 하나의 라인으로 통합
2. Laravel 12의 서비스 컨테이너 동작 방식
- Laravel 12는 기존 서비스 컨테이너 동작 방식을 유지하며, 타입 힌트 기반 자동 해상을 지원
- 예시:
```php
$this->app->bind(UserService::class, fn($app) => new UserService());
```
- 컨테이너는
UserController
생성 시UserService $service
와LoggerInterface $logger
를 자동으로 주입
3. Laravel 11 vs Laravel 12 비교
- Laravel 11:
- 속성 선언(3줄) + 생성자 매개변수(3줄) + 할당(3줄) → 총 7줄
- $this->service = $service;
와 같은 중복 코드 존재
- Laravel 12:
- 속성 프로모션으로 3줄만 사용 가능
- protected ProductService $service
처럼 단일 라인으로 처리
4. 커스텀 서비스 및 명령어 예시
- 커스텀 서비스:
```php
public function __construct(protected OrderRepository $orderRepo) {}
```
- 기존 방식($this->orderRepo = $orderRepo;
) 대체 가능
- 명령어:
```php
public function __construct(protected OrderReportService $reportService) {}
```
- php artisan make:policy
와 같은 내장 생성기에서도 지원
5. 베스트 프랙티스 및 주의사항
- 타입 힌트 필수:
protected $service
처럼 타입 미지정 시mixed
타입 발생 → 정적 분석 약화 - 단일 책임 원칙(SRP) 준수:
- 생성자에 5개 이상의 의존성 주입 시 리팩토링 권장
- 관련 로직을 작은 클래스로 그룹화하거나 Facade/Manager 서비스 도입
- 불변성 강화:
- public readonly Mailer $mailer
로 생성 후 재할당 시 예외 발생
결론
- Laravel 12에서 생성자 속성 프로모션을 활용해 의존성 주입 코드를 70% 이상 간결화 가능
- PHP 8.1 이상에서
public readonly
속성 사용으로 불변성 강화를 추천 - 타입 힌트 생략 시 정적 분석 약화 → 반드시 타입 명시하고, SRP 위반 시 리팩토링 수행해야 함