아무튼 개발
article thumbnail
반응형

 

1.  

2. mongoose 모듈이란?

데이터베이스를 테이블이나 엑셀처럼 쉽게 다룰 수 있도록 하는 모듈이다.

 

특히 몽고 db에는 없는 'Schema(스키마)'를 가지고 있기 때문에 몽구스 모듈을 통해

몽고 db에 넣어서 관계형 db처럼 사용할 수 있다.

 

Schema란?

관계형 데이터베이스처럼 조회 조건을 공통적으로 적용하도록

정해진 규칙으로 문서를 저장하게 하는 것이 스키마이다.

예를 들면 String, Number, Boolean 등 데이터 타입을 의미한다.

어떤 문서에는 name이 있고 또 다른 문서에는 name이 없을 수도 있기 때문에 일정한 조건으로 적용이 어렵다.

이에 따라 스키마로 수월하게 가능하다.

 

 


 

몽구스 모듈 설치

npm install mongoose --save

 

먼저 cmd창에 위의 내용을 입력하여 몽구스 모듈을 설치해준다.

밑의 예제는 몽고 db가 설치되었다는 것을 가정 하에 진행하겠다.

(몽고 db 설치 등에 관련해서는 추가적으로 글을 올릴 예정이다!)

 


회원가입 및 로그인을 할 수 있는

예제를 살펴보겠다.

 

사용 모듈 세팅 및 예제 변수 선언

<javascript />
require("dotenv").config(); var express = require("express"); var http = require("http"); var path = require("path"); var serveStatic = require("serve-static"); var expressErrorHandler = require("express-error-handler"); var expressSession = require("express-session"); var mongoose = require("mongoose"); var database; var UserSchema; var UserModel;

 

예제에서 사용하기 위한 모듈들을 먼저 등록해준다.

추가로 몽구스 모듈까지 입력한다.

몽고 db는 모듈에 등록하지 않아도 몽구스 모듈을 입력함으로써 가능해진다.

 

또한 각각 데이터베이스 객체, 스키마, 모델을 위한 변수를 선언하였다.

 

 

데이터베이스 연결

<javascript />
function connectDB(){ var databaseUrl = "mongodb://localhost:27017/shopping"; mongoose.connect(databaseUrl); database = mongoose.connection; database.on("open",function(){ console.log("데이터베이스가 연결되었습니다: " + databaseUrl); UserSchema = mongoose.Schema({ id:String, name:String, pwd:String }); console.log("UserSchema 정의함."); UserModel = mongoose.model("users",UserSchema) console.log("UserModel 정의함."); }); database.on("error",console.error.bind(console,"몽구스 연결 에러...")); database.on("disconnected",function(){ console.log("DB연결이 끊겼습니다. 5초 후 재연결 합니다."); setInterval(connectDB(),5000); }); } var app = express(); app.set("port",process.env.PORT||3000); app.use(express.urlencoded({extended:false})); app.use("/public",serveStatic(path.join(__dirname,"public"))); app.use(expressSession({ secret:"my Key", resave:true, saveUninitialized:true }));

 

  • 데이터베이스 연결

먼저 db 연결을 위해 연결 정보를 가져온다.

기본 포트번호는 27017로 설정하였으며 shopping이라는 데이터베이스를 만들었기에 입력해주고

데이터베이스 연결을 해준다.

 

  • Schema, Model 정의

내장 이벤트 open에서 스미카와 모델을 정의해준다.

데이터베이스 연결이 잘 됐는지 확인용으로 콘솔창에 띄워준다.

스키마 정의의 경우, 위에서 입력한 변수 UserSchema에 담았다. 스키마는 문서(=컬럼) 규칙을 정한 것이다.

id, name, pwd는 모두 String타입으로 지정했다.

 

모델은 어떤 컬렉션(=테이블)에 스키마를 담을지 설정해준다.

users라는 컬렉션에 지정한 UserSchema를 담기 위해 입력해주었다.

 

error 이벤트의 경우, function으로 넣지 않고 바로 입력하였다.

dicsonnected는 db 연결이 끊어졌을 때 나오도록 하며 

setInterval는 정해진 시간마다 반복을 작업하도록 하며, 따라서 메소드로 5초마다 db 연결하도록 입력했다.

 

  • 익스프레스 객체 생성

익스프레스 객체 생성은 지난 블로그글에서 작성했으니 내용을 생략하겠다.

Express 관련한 내용은 참고하면 좋을 것 같다.

 

 

회원가입 및 로그인 실행 함수

<javascript />
var addUser = function(database,id,pwd,name,callback){ console.log("addUser 함수 호출.."); var users = new UserModel({"id":id,"pwd":pwd,"name":name}); users.save(function(err,result){ if(err){ callback(err,null); return; } if(result){ console.log("사용자 추가.."); }else{ console.log("사용자 추가 실패.."); } callback(null,result); }); }; var authUser = function(database,id,pwd,callback){ console.log("authUser 함수 호출.."); UserModel.find({"id":id,"pwd":pwd},function (err,result){ if(err){ callback(err,null); return; } if(result.length>0){ callback(null,result); }else{ console.log("일치하는 데이터가 없습니다."); callback(null,null); } }); }

 

로그인과 회원가입 데이터를 다룰 함수이다. 함수는 이후 라우터에서 호출하여 사용하게 된다.

 

  • 사용자를 추가하는 함수 (addUser)

users라는 변수에 new를 통해 UserModel 즉, 컬렉션을 정의한다.

save는 객체의 데이터를 저장하는 것이며 결과는 콜백 함수로 전달된다.

따라서 err 또는 result의 유무에 따라 결과가 나뉜다.

 

  • 사용자를 인증하는 함수 (authUser)

 

로그인을 하기 위해 아이디와 비밀번호를 검색하도록 한다.

사용자 추가 함수의 users는 맨 위에서 모델 정의할 때 UserModel로 들어갔으니 users가 아닌 UserModel이다.

따라서 find에 id와 pwd를 가져오도록 했고

result의 length가 0보다 크다는 것은 데이터가 있을 경우이다.

에러는 없으니 콜백 함수에 null을 주고 result를 넘겼다.

 

 

라우팅 객체 생성

  • 회원가입 경로
<javascript />
var router = express.Router(); router.route("/process/addUser").post(function(req,res){ console.log("/process/addUser 호출.."); var id = req.body.id; var pwd = req.body.pwd; var name = req.body.name; if(database){ addUser(database, id, pwd, name, function(err,result){ if(err) {throw err;} if(result){ res.writeHead("200",{"Content-type":"text/html;charset=utf-8"}); res.write("<h1>사용자 추가 성공</h1>"); res.end(); }else{ res.writeHead("200",{"Content-type":"text/html;charset=utf-8"}); res.write("<h1>사용자 추가 실패</h1>"); res.end(); } }); }else{ res.writeHead("200",{"Content-type":"text/html;charset=utf-8"}); res.write("<h1>데이터베이스 연결 실패</h1>"); res.write("<div>데이터베이스를 연결하지 못했습니다.</div>"); res.end(); } });

 

express.Router()로 라우팅 객체를 생성하였다.

데이터를 받아 웹페이지에 출력할 내용들을 입력해줄 것이다.

 

경로에 회원가입 링크가 올 때 req.body로 데이터들을 받아주고

database가 있을 때 if문을 실행한다.

 

만들었던 addUser 함수를 호출하여 사용한다.

result 유무에 따라 클라이언트에 응답할 웹페이지 출력 내용이 달라진다.

마지막에는 database 유무이다.

 

  • 로그인 경로
<javascript />
router.route("/process/login").post(function(req,res){ console.log("/process/login 호출.."); var id = req.body.id; var pwd = req.body.pwd; if(database){ authUser(database, id, pwd, function(err,result){ if(err) {throw err;} if(result){ var userName = result[0].name; res.writeHead("200",{"Content-type":"text/html;charset=utf-8"}); res.write("<h1>로그인 성공</h1>"); res.write("<div>아이디: " + id + "</div>"); res.write("<div>이름: " + userName + "</div>"); res.write("<br/><br/><a href='/public/login.html'>다시 로그인</a>"); res.end(); }else{ res.writeHead("200",{"Content-type":"text/html;charset=utf-8"}); res.write("<h1>로그인 실패</h1>"); res.write("<div>아이디 또는 패스워드를 확인하세요</div>"); res.write("<br/><br/><a href='/public/login.html'>다시 로그인</a>"); res.end(); } }); }else{ res.writeHead("200",{"Content-type":"text/html;charset=utf-8"}); res.write("<h1>데이터베이스 연결 실패</h1>"); res.write("<div>데이터베이스를 연결하지 못했습니다.</div>"); res.end(); } }); app.use("/",router);

 

로그인 경로가 왔을 때 실행될 라우터이다.

마찬가지로 만들어 둔 authUser 함수를 호출한다.

userName는 매개변수로 가져온 id와 다르게 직접 가져와야 한다. 여러 데이터가 있을 수 있으므로 배열로 값을 가져왔다.

 

그리고 라우터 객체를 등록해주면 된다.

 

 Express 서버 시작

<javascript />
var errorHandler = expressErrorHandler({ static: { "404":"./public/404.html" } }); app.use(expressErrorHandler.httpError(404)); app.use(errorHandler); http.createServer(app).listen(app.get("port"),function(){ console.log("익스프레스 서버를 시작했습니다: " + app.get("port")); connectDB(); });

 

에러 처리와 서버 시작 역시 지난 블로그 글에서 작성하였으니 참고 바란다.

에러의 경우 마지막에 입력해줘야 하는 점 주의하자.

 

 

 

4월 5일 수업 🌜
반응형
profile

아무튼 개발

@릴쥬

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!