-> 많이 사용되고 기본적인 디자인 패턴, 유지보수와 확장성을 고려해서 개발가능, 협업간 코드의 표준화도 용이.
-> 데이터를 다루는 로직, 글 선택, 글 작성 등 기능들, 어플리케이션의 동작을 관리하는 폴더
-> 사용자가 볼 수 있는 화면의 데이터를 표시 해주는 역할
-> 모델과 뷰 사이에서 동작을 제어해주는 역할, 모델의 상태를 가지고 뷰에 반영 시켜주는 것
app.js
npm init -y 으로 package.json 생성
npm i ejs mysql2 express 로 외부모듈 설치
express 설정
->
const express = require("express");
const app = express();
view 엔진으로 ejs 사용 설정
->
const path = require("path");
app.set("views",path.join(_dirname,"page"));
app.set("view engine", "ejs");
body-parse 설정
->
app.use(express.urlencoded({extended:false}));
서버 대기상태로 설정
->
app.listen(8080,()=>{
console.log("서버 잘열림");
});
/models/config.js
1.const mysql2 = require("mysql2/promise");
-> promise 사용
2.const mysql = mysql2.createPool({
user: "root",
password : "admin",
database : "test",
multipleStatements : true
})
-> createPool 메서드로 연결하므로 promise 객체를 반환해준다.
많은 클라이언트가 데이터베이스와 통신할 때 요청이 많이 들어와도 성능이 유지된다.
3.mysql.getConnection((err,res)=>{
console.log(err);
})
-> mysql이 연결이 잘되었는지 확인하는 메서드
-> config.js 파일에서 mysql 정의 후 모듈로 내보내기
/models/users.js
const mysql = require("./config");
-> config.js에서 내보낸 mysql을 require
const user = {...안에는 각각의 쿼리문 작성}
module.exports = user ;
-> 객체로 작성한 쿼리문들을 user로 내보낸다.
/models/index.js
const user = require("./user");
-> users.js에서 내보낸 user를 require
module.exports = {user,board};
-> 다시 require 한 객체들을 다시 내보낸다.
/controller/user.js
const {user,board} = require("../model");
-> 컨트롤러에서 models/index.js 에서 내보낸 파일을 require 한다.
경로를 ../model 로만 해도 알아서 index.js을 찾는다.
exports.Signup = async ()=>{
try{
await user.signup();
}catch(error){
console.log("컨트롤러 signup에서 오류"+ error); }
}
-> 위와 같은 형태로 컨트롤러에서 코딩하게 되는데
async 와 await로 models에 쿼리문이 실행되는것을 비동기로 처리해야하고
models의 객체안에 함수를 불러오기때문에 user.signup() 으로 호출해야한다.
그리고 try ~ catch 를 이용해 어디서 오류 발생했는지 효율적으로 확인하자.
/route/user.js
const {Signup} = require("../controller/user")
const router = express.Router();
router.get("/signup",async (req,res)=>{
await res.render("signup");
})
router.post("/signup", async (req,res)=>{
try {
const data = await Signup(req,res);
res.render("signcom",{data});
} catch (error) {
console.log("라우터 에서 오류");
}
})
-> controller/user.js에서 exports한 Signup 함수를 require하여 사용한다.
express.Router();
-> 라우터별로 나눠서 코드를 짤 수 있다.
app.js 에서
const userRouter = require("./route/user");
app.use("/user",userRouter); 와 같이 작성해줘야 사용이 가능하다.
router/user.js에서 작성하는 router.get은 디폴트로 /user 가 붙게되어 접속 시에 /user를 붙여야한다.
router.get("/signup",async (req,res)=>{
await res.render("signup");
})
-> /signup 주소를 요청할 때 signup ejs를 렌더해준다는 뜻
router.post("/signup",
-> 회원가입을 하는 ejs에서 input 에 입력값을 post 형식으로 받아올 때 사용하고, form action 부분과 /signup 의 위치의 경로가 같아야한다.