정보, 통신, 기술/읽은 것들

Node.Js 노드제이에스 프로그래밍

최윤호 2013. 6. 16. 22:10
반응형

 

Node.Js 노드제이에스 프로그래밍 클라우드 컴퓨팅 시대의 고성능 자바스크립트 플랫폼

 

저자 : 변정훈

출판사 : 에이콘출판

출판일 : 2012.02.17

 

요즘 유행하는 Node.Js를 이용한 프로그래밍 서적이다. 자바스크립트와 CommonJS, 탄생과 역사, 그리고 특징 등의 기본적인 노드 소개설치와 간단한 샘플 등의 시작을 거쳐서 전역 객체, 유틸리티, 이벤트, 버퍼, 스트림, 파일 시스템, 경로, 네트워크, HTTP와 HTTPS, URL과 퀴리 문자열, 자식 프로세스, 클러스터, TCP를 이용한 채팅 예제 등의 기본 모듈에 대한 설명을 지나 npm을 이용한 확장 모듈 관리를 하고, 트워터 백업 애플리케이션 예제를 배운 후에 드디어 Simple Chat 예제가 나온다.

 

Simple Chat을 구성하는 2개의 확장 모듈인 경량 웹 프레임워크 익스프레스리얼타임 웹사이트를 위한 Socket.IO를 먼저 익힌 후에 익스프레스와 Socket.IO를 이용한 Simple Chat 예제가 본격적으로 펼쳐진다.

어느 지인이 말한대로 Node.JS 자습서의 1장이 채팅일지라도 완성된 채팅 기능을 하는 샘플은 쉽게 구할 수 없다.(물론 이 샘플도 완성 버전은 아니다. 단지, 기능적으로 입장부터 퇴장까지 완전하다.)

더구나 자세한 설명이 "한글"로 된 온전한 소스라니!!

앞의 확장 모듈을 설명하는 장과 함께 익히면 풍부한 주석까지 포함해서 총 350 라인 정도되는 온전히 작동하는 풀 소스를 갖게 된다.

 

Simple Chat 예제 이후, 책은 디버깅유닛 테스트, 그리고 VMWare의 클라우드 파운드리, 허로쿠, 조이엔트의 no.de 소개가 들어있는 클라우드 서비스 배포로 마무리된다.

 

개인적으로 자바스크립트 언어를 좋아하지만, 자바스크립트로 서버사이드를 100% 구현하는 것은 개발 생산성과 유지보수면에서 어렵지 않나 싶다. 정의로 이동, 자동완성, 리팩토링과 같은 IDE 기능도 그렇고, 인터페이스와 클래스 상속이란 OOP 언어면도 그렇고, 브레이킹과 단계별 실행 등의 디버깅도 그렇고, 전체 소스에 대한 가독성도 그렇고, 여러모로 아직은 그렇다.

 

반면 API 서비스를 하는 부분에선 UI라고는 JSON 데이터 Response하는 부분이 다인만큼 데이터베이스 드라이버만 제대로 갖춰진다면 얼마든지 Node.JS가 갖는 비동기성의 매력을 발휘할 여지가 많겠다는 생각이다.

지금 공부하는 이유도 개발중인 API 서비스에 Socket.IO를 적용해 보기 위함이고 말이다.

 

Node.JS에 관심있는 분이라면 일독을 권한다.

정말 어렵지 않게 단계별로 차근차근 설명해 준다.

 

다음은 경량 "6장 웹 프레임워크 익스프레스"에 나오는 "비동기 패턴의 의존성 문제" 해결 방안이다.

책을 읽다 보면 이거 뭐야 싶은 부분을 바로바로 긁어주는 부분이라 정리해 둔다.

 

6.6 비동기 패턴의 의존성 문제

6.5절에서 살펴본 MySQL과 몽고디비 예제를 보면 거슬리는 부분이 있다. 웹 서버에 대한 코드와 데이터베이스를 사용하는 코드를 분리하기 위해 repository.js를 만들었지만, 노드의 특징인 비동기로 인해 뷰 파일을 렌더링하는 코드가 repository.js의 콜백 함수 안으로 들어갔다. 의존성을 갖지 않기 위해 파일을 분리했지만, 데이터베이스 사용 결과가 콜백 함수로 전달되기 때문에 뷰를 렌더링하는 부분도 콜백 함수 안으로 이동했고, 결과적으로 깊은 의존성이 생겼다. 이는 좋은 모듈화라고 할 수 없다. ... 비동기 패턴의 의존성을 해결하는 방법은 두 가지가 있다.

 

1) 콜백 함수를 사용한 의존성 제거

콜백 함수를 이용하는 방법은 다른 함수를 호출할 때 추가적인 파라미터로 콜백 함수를 같이 전달한다. 지금까지 노드 기본 모듈의 I/O를 사용하면서 계속 사용했던 방법이기도 하다. ... 사용된 모듈에서 결과를 처리하는 대신 콜백 함수를 호출하면서 파라미터로 결과를 전달한다.

 

2) 이벤트를 사용한 의존성 해결

모듈 간의 의존성은 콜백 함수 대신 이벤트를 사용해 해결할 수 있다. 노드는 이벤트를 사용할 수 있게 이벤트 기본 모듈에서 EventEmitter 클래스를 제공한다. EventEmitter를 사용하면 모듈 간의 이벤트를 등록하고 발생시킬 수 있다.

 

3) 반복문에서 비동기 작업

노드로 코드를 작성하다 보면 반복문에서 비동기 요청을 사용하고 반복문이 끝난 후에 그 결과를 사용해야 하는 때가 있다. ... readFile()의 콜백 함수는 비동기로 실행되므로 console.log()가 실행되는 순간에는 text 변수에는 값이 들어 있지 않다. for문에서 실행한 fs.readFile()이 모두 실행 완료된 시점에 text를 사용해야 하지만, 이 시점을 정확히 알기가 어렵다. 이 문제는 콜백 함수나 이벤트로는 해결하기가 쉽지 않은데, 가장 간단한 방법은 loopIndex와 같은 변수를 추가해서 loopIndex가 마지막에 도달하면 console.log를 실행하는 것이다.

 

상기 내용은 샘플과 자세한 설명을 제외한 것으로 정확한 내용의 이해를 위해서는 꼭 책을 읽어 보기 바란다.

 

하지만, 함수가 파라미터로 함수 사이를 넘나드는 것 자체가 익숙하지 않다면 고구마 넝쿨같은 콜백 함수 연결 체인은 90년대 goto문만큼이나 코드를 이해하기 어렵게 만들 것이다. 따라서 이벤트를 사용한 의존성 해결이 생소한 접근이긴 하지만, 비동기라는 특수성을 이해하는 차원에서 더 맞는 접근방법이라 판단된다.

 

반복문에서 비동기 작업 역시 상기에서 소개한 내용 이후에 책에 더 소개되어 있는 재귀적 방법이 역시나 비동기라는 특수성에서 더 맞는 방법이라 생각된다.

 

반응형