The Pursuit of Happyness

반응형

이 포스팅은 Manning 출판사에서 나온 Getting MEAN with Mongo, Express, Angular, and Node 라는 책의 내용을 요약한 것입니다.


https://www.manning.com/books/getting-mean-with-mongo-express-angular-and-node


@ 풀스택 개발자의 장점

- 남들 보다 일을 더 많이 하게 된다. 

- 야근도 많이 할 수 있다.

- 서버도 체크해야하므로 퇴근과 주말은 없어진다.

- 개발 프로세스의 모든 과정을 이해함으로써 프로젝트의 흐름을 잘 파악할 수 있으며, 그것을 바탕으로 효율적인 코딩 작업을 할 수 있게 된다.

- 궁극적으로 본인의 가치가 향상 된다.


@ MEAN 이란?

책 제목에 나오는 Mongo DB, Express, AngularJS, Node.js 등의 기술을 바탕으로한 개발을 이야기함

- Mongo DB : NoSQL DB 중에 하나로 Document 형식으로 데이터를 저장하는 DB

- Express : jade 등의 템플릿 엔진을 이용해서 개발하는 백엔드 프레임워크

- AngularJS : 동적인 웹 애플리케이션을 개발할 때 사용하는 프론트엔드 프레임워크

- Node.js : javascript 언어를 이용해서 개발하는 소프트웨어 플랫폼


@ 개발 프로세스

1. Mock-up 사이트 개발

2. 데이터 모델링 및 DB 설계

3. API 개발

4. 애플리케이션에 실제 데이터 적용

5. 애플리케이션 마무리 작업


@ MEAN 설계

1. 블로그 페이지

-  컨텐츠가 풍부하다.

- 사용자가 하는 일이 적다.

- 첫 페이지 로딩이 빨라야 한다.

- 사용자들이 머무는 시간이 짧다.

- 공개적이고 공유가 가능하다.

2. Admin 페이지

- 기능이 풍부하다

- 사용자의 조작이 많다.

- 조작에 대한 반응이 빨라야 한다.

- 사용자들이 머무는 시간이 길다.

- 비공개 작업이다.


@ 웹 개발 설계

1. Express App : 서버에서 웹페이지를 생성해서 보내주는 방식 

2. Express and extras : 서버에서 웹페이지를 생성해서 보내주며, 페이지에 들어가는 내용은 클라이언트에서 데이터를 받아서 웹페이지를 렌더링 하는 방식

3. Angular SPA : 서버에서 정적인 웹페이지를 받아와서, 클라이언트에서 데이터를 받아와서 렌더링을 해주는 방식


@ 기타

- 책에서는 위의 웹 개발 설계에 소개된 방법에 따라서 예제 프로젝트를 작성해 가며 단계적으로 설명을 해줍니다.

- MEAN 각각에 대해서 깊이 있게 다루는 책은 아니지만, 웹 프로젝트를 다루는데 필요한 코드를 통해서 기본적인 사용법을 익히는 데 큰 도움을 줍니다.

- 테스트 서비스를 위한 Heroku 솔루션 사용법을 제공해 줍니다.

- Express 관련해서는 간단한 jade 템플릿 엔진에 사용법 및 라우팅에 대해서 설명합니다.

- Mongo DB 를 사용할 때는 mongoose 를 사용하여 객체 모델링이나 validation 을 하는 방법에 대해서도 소개하고 있습니다.

- REST API를 만드는 방법에 대해서 설명합니다.

- SPA (Single Page Application) 형식으로 앱을 제작하는 방법에 대해서도 설명을 해주고 있습니다.

- Angular JS는 1.x 버전으로 설명하고 있으며, 라우팅이나 데이터 바인딩에 대해서 설명합니다.

- 웹토큰을 이용한 로그인 인증 처리 예제를 제공합니다.


또한 무료로 배포하는 부록에는 Javascript 코딩 습관에 대한 저자의 노하우를 공개하고 있습니다. 


이미 각 스택에 대해서 잘 알고 계신 분이 보기에는 조금 아쉬운 감이 있겠지만, MEAN을 이용한 웹개발 입문자에게는 상당히 도움이 될 만한 책이라고 생각됩니다.






반응형

반응형

실행환경 Ubuntu 14.04 LTS / node v0.10.25


이번에는 events 모듈을 이용한 채팅서버 코드이다.

events 모듈을 이용하여 원하는 명령어에 대한 동작을 다음과 같이 구현하면 된다.

event를 전송하는 channel 객체를 생성하고, 채널 객체에 clients 에는 소켓들을, subscriptions 에는 각 클라이언트에 전달하는 메써드를 지정한다.

클라이언트 연결시에는 'join' 이벤트가, 연결 종료시에는 'leave' 이벤트가 처리된다.


var events = require('events');
var net = require('net');

var channel = new events.EventEmitter();
channel.clients = {};
channel.subscriptions = {};

channel.on('join',
        function(id, client) {
                this.clients[id] = client;
                this.subscriptions[id] = function(senderId, message) {
                        if (id != senderId) {
                                this.clients[id].write(message);
                        }
                }
                this.on('broadcast', this.subscriptions[id]);
        }
);

channel.on('leave',
        function(id) {
                channel.removeListener('broadcast', this.subscriptions[id]);
                channel.emit('broadcast', id, id + " has left the chat.\n");
        }
);

var server = net.createServer(
        function(client) {
                var id = client.remoteAddress + ':' + client.remotePort;
                channel.emit('join', id, client);
                client.on('data',
                        function(data) {
                                channel.emit('broadcast', id, data.toString());
                        }
                );
                client.on('close',
                        function() {
                                channel.emit('leave', id);
                        }
                );
        }
);
server.listen(3000);


반응형

반응형

실행환경 Ubuntu 14.04 LTS / node v0.10.25


이번에는 유저가 정의한 모듈을 사용하는 예제이다.

살펴볼 예제는 세율을 설정하고 아이템 가격을 입력하면 세금을 포함한 가격을 계산해 주는 모듈이다.


먼저 lib 라는 폴더를 만들고 거기에 tax.js라는 파일을 생성하여 다음과 같이 코딩한다.

var _taxRate = 0.10;

function roundTwoDecimals(amount) {
        return Math.round(amount*100) / 100;
}

exports.getTaxRate = function() {
        return _taxRate;
}

exports.setTaxRate = function(taxRate) {
        _taxRate = taxRate;
}

exports.calcTotalAmount = function(price) {
        return roundTwoDecimals( (1 + _taxRate) * price );
}

tax 라는 모듈을 이용해서 실행할 예제이다. moduletest.js 라는 파일을 만들어서 다음과 같이 코딩하자.

var tax = require('./lib/tax');
tax.setTaxRate(0.09);

var itemPrice = 10.00;
console.log("Tax Rate     :  " + (tax.getTaxRate()*100).toFixed(2) + "%");
console.log("Item Price   : $" + itemPrice.toFixed(2));
console.log("Total Amount : $" + (tax.calcTotalAmount(itemPrice)).toFixed(2));


nodejs moduletest 라고 실행하면 결과가 출력된다.

모듈을 만들 때 외부에서 접근이 가능하게 하기 위해서는 "exports" 로 정의해야 하며,

exports를 사용하지 않고 정의된 function 은 외부에서 사용이 불가능하다.

반응형

반응형

실행환경 Ubuntu 14.04 LTS / node v0.10.25


다음은 node.js 로 작성한 채팅 서버 코드.

chat.js라는 파일에 다음과 같이 코드를 작성해서 저장.

var net = require('net');
var sockets = [];

var server = net.createServer(
                function(socket) {
                        socket.name = socket.remoteAddress + ":" + socket.remotePort;
                        sockets.push(socket);
                        socket.write("Welcome " + socket.name + "\n");
                        broadcast(socket.name + " joined the chat\n", socket);

                        socket.on('data',
                                function(data) {
                                        broadcast(socket.name + "> " + data, socket);
                                }
                        );

                        socket.on('end',
                                function(data) {
                                        sockets.splice(sockets.indexOf(socket), 1);
                                        broadcast(socket.name + " left the chat.\n");
                                }
                        );
                }
);

function broadcast(message, sender) {
        sockets.forEach(
                function (socket) {
                        if (socket === sender) return;
                        socket.write(message);
                }
        );
}
server.listen(3000);

실행은 nodejs chat 이라고 입력하면 된다.

코드를 살펴보면, 이 채팅 서버는 3000번 포트로 작동한다.

클라이언트에서 접속하면 소켓 IP와 Port를 아이디로 할당하여 sockets 에 저장.

그리고 새로 접속한 클라이언트에게는 서버 Welcome 메시지를 전송하고, 기존의 클라이언트에게는 새로운 유저가 들어왔다는 메시지를 broadcast로  전송.

클라이언트가 끊고 나가는 경우 sockets에서 해당 소켓 정보를 삭제하고 남은 클라이언트 들에게 유저가 나갔다는 메시지를 전달.

 

테스트를 위해서 telnet 을 이용해서 접속을 한다.

telnet [서버IP] 3000

 

텔넷 창을 여러개 띄워서 상대방이 보낸 메시지가 제대로 오는지 확인한다.

반응형

반응형

실행환경 Ubuntu 14.04 LTS / node v0.10.25


다음은 클라이언트가 입력한 값을 그대로 돌려주는 Echo Server를 Node.js 스타일로 작성해 보겠다.

이번 예제에서는 소켓 연결을 위해서 net 모듈을 사용했으며, 3000번 포트로 동작하도록 하였다.

echo.js 라는 파일을 생성하여 아래와 같이 작성한다.

var net = require('net');
var server = net.createServer(
                function(socket) {
                        socket.on('data',
                                function(data) {
                                        socket.write(data);
                                }
                        );
                }
);
server.listen(3000);

실행은 nodejs echo 로 하면 되고, 확인을 위해서 telnet 등을 이용해서 서버에 3000 포트로 접속하면 입력한 값을 되돌려 주는 것을 확인 할 수 있다. 

여기서 socket.on 대신 socket.once 를 사용하면 한번 응답후에 연결을 종료시키도록 할 수 있다.

반응형

반응형

실행환경 Ubuntu 14.04 LTS / node v0.10.25


다음은 8080 포트로 작동하는 Node.js 로 작성한 http 서비스 코드이다.

Node 의 http, fs 서비스를 사용하였고, 요청한 파일이 있으면 내려보내주고, 아니면 간단한 에러를 출력하는데,

실제는 http 서비스의 header 등을 제대로 설정해 주는 것이 좋지만, 예제를 간단히 만들기 위해서 생략하고 파일만 전달하게 작성했다.

Node.js 에서는 많은 코드가 아래와 같이 callback 함수를 등록하는 형식으로 작성된다.

httptest.js 라는 파일을 생성하여 아래와 같이 입력하고 저장한다.


var http = require('http');
var fs = require('fs');

var server = http.createServer(
        function(req, res) {
                var filePath = './public';
                if (req.url == '/') {
                        filePath += '/index.html';
                } else {
                        filePath += req.url;
                }

                fs.exists(filePath,
                        function(exists) {
                                if (exists) {
                                        fs.readFile(filePath,
                                                function(err, data) {
                                                        if (err) {
                                                                res.end('Server Error');
                                                        } else {
                                                                res.end(data);
                                                        }
                                                }
                                        );
                                } else {
                                        res.end('File Not Exists');
                                }
                        }
                );
        }
);
server.listen(8080);


httptest.js 가 실행되는 위치에 public 이라는 이름의 폴더를 만들고 그 안에 필요한 파일들 (index.html 등) 을 넣어 두면 http 서비스가 작동한다. 

서버의 실행은 nodejs httptest 라고 입력하면 된다.

확인은 웹브라우져를 하나 열고 http://[서버 IP]:8080 식으로 입력하면 된다.


반응형

반응형

실행환경 Ubuntu 14.04 LTS / node v0.10.25


프로그래밍 책을 보면 대부분 시작은 Hello World 이다.

Node.js 는 수많은 모듈들을 이용해서 상당히 간결한 코드로 구현하는 경우가 많은데, 

Hello World는 정말 말 그대로 한 줄로 끝난다.

hello.js 라는 파일을 만들어서 다음과 같이 한줄 적고 저장하자.

console.log("Hello World");

긴 설명이 필요 없을 것 같은데, console.log 는 서버쪽에 로그를 남기는 명령어라고 생각하면 된다.

Ubuntu 서버에서는 다음의 명령어로 실행한다.

nodejs hello

확장자가 붙어 있지 않은 경우 자동으로 js 파일로 인식하므로 nodejs hello 라고만 입력하면 된다.





반응형

반응형

설치 환경 Ubuntu 14.04 LTS

Root 권한이라고 가정 (아니면 앞에  sudo 를 붙여주면 됨)


패키지 툴을 이용하는 경우 아래의 명령어만 실행하면 바로 설치가 됩니다.

apt-get install node npm

위의 문장을 실행하면 build-essential, libssl-dev 등의 패키지가 같이 설치되므로 별도로 설치할 필요가 없음


다음으로 Node 를 시작하게 되면 항상 만나게 되는 기본 용어 중에 npm 과 nvm 에 대해서 알아보겠습니다.

 npm

 node package manager

 node 프로그래밍시 사용하게 되는 패키지들을 추가할 때 사용하는 툴

 nvm

 node version manager

 node를 원하는 버전으로 설치하여 관리하기 위해 사용하는 버전 관리자


Ubuntu 에서는 node 실행시 node 대신 nodejs 라는 명령어를 써야한다.

설치가 완료되면 nodejs -v 혹은 nodejs --version 명령어로 설치된 패키지의 버전을 확인할 수 있다.



반응형