무작정 개발.Vlog

[node.js] mongoose 모듈을 활용한 관계형 DB

by 무작정 개발
반응형
2022.04.05(71일 차)

 

이번에는 mongoose 모듈에 대해 정리할 것이다.

 

mongoDB
mongoDB

 

 

mongoose 모듈 사용하기

 

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

그래서 스키마(Schema)를 만들고 해당 스키마에 맞는 모델을 만들어 공통된 조건에 맞게

조회 및 저장이 가능하다.

 

어떤 문서(칼럼)에는 name이 있고 다른 문서에는 name이 없을 수도 있기 때문에 일정한 조건으로 

적용하기가 어렵다. 관계형 데이터베이스처럼 조회 조건을 공통적으로 적용할 수 있게
정해진 규칙으로 문서를 저장할수 있게 하는 것이 Schema이다 

mongoDB(몽고DB)에는 스키마(Schema)가 없어서 mongoose 모듈을 사용해서 관계형DB로 만들 수 있다.

 

[모듈 설치 방법]

npm install mongoose --save

 

mongoose 모듈을 사용한 예제 1

 

  • 로그인 페이지

DatabaseExe 프로젝트 구조
DatabaseExe 프로젝트 구조

 

app2.js

//mongoose 모듈 사용하기

//Express 기본 모듈
require("dotenv").config();
var express = require("express");
var http = require("http");
var path = require("path");
//var bodyParser = require("body-parser"); //예전에는 bodyParser를 호출해야 했지만 express에 내장이 되어 안써도 괜춘
var serveStatic = require("serve-static"); //특정 폴더를 패스로 접근 가능하게 하는것.
var expressErrorHandler = require("express-error-handler");
var expressSession = require("express-session");

//몽고디비 모듈
//var MongoClient = require("mongodb").MongoClient; 몽구스모듈을 쓰면 이렇게 할 필요 없어서 여긴 주석

//mongoose 모듈
var mongoose = require("mongoose");

//데이터베이스 객체를 위한 변수
var database; //==connection conn; 과 같음

//데이터베이스 스키마를 위한 변수
var UserSchema;

//데이터베이스 모델을 위한 변수
var UserModel;

//데이터베이스 연결
function connectDB(){

	//데이터베이스 연결 정보
	var databaseUrl = "mongodb://localhost:27017/shopping";

	//연결
	mongoose.connect(databaseUrl); //몽고DB의 정보를 몽구스모듈과 연결해준다.
	
	database = mongoose.connection;
	
	database.on("open",function(){//open이라는 내장이벤트 db가 열려있냐
		
		console.log(" 데이터베이스가 연결 되었습니다: " + databaseUrl); //여기까지왔으면 DB연결 성공
		
		//스키마 정의
		UserSchema = mongoose.Schema({
			id:String,
			name:String,
			pwd:String
			
		});
		
		console.log("UserSchema 정의함.");
		
		//Model 정의 - 스키마를 정의했으면 Model를 정의해야 함
		UserModel = mongoose.model("users",UserSchema);//users 테이블에 UserSchema를 적용해라
		
		console.log("UserModel 정의함.");
		
	}); 
						//function자리에 한번에써준것.
	database.on("error",console.error.bind(console,"몽구스 모듈 에러")); //이렇게 한줄로 써줄수도있다.
									
	database.on("disconnected",function(){
		
		console.log("DB연결이 끊겼습니다 5초후 재연결 합니다.");
		setInterval(connectDB(),5000); //디비연결이 끊기면 5초마다 다시 연결하는 함수를 실행
	});
}

//익스프레스 객체 생성
var app = express();

app.set("port",process.env.PORT||3000);

app.use(express.urlencoded({extended:false}));

app.use("/public",serveStatic(path.join(__dirname,"public"))); //public (실제)폴더의 이름을 써준것
//사용자정의

app.use(expressSession({

	secret:"my key",
	resave:true,
	saveUninitialized:true

}));

//작업하는 함수를 만들고 그걸 불러쓰는 라우터를 만듬.
//사용자를 인증하는 함수
var authUser = function(database,id,pwd,callback){ //위에서 만든 database

	console.log("addUser 함수 호출");

	//아이디와 비밀번호 검색할것. 여러개나올 수 있으니 배열로 받음
	UserModel.find({"id":id,"pwd":pwd},function (err,result){
		
		//스키마와 모델을 정의해준값에 의해 UserModel에 users가 들어있는것
		if(err){
			callback(err,null); //에러가 있으면 에러 출력후 스톱
			return;
		}

		//데이터가 있을경우
		if(result.length>0){

			callback(null,result); //데이터가 있으면 데이터 전송

		}else{

			console.log("일치하는 데이터가 없습니다.");
			callback(null,null); //에러도 없으니깐 null,데이터도없으니깐 null
		}
	});


}

//사용자를 추가하는 함수
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 router = express.Router();

//로그인 라우터
router.route("/process/login").post(function(req,res){

	console.log("/process/login 호출");

	var id = req.body.id;
	var pwd = req.body.pwd;

	if(database){
		//callback함수가 되는것
		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>DB연결 실 패 ㅠ-ㅠ</h1>");
		res.write("<div>DB를 연결하지 못했습니다</div>");
		res.end();

	}



});

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>DB연결 실 패 ㅠ-ㅠ</h1>");
		res.write("<div>DB를 연결하지 못했습니다</div>");
		res.end();

	}

});


//라우터 객체 등록
app.use("/",router);

var errorHandler = expressErrorHandler({

	static: { //미리 메모리상에 올려둔것
		"404":"./public/404.html" //404에러가 뜨면 public에 404.html로 가라
	}
});

app.use(expressErrorHandler.httpError(404));
app.use(errorHandler); //변수명 담아줌


//Express 서버 시작
//var server = http.createServer();

http.createServer(app).listen(app.get("port"),function(){ //위에 set으로 넣어둔 port를 get으로 가져온거

	console.log("익스프레스 서버 on~~ 포트번호는:" + app.get("port"));

	//DB연결 함수 호출
	connectDB(); 

});

 

login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 테스트</title>
</head>
<body>

<h1>로그인</h1>
<br/>
<form action="/process/login" method="post">
	<table>
		<tr>
			<td>아이디</td>
			<td><input type="text" name="id"/></td>
		</tr>
		<tr>
			<td>비밀번호</td>
			<td><input type="text" name="pwd"/></td>
		</tr>
	</table>
	<input type="submit" value="로그인"/>
</form>

</body>
</html>

 

주소 : http://localhost:3000/public/login.html

주소 : http://localhost:3000/public/login.html
주소 : http://localhost:3000/public/login.html

회원 가입은 다음 예제에서 다룰 것이다. 먼저 미리 가입한 아이디와 비밀번호를 입력하고

로그인 버튼 클릭을 하면 하단의 화면이 나온다.

DB에 들어있는 id와 pwd가 일치하면 로그인 성공.

로그인 성공 시
로그인 성공 시
로그인 실패
로그인 실패

 

 

mongoose 모듈을 사용한 예제 2

  • 리스트 띄우기 (회원 정보 출력)
  • 회원 가입

 

app3.js

/*
list 띄우기
*/


//Express 기본 모듈
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;


//데이터베이스 연결
function connectDB() {
	
	//데이터 베이스 연결 정보 
	var databaseUrl = "mongodb://localhost:27017/shopping";
	
	//연결
	mongoose.connect(databaseUrl);  //몽고 디비의 정보를 몽구스와 연결 
	
	database = mongoose.connection;
	
	database.on("open",function(){        // on 이벤트 / open이라는 내장이벤트 db가 열려있냐

		console.log("데이터베이스가 연결되었습니다. "+databaseUrl);
		
		//스키마 정의 
		UserSchema = mongoose.Schema({
			id:{type:String,required:true,unique:true}, //// required:true -> 반드시 써야한다. unique:true -> 중복x
			name:{type:String},
			pwd:{type:String,required:true},
			age:{type:Number,'default':20}, //안썻다면 20을 넣고
			created:{type:Date,index:{unique:false},'default':Date.now}
			
		});
		
		console.log("UserSchema 정의함.");
	
		//스키마 객체에 메소드 추가 [방법 : 1. static() 사용, 2. method() 사용] 
		
		//로그인에서 사용
		UserSchema.static("findById",function(id,callback){
			return this.find({id:id},callback); //아이디를 찾고 콜백 실행해라 
		})
		
		//전체 데이터 가져오기
		UserSchema.static("findAll",function(callback){
			return this.find({},callback); // 조건이 없어서 {} 만 쓴다.
		})
		
		console.log("UserSchema 정의함.");
		
		
		
		//Model 정의 
		UserModel = mongoose.model("users2",UserSchema); // 새로운 컬렉션이 생기며 위 데이터들을 저장하게 됨

		console.log("UserModel 정의함.");
		
	});
	
	database.on("error",console.error.bind("몽구스 연결 에러..."));   // 이렇게 합쳐서 쓰기 가능

	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
	
}));

//함수를 만들고 함수를 구동시키는 라우터를 만든다! 

//사용자를 인증하는 함수 
var authUser = function(database,id,pwd,callback){
	
	console.log("addUser 함수 호출...");
	
	//users 컬렉션 참조
	//var users = database.collection("users"); UserModel의 사용으로 user 사용할 필요 없음 
	
	//아이디와 비번 검색
	UserModel.findById(id,function(err,result){
		
		if(err){
			
			callback(err,null);
			
			return;
		}
		
		//데이터가 있을 경우 
		if(result.length>0){
			
			console.log("아이디와 일치하는 사용자 찾음");
			
			if(result[0]._doc.pwd=pwd){
				
				console.log("비밀 번호 일치함");
				
				callback(null,result);
				
			}else{
				
				console.log("비밀번호 일치하지 않음");
				callback(null,null);
			}
			
			
			
		}else{
			
			console.log("아아디와 일치하는 데이터가 없습니다.");
			callback(null,null);
			
		}
		
	}); 
			
}
//사용자를 추가하는 함수 
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){ //입력 데이터가 0보다 크면. 데이터가 있으면
			
			console.log("사용자 추가...");
			
		}else {
			
			console.log("사용자 추가 실패...");
		}
		
		callback(null,result);
		
		
	})
}



//라우터 객체 생성 -----------------------
var router = express.Router();

//로그인 라우터
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();
		
	}

});




//사용자 추가 라우터
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>")
				
			}else {
				
				res.writeHead("200",{"Content-type":"text/html;charset=utf-8"});
				res.write("<h1>사용자 추가 실패</h1>")
			
			}
			
		})
		
		
	}else {
		
		res.writeHead("200",{"Content-type":"text/html;charset=utf-8"});
		res.write("<h1>데이터베이스 연결 실패</h1>")
		res.write("<div>데이터베이스를 연결하지 못했습니다.</div>");
		res.end();
		
	}
	
	
})

//사용자 리스트 라우터
router.route("/process/listUser").post(function(req,res) {  //html의 액션의 주소
	
	console.log("/process/listUser 호출..");
	
	if(database){
		
		UserModel.findAll(function(err,result) {
			
			if(err) {
				res.writeHead("200",{"Content-type":"text/html;charset=utf-8"});
				res.write("<div>사용자 리스트 조회 중 에러 발생.</div>");
				res.end();
				
				return;
			}
			
			if(result){
				
				res.writeHead("200",{"Content-type":"text/html;charset=utf-8"});
				res.write("<div>사용자 리스트</div>");
				res.write("<div><ul>");
				
				for(var i=0;i<result.length;i++){
					
					var id = result[i]._doc.id;
					var name = result[i]._doc.name;
					var age = result[i]._doc.age;
					
					res.write("<li>#"+(i+1)+":" + id + ", " +name+", "+age+"</li>")
				}
				
				res.write("</ul></div>");
				res.write("<br/><br/><a href='/public/listUser.html'>리스트</a>");
				res.end();
				
			}else{
				res.writeHead("200",{"Content-type":"text/html;charset=utf-8"});
				res.write("<div>사용자 리스트 조회 실패.</div>");
				res.end();
			}
			
		})
	}
	
});


//라우터 객체 등록 ----------------------------
app.use("/",router);



var errorHandler = expressErrorHandler({

	static: { //미리 메모리상에 올려둔것
		"404":"./public/404.html" //404에러가 뜨면 public에 404.html로 가라
	}
});

app.use(expressErrorHandler.httpError(404));
app.use(errorHandler); //변수명 담아줌


//Express 서버 시작
//var server = http.createServer();

http.createServer(app).listen(app.get("port"),function(){ //위에 set으로 넣어둔 port를 get으로 가져온거

	console.log("익스프레스 서버 on 포트번호는:" + app.get("port"));
	
	connectDB();
	
});

 

 

listUser.html (리스트 페이지)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>사용자 리스트</title>
</head>
<body>

<h1>사용자 리스트</h1>
<br/>

<form action="/process/listUser" method="post">

<table>
<tr>
	<td>아래 [리스트] 버튼을 클릭하세요</td>
</tr>
</table>
<input type="submit" value="리스트"/>

</form>

</body>
</html>

 

addUser.html - (회원가입 페이지)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>사용자 추가 테스트</title>
</head>
<body>

<h1>회원가입</h1>
<br>
<form action="/process/addUser" method="post">
	<table>
		<tr>
			<td>아이디</td>
			<td><input type="text" name="id"/></td>
		</tr>
		<tr>
			<td>비밀번호</td>
			<td><input type="password" name="pwd"/></td>
		</tr>
		<tr>
			<td>이름</td>
			<td><input type="text" name="name"/></td>
		</tr>
	</table>
	<input type="submit" value="회원가입"/>
<!-- 아이디 비밀번호를 입력하고 submit에 의해 전송됌 -->
</form>

</body>
</html>

 

리스트 주소 : http://localhost:3000/public/listUser.html

회원가입 주소 : http://localhost:3000/public/addUser.html

회원 가입 페이지
회원 가입 페이지
회원 가입 완료
회원 가입 완료
사용자 리스트 페이지
사용자 리스트 페이지
리스트 출력
리스트 출력

반응형

블로그의 정보

무작정 개발

무작정 개발

활동하기