mongoose 모듈 이란 ?
데이터베이스를 테이블이나 엑셀처럼 쉽게 다룰수 있게 하는 모듈이다.
Schema : String,Number,Boolean,Array,Buffer,Date,ObjectId,Mixed
어떤 문서(컬럼)에는 name이 있고 다른 문서에는 name이 없을수도 있기때문에 일정한 조건으로 적용하기가 어렵다
관계형 데이터베이스처럼 조회 조건을 공통적으로 적용할수있게 정해진 규칙으로 문서를 저장할수 있게 하는 것이 Schema이다
몽고db에는 스키마가 없어서 mongoose 모듈을 사용해서 관계형db처럼 만들어짐
몽구스 디비 설치 npm install mongoose --save
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 MongoClient = require("mongodb").MongoClient;
mongoose 모듈을 읽어올것임 (몽구스가 설치되어있어야 한다)
var mongoose = require("mongoose");
트위터 ,인스타그램 - 수천만개의 데이터 써지고 삭제됨 -> 오라클로 커버안됨 느려 대부분 NonSQL
일정데이터는 항상 오라클로 저장함 EX) 싸이월드 DB복구는 오라클
// 데이터베이스 객체를위한 변수
var database; // conn
// 데이터베이스 스키마를 위한 변수
var UserSchema; // id는 무조건 String name에는 String
// 데이터베이스 모델를 위한 변수
var UserModel; // (users, userSchema) users 특정컬럼에 적용해 그걸 해주는데 model
데이터베이스 연결
function connectDB(){
//데이터베이스 연결 정보
var databaseUrl = "mongodb://localhost:27017/shopping"; // 기본포트번호27017 shopping db쓸것임
//연결
console.log("데이터베이스 연결 시도...")
// 몽고db 정보와 몽구스와 연결함
mongoose.connect(databaseUrl);
// 연결해서 conn 만듬
database = mongoose.connection; //CONN 만듬
// on : 이벤트
// open : 내장이벤트 db가 열려있나 열려있으면 function 실행
database.on("open",function(){
console.log("데이터베이스가 연결되었습니다" + databaseUrl);
// 스키마 정의 : 문서 규칙을 정함 어떤컬럼에 어떤게 들어가있는지
UserSchema = mongoose.Schema({
id:String, // id컬럼은 String만 들어감
name:String,
pwd:String
});
console.log("UserSchema 정의함.")
//스키마를 만들었으면 Model 정의 -> users테이블에 스키마를 적용시킬것이다.
UserModel = mongoose.model("users",UserSchema); // 위에서만든 UsersSchema를 적용한다.
console.log("UserModel 정의함")
});
// 에러가 났을때
database.on("error",console.error.bind(console,"몽구스 연결 에러...")); // bind 있으면 몽구스 연결에러 띄어라
// 연결이 끊기면
database.on("disconnected",function(){
console.log("DB연결이 끊겼습니다. 5초후 재연결 합니다")
setInterval(connectDB(),5000); // 자기자신의 메소드를 5초마다 실행 , 서버재시작x db가끊기면
})
}99999999999
// 익스프레스 객체 생성
var app = express()
app.set("port",process.env.PORT||3000);
app.use(express.urlencoded({extended:false})) // post 방식
// serveStatic : 특정 경로에 있는 폴더(public 폴더)를 요청에 의해서 바로 파일을 가져올 수 있는 기능을 제공 해주는 모듈
// "serve-static" 이라는 것이 존재
// path.join : 메소드명처럼 인자로 받은 경로들을 하나로 합쳐서 문자열 형태로 path를 리턴한다.
app.use("/public",serveStatic(path.join(__dirname,"public")))
// 세션 코드
app.use(expressSession({
secret:"my key", // 사용자 정의 , 암호화되는 세션값
resave:true, // Documentation에서 이 값을 true로 설정하는것을 권장합니다.
saveUninitialized : true // 언이니셜라이즈드 새로 생겼지만 변경되지 않은 세션을 의미합니다.
}));
// 사용자를 인증하는 함수
var authUser = function(database,id,pwd,callback){
//users 컬렉션 참조
//var users = database.collection("users"); // users 호출
console.log("authUser 함수 호출..")
// 아이디와 비밀번호 검색
// find 찾아와라~
// users -> UserModel로 바꾼다
UserModel.find({"id":id,"pwd":pwd},function(err,result){
// UserModel 이므로 배열로 받을필요없다
// 에러가 났을때
if(err){
callback(err,null)
return;
}
// 데이터가 있을 경우
if(result.length>0){
callback(null,result);
} else { // 조회한 데이터가 없을 경우
console.log("일치하는 데이터가 없습니다.")
callback(null,null); // 데이터가없으니 null
}
// 콜백함수는 authUser를 호출하는 쪾에서 만들어주면 됨
});
}
// 사용자를 추가하는 함수
var addUser = function(database,id,pwd,name,callback) {
console.log("addUser 함수 호출..")
// id , pwd , name 컬럼 만 가져온다.
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 호출..")
// 넘어오는 post 데이터 받아낸다
var id = req.body.id;
var pwd = req.body.pwd;
// 받은 데이터와 db와 비교작업을 한다.
if(database){ // 데이터베이스 객체가 있을때 실행 위에 있는 함수 호출
// function(err,result) <- 콜백함수 호출
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 { // db연결이 안됐으면
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; // post 방식으로 받음
var pwd = req.body.pwd;
var name = req.body.name;
if(database) {
addUser(database, id, pwd, name, function(err,result){
// result는 데이터이다. err도 내가 만드는 이름
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();
}
});
// 라우터 객체 등록
app.use("/",router);
// 에러 코드
var errorHandler = expressErrorHandler({
static : {
"404":"./public/404.html" // 404에러가뜨면 404.html를 띄어라
}
})
app.use(expressErrorHandler.httpError(404)); // app에 추가
app.use(errorHandler);
// Express 서버 시작
http.createServer(app).listen(app.get("port"),function(){
console.log("익스프레스 서버를 시작했습니다: " + app.get("port")); // 3000
// 서버시작할때 db연결 함수 호출 하면 됨
connectDB(); // 1
});
'JAVA Programming > JDBC' 카테고리의 다른 글
[Node.js] 암호화 작업을 하기 위한 crypto 모듈 (0) | 2022.04.07 |
---|---|
[Node.js] mongoose 데이터베이스 연결 (0) | 2022.04.07 |
[하루 계획]2022-04-06 (0) | 2022.04.06 |
[하루 계획] 2022-04-05 (0) | 2022.04.05 |
[8] JDBC 트랜잭션 처리 (0) | 2020.08.05 |