Laravel 의존성 주입(DI) 정리
나의정리
의존성 주입(DI)에는 생성자 주입과 메서드 주입 두 가지 패턴이 있다.
-
생성자 주입은 생성자에서 의존성을 주입받아 클래스 내 여러 메서드에서 공통으로 사용할 수 있어 중복 선언을 줄일 수 있다.
-
메서드 주입은 메서드의 매개변수에 직접 의존성을 주입하는 방식이다. 직관적이지만 사용할 때마다 매개변수에 선언해야 한다.
아래 예제에서는 UserService는 생성자 주입을, Request는 메서드 주입을 사용하였다.
의존성 주입(DI)이란?
객체를 직접 생성(new)하지 않고 Laravel의 서비스 컨테이너가 자동으로 생성해서 전달해주는 기능이다.
직접 생성:
$userService = new UserService();
의존성 주입:
public function index(UserService $userService){
}
Laravel이 자동으로 UserService 객체를 생성하여 전달해준다.
Laravel의 의존성 주입 패턴
Laravel에서는 크게 두 가지 방식의 의존성 주입을 사용한다.
1. 생성자 주입 (Constructor Injection)
class UserController
{
private UserService $userService;
public function __construct(UserService $userService)
{
$this->userService = $userService;
}
public function index()
{
$this->userService->getUsers();
}
public function show()
{
$this->userService->getUser();
}
}
특징
-
객체를 한 번만 주입받는다.
-
컨트롤러 전체에서 사용할 수 있다.
-
여러 메서드에서 동일한 객체를 사용할 때 유용하다.
-
같은 의존성을 여러 메서드에서 반복 선언하지 않아도 된다.
2. 메서드 주입 (Method Injection)
public function index(UserService $userService){
$userService->getUsers();
}
특징
-
특정 메서드에서만 사용할 객체를 주입받는다.
-
필요한 곳에서만 의존성을 선언할 수 있다.
-
사용 범위가 명확하다.
Request 객체도 의존성 주입
public function store(Request $request){
}
Request 객체 역시 Laravel이 자동으로 생성하여 전달한다.
언제 어떤 방식을 사용할까?
생성자 주입
public function __construct(
UserService $userService
)
-
여러 액션에서 공통으로 사용하는 경우
-
중복 선언을 줄이고 싶은 경우
메서드 주입
public function index(
UserService $userService
)
-
특정 액션에서만 사용하는 경우
-
해당 메서드에 필요한 의존성을 명확하게 표현하고 싶은 경우
핵심 정리
-
Laravel의 의존성 주입(DI)은 서비스 컨테이너가 객체를 자동 생성하여 전달하는 기능이다.
-
의존성 주입에는 생성자 주입과 메서드 주입 두 가지 대표적인 패턴이 있다.
-
생성자 주입은 여러 메서드에서 공통으로 사용하는 객체에 적합하며 중복 코드를 줄일 수 있다.
-
메서드 주입은 특정 메서드에서만 필요한 객체를 주입받을 때 사용한다.
-
Request 객체 역시 의존성 주입의 대표적인 예이다.