관리 메뉴

java,javascript,android,php,sql,공부용,메모용

라라벨7 - 서비스 컨테이너, 바인드와 리졸브 본문

개발/php

라라벨7 - 서비스 컨테이너, 바인드와 리졸브

yy_dd2 2025. 10. 15. 16:58
반응형

🟢 라라벨 서비스 컨테이너 정리


1️⃣ 서비스 컨테이너란?

  • 라라벨에서 객체 생성과 의존성 관리를 담당하는 핵심 기능
  • 쉽게 말하면 “객체 공장 + 객체 저장소”
  • 클래스 인스턴스를 직접 new로 만들지 않고, 컨테이너에 등록해두고 필요할 때 꺼내 쓸 수 있음.

💡 예시 코드

class FooLogger {
    public function log($message) {
        echo "[LOG] " . $message;
    }
}

// 바인드 (등록)
app()->bind('logger', function() {
    return new FooLogger();
});

// 리졸브 (사용)
$logger = app()->make('logger');
$logger->log("서비스 컨테이너 사용 예시");

 

  • bind → 컨테이너에 “레시피” 등록
  • make → 컨테이너가 “레시피를 사용해 객체 생성”

2️⃣ 바인드와 리졸브

🔹 개념

용어의미
바인드(Bind) 컨테이너에 객체 생성 방법(레시피)을 등록
리졸브(Resolve) 등록된 방법대로 객체를 만들어 꺼내 쓰는 과정

🔹 예시 (Logger)

// 1. 바인드
app()->bind('FooLogger', function() {
    return new FooLogger();
});

// 2. 리졸브
$logger = app()->make('FooLogger');
$logger->log('로그 출력 완료');

 

  • 매번 make를 호출할 때마다 새로운 인스턴스가 생성됨 (bind의 기본 동작)

 

3️⃣ 바인드(Bind) 관련 메서드

(1) bind() 메서드

  • 컨테이너에 객체 생성 방법(클로저) 등록
  • 매번 새로운 인스턴스 생성
app()->bind('Number', function() {
    return new Number(0);
});

$num = app()->make('Number'); // 새 객체 반환

(2) bindIf() 메서드

  • 같은 이름이 이미 등록되어 있으면 무시
  • 예:
app()->bindIf('Number100', function() {
    return new Number(100);
});

app()->bindIf('Number100', function() {
    return new Number(200);
});

$num = app()->make('Number100');
echo $num->getNumber(); // 100

(3) singleton() 메서드

  • 최초 생성 후 동일 인스턴스 재사용
app()->singleton('FooLogger', function() {
    return new FooLogger();
});

$logger1 = app()->make('FooLogger');
$logger2 = app()->make('FooLogger');
var_dump($logger1 === $logger2); // true

(4) instance() 메서드

  • 이미 생성한 인스턴스를 컨테이너에 등록
$logger = new FooLogger();
app()->instance('logger', $logger);

$resolvedLogger = app()->make('logger');
var_dump($logger === $resolvedLogger); // true
  • 주로 테스트 더블이나 런타임 생성 객체 공유에 사용

(5) alias / 문자열을 이용한 리졸브 처리

  • 한 이름을 다른 이름으로 매핑 가능
  • 예:
app()->bind('A', 'B');
app()->bind('B', function() {
    return new FooLogger();
});

$logger = app()->make('A'); // 실제로는 B의 객체 반환

🔹 복잡한 객체 바인드

  • 의존성이 있는 객체도 컨테이너가 자동 생성 가능
class UserService {
    protected $logger;
    public function __construct(FooLogger $logger) {
        $this->logger = $logger;
    }
}

app()->bind('UserService', function($app) {
    return new UserService($app->make('FooLogger'));
});

🔹 바인드 정의 위치

  • 일반적으로 AppServiceProvider의 register() 메서드에서 등록
public function register() {
    $this->app->bind('FooLogger', function() {
        return new FooLogger();
    });
}

4️⃣ 리졸브(Resolve)

(1) make() 메서드

  • 컨테이너에 등록된 이름을 통해 객체 생성/리턴
$logger = app()->make('FooLogger');
$logger->log('Hello!');

(2) app() 헬퍼 함수

  • app()->make() 와 동일하게 사용 가능
$logger = app('FooLogger');
$logger->log('헬퍼로 리졸브');

🔹 바인드되지 않은 문자열 리졸브

  • 등록되지 않은 클래스 이름도 자동으로 인스턴스 생성 가능 (의존성 주입 포함)
class Example {
    public function hello() {
        echo "Hello";
    }
}

$example = app()->make(Example);
$example->hello(); // Hello

✅ 요약

메서드동작특징
bind() 요청 시 새 객체 생성 매번 새로운 인스턴스
bindIf() 기존 등록이 없을 때만 바인드 이미 등록되면 무시
singleton() 최초 생성 후 동일 인스턴스 반환 공유 객체
instance() 이미 생성한 인스턴스를 등록 테스트/런타임 객체 공유
make() / app() 컨테이너에서 객체 생성 자동 의존성 주입 가능

 

2️⃣ 라라벨 서비스 컨테이너

  1. 서비스 컨테이너란?
    • 객체 생성과 의존성 관리를 담당하는 “객체 공장 + 객체 저장소”
  2. 바인드(bind)와 리졸브(resolve)
    • 바인드 → 컨테이너에 객체 생성 방법 등록
    • 리졸브 → 등록된 방법대로 객체 생성 및 반환
  3. 주요 메서드 특징
메서드역할 한 줄 요약
bind() 요청할 때마다 새 객체 생성
bindIf() 등록이 안 되어 있을 때만 객체 생성
singleton() 최초 생성 후 동일 객체 재사용
instance() 이미 생성된 객체를 등록, 공유
make() / app() 컨테이너에서 객체 꺼내기, 의존성 자동 주입 가능

💡 핵심 한 문장 요약:

“필요할 때 컨테이너가 객체를 만들어주고, 상황에 따라 새로 만들거나 이미 있는 걸 재사용한다.”

🔹 서비스 컨테이너 쉽게 이해

  • bind() → 매번 새 요리 만들기: 요청할 때마다 새로운 요리 제공
  • singleton() → 대형 냉장고에 요리 저장: 처음 만든 요리를 계속 제공
  • instance() → 이미 만든 요리 등록: 미리 만들어 둔 요리를 바로 사용
  • make() / app() → 요리사에게 재료/요리 요청: 필요한 객체를 꺼내 사용
  • bindIf() → 이미 저장된 요리 있으면 새로 만들지 않음

💡 한 줄 요약:

“컨테이너는 객체 요리사. 필요할 때 새로 만들거나, 이미 만들어진 걸 꺼내준다.”

🟢 라라벨 라이프사이클 vs 서비스 컨테이너

구분역할이해하기 쉬운 비유핵심 요약
구분 역할 이해하기 쉬운 비유 핵심 요약
서비스 컨테이너 객체 생성과 의존성 관리, 필요할 때 객체를 제공 요리사와 주방 창고: 요리사가 필요한 재료를 창고에서 꺼내 사용 필요한 객체를 컨테이너에 등록(bind) → 요청 시 꺼내 쓰기(make/app)
반응형
Comments