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
  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'

alias

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 > Code-Flow' 카테고리의 다른 글

MongoDB - NoSQL  (0) 2017.12.13
[2] Middleware  (0) 2017.12.06

+ Recent posts