분류 sql

MongoDB 및 Node.js : 시작 방법 및 이유

컨텐츠 정보

  • 조회 633 (작성일 )

본문

업계에서 가장 선호하는 서버 측 플랫폼에서 가장 널리 사용되는 문서 데이터베이스 소개


우리가 그 어느 때보다 기술에 더 의존한다는 것은 비밀이 아닙니다. 스마트 폰 외에도 인터넷에 연결된 소수의 장치 (노트북, 웨어러블, 스마트 가전 제품, 온도 조절 장치 (너 스트 네스트))도 있습니다. 인터넷에 연결되었다고 말하면 모두 동일한 서비스 (예 : Google 계정)에 연결되어 있다는 의미입니다. 이제 사용자 활동, 원하는 종류, 이전 24 시간 또는 48 시간 또는 지난 달에 검색 한 내용을 저장해야 하는 문제를 생각해보십시오. 그런 다목적 데이터를 어떻게 저장할 수 있습니까? 확실히 압도적이며 SQL (관계형 데이터베이스)이 여기에 대한 대답이 아니라는 것을 확신 할 수 있습니다.


https://contextneutral.com/story/mongodb-and-nodejs-how-to-begin 


일반적인 SQL 데이터베이스는 이와 같이 작동합니다. 스키마에는 사용자 장치 ID와 활동 이름이 포함 된 고정 된 스키마가 필요합니다. 그러나 끊임없이 변화하는 타임 스탬프는 어디로 갈까요? 새로운 유형의 사용자 데이터가 모두 표시되면 어떻게 됩니까? 전통적인 관계형 DB로 어떻게 적응할 수 있습니까?


정답은 우리가 실제로 할 수 없다는 것입니다. 스키마에 맞게 응용 프로그램의 동작을 제한하려고 할 수 있지만 현재 응용 프로그램의 작동 방식 또는 작동 방식은 무엇입니까? 실제로는 아닙니다. 스키마 없는 데이터베이스인 NoSQL 데이터베이스인 관계형 데이터베이스보다 더 나은 솔루션이 필요합니다.


NoSQL 데이터베이스는 기존 데이터베이스와 달리 테이블 대신 문서에 데이터 항목을 저장하는 스키마가 없는 데이터베이스입니다. 


따라서 테이블을 사용할 수 없으며 긴 조인이나 열 또는 행이 없으며 특정 고유 ID에 대한 모든 데이터를 보유하는 데이터 항목이 있습니다. 또한 NoSQL은 Not-Only-SQL을 의미하므로 SQL과 비슷한 동작을 수행하지만 성능, 확장성 등의 측면에서 더 우수 할 것으로 기대합니다.


현재 Microsoft의 DocumentDB, Amazon의 DynamoDB (AWS) 및 MongoDB, MongoDB Inc 등 좋은 NoSQL 데이터베이스를 사용할 수 있습니다.이 중 3 개 (포함되지 않은 데이터베이스) 중에서 MongoDB는 최근에 큰 진전을 이루었습니다. Facebook (Parse), Expedia, Bosch 등과 같은 회사에서 채택이 증가하고 있습니다. 그들이 NoSQL을 채택한 이유에 대한 대답은 누구에게나 놀라운 일이 아니라고 확신합니다. MongoDB는 복잡한 데이터 구조를 보다 쉽게 ​​유지하고 쿼리 할 수 있게 하며 Node.js를 사용하면 빠르게 이동할 수 있습니다. 

모든 MongoDB로 시작하는 방법과 Node.js에서 다른 작업을 수행하는 방법을 살펴 보겠습니다.


0. MongoDB 설치 


데이터베이스 작업시 두 단계가 필요합니다. 

1. 시스템에 데이터베이스를 설치하십시오. 

2. 드라이버를 사용하여 로컬 데이터베이스에 연결하고 조작을 수행하십시오.


먼저 원하는 시스템에 MongoDB를 설치하는 방법을 살펴 보겠습니다. MacOS 설치는 서버에서 사용되지 않으므로 무시합니다.


MongoDB Inc.는 Enterprise 및 Community의 두 가지 버전의 MongoDB를 제공합니다. 

여기에서 Enterprise Edition 및 Community Edition과 함께 제공되는 내용을 읽고 진행하기 전에 설치할 버전을 결정하십시오. 

커뮤니티 버전을 설치하므로 다른 버전과 함께 선택하면 변경하십시오. 

또한 완전한 MongoDB 패키지 (mongodb-org)를 사용할 것이므로 다른 명령이 필요한 경우 아래 명령에서 해당 패키지 이름을 지정하십시오.


Ubuntu 시스템에서 MongoDB 3.4를 설치하려면 다음 4 가지 명령을 실행해야 합니다.


--  Importing public key 


Ubuntu의 APT 패키지 관리자에는 공급 업체가 패키지에 서명하는 데 사용한 GPG 키가 필요합니다. 다음 명령은 MongoDB의 GPG 키를 가져옵니다.


sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6

-- Creating source list 


APT에 설치를 요청하기 전에 MongoDB 저장소의 소스 목록을 작성해야 합니다. apt package manager가 액세스 할 수있는 저장소 주소를 보유하기 위해 "mongodb-org-3.4.list"라는 목록을 작성합니다. 우분투 16.04에서 명령은


echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list

다른 버전에서는 Ubuntu 14.04의 ubuntu trusty와 같이 ubuntu xenial을 버전 이름으로 바꾸십시오.


-- Updating Package Manager Local Database 


목록을 만든 후에는 새로운 리포지토리 소스가 있는지 패키지 관리자가 알아야 합니다. 우리는 그것을 사용하여 업데이트함으로써 그렇게 합니다.


sudo apt-get update

-- Doing apt-get install 


그러면 4 개의 하위 패키지, mongodb-org-server, mongodb-org-mongos, mongodb-org-shell 및 mongodb-org-tools가 모두 포함 된 기본 mongodb-org 패키지가 설치됩니다.


sudo apt-get install mongodb-org -y

여기서 -y는 설치 중 필요한 모든 권한에 대한 승인을 나타냅니다. 이제 데이터베이스가 설치되었으므로 이제 데이터 저장소 경로를 설정하고 데몬 서비스를 시작하기 만하면 됩니다. 이렇게 하면 MongoDB 데몬이 시작됩니다.


mongod --dbpath /path/data

디먼은 기본 스토리지 디렉토리 인 dbpath 값으로 포트 27017에서 실행을 시작합니다.



다른 Linux 버전의 경우 전체 지침을 보려면 여기로 이동하고 Windows의 경우 여기로 이동하십시오.


1. Node.js 용 MongoDB 드라이버 설치 


로컬 설치가 완료되면 데이터베이스에 연결하고 액세스하려면 Node.js 애플리케이션이 필요합니다. Node.js의 기본 사항에 대해 잘 이해하고 있다고 가정하겠습니다. 다른 데이터베이스 시스템과 마찬가지로 데이터베이스에 액세스하려면 Node.js에 MongoDB 드라이버가 설치 및 구성되어 있어야 합니다. 운 좋게도 MongoDB는 소수의 언어에 대한 드라이버를 제공하며 Node.js 중 하나입니다.


MongoDB 드라이버를 설치하려면 NPM (Node Package Manager)이 필요합니다. Node.js 버전 v0.6.3 이상을 실행중인 경우 이미 NPM이 설치되어 있습니다. 그 이전 버전에서는 다음 명령을 실행해야 합니다 (Ubuntu 용).

sudo apt-get install npm

Windows에서는 모든 Node.js 실행 파일이 기본적으로 NPM을 포함하므로 추가 명령이 필요하지 않습니다.


이제 패키지 관리자가 설치되었으므로 다음 명령을 실행하여 MongoDB를 설치할 수 있습니다.

sudo npm i mongodb --save

Windows의 경우 위 명령에서 sudo를 제거하면 나머지는 둘 다 동일하게 유지됩니다. NPM 설치 프로그램에 필요한 액세스 권한을 부여하려면 Ubuntu 시스템에 sudo를 포함시켜야 합니다 (예 : 쓰기). Windows 시스템에서는 모든 것이 제대로 실행되거나 관리자 권한으로 명령 프롬프트를 실행해야 합니다.


나머지 명령은 NPM 패키지 관리자가 i를 위해 필요한 MongoDB 모듈을 설치하도록 지시하는 실제 NPM 명령입니다. 여기서, 명령의 마지막 매개 변수 인 save는 향후 재사용을 위해 설치 될 모듈 이름을 프로젝트의 package.json 파일에 추가하려는 의사를 나타냅니다. node_modules 폴더에 설치된 모듈을 볼 수 있습니다.


2. 사용할 데이터베이스 생성 


Node.js 애플리케이션을 MongoDB에 연결하기 전에 먼저 MongoDB 쉘을 사용하여 MusicDB와 같은 수동 데이터베이스를 작성하십시오. 쉘을 열려면 그냥 실행하십시오.


mongo

우분투에서. 이제 MusicDB 데이터베이스를 만들려면 다음을 입력하십시오.

use MusicDB

Enter 키를 누르십시오. MongoDB는 기본 데이터베이스의 변경과 사용을 통한 새 데이터베이스 생성을 모두 처리합니다. 시스템이 제공된 이름의 이미 작성된 데이터베이스를 볼 수 없는 경우 해당 이름의 새 데이터베이스를 작성하여 기본 데이터베이스로 설정합니다. 그러나 데이터베이스에 데이터가 있을 때까지 데이터베이스가 셸에 표시되지 않는다는 것을 이해해야 합니다. 당신이 사용할 수 있는

show dbs 

또는

show databases

로컬 디스크에 있는 모든 데이터베이스를 나열합니다.


이제 DB를 초기화 했으므로 컬렉션을 만들고 앨범을 말하고 앨범 데이터를 삽입해야 합니다. 컬렉션을 테이블의 SQL이 아닌 테이블로 생각하면 행은 엔터티 속성으로 데이터 항목과 열로 표시됩니다. Alan Walker의 Faded EP에 대한 앨범 데이터로 다음 항목을 추가하겠습니다.

db.albums.insert({name: 'Faded-EP', artist: 'Alan Walker', releaseDate: '25 Nov 2015', genre: 'Dance'})

코드를 자세히 살펴보십시오. 데이터 입력을 수집 및 데이터베이스에 저장하기 위해 함께 작동하는 5 개의 파트가 있습니다.


먼저 db 변수입니다. 현재 사용 중인 기본 데이터베이스를 나타내며 컬렉션의 데이터를 조작하거나 액세스하는 데 사용할 수 있습니다. 여기서 데이터를 앨범 (두 번째 부분) 모음에 넣고 DB에서 액세스했습니다. 다음 부분 인서트는 콜렉션 인터페이스에서 제공하는 메소드입니다. 단순히 데이터 항목을 JSON 객체로 가져 와서 포함 된 컬렉션에 저장합니다. 마찬가지로 앨범의 다른 속성을 단일 JSON 객체로 전달하여 앨범 모음에 저장된 Faded EP 앨범 데이터 항목을 얻었습니다.


네 번째와 다섯 번째 부분은 JSON 속성의 이름과 값입니다. 컬렉션에 저장되는 데이터 유형을 잘 이해하는 것이 중요합니다. 숫자, 문자열 또는 날짜 또는 다른 것입니까? -MongoDB가 동일한 속성에 대해 여러 데이터 유형을 허용 할 수 있으므로 단일 속성의 데이터 유형에 대한 일관성을 유지합니다. 예를 들어, 다른 앨범의 두 번째 데이터 항목에서 String for releaseDate 속성 대신 Date 인스턴스를 전달하면 MongoDB에 적합했을 것입니다. 필요한 경우에만 일관성을 유지하기 위해 MongoDB에서 이러한 중복성을 확인하십시오.


3. Node.js 드라이버를 사용하여 데이터베이스에 연결 


데이터베이스 MusicDB에 연결하려면 먼저 MongoDB 패키지에서 제공하는 MongoClient 인스턴스를 가져와야 합니다. 다음을 수행하면 MongoClient 인스턴스가 생깁니다.


const MongoClient = require('mongodb').MongoClient

이 MongoClient 인스턴스는 기본 포트 27017의 로컬 호스트 (또는 로컬 컴퓨터)에서 실행 중인 MongoDB에 연결하고 데이터베이스에 액세스하는 데 도움이됩니다. 우리는 MongoClient의 connect 메소드를 사용하여 MusicDB에 연결하기 위해 데이터베이스 URL과 DB 인스턴스와의 콜백이라는 두 가지 매개 변수가 필요합니다. 아래 코드는 URL을 받아 오류 및 데이터베이스 인스턴스를 발생시킵니다. 오류 인스턴스가 null이거나 오류가 발생한 경우에만 데이터베이스에 액세스합니다.


MongoClient.connect('mongodb://127.0.0.1:27017/MusicDB', (err, db) => { 
    if (err) throw err 
    db.collection('albums').find({}).toArray((e, albums) => { 
        db.close() 
        if (e) throw e
        console.log(albums)
    })
})

위의 URL에서 비정상적인 것을 눈치 채 셨을 것입니다. 일반적인 HTTP 또는 HTTP 대신 MongoDB 프로토콜이 있습니다. MongoDB 클라이언트는 TCP / IP를 통한 연결 및 데이터를 처리하므로 연결을 생성하는 것에서 부터 데이터를 읽을 수 있는 형식으로 변환하는 것까지 모든 것을 처리하기 위해 시스템 내에서 공통 프로토콜을 말해야 합니다.



다음 URL은 mongodb 프로세스가 실행 중인 주소입니다. 여기서 127.0.0.1은 로컬 설치를 나타내고 27017은 mongod 데몬 (서비스)이 실행되는 기본 포트입니다. 위의 connect (...)에 전달 된 URL의 경로는 액세스 해야 하는 데이터베이스 인 MusicDB입니다.


데이터베이스에 연결되면 앨범 컬렉션을 쿼리하고 사용할 수 있는 작업을 수행하려고 합니다.


db.collection('albums').find({})

위의 코드에는 컬렉션 이름을 허용하고 필요한 컬렉션 인터페이스를 반환하는 컬렉션 메서드가 있습니다. 이 인터페이스는 컬렉션에서 데이터를 쿼리, 업데이트, 제거 (및 그 이상) 할 수있는 몇 가지 방법을 제공합니다. 여기서 query-less 객체를 사용하는 find (...) 메소드를 사용하여 컬렉션을 쿼리하므로 컬렉션의 모든 데이터 항목을 커서로 반환합니다. 커서를 앨범의 항목 배열로 변환하기 위해 toArray (...)를 적용했습니다.


이제 연결을 확인하려면 위의 모든 Node.js 코드를 app.js 파일에 넣고 다음 명령을 실행하여 Node.js 환경에서 실행하십시오.

sudo node app.js

데이터 입력을 일찍 삽입하면 모든 것이 잘 진행되었습니다. 그렇지 않으면 문제가 발생하여 다시 실수를 한 부분을 확인해야 합니다. 가장 일반적인 실수는 잘못된 주소 나 포트 또는 데이터베이스 이름과 관련이 있습니다.


하나 더. MongoDB는 데이터베이스에 연결할 때 약속을 반환합니다. 따라서 메모리 누수를 피하기 위해 작업이 완료되면 데이터베이스를 닫으십시오.


4. 다음은 무엇입니까? 


연결이 끝나면 Node.js와 MongoDB와 함께 할 일이 많이 있습니다. CRUD 조작을 위한 API를 작성하거나 BigData 조작을 위해 MongoDB를 사용하여 데이터를 저장하거나 (MapReduce 프레임 워크를 사용하여) Node.js를 사용하여 소켓을 작성하고 MongoDB를 사용하여 사용자 대화 데이터를 저장하거나 사용자의 해시 비밀번호를 저장하거나 액세스 토큰을 생성하여 API 액세스를 확인하십시오. 복잡한 상황에 대한 집계 프레임 워크로 파이프 라인 (일련의 쿼리)을 수행 할 수도 있습니다.


Node.js의 경우 Automattic에서 만든 뛰어난 몽구스 클라이언트도 있으며 많은 이점 중에서 스키마 지원을 제공합니다. Mongoose는 Schema를 사용하여 별도의 컬렉션 인스턴스를 만들어 컬렉션 구조를 관리합니다 .Mongoose에 대한 자세한 내용은 여기를 참조하십시오.


우리는 다른 게시물에서 몽구스를 자세히 다룰 것입니다. 또한 앞으로 몇 주 동안 다양한 MongoDB 운영, 성능 조정 및 빅 데이터에 대한 MapReduce 기능을 다룰 예정입니다. 보다 구체적으로 이 시리즈의 다음 기사는 MongoDB 컬렉션을 쿼리 (찾기)하는 다양한 방법에 대해 설명합니다.