on
Node.js학습_몽고디비
Node.js학습_몽고디비
728x90
반응형
# 몽고디비
1. NoSQL
MySQL 같은 SQL 데이터베이스와는 다른 유형의 데이터
NoSQL의 대표주자인 mongoDB (몽고디비) 사용.
SQL 과 NoSQL 비교 SQL (MySQL) NoSQL (몽고디비) 규칙에 맞는 데이터 입력 자유로운 데이터 입력 테이블 간 JOIN 지원 컬렉션 간 JOIN 미지원 안정성, 일관성 확장성, 가용성 용어 (테이블, 로우, 컬럼) 용어 (컬렉션, 다큐먼트, 필드)
JOIN : 관계가 있는 테이블끼리 데이터를 합치는 기능 (몽고디비 aggregate로 흉내 가능)
빅데이터, 메시징, 세션 관리 등 (비정형 데이터)에는 몽고디비 사용하면 좋음.
2. 몽고디비 설치
### 윈도의 경우.
공식 사이트 : https://www.mongodb.com/try/download/community
community 버전 다운로드하여 설치 진행, 설치 시 complete 클릭 후 Install MongD as a Service 체크 해제 이후에 Install MongoDB Compass는 체크하여 설치 진행.
3. 몽고디비 연결
윈도의 경우 C:\에 data 폴더를 만들고 그 안에 db 폴더 생성.
콘솔로 몽고디비가 설치된 경로(기본적으로 C:\Program Files\MongoDB\Server\5.0\bin)로 이동하여 몽고디비를 실행. 그리고 콘솔에 아래와 같이 이력하여 실행
# 콘솔 mongod
mongd로 실행 후 그대로 놔둬야 몽고디비 서버가 돌아감. (만약 실행해둔걸 끄게되면 몽고디비 꺼짐)
mongd가 실행된 상태에서 mongo.exe 실행 시 몽고디비 사용 가능.
4. 어드민 설정
어드민 권한을 설정하여 디비에 비밀번호 걸기
# 콘솔 use admin db.createUser({ user: '이름'. pwd: '비밀번호', roles: ['root']});
mongod를 입력했던 콘솔을 종료한 후 mongod --auth 명령어로 접속. (--auth는 로그인이 필요하다는 의미.)
mongo를 입력한 콘솔도 종료한 후 mongo admin -u 이름 -p 비밀번호로 접속.
5. 커넥션 생성하기
컴퍼스 (MongDB Compass Community)로 접속 (mongod 실행된 상태에서 진행)
Fill in connection fields individually 클릭 후 아래와 같이 입력 후 connect 진행
아래는 접속 성공 화면 (기본적으로 admin / config / local 존재)
6. 데이터 베이스 생성
### 터미널 이용 시.
use 데이터베이스명으로 생성
# 콘솔 use nodejs // nodejs 이름의 데이터베이스 생성.
show dbs로 목록 확인.
# 콘솔 show dbs 출력 예 admin 0.000GB config 0.000GB local 0.000GB => 방금 생성한 nodejs는 보이지 않음. (데이터 넣기 전까지는 보이지 않음)
db로 현재 사용중인 데이터베이스 확인 가능.
# 콘솔 db 출력 예 nodejs
### MongoDB Compass 이용 시.
CREATE DATABASE 클릭하여 생성
7. 컬렉션 생성 (=SQL에서의 테이블)
따로 생성할 필요는 없음.
다큐먼트(=로우)를 넣는 순간 컬렉션도 자동 생성된다.
직접 생성하는 명령어도 있다. (아래참고)
# 콘솔 db.createCollection('users') { "ok" : 1 } db.createCollection('comments') { "ok" : 1 }
show collections로 현재 컬렉션 확인 가능.
# 콘솔 show collections 출력 예 comments users
컬렉션 생성 후 MongoDB Compass에서 새로고침 클릭 시 생긴 걸 확인 가능.
8. 몽고디비 CRUD 작업
### Create
몽고디비는 컬럼을 정의하지 않아도 된다.
자유로움이 장점, 무엇이 들어올지 모른다는 단점 (몽고디비는 오타에 취약하므로 필드명에 주의.)
자바스크립트의 자료형을 따른다. (차이점도 존재)
ObjectId : 몽고 디비의 자료형으로 고유 아이디 역할. ( _id : ObjectId(" ") )
save method로 저장
# 콘솔 use nodejs db.users.save({ name: 'zero', age: 28, married: false, comment: 'hello hi.', createAt: new Date() }); db.users.save({ name: 'mero', age: 32, married: true, comment: 'what hi hello.', createAt: new Date() });
MongoDB Compass 로 생성할 경우 : users 컬렉션 클릭 후 ADD DATA 클릭 > Insert Document 클릭하여 json 형식에 맞게 작성 or 한줄씩 추가(VIEW 옆에 { } or 목록모양 클릭)하여 생성.
### Create (관계 설정)
컬렉션 간 관계를 강요하는 제한이 없으므로 직접 ObjectId를 넣어 연결.
사용자의 ObjectId를 찾은 뒤 댓글 컬렉션에 넣음.
# 콘솔 db.users.find({ name : 'zero' }, { _id : 1 }) => 첫 번째 객체가 find 하는 조건. ({ name : 'zero' }) 두 번째 객체는 어떤 필드를 보여줄지. ({ _id : 1 }) // 1 : 보여줌, 0 : 숨김
users에서 댓글 작성자의 ObjectId를 comments에서 commenter에 넣어주면 유저가 연결되는 것임. (단, 몽고디비가 commenter에 대해 존재하는지 여부 등을 검사해 주지 않음. 그래서 오타에 주의해야 함)
### Read
find로 조회, findOne으로 하나만 조회
# 콘솔 db.users.find({}); // users 컬렉션 전체 조회. db.comments.find({}); // comments 컬렉션 전체 조회.
### Read (조건)
두 번째 인수로 조회할 필드를 선택할 수 있다. (1은 추가 / 0은 제외) ( _id는 기본적으로 1임)
# 콘솔 db.users.find({ _id: 0, name: 1, married: 1 });
첫 번째 인수로 조회 조건을 입력할 수 있다. ($gt 나 $or 같은 조건 연산자 사용)
# 콘솔 db.users.find({ $or: [{ age: { $gt: 30 }, { married: false }] }, { _id: 0, name: 1, age: 1 });
정렬은 sort 메서드로 함. (1 : 오름차순 / -1 : 내림차순)
# 콘솔 db.users.find({}, { _id: 0, name: 1, age: 1}).sort({ age: -1 });
limit 메서드로 조회할 다큐먼트 개수 제한
# 콘솔 db.users.find({}, { _id: 0, name: 1, age: 1 }).sort({ age: -1 }).limit(1);
skip 메서드로 건너뛸 다큐먼트 개수 제공
# 콘솔 db.users.find({}, { _id: 0, name: 1, age: 1 }).sort({ age: -1 }).limit(1).skip(1);
### Update
update 메서드로 쿼리.
첫 번째 인수로 수정 대상을, 두 번째 인수로 수정 내용을 제공
$set을 붙이지 않으면 다큐먼트 '전체'가 대체되므로 주의
# 콘솔 db.users.update({ name: 'nero' }, { $set: { comment: '안녕하세요. 해당 필드 수정' } });
결과로 수정된 개수가 나옴.
### Delete
remove 메서드로 쿼리.
첫 번째 인수로 삭제할 대상 조건 제공
# 콘솔 db.users.remove({ name: 'nero' });
성공 시 삭제된 개수가 반환 됨.
9. 몽구스 ODM
몽고디비 작업을 쉽게 할 수 있도록 도와주는 라이브러리. (몽고디비 드라이버도 내장되어 있음)
ODM : Object Document Mapping로 객체와 도큐먼트를 매핑(1대 1 짝지음)
몽고디비에 없어 불편한 기능들을 몽구스가 보완.
테이블과 유사한 기능, JOIN 기능 추가.
$set 등 빼먹는 것 방지, 쿼리빌더(쿼리를 쉽게 만들 수 있게 해주는 기능) 기능 제공.
몽구스 예제 참고 : https://github.com/zerocho/nodejs-book/tree/master/ch8/8.6/learn-mongoose
위 예제의 경우 프로젝트 세팅 후 콘솔을 통해 경로로 이동한 후 package.json 설치
# 콘솔 npm i express morgan nunjucks mongoose npm i -D nodemon
/schemas/index.js
const mongoose = require('mongoose'); const connect = () => { if (process.env.NODE_ENV !== 'production') { mongoose.set('debug', true); // 개발 시 debug 모드 true.(쿼리가 콘솔에 보이도록 해줌) } // mongodb://설정한 관리자아이디:비밀번호@localhost:27017/admin mongoose.connect('mongodb://root:nodejsbook@localhost:27017/admin', { // 로그인을 위한 db dbName: 'nodejs', // 실제로 데이터 저장할 db명 useNewUrlParser: true, useCreateIndex: true, }, (error) => { if (error) { console.log('몽고디비 연결 에러', error); } else { console.log('몽고디비 연결 성공'); } }); }; // 에러 기록하는 이벤트 리스너. mongoose.connection.on('error', (error) => { console.error('몽고디비 연결 에러', error); }); // 연결 끊겼을 때 연결 재시도 코드. mongoose.connection.on('disconnected', () => { console.error('몽고디비 연결이 끊겼습니다. 연결을 재시도합니다.'); connect(); }); module.exports = connect;
app.js
const express = require('express'); const path = require('path'); const morgan = require('morgan'); const nunjucks = require('nunjucks'); const connect = require('./schemas'); const indexRouter = require('./routes/index'); const usersRouter = require('./routes/users'); const commentsRouter = require('./routes/comments'); const app = express(); app.set('port', process.env.PORT || 3002); app.set('view engine', 'html'); nunjucks.configure('views', { express: app, watch: true, }); connect(); app.use(morgan('dev')); app.use(express.static(path.join(__dirname, 'public'))); app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.use('/', indexRouter); app.use('/users', usersRouter); app.use('/comments', commentsRouter); app.use((req, res, next) => { const error = new Error(`${req.method} ${req.url} 라우터가 없습니다.`); error.status = 404; next(error); }); app.use((err, req, res, next) => { res.locals.message = err.message; res.locals.error = process.env.NODE_ENV !== 'production' ? err : {}; res.status(err.status || 500); res.render('error'); }); app.listen(app.get('port'), () => { console.log(app.get('port'), '번 포트에서 대기 중'); });
10. 몽구스 스키마 사용 (학습중)
728x90
반응형
from http://dlagusgh1.tistory.com/842 by ccl(A) rewrite - 2021-10-15 00:26:18