안녕하세요 이번에는 라라 벨의 서비스 컨테이너에 대해 알아보도록 하겠습니다!

전 처음에 이 서비스 컨테이너에 정의가 제대로 잡히지 않아서 좀 고생했었습니다. :(

우선!

 

라라벨 홈페이지에 나오면 서비스 컨테이너의 정의부터 보시면,

라라 벨의 서비스 컨테이너는 클래스의 의존성을 관리하고 의존성을 주입하는 강력한 도구입니다. 의존성 주입이라는 멋진 말의 의미는 다음과 같습니다: 클래스 간의 의존성은 클래스 생성될 때 또는 경우에 따라 "setter" 메서드에 의해서 "주입" 된다는 의미입니다.

라는 말이 나와있습니다.

 

여기서 의존성주입 이란 단어를 이해하시면 라라 벨 서비스 컨테이너에 대해 보다 쉽게 접근하실 수 있습니다.

의존성 주입이란, 기존에 존재하는 디자인 패턴 중의 하나로 DI (Dependency Injection)이란 말로 많이 알려져 있습니다.

(구성요소 간의 의존 관계가 소스코드 내부가 아닌 외부의 설정 파일 등을 통해 정의되게 하게 만드는 것)

 

??

소스코드 내부가 아닌 외부의 설정 파일이라.. 무슨 말이지??라고 생각하실 수 있습니다.

여기서 의존성 주입이라는 단어를 제외하고 코드를 한번 작성해 보겠습니다.

class TestLaravel{
 public function __construct() {
  $sql = new Mysql();
 }
}

class Mysql {
}

class Test {
 public function test(){
  $testLaravel = new TestLaravel();
 }
}

위의 코드에서 문제점이 보이시나요?

겉보기엔 아무 문제없는 코드인데 뭐가 문제지?라는 생각을 하실 수 있습니다.

 

하지만 TestLaravel 클래스는 Mysql클래스를 의존하고 있는 것입니다.

이게 왜?라는 질문이 있을 수 있습니다.

 

만약 여기서 Test클래스는 Mysql 말고 MongoDB도 필요한 작업들이 생긴다고 가정해보겠습니다.

그렇게 되면 TestLaravel은 mongoDB를 가져오는 인스턴스를  만들어야 하는 작업들이 귀찮은 작업들이 생기게 되는 겁니다. 이게 1~2개면 뭐 상관없지만, 100개 200개 300개가 되는 순간 지옥의 시작입니다.. :(

 

여기서 저희들은 의존성 주입이란 것을 이용해 보도록 하겠습니다.

class TestLaravel{
 protected $sql = null;

 public function __construct(DBInterface $sql) {
  $this->sql = $sql
 }
}

class Mysql implements DBInterface{
}
class MongoDB implements DBInterface{
}

interface DBInterface {
}


class Test {
 public function test(){
  $mongoDB = new MongoDB();
  $mysql = new Mysql();
  $mongoDBTestLaravel = new TestLaravel($mongoDB);
  $mysqlTestLaravel = new TestLaravel($mysql);
 }
}

달라진 점은 interface를 이용한다는 점!

이렇게 함으로써 TestLaravel을 사용할 때 mongoDB가 됐든, mysql이 됬든 상관없이 먼저 인스턴스를 만들고 값을 넣어줌으로써, TestLarvel클래스는 수정 없이 바로바로 사용할 수 있게 된다는 점입니다!

 

이제 여기까지 의존성 주입을 알아봤는데요.

이게 왜 서비스 컨테이너랑 무슨 상관인데?라는 의문이 들 수 있습니다.

 

서비스 컨테이너는 프로바이더의 $this->app 속성을 통해서 컨테이너 인스턴스에 접근할 수 있다는 점입니다.

(프로바이더는 다음장에 배우도록 하겠습니다.)

$this-app이 서비스 컨테이너 자체이자 위의 예제에서 썼던 인터페이스 역할을 하고 있는 것입니다.

 

예제를 보겠습니다.

$this->app->bind('HelpSpot\API', function ($app) {
    return new HelpSpot\API($app->make('HttpClient'));
});

위의 예제는 라라 벨 공식 홈페이지의 예제입니다.

$this-app을 이용하여 컨테이너 인스턴스에 접근한 뒤 bind메서드를 사용하여 HelpHelpSpot\API의 인스턴스를 의존성 주입하는 모습입니다.

 

여기서 딱 한 번만 더 강조하자면 $this-app이 서비스 컨테이너 인스턴스에 접근할 수 있다는 점! 

 

이렇게 라라 벨의 서비스 컨테이너에 대해 알아보았습니다. :)

 

다음장에는 서비스 프로바이더, 파사드에 대해 알아보도록 하겠습니다. 

+ Recent posts