01. Binding : http://forum.falinux.com/zbxe/index.php?document_srl=804623
02. Controller : http://forum.falinux.com/zbxe/index.php?document_srl=804950
03. controller 사이의 데이터 공유 : http://forum.falinux.com/zbxe/index.php?document_srl=805325
04. controller에 메소드 만들기 : http://forum.falinux.com/zbxe/index.php?document_srl=805915
05. Filter : http://forum.falinux.com/zbxe/index.php?document_srl=806499
06. ng-repeat와 filter의 응용 : http://forum.falinux.com/zbxe/index.php?document_srl=806788
07. Directive : http://forum.falinux.com/zbxe/index.php?document_srl=807545
08. Directive #2 : http://forum.falinux.com/zbxe/index.php?document_srl=808009

이번시간에는 AngularJS의 의존성 주입에 대해서 간략하게 알아보겠습니다.

우선 기본이 되는 index.html과 main.js를 작성해봅시다.

var app = angular.module("app", []);

app.controller("MyCtrl", function($scope, $http) {
        console.log($scope);
        console.log($http);
});

app.directive("myDirective", function() {
        return {
                restrict: "E",
                link: function (scope, element, attrs) {
                        console.log(scope);
                        console.log(element);
                        console.log(attrs);
                }
        }
});

<!DOCTYPE html>
<html>
<head>
        <title>Binding</title>
</head>
<body>
<div ng-app="app">
        <div ng-controller="MyCtrl">
                <my-directive>
                </my-directive>
        </div>
</div>
<script type="text/javascript" src="components/angularjs/angular.js"></script>
<script type="text/javascript" src="javascripts/main.js"></script>
</body>
</html>


브라우저를 열고, 개발자도구를 열어서 확인해보면 controller에서 찍은 $scope와 directive에서 찍은 scope와 같음을 알 수 있습니다. directive에서 별도의 scope를 정의하지 않으면 동일한 scope를 사용합니다.


main.js를 다음과 같이 수정합니다.

var app = angular.module("app", []);

app.controller("MyCtrl", function($scope, $http) {
        console.log($scope);
        console.log($http);
});

app.directive("myDirective", function() {
        return {
                restrict: "E",
                scope: {},
                link: function (scope, element, attrs) {
                        console.log(scope);
                        console.log(element);
                        console.log(attrs);
                }
        }
});


확인해보면 $scope와 scope가 다르게 찍히는 것을 확인할 수 있습니다. 이렇게 directive에서 scope를 정의해버리면 controller가 아닌 local scope를 다시 생성하게 됩니다.


그러면 directive에서 controller에 있는 scope를 사용하려면 어떻게 해야할까요?

다음과 같이 바꾸어봅시다.

var app = angular.module("app", []);

app.controller("MyCtrl", function($scope, $http) {
        console.log($scope);
        console.log($http);
});

app.directive("myDirective", function() {
        return {
                restrict: "E",
                scope: {},
                link: function ($scope, scope, element, attrs) {
                        console.log($scope);
                        console.log(scope);
                        console.log(element);
                        console.log(attrs);
                }
        }
});

로그를 보면 $scope는 controller의 것을, scope는 directive의 것임을 확인할 수 있습니다.



이번에는 main.js를 이렇게 바꿔봅시다.

var app = angular.module("app", []);

app.controller("MyCtrl", function($scope, $http) {
        console.log($scope);
        console.log($http);
});

app.directive("myDirective", function() {
        return {
                restrict: "E",
                scope: {},
                link: function ($scope, element, scope, attrs) {
                        console.log($scope);
                        console.log(scope);
                        console.log(element);
                        console.log(attrs);
                }
        }
});


인자의 순서를 바꿨더니 element에 scope의 내용이 들어왔습니다. 이렇게 일반 이름은 순서에 따라서 의존성이 주입됩니다.


이번에는 이렇게 한번 바꿔보겠습니다.

var app = angular.module("app", []);

app.controller("MyCtrl", function($http, $scope) {
        console.log($scope);
        console.log($http);
});

app.directive("myDirective", function() {
        return {
                restrict: "E",
                scope: {},
                link: function ($scope, scope, element, attrs) {
                        console.log($scope);
                        console.log(scope);
                        console.log(element);
                        console.log(attrs);
                }
        }


이번에는 어떤가요? 인자의 순서가 바뀌었음에도 불구하고 $scope는 scope정보를 가지고 있습니다.


이렇듯이 $로 정의된 변수는 미리 정의된 angular-js의 것을 의존성 주입하도록 되어있습니다.


$scope라는 것을 바꾸고 싶다면 어떻게 해야할까요?

다음과 같이 해봅시다.

var app = angular.module("app", []);

app.controller("MyCtrl", ["$scope", "$http", function(스코프, 에치티티피) {
        console.log(스코프);
        console.log(에치티티피);
}]);

app.directive("myDirective", function() {
        return {
                restrict: "E",
                scope: {},
                link: function ($scope, scope, element, attrs) {
                        console.log($scope);
                        console.log(scope);
                        console.log(element);
                        console.log(attrs);
                }
        }


처음에 썼던 방식은 편의를 위해서 축약된 선언이고, 위와 같이 선언하는 것이 정석대로 하는 것입니다. 어떤 것을 의존성 주입을 할 것인지 먼저 정의하고 그 정의된 순서대로 인자에 의존성 주입이 되는 방식입니다.



여기까지 angular-js의 의존성 주입에 대해서 아주 간단하게 살펴보았습니다.