본문 바로가기

AngularJS

15. 모듈(Module)

1. 개요

 - 모듈은 대체로 관련된 기능을 하나로 묶어 다른 코드와 결합도를 줄이고 재사용성을 높이기 위해 사용한다.

 - 모듈을 선언하는 코드

 angular.module("모듈이름", ["사용할 모듈", ...])

 - angular.module 함수를 사용해 모듈을 만들면 모듈 인스턴스가 반환되는데 해당 모듈 인스턴스는 컨트롤러, 서비스, 지사자, 필터들을 담는다.

 * 참고 모듈 인스턴스 메서드

모듈 메서드 

설명 

Module.config(configFunction) 

모듈이 로딩될 때 호출되며 config 함수에 해당 익명 함수로 서비스를 설정할 수 있다.

Module.constant(name, object) 

모듈에서 사용되는 상수를 등록한다. 

Module.controller(name, constructor) 

모듈에서 사용되는 컨트롤러를 등록한다. 

Module.directive(name, directiveFactory)

모듈에서 사용되는 지시자를 등록한다. 

Module.factory(name, providerFunction) 

모듈에서 사용되는 서비스를 팩토리 형태로 등록한다. 

 Module.filter(name, filterFactory)

모듈에서 사용되는 필터를 등록한다. 

Module.provider(name, providerType) 

모듈에서 사용되는 서비스를 제공하는 프로바이더를 등록한다. 

Module.run(initializationFn) 

어플리케이션 초기화 함수를 등록한다. 모든 모듈의 등록을 완료했을 때 초기화 함수가 실행된다. 

 Module.service(name, constructor)

모듈에서 사용되는 서비스를 등록한다. 

Module.value(name, object) 

모듈에서 사용되는 객체를 등록한다. 


2. 모듈을 이용한 컨트롤러 등록

 - 모듈을 이용해 컨트롤러를 선언하고 해당 모듈을 사용하는 어플리케이션이 등록된 컨트롤러를 사용할 수 있다.

<!DOCTYPE html>

<html ng-app="ngBookmark">

<head>

<meta charset="UTF-8">

<script type="text/javascript" src="js/lib/angular.js" ></script>

<script type="text/javascript">

angular.module('ngBookmark',[])

.controller('bookmarkListCtrl', ["$scope", function($scope){

$scope.bookmarkList=[

                    {id:"google", name:"구글", url:"www.google.com"},

                    {id:"naver", name:"네이버", url:"www.naver.com"},

                    {id:"daum", name:"다음", url:"www.daum.com"}

                    ];

}]);

</script>

</head>

<body>

<div ng-controller="bookmarkListCtrl">

<h1>북마크 목록</h1>

<div>

<ul>

<li ng-repeat="bookmark in bookmarkList">

<em>{{bookmark.name}}</em>:<span>{{bookmark.url}}</span>

</li>

</ul>

</div>

</div>

</body>

</html>

ng-app="ngBookmark"

 - ng-app 지시자에는 해당 어플리케이션이 사용하는 모듈의 이름을 값으로 줄 수 있다. 

.controller('bookmarkListCtrl', ["$scope", function($scope){

 - 이름이 bookmarkListCtrl인 컨트롤러 함수를 등록한다. 

 - controller()함수의 첫 번째 인자는 컨트롤러 명이고 두 번째 인자는 배열 또는 함수가 된다.

 - 배열일 경우 배열의 0~n-1 번째 까지는 해당 컨트롤에서 사용하는 서비스 명을 문자열로 주고 마지막 n번째에서는 컨트롤러 함수가 와야 한다.

 - 해당 컨트롤러 함수에서 사용할 서비스를 컨트롤러 함수의 인자로 작성하고 그 서비스의 이름을 배열에 이름으로 주는 것이다.

그래서 배열의 0~n-1 번까지의 문자열 개수가 컨트롤러 함수에서의 인자의 개수와 같아야 한다.

이렇게 배열에 사용하는 서비스명을 작성하는 이유는 자바스크립트 코드 찹추기인 minifier, uglifier에서 컨트롤러 함수 인자 문자열을 a, b, c 처럼 바꾸어 서비스 명을 제대로 전달하지 못하기 때문이다.


3. 다른 모듈의 사용

 - ng-app에 해당 어플리케이션이 사용하는 모듈명을 값으로 주었다.

이는 하나의 어플리케이션에서 하나의 모듈만 사용하는 것처럼 보이지만 angularJS module 함수에서 어러 모듈을 참조할 수 있는 기능을 제공한다.

angular.module("ngBookmark", ["moduleA","moduleB"])

 - 위와 같이 ngBookmark 모듈을 선언할 때 해당 모듈이 참조하는 moduleA와 moduleB를 선언하는 것이다.

사실 우리가 사용하는 ng-repeat, ng-select와 같은 지시자와 $http, $log와 같은 서비스 모두 기본 모듈인 ng 모듈에서 제공하는 것들이다.

우리가 모듈을 선언하면 기본적으로 ng 모듈을 사용하게 된다.


- 쿠키 모듈을 사용하는 예제

<!DOCTYPE html>

<html ng-app="cookieDemo">

<head>

<meta charset="UTF-8">

<script type="text/javascript" src="js/lib/angular.js" ></script>

<script type="text/javascript" src="js/lib/angular-cookies.js" ></script>

<script type="text/javascript">

angular.module('cookieDemo', ['ngCookies'])

.controller("mainCtrl", ['$scope', '$cookieStore', function($scope, $cookieStore){

$scope.value=$cookieStore.get("test")|| "없음";

$scope.getValue=function(){

$scope.value=$cookieStore.get("test");

};

$scope.putValue=function(iV){

$cookieStore.put("test", iV);

};

}]);

</script>

</head>

<body ng-controller="mainCtrl">

<h1>Cookie 서비스 사용</h1>

<p>test 키로 저장된 값 : {{value}}</p>

<button ng-click="getValue();">쿠키가져오기</button>

<br>

<input type="text" ng-model="iValue">

<button ng-click="putValue(iValue)">쿠키저장</button>

</body>

</html>

1) angular.module('cookieDemo', ['ngCookies'])

'cookieDemo' 모듈을 선언할 때 ngCookies 모듈을 사용한다는 의미로 'ngCookies' 문자열을 배열에 입력하였다.


2) .controller("mainCtrl", ['$scope', '$cookieStore', function($scope, $cookieStore){

ngCookies 모듈은 두 개의 서비스를 제공한다. 

하나는 $cookie이고 다른 하나는 $cookieStore다. 

$cookieStore 서비스를 사용하기 위해 컨트롤러 함수에 $cookieStore를 인자로 주었다. 그러면 AngularJS가 ngCookie 모듈이 제공하는 해당 서비스를 mainCtrl 컨트롤러에서 사용할 수 있게 $cookieStore 인자로 주입하여 준다. 


3) $scope.value=$cookieStore.get("test")|| "없음";

"test" 키를 이름으로 가지는 값을 쿠키에서 가지고 온다. 없으면 "없음"을 $scope.value에 대입한다.


4) $cookieStore.put("test", iV);

"test"를 키로 하여 전달받은 값을 쿠키에 저장한다.