nodejs Callback 지옥 벗어나기

NodeJs 2014. 7. 15. 00:28

제가 쓰는 mongodb-mongoose 는 모든 요청의 결과를 비동기로 처리하도록 되었지요.


이게 문제인게 간단한 회원가입에 대한 처리도 아래와 같은 로직을 흐르게 됩니다.



 

아마도 스프링과 같은 기본적으로 동기식이라면 저게 뭐가 어려워? 라고 하겠지만
NodeJS 는 대다수의 IO 동작이 Callback 에 의해서 동작한다
(이건 NodeJS 의 동작과 연관된 부분이다.)

그래서 실제 코드에서는 요청에 대한 처리 결과가 모드 비동기이기 때문에 전혀 다른 곳에 정의를 해야했고 대다수의 동작들이 완벽하게 시나리오에 의한 정의만으로 되어 있습니다.

이러한 문제 때문에 콜백을 처리할 수 있는 좀 더 코드가독성을 높일 방법을 찾을 수 밖에 없었습니다.

그러다가 알게된 Q 라는 라이브러리를 알게 되었습니다. 본디는 Promises 라는 개념이 있다는 것을 알게 되고 nodejs 모듈을 검색했더니  Q 가 제일 높은 점유율을 보여주고 있어서 선택했죠.

자 그럼 Q 라이브러리를 통해 개선된 코드를 보여드리겠습니다.

    userdao.findOne(email)
        .then(function(findObject) {
            console.log("Find : " + findObject);
            throw new Error("It has same email");
        }, function(err) {
            console.log("Error : " + err);
            if (!err) {
                return userdao.save(email, pwd, name);
            } else {
                throw err;
            }

        })
        .then(joinSuccess, joinFail);

Q 에 의해 정의된 로직을 구현하면 위와 같이 각 단계별 로직을 하나의 코드페이지에서 관리할 수 있게 됩니다.


userdao.findOne(email) 의 정의는 아래와 같습니다.

var deferred = Q.defer();

    UserModel.findOne({email: email}, function (err, findObject) {

        if (findObject) {
            deferred.resolve(findObject);
        } else {
            if (!err) {
                deferred.reject(new Error("No Item"));
            } else {
                deferred.reject(err);
            }
        }

    });

    return deferred.promise;

위에서 보듯이 Q.defer() 를 통해 로직은 Q 에 의해 관리되는 것이라 선언 후 promise 객체를 반환하여 다음 처리를 예약할 수 있도록 하였습니다.
코드 내의 콜백은 defer.reject() 또는 defer.resolve() 를 통해서 Success, Fail 를 실행하도록 되어 있습니다.

이러한 라이브러리를 소개하는 가장 큰 이유는 모바일 어플리케이션을 개발하는 과정에서 정말 많이 고민했던 부분입니다.

특정 앱에서는 시나리오 단계가 10단계 가까이 가는 경우가 있었는데 이런 경우 각 단계별 성공 실패를 정의하다보면 A 클래스, B 클래스등을 날아다녀야 하는 경우가 많았습니다.

이러한 해결책을 Nodejs 에서 만나게 될 줄은 몰랐네요.

Callback 지옥에서 벗어나는 큰 도움이 된 라이브러리였습니다 :)

'NodeJs' 카테고리의 다른 글

nodejs Callback 지옥 벗어나기  (0) 2014.07.15
NodeJS 의존성 라이브러리 관리  (0) 2014.03.16
NodeJS 와의 첫 만남  (0) 2014.03.16

설정

트랙백

댓글

NodeJS 의존성 라이브러리 관리

NodeJs 2014. 3. 16. 16:56

처음에 프로젝트를 작성할 때 데이터베이스까지 한번 찍어보는 기본 동작을 해보기 위해서

기존에 설치되어 있던 Mariadb 에 접근하기 위해서 별도로 아래와 같이 하였다.

$> sudo npm install mariasql

※ 저는 mac 이라 sudo 를 붙였습니다.

그래서 mariadb 와 연동하는데는 크게 문제가 없었습니다.

근데 문득 든 생각은..
그럼 실제 Deploy 하게 될 서버에서도 저걸 다 설정해줘야해? 하는 생각이 들었습니다.


그래서 찬찬히 훑어보니 구글링.. 이러한 문제를 이미 해결된 상태였던 것입니다.


1. 의존성 추가 방법

NodeJS Espress 프로젝트에서 최상단에 보면 package.json 파일을 볼 수 있습니다.

이 파일의 내부를 보면 아래와 같습니다.

그 중에서 유심히 본 것이 dependencies 입니다.
거기에 전 mariasql 과 버전을 표기하였습니다.


2. 의존성 라이브러리 가져오기

 1 에서 설정한 package.json 의 경로로 이동하여 다음과 같이 명령어를 칩니다.

$> cd [프로젝트 경로]

$> npm outdated

.. 중략

Package       Current  Wanted  Latest  Location
mariasql      MISSING  0.1.20  0.1.20  mariasql
express         3.2.6   3.2.6   3.4.8  express
transformers    2.1.0   2.1.0   3.0.0  jade > transformers
readdirp        0.2.5   0.2.5   0.3.3  jade > monocle > readdirp
optimist        0.3.7   0.3.7   0.6.1  jade > constantinople > uglify-js > optimist
optimist        0.3.7   0.3.7   0.6.1  jade > with > uglify-js > optimist

$> npm update

(..중략)
mariasql 와 관련 의존성 업데이트


3. 라이브러리 확인

최종적으로 [프로젝트 경로]/node_modules/ 에 mariasql 이 추가된 모습을 보실 수 있습니다. 



이렇게 하면 Maven 프로젝트처럼 공동 저장소에 의존성 라이브러리들을 추가하면 별도로 관리할 필요가 없겠죠? ^^

'NodeJs' 카테고리의 다른 글

nodejs Callback 지옥 벗어나기  (0) 2014.07.15
NodeJS 의존성 라이브러리 관리  (0) 2014.03.16
NodeJS 와의 첫 만남  (0) 2014.03.16

설정

트랙백

댓글

NodeJS 와의 첫 만남

NodeJs 2014. 3. 16. 16:27

업무외에 취미로 나만의 서비스를 하나 만들어겠다고 생각하기를 1달..

그동안 간단한 세팅만 하다가 드디어 개발 플랫폼을 선정했습니다.


최근 많은 서비스 제품들 사이에서 화두가 되고 있는 NodeJS

많은 이야기들이 오고가고 있지만...전 아직 노드JS의 ㄴ도 모르니 다 생략하고 우선 부딪혀봐야 좋은지 안 좋은지 느낄 수 있다는 경험적 행동주의를 가진지라 무작정 부딪혀봤습니다.


1. NodeJS 용 IDE : (IntelliJ13 -> Eclipse)

처음부터 큰 벽을 만나게 되었습니다. 원래는 IntelliJ 를 숙지할 겸 해서 설치하였는데
NodeJS 플러그인이 설치되지 않아 왜 안되지 했는데 IntelliJ 는 유료버전만 NodeJS 를 지원한다는 군요. 

IntelliJ Unlimit 용에 한해서 제공하며 개인용은 $199 라고 합니다.
1년에 1~2번 정도 할인이 들어간다고 하니 그때를 노려야겠습니다.

그래서 선택은 별 수 없이 Eclipse 용 IDE Plugin - Enide(=NodeJS Plugin)입니다.

2. NodeJS 용 프레임워크 : (Espress, Jade)

사실 프레임워크는 뭐 선택의 여지도 없이 검색하니 Espress 와 Jade 가 제일 먼저 검색되서 생각할 것도 없이 이걸로..

대충 매뉴얼을 통해서 느낀건 Espress 는 MVC 프레임워크? 정도 Jade 는 그 중 View 를 담당하는 녀석?


3. 프로젝트 생성

1) 이클립스에서 Enide Plugin 설치
2) NodeJS Espress Project 선택
3) 다음..다음..다음..하니 서버 설정까지 기본적으로 다 들어가 있더군요.


app.js 를 NodeJS 용으로 Run 시키니 동작 -_-b
일반 디버깅처럼 Break Point 설정 후 Debug Run 하니 디버깅도 되네요.


소감

가장 많이 놀랬던 점은 기본에 Tomcat 을 사용했을 때보다 훨씬 더 응답 속도가 빠르다는 것이었습니다.
현저하게 느껴질 정도로...

아..이래서 많은 서비스회사들이 NodeJS 로 옮기는구나...라는 생각을 많이 했습니다.



'NodeJs' 카테고리의 다른 글

nodejs Callback 지옥 벗어나기  (0) 2014.07.15
NodeJS 의존성 라이브러리 관리  (0) 2014.03.16
NodeJS 와의 첫 만남  (0) 2014.03.16

설정

트랙백

댓글