[NODE] 개발을 빠르고 쉽게 만들어주는 도구들을 알아보자! - 3. Express 구조를 뜯어보자!

저번시간에 Express-generator을 통해 한번에 만들었던 폴더들을 하나하나 순서대로 뜯어보겠습니다. 그전에 기본적인 Express 폴더에 대해 짚고 넘어가는게 좋겠죠?

Express의 기본 구조

bin/www

서버 구동을 위한 기본적인 코드로 구성되어있습니다. app.js 파일을 가져와 HTTP 객체와 연동하는 작업을 해줍니다.

public

UI 설정(html/js/css 관련)에 들어가는 assets 의 폴더와 파일들로 구성되어 있습니다.

routes

url 을 연결해서 로직과 연결해주는 폴더입니다.

view

템플릿 jade 파일이 담겨있는 공간입니다. jade 엔진을 통해 html로 변환해 효율적으로 코드를 짤 수 있습니다.

app.js

서버 설정 파일이 담겨있습니다. bin/www 가 이 파일을 읽고 http 와 연결해줍니다.

package.json

패키지 관리 파일. 프로그램 이름, 버전 등 노드 프로그램의 정보를 이 파일에 담아놓습니다. 사용하는 모듈 목록을 알 수 있습니다.

bin/www

서버 구동을 위한 기본적인 코드입니다. node app.js를 시작하면 컴파일러는 서버를 키기 위해 가장 먼저 이 파일을 해석하죠. 하나하나 찬찬히 뜯어보겠습니다.


#!/usr/bin/env node


//1. http 통신을 위한 모듈을 추출합니다.
var app = require('../app');
var debug = require('debug')('meanapp:server');
var http = require('http');

//2. 통신할 포트를 설정합니다. 3000으로 설정해 주네요.
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);


// 3. 추출한 http 모듈의 미들웨어로 서버를 생성합니다.
var server = http.createServer(app);

// 4.통신을 위해 3000 번 포트로 응답을 듣습니다.
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

// 5. 파이프 이름 또는 포트 번호를 반환합니다.
function normalizePort(val) {
 var port = parseInt(val, 10);
 if (isNaN(port))
   return val;

 if (port >= 0)
   return port;
 return false;
}
// 6. 에러시 로그를 반환합니다.
function onError(error) {
 if (error.syscall !== 'listen') {
   throw error;
}

 var bind = typeof port === 'string'
   ? 'Pipe ' + port
  : 'Port ' + port;

 switch (error.code) {
   case 'EACCES':
     console.error(bind + ' requires elevated privileges');
     process.exit(1);
     break;
   case 'EADDRINUSE':
     console.error(bind + ' is already in use');
     process.exit(1);
     break;
   default:
     throw error;
}
}
// 7. 성공시 값을 반환합니다.
function onListening() {
 var addr = server.address();
 var bind = typeof addr === 'string'
   ? 'pipe ' + addr
  : 'port ' + addr.port;
 debug('Listening on ' + bind);
}

이 파일에서 처음 추출했던 var app = require('../app');에 해당하는 app.js를 살펴볼까요?

app.js

1. var ~ = require('~')


var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser')
var bodyParser = require('body-parser');
var sassMiddleware = require('node-sass-middleware');

var index = require('./routes/index');
var users = require('./routes/users');

require('~') 함수는 모듈을 로딩하는 함수입니다. c와 비교하자면 import java.util.~이런것과 비슷하려나요?

express-generator가 package.json에 명시한 외부 모듈(=라이브러리)와, 사용자가 직접 만든 내부 모듈을 app.js에서 사용할 수 있도록 만들어 줍니다.

index.js


var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
 res.render('index', { title: 'Express' });
});

module.exports = router;

모듈은 라이브러리와 같다고 보면 됩니다. node.js에서는 라이브러리를 모듈이라고 지칭하죠. 외부에서 개발자들이 만든 모듈 외에,Express-generator은 기본적으로 내장 모듈을 만들어줍니다. 대표적인 샘플이 ./routes/index.js의 내용인데요. 마지막에 module.exports = router;을 명시하여 이 파일을 모듈로 사용할 수 있습니다.

1. var app = express();


var app = express();

express 라이브러리를 해당 파일에 임폴트 (require)했으니, 실행시켜야겠죠? 실행시킨 express(); 를 app 에 넣어줍니다.

2. app.set()


// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

생성한 express에서 제공하는 .set() 메서드는 템플릿 엔진을 렌더링 하는 함수입니다.

  • 'views' : 템플리트가 있는 디렉토리 경로를 설정해 줍니다.

  • 'view engine': 사용할 템플리트 엔진을 설정해 줍니다.

app.use()


app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(sassMiddleware({
 src: path.join(__dirname, 'public'),
 dest: path.join(__dirname, 'public'),
 indentedSyntax: true, // true = .sass and false = .scss
 sourceMap: true
}));
app.use(express.static(path.join(__dirname, 'public')));

// 라우팅을 로드합니다.
app.use('/', index);
app.use('/users', users);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
 var err = new Error('Not Found');
 err.status = 404;
 next(err);
});

// error handler
app.use(function(err, req, res, next) {
 // set locals, only providing error in development
 res.locals.message = err.message;
 res.locals.error = req.app.get('env') === 'development' ? err : {};

 // render the error page
 res.status(err.status || 500);
 res.render('error');
});

위에 require 로 import한 모듈을 express() 함수 안에서 사용하겠다고 선언하는 내용입니다. 이 모듈들의 각각의 내용은 따로 정리하여 올리겠습니다. 자 이제 app.js의 순서대로 살펴보겠습니다. app.set()에서 설정한 View 엔진 부터 둘러보겠습니다.

app/views/index.js


<!DOCTYPE html>
<html>
 <head>
   <title><%= title %></title>
   <link rel='stylesheet' href='/stylesheets/style.css' />
 </head>
 <body>
   <h1><%= title %></h1>
   <p>Welcome to <%= title %></p>
 </body>
</html>

ejs파일입니다. ejs는 embed javascript의 약자로 <%= %>의 표현식 안에 javascript 문법을 넣어 정적인 html 문서를 동적으로 사용할 수 있습니다.

Routing


app.use('/', index);
app.use('/users', users);

app.js에서는 app.use()를 통해 라우팅을 로드합니다. app.use('/',index)에서 / 는 라우트의 경로를 의미합니다. / 의경로로부터 시작하는 라우팅인데, 한번 파일을 보겠습니다.

app/routes/index.js


var express = require('express');
var router = express.Router();
// 1.
router.get('/', function(req, res, next) {
 // 2.
 res.render('index', { title: 'Express' });
});
module.exports = router;
router.get('/', func)

index.js 파일 .get() 함수로 라우팅 경로를 지정해 줍니다. 예를들어 use('/').get('/') 경로이므로 localhost:3000의 경로에 나오는 페이지를 보여줍니다.

res.render('index', { title: 'Express' });

res.render()는 해당 라우팅 요청이 들어왔을때 보여줄 뷰 페이지를 말해줍니다. index.ejs의 파일에 있는 html 문서가 보여집니다. {} 안에 있는 내용은 html에 전달해줄 값들을 명시해 둔 내용입니다.

크게 express-generator로 만든 모듈을 살펴보았습니다. 수고하셨습니다!

참고자료


[NODE] 개발을 빠르고 쉽게 만들어주는 도구들을 알아보자! - 2. Express.js 프레임워크 설치 및 실행

이전장에서 프레임워크, 라이브러리, 플랫폼의 개념을 살펴보았는데요. 대표적인 Node.js의 프레임워크인 Express.js에 대해 알아보겠습니다.

Express.js

Express.js 는 http와 Connect 컴포넌트를 기반으로 Node.js에서 사용하는 웹 프레임워크 입니다. 가장 많이 사용하는 프레임워크이며, 안정적이기 때문에 웹 규모에 관게 없이 웹 서버를 구축할 수 있습니다.

설치


$ npm install -g express

express-generator

express-generator는 Express 웹 프레임워크의 구조를 만들어주는 Express Application Generator Tool입니다. Express 프레임워크의 구조를 신속하게 작성하기 위해 사용합니다.

설치


$ npm install -g express-generator

위 명령어가 설치가 완료되면, Express 프레임워크 구조를 설정해주는 커맨드 명령어를 실행할 수 있습니다.

명령어 확인하기


$ express -h

express-generator가 성공적으로 설치되어있다는 것을 확인할 수 있는 명령어 입니다. 아래는 명령어 내용들을 확인할 수 있습니다

result


Usage: express [options] [dir]
Options:

      --version       output the version number
  -e, --ejs           add ejs engine support
      --pug           add pug engine support
      --hbs           add handlebars engine support
  -H, --hogan         add hogan.js engine support
  -v, --view <engine> add view <engine> support (dust|ejs|hbs|hjs|jade|pug|twig|vash) (defaults to jade)
  -c, --css <engine>   add stylesheet <engine> support (less|stylus|compass|sass) (defaults to plain css)
      --git           add .gitignore
  -f, --force         force on non-empty directory
  -h, --help           output usage information

express -h 로 옵션을 확인해 보니, view 와 css의 부분은 default로 jadecss가 설정이 되어있는 것을 알수있네요. 한번 확인해볼까요 ?

myapp/views/index.jade
myapp/public/stylesheets/style.css

의 파일을 확인할 수 있습니다.

Express-generator로 express framework 생성하기

간단하게 만들어보고 Express-generator 가 만들어준 파일을 분석해 보겠습니다.

1. 설치

굉장히 간단합니다. express 프로젝트이름 형식으로 폴더 구조를 만들어 줍니다


$ express myapp
result

결과 로그를 확인해 봅시다.


$ express myapp

// 1.
warning: the default view engine will not be jade in future releases
warning: use `--view=jade' or `--help' for additional options

// 2.
  create : myapp
  create : myapp/package.json
  create : myapp/app.js
  create : myapp/public
  create : myapp/routes
  create : myapp/routes/index.js
  create : myapp/routes/users.js
  create : myapp/views
  create : myapp/views/index.jade
  create : myapp/views/layout.jade
  create : myapp/views/error.jade
  create : myapp/bin
  create : myapp/bin/www
  create : myapp/public/javascripts
  create : myapp/public/images
  create : myapp/public/stylesheets
  create : myapp/public/stylesheets/style.css

// 3.
  install dependencies:
    $ cd myapp && npm install

  run the app:
    $ DEBUG=myapp:* npm start
1. 뷰 엔진이 jade가 아니라는 warning이 뜨는데, jade가 이제는 pug라는 이름으로 바뀌어서 나는 에러인 것 같습니다.
2. express 명령어로 만들어진 폴더의 구조를 보여줍니다. 기본 설정되어있는 jade view 엔진과 css가 되어있고, routes,view,bin,public 의 폴더와 package.json,app.js의 다양한 파일들을 만들어 주네요. 뒤에 살펴보겠습니다.
3. 의존하는 라이브러리를 설치하는 명령어와, app을 실행하는 명령어를 알려주고 있습니다.

2. 설치

바로 실행시키면 express-generator가 package.json에 넣어준 의존성 모듈이 설치가 안되서 에러가 납니다. 설치 후 실행해 봅시다.


$ cd myapp && npm install

3. 실행


$ DEBUG=myapp:* npm start

실행 한 후 로그창을 확인해보면

result


> myapp@0.0.0 start /NODEJS/BLOG/using-express-generator/myapp
> node ./bin/www
myapp:server Listening on port 3000 +0ms

서버가 실행되었다는 결과창을 알려주고,

http://localhost:3000/ 로 들어가보면

의 문구를 확인할 수 있습니다.

View,CSS 설정 바꿔서 만들어보기

Express는 jade, css 를 default 로 제공해주지만, 저는 MEAN 스택을 공부하고 있기 때문에 jade 가 아닌 ejs와, sass를 설정하겠습니다. jade,ejs 는 정적인 html 파일을 동적으로 바꿔주는 템플릿 엔진인데요. MEAN 스택과 템플릿 엔진 부분은 나중에 따로 올리겠습니다.

1. 설치

위에 express -h 명령어에 봤던 것 중, 필요한 값을 명령어에 한번에 연결시켜 설치해 줍니다.


$ express meanapp --view=ejs --css sass --git
결과


create : .
  create : ./package.json
  create : ./app.js
  create : ./.gitignore
  create : ./public
  create : ./routes
  create : ./routes/index.js
  create : ./routes/users.js
  create : ./views
  create : ./views/index.ejs
  create : ./views/error.ejs
  create : ./bin
  create : ./bin/www
  create : ./public/javascripts
  create : ./public/images
  create : ./public/stylesheets
  create : ./public/stylesheets/style.sass
실행시켜보기

바로 실행시키면 express-generator가 package.json에 넣어준 의존성 모듈이 설치가 안되서 에러가 납니다. 설치 후 실행해 봅시다


$ npm install
$ npm start

위에 실행파일처럼 잘 뜨는것을 확인할 수 있었습니다. 다음장에서는 Express에서 만들어준 구조를 자세히 살펴보겠습니다


구글 지도 API key 얻기

Google Maps API페이지에서 플랫폼 별로 KEY를 받을 수 있다.
이 후 app/views/partials/head.html파일에 보면
"https://maps.googleapis.com/maps/api/js?key= key입력" 부분에 key를 입력하면 된다.

이 key를 제대로 입력하지 않으면
error 페이지
이와 같은 페이지가 뜨면서
Console 에러

이런 에러를 뿜어낸다.



몽고 DB 대량의 데이터 insert

이는 MySQL의 Workbench가 GUI툴이듯이 MongoDB의 GUI툴을 사용하면 되는데 책에 있는 방법은 RoboMongo를 사용한다.



거리제한 필터


'Node.js > Multiple OS' 카테고리의 다른 글

4장. Yeoman  (0) 2018.01.01
3장. BSON이란?  (0) 2017.12.05
2장. MySQL 연동 & Template 및 미들웨어  (0) 2017.12.05
1장. express & 몽고DB 설치  (0) 2017.12.03

Yeoman이란?

WebApp을 포괄적으로 구성하는 scaffolding tool이다.

요맨 그 자체로는 단순히 CLI에 불과하며 yo-generator라는 모듈을 통해 사용할 수 있다.

    <!-- Angular 생성 -->
    yo generator-angular

    <!-- express 생성 -->
    yo generator-express

    <!-- Vue.js 생성 -->
    yo generator-Vuejs

참조
yoman
yoman 구성도

Bower(Web Package Manager)

Web FrontEnd 전용 패키지 매니저로 Twitter에서 개발되어 그 하단에서만 사용되었지만 규모가 커지면서 2012년 Twitter가 오픈소스로 공개하여 독자적으로 사용이 가능하다. 다만 이를 사용하기 위해서는 git과 NPM이 필요하다.

참조
Bower 홈페이지
Bower 사용법

BowerError

generator-express와 express-generator의 차이

  • generator-express
    Yeoman에서 express의 기본틀을 생성하는 모듈

  • express-generator
    express모듈의 하위 모듈로 express의 기본 틀을 생성해주는 모듈

참조
두 모듈의 차이점?

'Node.js > Multiple OS' 카테고리의 다른 글

5장. Google API  (0) 2018.01.01
3장. BSON이란?  (0) 2017.12.05
2장. MySQL 연동 & Template 및 미들웨어  (0) 2017.12.05
1장. express & 몽고DB 설치  (0) 2017.12.03

MongoDB - NoSQL


안녕하세요. 오늘은 MongoDB를 공부하기 전 NoSQL이 무엇인지 알고 싶어서 이렇게 간단하게 공부한 것을 포스팅하려 합니다.


Node.Js 공부를 하면서 많은 영상과 서적들에서 RDB인 MySQL과 NoSQL인 MongoDB를 동시에 소개한곤 합니다. 또한 학교에 강연 오시는 분들도 NoSQL을 한번 공부해보는 것이 좋을 것이라고 자주 언급을 하셔서 NoSQL의 한 종류인 MongoDB를 공부하기 전 NoSQL이 무엇인지 그리고 NoSQL과 RDB와 어떤 차이점이 있는지에 대해 간략하게 공부를 하면서 기록한 것들을 공유하고자 합니다.


저도 아직은 용어가 많이 낯설고 익숙치 않은 개념이라 최대한 제가 이해한 부분에 대해서만 언급하려고 하지만 틀린 부분이 있을 수 있으므로 많은 피드백 부탁드리겠습니다.


관계형 데이터베이스(RDB)

우리가 현재 가장 많이 사용하고 있고 많은 학부에서도 데이터베이스 강의를 진행할 때 관계형 데이터베이스(RDB)를 가르치곤 합니다. 저 또한 학부 강의에서는 오라클 데이터베이스를 통해 관계형 데이터베이스와 SQL을 배웠고 여러 프로젝트에서는 MySQL을 사용하였습니다.

우리가 알고 있는 관계형 데이터베이스는 대략 다음과 같은 장단점을 갖습니다.


  • 장점

    1. 범용적이고 안정적이며 데이터의 일관성을 보장
    2. 복잡한 형태의 쿼리가 가능하여 원하는 데이터를 추출 가능 (Join 등의 연산 지원)

즉 RDB는 데이터의 신뢰성과 안정성이 보장되며 테이블 내의 여러 데이터 제약을 통해 데이터의 중복을 방지합니다.


  • 단점

    1. 테이블 간의 관계를 맺는 과정이 굉장히 복잡하다.
    2. 대량의 데이터 입력, 조회 시 성능이 저하된다.
    3. 테이블 구조의 변경 시 많은 패널티가 따른다.

하지만 관계형 데이터베이스가 생겨난 시대와는 다르게 현재는 인터넷의 보급과 SNS의 발달로 단순하면서 대규모의 비정형 데이터들이 늘어나게 되어 기존의 RDB만으로는 처리하기 힘든 상황이 발생하게 되었습니다.


비정형 데이터는 형태도 없고, 연산 가능하지도 않은 것. 우리가 흔히 말하는 SNS가 이에 속하며 텍스트, 영상, 음성 등의 형태로 나타납니다.

이러한 대량의 비정형 데이터가 늘어남에 따라 정형화된 데이터를 처리하는데 특화된 RDB로는 감당하기가 힘든 것입니다. 이를 대응하기 위해 생겨난 시스템이 바로 NoSQL입니다.


NoSQL

NoSQL은 Not Only SQL의 약자로 단순히 SQL뿐만 아니라 부가적인 기능을 지원한다는 의미입니다. NoSQL의 장점과 단점을 서술하기 전에 단점이면서 장점인 부분을 먼저 언급하도록 하겠습니다.


기본적으로 NoSQL은 최초 테이블 생성 시 테이블 간의 관계를 정의하지 않습니다. 이로 인한 장점과 단점이 모두 존재합니다. 기본적으로 여러 테이블 간의 관계를 정의하지 않기 때문에 보다 빠른 속도의 설계가 가능해집니다. 하지만 역시 관계를 정의하지 않았기 때문에 RDB처럼 Join 과 같은 테이블 간의 복잡한 쿼리가 불가능하므로 특정 데이터를 추출하는데 어려움이 있을 수 있습니다. 

이제 NoSQL의 장담점을 간략하게 설명하자면 다음과 같습니다.


  • 장점

    1. 데이터 분산에 용이
    2. 복제 및 장애대응에 용이
    3. 데이터를 고속으로 처리(입력, 조회)에 특화된 성능

적은 수의 고성능 머신에 저장하는 RDB와는 다르게 NoSQL은 기본적으로 여러 일반 서버 머신에 분산 저장이 가능합니다. 또한 이렇게 분산된 데이터는 서로 상호복제 하여 저장하기 때문에 하나의 서버에 문제가 생겨도 데이터의 유실이나 서비스를 제공하는데 크게 무리가 없습니다. 또한 Key-Value 저장 기법을 사용하여 데이터의 입력과 조회의 처리 속도가 매우 뛰어납니다.


  • 단점

    1. 다양하고 복잡한 데이터 쿼리는 불가능
    2. 기존의 데이터를 업데이트하는데 오랜 시간이 걸림
    3. 데이터의 일관성이 보장되지 않는다.

위에서 언급하였듯이 테이블간의 관계를 정의하지 않았기 때문에 다양하고 복잡한 쿼리를 통한 데이터의 추출은 불가능하며 기존에 저장한 분산된 데이터의 업데이트를 할 경우 저장 된 서버 머신들을 (수십대에 분산되어 저장될 수 있음) 모두 갱신해야하기 때문에 시간이 오래걸립니다. 이러한 서버 간의 갱신 시간 차이로 데이터의 일관성이 보장되지 않을 수 있습니다.


즉 NoSQL은 기존의 관계형 데이터베이스보다 유연하며 대용량의 데이터 처리를 필요로하는 특화된 분야에서 비정형데이터들을 분산 저장하여 관리할 수 있는 시스템입니다. (빅데이터 등)


용어 차이

이렇게 NoSQL과 RDB는 서로 다른 시스템이기 때문에 우리가 RDB에서 익숙하게 사용했던 용어 역시 NoSQL에서는 큰 차이를 보입니다. 용어를 확실히 익혀두시길 바랍니다.


RDBMSNoSQL
DatabaseDatabase
TableCollection
Tuple/RowDocument
ColumnKey/Field
Primary KeyPrimary Key (_id)


마무리

오늘은 이렇게 간략하게 NoSQL과 RDB의 비교를 통해 NoSQL이 무엇인지 살펴보았습니다. 이를 공부하면서 느낀 것은 NoSQL과 RDB는 각각의 시스템의 사용 용도에 따라 무엇을 선택하느냐의 차이지 단순히 어느것이 더 좋은가에 차이는 아니라는 것을 느꼈습니다. 읽어보시고 틀린 부분이 존재한다면 많은 지적 부탁드립니다. 감사합니다.


참고자료


  1. NoSQL의 특징#1
  2. 개발자를 꿈꾸는 프로그래머
  3. NoSQL이란 무엇인가
  4. NoSQL이란?


'Node.js > Code-Flow' 카테고리의 다른 글

[2] Middleware  (0) 2017.12.06
[1] Express-generator  (0) 2017.12.01

Express의 정의는 다음과 같습니다.


Express is a routing and middleware web framework that has minimal functionality of its own: An Express application is essentially a series of middleware function calls.


Express에서는 각종 요청을 처리하고 기능을 붙이기 위해 미들웨어(middleware)를 사용합니다. 그 만큼 우리는 미들웨어를 많이 사용하게 되는데요. 오늘은 이런 미들웨어에 대해 공부를 해보도록 하겠습니다. 


미들웨어는 위에서 언급했고, 이름 그대로 request와 response 객체에 접근하여 그 사이에서 특정 작업을 처리해주는 역할을 합니다. 모듈(module)과 혼동이 될 수 있지만, 모듈은 해당 모듈의 역할을 하는 미들웨어들의 묶음이라고 보시면 됩니다.


미들웨어의 유형에는 크게 4가지가 존재합니다.


  1. Application
  2. Router
  3. Error Handling
  4. Third-party

이 유형들을 하나하나 살펴보도록 하겠습니다.



1. Application-level middleware

어플리케이션 전역에서 처리가 가능한 미들웨어로 어플리케이션 자체에 request가 발생할 때마다 실행됩니다. 이런 어플리케이션 레벨의 미들웨어는 다음과 같이 사용합니다.

  • app.use()
  • app.METHOD() - HTTP method

미들웨어를 사용한다고 선언을 하면 기본적으로 미들웨어는 미들웨어 스택에 쌓이게 됩니다. 어플리케이션에 대한 request가 들어올 때마다 이 스택을 통과하면서 request에 관한 처리를 하고 response를 하게 됩니다.


app.use(function(req, res, next){
  console.log('Time: ', Date.now())
  next()
}) // ----- 1

app.use('/index', function(req, res, next){
  /*
  	Code
  */
}) // ----- 2

app.use() 를 사용할 때는 path를 지정할 수 있습니다. 첫 번째 미들웨어는 어떤 request가 들어와도 작동을 하는 것이고 두 번째 미들웨어는 /index의 path를 통해 들어오는 요청에 대해서만 작동하는 미들웨어입니다. 그럼 여기서 app.METHOD()와의 차이점이 무엇인지 생각해볼 수 있습니다.

app.use('/index', function(req, res, next){
  // Code
})

app.get('/index', function(req, res, next){
  // Code
})

app.use('/index')/index 로의 모든 요청에 대해서 동작합니다. 즉 get이나 post 등 어떤 HTTP method에도 작동을 합니다. 그에 반해서 app.get('/index')get 요청에 대해서만 동작하는 미들웨어입니다.


그리고 next 를 통해 현재 미들웨어 내에서 상태에 따라 선택적으로 다음으로 넘어갈 미들웨어 함수를 지정할 수 있습니다.


2. Router-level middleware

동작방식은 Application-level 미들웨어랑 같습니다. 하지만 라우터 단위로 묶어 넣고 experss.Router()의 객체를 사용해야 한다는 차이점이 있습니다. Router-level 미들웨어를 사용한다면 어플리케이션에 Path별 요청에 따른 동작 방식을 모듈화하여 관리할 수 있습니다.

// user.js
var app = express()
var router = express.Router()

router.get('/mypage', function(req, res, next){
  // Code
})

router.get('/articles', function(req, res, next){
  // Code
})

router.post('/newArticle', function(req, res, next){
  // Code
})

module.exports = router

// app.js
var app = express();
var user = require('user.js')

app.use('/user', user)

만일 /user/mypage의 path로 GET 요청이 들어온다면 user라는 라우터 미들웨어가 처리하는데 그 안의 내용을 보면 router.get('/mypage') 에서 처리를 해주는 것을 알 수 있습니다. 이런 방법으로 path별로 처리해줄 미들웨어를 모듈화하여 관리할 수 있습니다.



3. Error-handling middleware

에러 처리를 담당하는 미들웨어입니다. 이러한 유형의 미들웨어는 반드시 네 개의 인자를 매개변수로 받아 이 미들웨어가 에러를 담당하는 미들웨어라는 것을 식별해야 합니다.


Error-handling 미들웨어를 작성하는 것은 여타 다른 미들웨어와 매개변수의 개수 차이 외에는 다른 점이 없습니다.

app.use(function(err, req, res, next){
  console.error(err.stack)
  res.status(500).send('Something broke!')
})

Error-handling 미들웨어로 넘어가기 위해서는 에러가 발생할 수 있는 미들웨어에서 반드시 next(err) 를 통해 Error-handling 미들웨어로 넘어간다는 것을 지정해주어야 에러 처리가 정상적으로 작동합니다.



4. Third-party middleware

기본적으로 주어지는 Built-in middleware 외에 추가로 설치하여 사용해야하는 미들웨어를 Third-party middleware라고 합니다.

$ npm install cookie-parser

Express에서는 쿠키와 세션을 사용하기 위한 기본 내장 미들웨어가 존재하지 않기 때문에 이렇게 따로 설치하여 사용해주어야 합니다.

var express = require('express')
var app = express()
var cookieParser = require('cookie-parser')

app.use(cookieParser())



마무리

오늘은 이렇게 Express에서 아주 중요한 개념인 미들웨어(middleware)에 대해 공부해보았습니다. 반드시 이해하고 있어야 하는 개념이기 때문에 여러 글들도 참고해가면서 개념을 반드시 익히시길 바랍니다. 저도 마찬가지로 공부하고 있는 입장이기 때문에 많은 피드백 부탁드리겠습니다. 감사합니다.




참고자료

  1. 모듈과 미들웨어 개념
  2. express 미들웨어(middleware)
  3. Express.js 기본 개념 및 내용 정리
  4. Middleware : The core of node.js backend apps
  5. Express documents - Using middleware
  6. stackoverflow - Express: what is "app.use"
  7. stackoverflow - Difference between app.use and app.get in express.js
  8. stackoverflow - Difference Between app.use() and router.use() in Express
  9. stackoverflow - Differences between express.Router and app.get
  10. Express에서의 MIDDELWARE


'Node.js > Code-Flow' 카테고리의 다른 글

MongoDB - NoSQL  (0) 2017.12.13
[1] Express-generator  (0) 2017.12.01
readme.md

환경별 셋팅 방법 (dev, production, test)

NODE_ENV를 설정하는 것으로 Express 3.x까지는 app.configure()로 쓰였다가 Express 4.x부터는 문법이 바뀌었다.

    // Express 3.x
    app.configure('development', function() {
    // configure stuff here
    });

    // Express 4.x
    var env = process.env.NODE_ENV || 'development';
    if ('development' == env) {
    // configure stuff here
    }

BSON(Binary JSON)

JSON을 Binary data, 즉 컴퓨터가 이해 할 수 있는 16진수 데이터로 변환한 것을 말하며, 최초로 몽고DB에서 도입하였다.


BSON
Wiki

FS stream API

Node.js에서 파일을 read/write할 때 쓰는 API

'Node.js > Multiple OS' 카테고리의 다른 글

5장. Google API  (0) 2018.01.01
4장. Yeoman  (0) 2018.01.01
2장. MySQL 연동 & Template 및 미들웨어  (0) 2017.12.05
1장. express & 몽고DB 설치  (0) 2017.12.03
readme.md

MySQL 설치 및 실행법

  • windows

    • 설치 : MySQL 홈페이지의 Windows용 installer로 선택적 설치
    • 실행 : 따로 실행할 필요 없음
  • Ubuntu

    • 설치 : sudo apt-get install mysql-server mysql-client
    • 실행 : sudo service mysql start
    • 중지 : sudo sevice mysql stop
  • Mac

    • MySQL 홈페이지의 Mac용 installer로 설치
      참조

Swig Template

JS Template 엔진으로 Django, Jinja2, and Twig 등에서 사용할 수 있다.

Docs
Github

Sequelize 미들웨어

Node.js 기반의 ORM으로 PostgreSQL, MySQL, MariaDB, SQLite, MS-SQL을 지원한다.

가장 큰 특징은 Promise를 기본으로 동작한다는 것이다. Promise는 Promise/A+ 로 불리는 spec에 따라 정의된 비동기작업 제어방식이다. ES6에는 native로 Promise가 포함되었다.

Promise의 장점은 다음과 같다.

복잡한 비동기 코드를 깔끔하고 쉽게 만들 수 있는 방법을 제공한다. Chaining 을 통해 값을 전달하거나 연속된 일련의 작업을 처리할 수 있다. Error handling에 대한 처리를 깔끔하게 할 수 있다. Promise를 구현한 라이브러리에는 대표적으로 Q, RSVP, bluebird가 있다. Sequelize는 이중에서도 bluebird 라이브러리를 살짝 수정한 버전을 사용하고 있다. Promise를 비동기작업을 제어하는 방식으로 사용하는 만큼 Promise에 대해 알고 있는 부분이 많다면 Sequelize의 이용도 한결 수월해진다.

  • 설치

    npm install sequelize

    MySQL을 기본적으로 포함하지 않고 있으므로 따로 설치해주어야한다.

    npm install mysql2

    Docs
    참조

ODM(Mongoose) vs ORM(Sequelize)

  1. ORM이란?
    Object Relational Mapping으로 App과 DB를 Mapping시켜주는 도구이다. 한층더 추상화된 layer에서 Database에 대한 작업을 할 수 있게 해준다. ORM을 사용함으로써 얻는 장단점(pros and cons)은 다음과 같다.

    • Pros of ORM
      특정 DBMS에 종속되지 않는다. SQL문이 코드에 들어가지 않아 깔끔한 코드를 유지할 수 있다. ORM이 nesting데이터를 바인딩해준다.

    • Conf of ORM
      RAW query에 비해 performance가 느리다. Query tuning이 힘들다. 서비스가 복잡해 질수록 ORM으로 할 수 있는 작업의 범위에 한계가 있다.

      Wiki

  1. ODM(Object Data Mapping)?
    ODM을 사용하면 코드의 개체와 필요한 경우 데이터의 document 표현간에 변환 할 수 있습니다.
    JSONB는 MongoDB에서 사용하는 JSON 표기법 문서를 이진으로 저장한 형식을 말합니다.
    mongoose는 자바의 JPA/Hibernate/Mybatis와 같은 OR Mapper와 같은 개념입니다.
    또한 객체 표기법을 Document 표기법으로 변환하기 위해 JSON 또는 JSONB API를 사용합니다.
    ORM은 객체 지향 프로그래밍 언어를 사용하여 호환되지 않는 유형 시스템간에 데이터를 변환하는 프로그래밍 기술입니다.

    ODM vs ORM
    StackOverFlow

Insert Error(DB)

'Node.js > Multiple OS' 카테고리의 다른 글

5장. Google API  (0) 2018.01.01
4장. Yeoman  (0) 2018.01.01
3장. BSON이란?  (0) 2017.12.05
1장. express & 몽고DB 설치  (0) 2017.12.03


웹사이트를 구축할 경우 밑바닥부터 하나하나 만드는 것은 오래 걸리고, 복잡하며, 유지보수하기 어렵습니다. 이런 불편한 점을 개선시키기 위해 손쉽고 빠른 프로젝트 개발을 위한 여러가지 도구들이 존재합니다. 대표적으로 프레임워크와 라이브러리를 알아봅시다! 

프레임워크 , 라이브러리, 플랫폼

프레임워크, 라이브러리, 플랫폼은 개발 공부를 하면서 많이 듣게 되는 단어 중 하나인데요. 비슷한 것 같지만 굉장히 헷갈리는 개념들 중 하나입니다. 차이점이 뭘까요?




프레임워크


프레임워크는 프로젝트의 구조를 잡아주는 역할을 합니다. 필수적으로 필요한 구조를 잡아주기 때문에 프레임워크 만으로도 프로젝트는 돌아가며 이에 필요한 라이브러리를 포함하고 있습니다. 프레임워크로 구조를 잡아주면, 여러 규칙이 존재하기 때문에 프레임워크의 틀에 맞춘 프로젝트의 개발을 해야합니다.




라이브러리




라이브러리는 프로젝트 시 필요한 기능들을 모아둔 도구입니다. 전체적인 프로젝트 구조에서 기능을 제공해 줍니다. 선택적으로 필요한 부품입니다. 라이브러리는 필요한 하나의 기능 단위를 말하기 때문에 선택적으로 필요한 부분을 설치해서 사용합니다.



프레임워크 vs 라이브러리

프레임워크라이브러리의 차이를 간단하게 말하면 프레임워크는 구조를 잡아주기 때문에 프로젝트가 돌아가지만, 라이브러리는 도구이기 때문에 돌아가지 않습니다.

건축으로 예를들어볼까요?




건물을 지을때, 건축물을 올리기위해 철골을 쌓아놓고 건축을 시작합니다. 이를 Scaffolding이라고 하죠.

웹사이트 제작시에도 이런 철골 작업이 필요합니다.

웹을 프레임워크 없이 밑바닥 부터 구축한다면 시간도 오래걸리고, 보통 협업을 하기 때문에 다른사람들에게 남들에게 내가 만든 프로젝트 구조를 설명해줘야 합니다.

이런 불편함을 해결하기 위해 기본적인 구조를 한번에! 잡아주는 역할이 프레임워크 입니다.





건축으로 비교하자면 집에 가장 필요한 기본적인 ,화장실,거실같은 구조만 갖춘 형태로 만들어줍니다.

웹프레임워크 또한 웹사이트가 실행이 될 수 있도록 하는 기본적인 라이브러리들만 가지고 웹사이트를 만들어줍니다. 그럼 라이브러리는 어떤존재들일까요?





라이브러리

라이브러리는 이런 기본적인 웹사이트를 더 편안하고, 예쁘게 만들어주는 도구라고 생각하면 됩니다.

기본적인 건축이 끝나서 입주를 할 수있다고 가정해봅시다. 사람이 살 수 있는 상태이지만 가구나 가전용품들이 필요하겠죠? 침대이불이 필요하고, 예쁘게 꾸미고 싶다면 벽지 또는 리빙 가구들로 꾸밀 수 있습니다.

라이브러리는 기본적으로 웹사이트가 돌아가게 만든 프레임워크에 `세탁기`,`비데`,`냉장고` 와같은 기능과 같습니다. 라이브러리를 하나하나 구축하는게 아닌 누군가 만든 기능을 가져다 사용함으로써  원하는 사이트를 더욱 빠르게 구축할 수 있습니다.




플랫폼

소프트웨어에서의 플랫폼의 정의는 프로젝트가 실행되는 환경을 말합니다. Node.js 또한 플랫폼입니다.

건축으로 말하면 내진설계방식..? 이런게 되려나요 ㅎㅎ

Node.js의 실행 환경
  • 네트워크 애플리케이션(특히 서버 사이드) 개발에 사용되는 소프트웨어 플랫폼
  • Javascript 언어 사용
  • Non-blocking I/O와 단일 스레드
  • 내장 HTTP 서버 라이브러리를 포함하고 있어 별도의 소프트웨어 없이 동작하는 것이 가능
  • 웹 서버의 동작에 있어 더 많은 통제 가능

자 이제 기본적인 개념을 알았다면, 다음 페이지에서 Node.js에서 사용되는 프레임워크 중 가장 대표적인 Express.js를 알아봅시다~!

참고 자료


readme.md
  1. 기본 package 설치

    npm install -g yo express express-generator

  • npm yo : node뿐만이 아니라 web framework들의 scaffold틀을 만들어주는 npm
  1. 프로젝트 생성

  • express -option project_name

express --ejs --css sass --git blueprint_1th

  • Option

    • --ejs : ejs 사용 가능

    • --css : stylesheet 사용 가능

      • default = css이지만 sass 사용
    • --git : .gitignore 추가

    • --force : 강제로 진행

  1. 추가적인 npm

  • passport : 인증절차에 쓰이는 middleware
  • gravatar : 랜덤이미지 표시
  • connect-flash : flash자체가 session에 저장되는 메시지, 그걸 깔끔하게 보여줌
  • connect-mongo : 몽고DB 연결
  • mongoose : 몽구스 ODM - 몽고DB설정
  • express-session : DB에 세션 저장
  • passport-local : ID/PW 인증

app 실행방법

몽고DB start
sudo service mongodb start

windows cmd

set DEBUG=appname:* & npm start

bash && shell

DEBUG=appname:* npm start

  • 디버그모드 : 서버 실행 시 디버깅 정보 출력
    DEBUG=appname:* 

bash 단축명령어 등록법

alias 단축명령어 = '원래 커맨드'

alias de = 'DEBUG=blueprint_1th:* npm start'








package.json 수동 설치

command로 설치한게 아닌 package.json에 적었을 때

npm install

몽고DB 사용법

공식홈페이지

Linux

서버 : sudo apt-get install mongodb-org

시작 : sudo service mongod start
종료 : sudo service mongod stop
재시작 : sudo service mongod restart

windows

다운로드
설치 : 그냥 쭈~욱 하기
서버 셋팅 하기

1. mongodb의 기본 dir 생성   
 <code>mkdir c:\data\db</code>   
 * default 폴더 바꾸기   
   <code>"C:\Program Files\MongoDB\Server\3.4\bin\mongod.exe" --dbpath "원하는 위치"</code>   
2. 몽고DB 프로젝트 폴더로 이동 후 mongod.exe 실행
 <code>cd C:\Program files\mongodb\server\3.4\bin\mongod.exe</code>
3. 로그 확인    

실행 중 에러

  • sass revision
    node버전과 sass버전 호환성 문제
    sass최신 버전은 node 7.x버전까지만 사용 가능하다.
    npm rebuild node-sass
  • express-session 버전에 따른 문법 change
    app.use(cookieParser())
    app.use(cookieParser('some secret text'))

구성도

기본적으로 MVC 패턴과 Server쪽만 구성이 되어 있다.

따라서 Server 폴더에 Model View Controller 이 3가지 폴더와 routes를 구성하는 routes, 그리고 express의 기본 구성 및 module을 설정하는 config폴더로 이루어져 있다.

1. config/passport.js : passport-local을 이용하여 로그인 구현    
 apps.js : 모듈 호출   
 model/user.js : 비밀번호 확인    
 routes/index.js : 각 페이지 설정   
 [참조](https://www.zerocho.com/category/NodeJS/post/57b7101ecfbef617003bf457)    

2. Controller/comments.js   
 댓글만 구현하므로 Controller파일이 하나이다.    
 중간에 render로 direction시키는 부분에서 설정된 문법을 view페이지에서 사용한다.    

3. Model  
 로그인할 유저 & 댓글이 comments 모델 2가지를 구현    
 NoSQL인 mongodb 형식대로 JSON Type이며 User모델에서는 bcrypt를 사용하여 비밀번호를 암호화한다.    

4. routes/users.js : user 리스트를 보여줌    
 routes/comments.js : view에서 입력받은 양식들을 model에 넘겨주는 역할 및 설정   
 routes/index.js : app.js와 같은 역할 (about comment CRUD)   


'Node.js > Multiple OS' 카테고리의 다른 글

5장. Google API  (0) 2018.01.01
4장. Yeoman  (0) 2018.01.01
3장. BSON이란?  (0) 2017.12.05
2장. MySQL 연동 & Template 및 미들웨어  (0) 2017.12.05

+ Recent posts