Wednesday, April 20, 2016

AngularJS(앵귤러JS) 서비스(Service)와 팩토리(Factory)의 차이와 관련 예제

AngularJS


멀티캠퍼스 AnnularJS 교육 3일차 입니다.
앵귤러JS 관련 예제로 빠르게 8시간을
진행하다 보니 교육이 끝나면 진이 좀
빠지지만 그래도 회사에서 AngularJS
프로젝트를 하고 있는 상태에서 듣는
교육이라 내용 이해하는 데 많이
도움이 되고 있습니다.
개인적인 생각이지만... 이렇게 단기간
속성 교육은 어느 정도 알고 들어야
도움이 되는 거 같습니다. 아예 모르는
상태에서 처음부터 배우겠다는 생각으로
갔다가는 시간만 낭비하기 딱 좋은거 같습니다.

오늘도 AngularJS 교육에서도 많은 내용이
나왔는데 그 중에서 흥미를 끄는 내용이
있어서 올려 보겠습니다.
서비스와 팩토리 관련 내용입니다.

AngularJS로 프로젝트를 하면서 factory를
특히 많이 사용했습니다. 하지만 service,
directive, constant 등 인터넷에서 검색해서
사용하기는 하지만 도대체 각각의 정확한
용도와 차이를 아직까지도 모르고 있어서
이걸 맞게 사용하고 있는 건지가 의문이었는데
오늘 그 중 서비스와 팩토리를 설명해 주는
부분이 있어서 귀가 번뜩했습니다.

Factory


일단 어제 강의에서도 Factory에 대한 내용이
잠깐 나왔던게 있어서 정리해 보겠습니다.
$scope 을 이용해서 View와 Controller를
연결을 해줍니다. 그리고 실질적인 화면 작업은
Controller에서 해주는데 이 때 기능 구현 시
하나의 controller에서가 아닌 다른 controller에서도
사용될 수 있는 기능적인 부분을 factory로 따로
빼서 관리를 한다고 합니다. 그리고 이를 위해
factory에서는 변수나 함수를 return을 해주는데
이 return 되는 값에 한해서만 다른 module에서
사용하는 것이 바람직하다. 그리고 이렇게 return을
해주는 이유는 팩토리는 내부는 변수나 함수를
var 타입으로 선언해서 외부에서는 해당 변수나
함수에 접근하지 못하도록 하는게 바람직하기
때문이라고 합니다. 대신 외부에 제공할 변수나
함수에 대해서만 return 형태로 전달해서
사용할 수 있게 하는 겁니다.


위에서 보시면 factory 내부의 변수와 함수는
모두 var 타입으로 선언이 되었습니다.
그러므로 위에 factory를 의존성 주입한
다른 module에서도 위에 변수나 함수에는
직접 접근을 할 수가 없습니다.
대신 factory에 마지막에서 return을 해주는
값들이 있는데 이 거에 대해서는 팩토리
의존성 주입이 된 다른 변수에서 접근할 수
있습니다.

Service


팩토리와 달리 service에서는 return 되는
값이나 변수가 없습니다. 그럼 이 때 생각해
봐야 될 게... 만약 서비스 내부도 팩토리처럼
var 타입의 변수/함수만 있다면 해당 service를
의존성 주입 받은 다른 module에서는 이 서비스에서
얻을 수 있는 값이 하나도 없게 됩니다. 팩토리는
return을 통해서 var 타입의 변수/함수를 외부에서도
사용할 수 있게 할 수 있는데 반해 return 형태가
없는 service는 외부에서 접근 자체가 불가능합니다.
그러므로 service는 외부에서 접근할 수 있도록
변수/함수는 this를 사용해서 선언해 줍니다.



위에 serivce를 보시면 this.변수/함수 형태로 선언이
되고 있습니다. 이러한 값들은 해당 서비스의 의존성을
받은 다른 외부 모듈에서 접근이 가능합니다.
그렇다고 service 내부의 모든 함수나 변수를 this로
선언할 필요는 없습니다. 외부접근을 막을 건 var로
선언해서 막고, 외부에 공유할 것만 this로 선언하면
되는 겁니다.

서비스와 팩토리의 용도


이 쯤 되면 그럼 서비스를 써야 되나?
팩토리를 써야 되나? 하는 의문 하나가
먼저 생기고, 또 이런 차이는 도대체
왜 존재하고, 어떻게 써먹어야 되는거지?
란 구금증도 생기게 됩니다.

여기서부터는 교육을 듣고 블로그에
정리하면서 든 제 생각 위주로 작성을
해보도록 하겠습니다. 판단은 읽으시는
분들께서 해주세요 ㅠㅠ 저도 오늘 처음
교육 듣고, 복습 하면서 곱씹어 보는 겁니다.

일단 controller라는 놈은 view와 연결되어
view 와 관련된 구현을 하는 놈이라고
보면 될 거 같습니다. 그럼 controller에서
화면을 구현하다 보면 단순하게 보이는 것만
구현하는 게 아니라 필연적으로 기능적인 개발도
수반되게 됩니다. 그런 이 화면 구현과
기능 개발을 controller에서만 하게 되면
화면의 구현과 비즈니스 로직 개발이
서로 뒤섞이게 됩니다. 즉 화면 구현이 아닌
부분(기능)을 view단과 분리를 시키기 위해
서비스나 팩토리가 존재하는게 아닌가 싶습니다.

결국 function 형태로 그 부분을 외부로 뺄건데...
이 때 그 function 내용에 특성에 따라
AngularJS에서는 service로 분리해낼 수도 있고,
factory로 분리해낼 수도 있는 겁니다.

위에서 말했 듯이 만약 해당 부분의 내용 중
일부만을 외부에 보여주고 싶다면 해당 변수나
함수는 var 타입으로 선언하면 되고, 외부로
공유하고 싶은 건 this로 선언해 주면 됩니다.
그런데 앵귤러JS의 팩토리에 경우 return하는
형태로 외부 모듈에서 접근할 수 있게 해주므로
일부만 외부에 제공하려면 factory를 사용하면
된다는 결론을 내릴 수 있지 않나 싶습니다.

또 다른 관점에서 만약 외부로 뺄 내용이
외부에서 저급해도 상관이 없다면 굳이
일부만 return해서 제공해주는 factory가 아닌
service를 사용하면 되는 거겠죠~~~

결국 factory나 service나 공통 부분을
외부로 빼서 관리를 하고 외부에서
접근하는 형태로 특정 기능이나 값을 제공하는
역할을 한다는 것은 다르지 않다는 겁니다.

접근권한, 객체지향


이렇게 주저리주저리 이야기를 하다보니

어라?? 어디서 많이 들었던 얘기들인데?

이런 생각이 갑자기 듭니다.
처음 전자과에서 소프트웨어 쪽으로
전향 한답시고 프로그램 관련 수업만
들었을 때 수업에서 줄기차게 들었던
자바의 특성들과 크게 다르지 않다라는
생각이 들었습니다. C와 같이 폭포수 코딩을
하면 가독성/관리/효율적인 면에서 많은
문제가 생겼고, 그렇게 때문에 객체지향의
언어가 부각 되었으며, 그 객체지향의
특성 중에는 재사용이 있었습니다.
따로 선언만 해놓으면 언제든 그 기능을
가져다 사용할 수 있다!!! 란 개념은
제가 오늘 얘기한 angularJS의 서비스나
팩토리의 용도와 크게 다르지 않다라는
생각이 듭니다. 또 자바에서는 public,
private 등과 같은 선언자를 사용해서
변수나 메서드접근에 제한을 주고 있습니다.
AngularJS에서도 var나 this를 이용해
외부 module에서의 접근을 제한하고 있구요~
이렇게 생각을 하니 오늘 AngularJS에 대한
이해도가 조금은 더 올라가서 친숙도가
조금은 상승한 거 같네요~~~

뭐 제 설명이 맞는지 틀린지는 모르겠지만
적어도 저 자신은 오늘 교육에 대해 납득을
시킨 거 같아 뿌듯합니다 ㅋㅋㅋㅋㅋㅋㅋ

ㅎㅎ 오늘 설명한 내용은 오늘 교육 중
한 시간 분량도 안되는 내용인데 ㅋㅋ
저도 정리가 필요하므로 시간 날 때마다
계속 블로그에 올려 놓도록 하겠습니다!

No comments:

Post a Comment