MVC 패턴

이재영·2023년 5월 7일
0

Node.js

목록 보기
12/12
post-thumbnail

MVC 패턴 (model - view - controller)

-> 많이 사용되고 기본적인 디자인 패턴, 유지보수와 확장성을 고려해서 개발가능, 협업간 코드의 표준화도 용이.

model

-> 데이터를 다루는 로직, 글 선택, 글 작성 등 기능들, 어플리케이션의 동작을 관리하는 폴더

view

-> 사용자가 볼 수 있는 화면의 데이터를 표시 해주는 역할

controller

-> 모델과 뷰 사이에서 동작을 제어해주는 역할, 모델의 상태를 가지고 뷰에 반영 시켜주는 것


MVC 패턴을 이용해서 게시판 서버를 만들어보자.

app.js

  1. npm init -y 으로 package.json 생성

  2. npm i ejs mysql2 express 로 외부모듈 설치

  3. express 설정
    ->
    const express = require("express");
    const app = express();

  4. view 엔진으로 ejs 사용 설정
    ->
    const path = require("path");
    app.set("views",path.join(_dirname,"page"));
    app.set("view engine", "ejs");

  5. body-parse 설정

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

  1. 서버 대기상태로 설정
    ->
    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이 연결이 잘되었는지 확인하는 메서드

  1. module.exports = 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 의 위치의 경로가 같아야한다.


이렇게 MVC 패턴으로 모델/컨트롤러/라우터 로 나눠서 구현한다. 로그인, 회원가입, 글쓰기 등 각각의 기능을 나눠서 작성할 예정

profile
한걸음씩

0개의 댓글