1. 몽고디비
비관계형 데이터베이스 중 하나인 몽고디비, NoSQL 또는 Not Only SQL이라고도 부른다.
몽고디비는 여러 데이터가 모인 하나의 단위를 컬렉션(Collection)이라고 부른다.
그러므로 데이터 베이스는 컬렉션의 집합이라고 할 수 있습니다. 그리고 각각의 컬렉션은 여러 개의 문서 객체(Document)를 가질 수 있습니다. 문서 객체는 속성들의 집합으로서 한 사람의 이름과 나이 등을 저장하고 싶을 때 하나의 문서 객체를 만든 후 그 안에 자바스크립트 객체와 같이 속성들을 추가하여 저장할 수 있습니다.
이 문서 객체들은 다른 문서 객체와 똑같은 속성을 가질 필요가 없어서 필요에 따라 완전히 다른속성을 넣어 둘수 있습니다.
ex) 한 문서 객체가 id, pwd 속성을 가진다면 다른 문서 객체는 date, price속성을 가질수 있습니다.
몽고디비 설치 : https://www.mongodb.com/download-center/community
- Path 추가 : C:\Program Files\MongoDB\Server\4.0\bin
- 데이터베이스 실행
데이베이스 지정 |
use 데이터베이스명 ex) use shopping |
switched to db shopping |
INSERT(JSON) |
db.users.insert({"name":"소녀시대","age":20}) |
WriteResult({ "nInserted" : 1 }) |
SELECT (모든 문서 객체) | db.users.find().pretty() | { "name" : "소녀시대", "age" : 20 } |
- mongodb://%IP정보%:%포트정보%/%데이터베이스이름%
// Express 기본 모듈 불러오기 var express = require('express') , http = require('http') , path = require('path'); // Express의 미들웨어 불러오기 var bodyParser = require('body-parser') , cookieParser = require('cookie-parser') , serveStatic = require('serve-static'); // 에러 핸들러 모듈 사용 var expressErrorHandler = require('express-error-handler'); // Session 미들웨어 불러오기 var expressSession = require('express-session'); // 익스프레스 객체 생성 var app = express(); // 기본 속성 설정 app.set('port', process.env.PORT || 7001); // body-parser를 이용해 application/x-www-form-urlencoded 파싱 app.use(bodyParser.urlencoded({ extended: false })) // body-parser를 이용해 application/json 파싱 app.use(bodyParser.json()) // public 폴더를 static으로 오픈 app.use('/public', serveStatic(path.join(__dirname, 'public')));
// cookie-parser 설정 app.use(cookieParser()); // 세션 설정 app.use(expressSession({ secret:'my key', resave:true, saveUninitialized:true })); //===== 데이터베이스 연결 =====// // 몽고디비 모듈 사용 var MongoClient = require('mongodb').MongoClient; // 데이터베이스 객체를 위한 변수 선언 var database; //데이터베이스에 연결 function connectDB() { // 데이터베이스 연결 정보 var databaseUrl = 'mongodb://localhost:27017/shopping';
// 데이터베이스 연결 MongoClient.connect(databaseUrl, function(err, db) { if (err) throw err;
console.log('데이터베이스에 연결되었습니다. : ' + databaseUrl);
// database 변수에 할당 database = db; }); } //===== 라우팅 함수 등록 =====// // 라우터 객체 참조 var router = express.Router(); // 로그인 라우팅 함수 - 데이터베이스의 정보와 비교 router.route('/process/login').post(function(req, res) { console.log('/process/login 호출됨.'); // 요청 파라미터 확인 var paramId = req.body.id || req.query.id; var paramPassword = req.body.password || req.query.password;
console.log('요청 파라미터 : ' + paramId + ', ' + paramPassword);
// 데이터베이스 객체가 초기화된 경우, authUser 함수 호출하여 사용자 인증 if (database) { authUser(database, paramId, paramPassword, function(err, docs) { if (err) {throw err;}
// 조회된 레코드가 있으면 성공 응답 전송 if (docs) { console.dir(docs); // 조회 결과에서 사용자 이름 확인 var username = docs[0].name;
res.writeHead('200', {'Content-Type':'text/html;charset=utf8'}); res.write('<h1>로그인 성공</h1>'); res.write('<div><p>사용자 아이디 : ' + paramId + '</p></div>'); res.write('<div><p>사용자 이름 : ' + username + '</p></div>'); res.write("<br><br><a href='/public/login.html'>다시 로그인하기</a>"); res.end();
} else { // 조회된 레코드가 없는 경우 실패 응답 전송 res.writeHead('200', {'Content-Type':'text/html;charset=utf8'}); res.write('<h1>로그인 실패</h1>'); res.write('<div><p>아이디와 패스워드를 다시 확인하십시오.</p></div>'); res.write("<br><br><a href='/public/login.html'>다시 로그인하기</a>"); res.end(); } }); } else { // 데이터베이스 객체가 초기화되지 않은 경우 실패 응답 전송 res.writeHead('200', {'Content-Type':'text/html;charset=utf8'}); res.write('<h2>데이터베이스 연결 실패</h2>'); res.write('<div><p>데이터베이스에 연결하지 못했습니다.</p></div>'); res.end(); }
}); // 라우터 객체 등록 app.use('/', router); // 사용자를 인증하는 함수 var authUser = function(database, id, password, callback) { console.log('authUser 호출됨 : ' + id + ', ' + password); // users 컬렉션 참조 var users = database.collection('users'); // 아이디와 비밀번호를 이용해 검색 users.find({"id":id, "password":password}).toArray(function(err, docs) { if (err) { // 에러 발생 시 콜백 함수를 호출하면서 에러 객체 전달 callback(err, null); return; } if (docs.length > 0) { // 조회한 레코드가 있는 경우 콜백 함수를 호출하면서 조회 결과 전달 console.log('아이디 [%s], 패스워드 [%s] 가 일치하는 사용자 찾음.', id, password); callback(null, docs); } else { // 조회한 레코드가 없는 경우 콜백 함수를 호출하면서 null, null 전달 console.log("일치하는 사용자를 찾지 못함."); callback(null, null); } }); }; // 404 에러 페이지 처리 var errorHandler = expressErrorHandler({ static: { '404': './public/404.html' } }); app.use( expressErrorHandler.httpError(404) ); app.use( errorHandler ); // Express 서버 시작 http.createServer(app).listen(app.get('port'), function(){ console.log('서버가 시작되었습니다. 포트 : ' + app.get('port')); // 데이터베이스 연결을 위한 함수 호출 connectDB();
}); |
|
- 사용자기능 추가
// 사용자 추가 라우팅 함수 - 클라이언트에서 보내오는 데이터를 이용해 데이터베이스에 추가 router.route('/process/adduser').post(function(req, res) { console.log('/process/adduser 호출됨.'); var paramId = req.body.id || req.query.id; var paramPassword = req.body.password || req.query.password; var paramName = req.body.name || req.query.name;
console.log('요청 파라미터 : ' + paramId + ', ' + paramPassword + ', ' + paramName);
// 데이터베이스 객체가 초기화된 경우, addUser 함수 호출하여 사용자 추가 if (database) { addUser(database, paramId, paramPassword, paramName, function(err, result) { if (err) {throw err;}
// 결과 객체 확인하여 추가된 데이터 있으면 성공 응답 전송 if (result && result.insertedCount > 0) { console.dir(result);
res.writeHead('200', {'Content-Type':'text/html;charset=utf8'}); res.write('<h2>사용자 추가 성공</h2>'); res.end(); } else { // 결과 객체가 없으면 실패 응답 전송 res.writeHead('200', {'Content-Type':'text/html;charset=utf8'}); res.write('<h2>사용자 추가 실패</h2>'); res.end(); } }); } else { // 데이터베이스 객체가 초기화되지 않은 경우 실패 응답 전송 res.writeHead('200', {'Content-Type':'text/html;charset=utf8'}); res.write('<h2>데이터베이스 연결 실패</h2>'); res.end(); }
}); .... //사용자를 추가하는 함수 var addUser = function(database, id, password, name, callback) { console.log('addUser 호출됨 : ' + id + ', ' + password + ', ' + name);
// users 컬렉션 참조 var users = database.collection('users'); // id, password, username을 이용해 사용자 추가 users.insertMany([{"id":id, "password":password, "name":name}], function(err, result) { if (err) { // 에러 발생 시 콜백 함수를 호출하면서 에러 객체 전달 callback(err, null); return; }
// 에러 아닌 경우, 콜백 함수를 호출하면서 결과 객체 전달 if (result.insertedCount > 0) { console.log("사용자 레코드 추가됨 : " + result.insertedCount); } else { console.log("추가된 레코드가 없음."); }
callback(null, result);
}); }; |
|
몽고디비를 GUI 툴을 통해 쉽게할수있는 robomongo 를 설치해보겠습니다.
다운주소 : https://robomongo.org/download