minstudio

의존성 주입(DI)과 PHP-DI 컨테이너

큰 규모의 앱을 만들다 보면 클래스들이 서로 복잡하게 얽히게 됩니다(의존성). DI 컨테이너는 "내가 이 부품이 필요해!"라고 외치면, 알아서 조립해서 가져다주는 아주 똑똑한 '스마트 자판기' 역할을 합니다.

🤖 DI 컨테이너 (스마트 부품 창고)

🧑‍💻
UserController
"DB 연결 객체가 필요해!"
➡️ 요청
⬅️ 배달
📦
PHP-DI 컨테이너
  • ✔️ DB 연결 객체 준비
  • ✔️ 로거(Logger) 객체 준비
bash
// composer require php-di/php-di

use DI\ContainerBuilder;
use Psr\Container\ContainerInterface;
use Slim\Factory\AppFactory;

// 1. 컨테이너 빌더 생성
$containerBuilder = new ContainerBuilder();

// 2. 부품 등록 (정의)
$containerBuilder->addDefinitions([
    // 'db'를 요청하면, PDO 객체를 만들어서 반환해라!
    'db' => function (ContainerInterface $c) {
        $pdo = new PDO('mysql:host=localhost;dbname=test', 'root', 'pass');
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $pdo;
    }
]);

// 3. 컨테이너 생성 및 Slim 앱에 장착
$container = $containerBuilder->build();
AppFactory::setContainer($container);
$app = AppFactory::create();

// 4. 라우트에서 편하게 꺼내 쓰기
$app->get('/users', function ($request, $response) {
    // $this->get('db') 로 컨테이너에서 DB 객체를 바로 꺼내옵니다.
    $db = $this->get('db');
    $stmt = $db->query("SELECT * FROM users");
    // ...
});
의존성 주입(DI)과 PHP-DI 컨테이너 | Minstudio