2015년 10월 16일 금요일

PHP 의존성 주입 예제

이해가 되는 슬라이드

http://www.slideshare.net/rifat/dependency-injection-10624875?qid=5def2560-b50b-4e50-8592-cb7d4d077516&v=qf1&b=&from_search=6

 

http://modernpug.github.io/php-the-right-way/#dependency_injection 에서 발췌

의존성 주입


위키백과에서 인용:
의존성 주입(Dependency Injection, DI)은 프로그래밍에서 구성요소간의 종속성을 소스코드에서 설정하지 않고 외부의 설정파일 등을 통해 컴파일 시점이나 실행 시점에 주입하도록 하는 디자인 패턴 중의 하나이다.

위와 같은 설명은 실제보다 훨씬 어렵게 느껴지게 만드는 점이 있습니다. 의존성 주입이라는 것은 특정 컴포넌트의 의존 관계를, 생성자에서 주입하거나 메소드 호출 혹은 프로퍼티 설정을 하는 방식으로 지정할 수 있게 하는 것입니다. 간단한 얘기입니다.



기본 개념


간단한 예제를 통해서 기본적인 개념을 보여드리겠습니다.

아래 코드를 보면 데이터베이스와 통신하기 위한 어댑터를 필요로 하는 Database라는 클래스가 있습니다. 생성자에서 어댑터 인스턴스를 생성하는 방식으로 되어 있어서 두 클래스는 서로 강한 의존 관계를 가지고 있습니다. 그래서 Database 클래스를 테스트하기도 어렵습니다.

<?php
namespace Database;

class Database
{
protected $adapter;

public function __construct()
{
$this->adapter = new MySqlAdapter;
}
}

class MysqlAdapter {}


아래와 같이 리팩터링하여 의존성 주입을 사용하도록 하면 의존 관계를 약화시킬 수 있습니다.

<?php
namespace Database;

class Database
{
protected $adapter;

public function __construct(MySqlAdapter $adapter)
{
$this->adapter = $adapter;
}
}

class MysqlAdapter {}


이제 Database는 내부에서 직접 의존 관계에 있는 클래스 인스턴스를 생성하지 않고, 외부에서 전달받게 되었습니다. 어댑터 인스턴스를 인자로 전달받는 메소드를 만들어서 해당 어댑터를 사용하도록 설정하는 방식을 적용하거나, $adapter 프로퍼티를public 으로 만들어서 프로퍼티를 직접 설정하게 할 수도 있을 것입니다.

0 comments:

댓글 쓰기