1. 파일 업로드
** /public/write.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>파일 업로드</title>
</head>
<body>
<h2>파일 업로드</h2>
<form method="post" action="/write" enctype="multipart/form-data">
<p><label>제목 : <input type="text" name="title"></label></p>
<p>내용</p>
<p><textarea cols="50" rows="5" name="content"></textarea></p>
<p><label>파일 : <input type="file" name="photo"></label></p>
<p><input type="submit" value="확인"></p>
</form>
</body>
</html>
** 2_multer.js
const express = require('express');
const bodyParser = require('body-parser');
const static = require('serve-static'); // npm i serve-static
const path = require('path');
const logger = require('morgan'); // npm i morgan
const multer = require('multer'); // npm i multer
const port = 3000;
const app = express();
const router = express.Router();
app.use(bodyParser.urlencoded({extended: false}));
app.use('/public', static(path.join(__dirname, 'public'))); // http://localhost:3000/public
app.use('/uploads', static(path.join(__dirname, 'uploads'))); // http://localhost:3000/uploads
app.use(logger('dev')); // dev, short, common, bombined
const storage = multer.diskStorage({
destination: (req, file, callback) => {
callback(null, 'uploads');
},
filename: (req, file, callback) => {
const extension = path.extname(file.originalname);
const basename = path.basename(file.originalname, extension);
callback(null, basename + "_" + Date.now() + extension);
// apple.png
// apple_32904820394.png
}
});
const upload = multer({
storage: storage,
limits: {
files: 5,
fileSize: 1024 * 1024 * 100
}
});
router.route('/write').post(upload.array('photo', 1), (req, res) => {
console.log('/write 호출!');
try {
const title = req.body.title;
const content = req.body.content;
const files = req.files;
console.dir(req.files[0]);
const originalname = files[0].originalname;
const filename = files[0].filename;
const mimetype = files[0].mimetype;
const size = files[0].size;
console.log(`파일정보 : 원본파일명:${originalname}, 파일이름:${filename}, mimetype:${mimetype}, 파일크기 : ${size}`);
res.writeHead('200', {'content-type':'text/html;charset=utf-8'});
res.write('<h2>파일 업로드 성공</h2>');
res.write('<hr>');
res.write(`<p>제목 : ${title}</p>`);
res.write(`<p>내용 : ${content}</p>`);
res.write(`<p>원본파일명 : ${originalname}}</p>`);
res.write(`<p>파일명 : ${filename}</p>`);
res.write(`<p>mimetype : ${mimetype}</p>`);
res.write(`<p>파일크기 : ${size}</p>`);
res.write(`<p><img src='/uploads/${filename}' width='200'><\p>`);
res.end();
} catch(e) {
console.log(e);
}
});
app.use("/", router);
app.listen(port, () => {
console.log(`${port}포트로 서버 동작중...`);
});
** 아래의 에러는 uploads 폴더가 없기 때문에 생긴 에러
** uploads 폴더 생성
** 정상적으로 파일 업로드 성공...!
2. mysql 모듈
: mysql과 연결하기 위한 모듈이다.
mysql 모듈은 커넥션 풀을 사용하여 연결한다.
데이터베이스 연결 객체가 너무 많이 만들어지는 것을 막고 한번 만든 연결을 재활용할 수 있습니다.
** mysql 연결 설정
connectionLimit : 커넥션 풀에서 만들 수 있는 최대 연결 개수를 설정한다.
host : 연결할 호스트 이름을 설정한다.
port : 데이터베이스가 사용하는 포트번호를 설정한다.
user : 데이터베이스 사용자 아이디를 설정한다.
password : 데이터베이스 사용자 비밀번호를 설정한다.
database : 데이터베이스 이름을 설정한다.
debug : 데이터베이스 처리 과정을 로그로 남길지 여부를 설정한다.
3. mysql에서 여러가지 암호화를 지원
** 이번 수업시간에서는 아주 간단한 단방향 암호화 실습(단방향 암호화? 암호화는 가능하나 복호화가 불가능)
대신에 같은 글자를 암호화하면 똑같은 글자가 된다.
** 홈페이지의 비밀번호를 찾을 때, 알려주는 곳도 있으나 재설정을 하라는 곳도 있다.
재설정하라는 곳은 단방향 암호화로 비밀번호를 알 수 없다!
** 암호화는 많은 시간이 주어지면 그 어떤 복잡한 암호화도 뚫을 수 있기 때문에
암호화는 복잡하게 한다기 보다는 시도를 제한하는 것이 좋은 방법이다.
** 가장 단순한 암호 기법 sha1
4. 1_mysql.js, 회원가입
const express = require('express');
const bodyparser = require('body-parser');
const mysql = require('mysql'); // npm i mysql
const logger = require('morgan');
const app = express();
const port = 3000;
const router = express.Router();
app.use(bodyparser.urlencoded({extended:false}));
app.use(logger('dev'));
const pool = mysql.createPool({
connectionLimit: 10,
host: 'localhost',
user: 'root',
password: '1234',
database: 'frontenddb',
debug: false
});
// http://localhost:3000/member/regist (post)
router.route('/member/regist').post((req, res) => {
const userid = req.body.userid;
const pass = req.body.pass;
const name = req.body.name;
const age = req.body.age;
console.log(`userid:${userid}, pass:${pass}, name:${name}, age:${age}`);
if(pool) {
joinMember(userid, pass, name, age, (err, result) => {
if(!err){
if(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 {
console.log(err);
}
});
} else {
res.writeHead('200', {'content-type':'text/html;charset=utf8'});
res.write('<h2>데이터베이스 연결실패</h2>');
res.end();
}
});
const joinMember = function(userid, pass, name, age, callback) {
console.log('joinMember 호출!');
pool.getConnection((err, conn) => {
if(!err) {
console.log('데이터베이스 연결 성공');
const sql = conn.query('insert into tb_simplemember (sm_userid, sm_pass, sm_name, sm_age) values (?, sha1(?), ?, ?)', [userid, pass, name, age], (err, result) => {
conn.release();
console.log('sql 실행 완료!');
if(!err) {
console.log('가입완료');
callback(null, result);
return;
} else {
callback(err, null);
}
});
}
});
}
app.use('/', router);
app.listen(port, () => {
console.log(`${port}번 포트로 서버 실행중...`);
})
5. 1_mysql.js, 로그인
const express = require('express');
const bodyparser = require('body-parser');
const mysql = require('mysql'); // npm i mysql
const logger = require('morgan');
const app = express();
const port = 3000;
const router = express.Router();
app.use(bodyparser.urlencoded({extended:false}));
app.use(logger('dev'));
const pool = mysql.createPool({
connectionLimit: 10,
host: 'localhost',
user: 'root',
password: '1234',
database: 'frontenddb',
debug: false
});
// http://localhost:3000/member/regist (post)
router.route('/member/regist').post((req, res) => {
const userid = req.body.userid;
const pass = req.body.pass;
const name = req.body.name;
const age = req.body.age;
console.log(`userid:${userid}, pass:${pass}, name:${name}, age:${age}`);
if(pool){
joinMember(userid, pass, name, age, (err, result) => {
if(!err) {
if(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 {
console.log(err);
}
});
}else{
res.writeHead('200', {'content-type':'text/html;charset=utf8'});
res.write('<h2>데이터베이스 연결실패</h2>');
res.end();
}
});
// http://localhost:3000/member/login (post)
router.route('/member/login').post((req, res) => {
const userid = req.body.userid;
const pass = req.body.pass;
console.log(`userid:${userid}, pass:${pass}`);
if(pool) {
loginMember(userid, pass, (err, result) => {
if(!err) {
if(result) {
console.dir(result);
const name = result[0].sm_name;
const age = result[0].sm_age;
res.writeHead('200', {'content-type':'text/html;charset=utf8'});
res.write('<h2>로그인 성공</h2>');
res.write(`<p>아이디 : ${userid}</p>`);
res.write(`<p>이름 : ${name}</p>`);
res.write(`<p>나이 : ${age}</p>`);
res.end();
} else {
res.writeHead('200', {'content-type':'text/html;charset=utf8'});
res.write('<h2>로그인 실패</h2>');
res.end();
}
} else {
console.log(err);
}
});
} else {
res.writeHead('200', {'content-type':'text/html;charset=utf8'});
res.write('<h2>데이터베이스 연결실패</h2>');
res.end();
}
});
// --------------------------------------------------------------------------
const joinMember = function(userid, pass, name, age, callback) {
console.log('joinMember 호출!');
pool.getConnection((err, conn) => {
if(!err) {
console.log('데이터베이스 연결 성공');
const sql = conn.query('insert into tb_simplemember (sm_userid, sm_pass, sm_name, sm_age) values (?, sha1(?), ?, ?)', [userid, pass, name, age], (err, result) => {
conn.release();
console.log('sql 실행 완료!');
if(!err) {
console.log('가입완료');
callback(null, result);
return;
} else {
callback(err, null);
}
});
}
});
}
const loginMember = function(userid, pass, callback) {
console.log('loginMember 호출!');
pool.getConnection((err, conn) => {
if(!err) {
const sql = conn.query('select sm_idx, sm_name, sm_age from tb_simplemember where sm_userid=? and sm_pass=sha1(?)', [userid, pass], (err, result) => {
conn.release();
console.log('sql 실행 완료!');
if(!err) {
if(result.length > 0) {
console.log('일치하는 사용자를 찾음');
callback(null, result);
} else {
console.log('일치하는 사용자가 없음');
callback(null, null);
}
return;
} else {
callback(err, null);
}
});
} else {
console.log(err);
}
});
}
app.use('/', router);
app.listen(port, () => {
console.log(`${port}번 포트로 서버 실행중...`);
})
6. mongoose 모듈
: 몽고디비를 사용하면 하나의 컬렉션 안에 똑같은 속성을 가진 문서 객체를 반복적으로 넣어둔다면
데이터를 조회할때도 어던 속성들이 있는지 미리 알고 있는 상태에서 조회할 수 있다.
관계형 데이터베이스처럼 테이블이나 엑셀시트와 같이 쉽게 데이터를 다룰 수 있도록 제공한다.
** 메소드
connect() : mongoose를 사용해 데이터베이스를 연결한다.
model() : 모델을 정의한다.
Schema() : 스키마를 정의하는 생성자이다.
7. 2_mongoose.js, 회원가입
const express = require('express');
const bodyparser = require('body-parser');
const logger = require('morgan');
const mongoose = require('mongoose'); // npm i mongoose
const app = express();
const port = 3000;
const router = express.Router();
app.use(bodyparser.urlencoded({extended:false}));
app.use(logger('dev'));
// 데이터베이스 연결
let database;
let UserSchema;
let UserModel;
function connectDB() {
const url = "mongodb://localhost:27017/frontenddb";
console.log('데이터베이스 연결 시도중...');
mongoose.Promise = global.Promise; // 몽구스의 프로미스 객체를 global의 프로미스 객체로 사용
mongoose.connect(url, {useNewUrlParser: true, useUnifiedTopology: true});
database = mongoose.connection;
database.on('error', console.error.bind(console, "mongoose 연결 실패!"));
database.on('open', () => {
console.log('데이터베이스 연결 성공!');
UserSchema = mongoose.Schema({
userid: String,
userpw: String,
name: String,
gender: String
});
console.log('UserSchema 생성 완료!');
UserModel = mongoose.model('user', UserSchema);
console.log('UserModel이 정의되었습니다.');
});
}
// http://localhost:3000/user/regist (post)
router.route('/user/regist').post((req, res) => {
console.log('/user/regist 호출!');
const userid = req.body.userid;
const userpw = req.body.userpw;
const name = req.body.username;
const gender = req.body.gender;
console.log(`userid:${userid}, userpw:${userpw}, name:${name}, gender:${gender}`);
if(database) {
joinUser(database, userid, userpw, name, gender, (err, result) => {
if(!err) {
if(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();
}
});
} else {
res.writeHead('200', {'content-type':'text/html;charset=utf8'});
res.write('<h2>데이터베이스 연결실패</h2>');
res.end();
}
});
// --------------------------------------------------------------------
const joinUser = function(database, userid, userpw, name, gender, callback) {
console.log('joinUser 호출!');
const users = new UserModel({userid:userid, userpw:userpw, name:name, gender:gender});
users.save((err, result) => {
if(!err) {
console.log('회원 document가 추가되었습니다.');
callback(null, result);
return;
}
callback(err, null);
});
}
app.use('/', router);
app.listen(port, () => {
console.log(`${port}번 포트로 서버 실행중...`);
connectDB();
});
8. 2_mongoose.js, 로그인
const express = require('express');
const bodyparser = require('body-parser');
const logger = require('morgan');
const mongoose = require('mongoose'); // npm i mongoose
const app = express();
const port = 3000;
const router = express.Router();
app.use(bodyparser.urlencoded({extended:false}));
app.use(logger('dev'));
// 데이터베이스 연결
let database;
let UserSchema;
let UserModel;
function connectDB() {
const url = "mongodb://localhost:27017/frontenddb";
console.log('데이터베이스 연결 시도중...');
mongoose.Promise = global.Promise; // 몽구스의 프로미스 객체를 global의 프로미스 객체로 사용
mongoose.connect(url, {useNewUrlParser: true, useUnifiedTopology: true});
database = mongoose.connection;
database.on('error', console.error.bind(console, "mongoose 연결 실패!"));
database.on('open', () => {
console.log('데이터베이스 연결 성공!');
UserSchema = mongoose.Schema({
userid: String,
userpw: String,
name: String,
gender: String
});
console.log('UserSchema 생성 완료!');
UserModel = mongoose.model('user', UserSchema);
console.log('UserModel이 정의되었습니다.');
});
}
// http://localhost:3000/user/regist (post)
router.route('/user/regist').post((req, res) => {
console.log('/user/regist 호출!');
const userid = req.body.userid;
const userpw = req.body.userpw;
const name = req.body.username;
const gender = req.body.gender;
console.log(`userid:${userid}, userpw:${userpw}, name:${name}, gender:${gender}`);
if(database) {
joinUser(database, userid, userpw, name, gender, (err, result) => {
if(!err) {
if(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();
}
});
} else {
res.writeHead('200', {'content-type':'text/html;charset=utf8'});
res.write('<h2>데이터베이스 연결실패</h2>');
res.end();
}
});
// http://localhost:3000/user/login (post)
router.route('/user/login').post((req, res) => {
console.log('/user/login 호출!');
const userid = req.body.userid;
const userpw = req.body.userpw;
console.log(`userid:${userid}, userpw:${userpw}`);
if(database) {
loginUser(database, userid, userpw, (err, result) => {
if(!err) {
if(result) {
console.dir(result);
const name = result[0].name;
const gender = result[0].gender;
res.writeHead('200', {'content-type':'text/html;charset=utf8'});
res.write('<h2>로그인 성공</h2>');
res.write(`<p>아이디 : ${userid}</p>`);
res.write(`<p>이름 : ${name}</p>`);
res.write(`<p>성별 : ${gender}</p>`);
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();
}
});
} else {
res.writeHead('200', {'content-type':'text/html;charset=utf8'});
res.write('<h2>데이터베이스 연결실패</h2>');
res.end();
}
})
// --------------------------------------------------------------------
const joinUser = function(database, userid, userpw, name, gender, callback) {
console.log('joinUser 호출!');
const users = new UserModel({userid:userid, userpw:userpw, name:name, gender:gender});
users.save((err, result) => {
if(!err) {
console.log('회원 document가 추가되었습니다.');
callback(null, result);
return;
}
callback(err, null);
});
}
const loginUser = function(database, userid, userpw, callback) {
console.log('loginUser 호출!');
UserModel.find({userid:userid, userpw:userpw}, (err, result) => {
if(!err) {
if(result.length > 0) {
console.log('일치하는 사용자를 찾음');
callback(null, result);
} else {
console.log('일치하는 사용자가 없음');
callback(null, null);
}
return;
}
callback(err, null);
});
}
app.use('/', router);
app.listen(port, () => {
console.log(`${port}번 포트로 서버 실행중...`);
connectDB();
});
9. 2_mongoose.js, 회원목록
const express = require('express');
const bodyparser = require('body-parser');
const logger = require('morgan');
const mongoose = require('mongoose'); // npm i mongoose
const app = express();
const port = 3000;
const router = express.Router();
app.use(bodyparser.urlencoded({extended:false}));
app.use(logger('dev'));
// 데이터베이스 연결
let database;
let UserSchema;
let UserModel;
function connectDB() {
const url = "mongodb://localhost:27017/frontenddb";
console.log('데이터베이스 연결 시도중...');
mongoose.Promise = global.Promise; // 몽구스의 프로미스 객체를 global의 프로미스 객체로 사용
mongoose.connect(url, {useNewUrlParser: true, useUnifiedTopology: true});
database = mongoose.connection;
database.on('error', console.error.bind(console, "mongoose 연결 실패!"));
database.on('open', () => {
console.log('데이터베이스 연결 성공!');
UserSchema = mongoose.Schema({
userid: String,
userpw: String,
name: String,
gender: String
});
console.log('UserSchema 생성 완료!');
// 조건 없이 전부 조회하는 함수 생성
UserSchema.static('findAll', function(callback) {
return this.find({}, callback);
});
UserModel = mongoose.model('user', UserSchema);
console.log('UserModel이 정의되었습니다.');
});
}
// http://localhost:3000/user/regist (post)
router.route('/user/regist').post((req, res) => {
console.log('/user/regist 호출!');
const userid = req.body.userid;
const userpw = req.body.userpw;
const name = req.body.name;
const gender = req.body.gender;
console.log(`userid:${userid}, userpw:${userpw}, name:${name}, gender:${gender}`);
if(database) {
joinUser(database, userid, userpw, name, gender, (err, result) => {
if(!err) {
if(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();
}
});
} else {
res.writeHead('200', {'content-type':'text/html;charset=utf8'});
res.write('<h2>데이터베이스 연결실패</h2>');
res.end();
}
});
// http://localhost:3000/user/login (post)
router.route('/user/login').post((req, res) => {
console.log('/user/login 호출!');
const userid = req.body.userid;
const userpw = req.body.userpw;
console.log(`userid:${userid}, userpw:${userpw}`);
if(database) {
loginUser(database, userid, userpw, (err, result) => {
if(!err) {
if(result) {
console.dir(result);
const name = result[0].name;
const gender = result[0].gender;
res.writeHead('200', {'content-type':'text/html;charset=utf8'});
res.write('<h2>로그인 성공</h2>');
res.write(`<p>아이디 : ${userid}</p>`);
res.write(`<p>이름 : ${name}</p>`);
res.write(`<p>성별 : ${gender}</p>`);
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();
}
});
} else {
res.writeHead('200', {'content-type':'text/html;charset=utf8'});
res.write('<h2>데이터베이스 연결실패</h2>');
res.end();
}
})
// http://localhost:3000/user/list (get)
router.route('/user/list').get((req, res) => {
if(database) {
UserModel.findAll((err, result) => {
if(!err) {
if(result) {
res.writeHead('200', {'content-type':'text/html;charset=utf8'});
res.write('<h2>회원리스트</h2>');
res.write('<div><ul>');
for(let i=0; i<result.length; i++) {
const userid = result[i].userid;
const name = result[i].name;
const gender = result[i].gender;
res.write(`<li>${i} : ${userid} / ${name} / ${gender}</li>`);
}
res.write('</div></ul>');
res.end();
} else {
res.writeHead('200', {'content-type':'text/html;charset=utf8'});
res.write('<h2>회원정보가 없습니다.</h2>');
res.end();
}
} else {
console.log('리스트 조회 실패');
}
});
} else {
res.writeHead('200', {'content-type':'text/html;charset=utf8'});
res.write('<h2>데이터베이스 연결실패</h2>');
res.end();
}
});
// --------------------------------------------------------------------
const joinUser = function(database, userid, userpw, name, gender, callback) {
console.log('joinUser 호출!');
const users = new UserModel({userid:userid, userpw:userpw, name:name, gender:gender});
users.save((err, result) => {
if(!err) {
console.log('회원 document가 추가되었습니다.');
callback(null, result);
return;
}
callback(err, null);
});
}
const loginUser = function(database, userid, userpw, callback) {
console.log('loginUser 호출!');
UserModel.find({userid:userid, userpw:userpw}, (err, result) => {
if(!err) {
if(result.length > 0) {
console.log('일치하는 사용자를 찾음');
callback(null, result);
} else {
console.log('일치하는 사용자가 없음');
callback(null, null);
}
return;
}
callback(err, null);
});
}
app.use('/', router);
app.listen(port, () => {
console.log(`${port}번 포트로 서버 실행중...`);
connectDB();
});
'웹_프론트_백엔드 > 프론트엔드' 카테고리의 다른 글
2021.03.14 (0) | 2021.04.18 |
---|---|
2021.03.13 (0) | 2021.04.17 |
2021.03.06 (0) | 2021.03.14 |
2021.02.28 (0) | 2021.03.01 |
2021.02.27 (0) | 2021.02.27 |