Model (User.js)
realId, realPw)를 담고 있으며, 이를 외부에서 접근할 수 있도록 exports.userInfo() 메서드로 제공하였습니다.View (index.ejs)
Controller (Cuser.js)
project-MVC
├── controller/
│ ├── Cuser.js
├── model/
│ ├── User.js
├── routes/
│ ├── user.js
├── views/
│ ├── index.ejs
└── app.js
![]() | ![]() |
|---|
홈 화면
로그인 기능
/login 경로로 POST 요청됩니다.Cuser.js)는 Model(User.js)의 사용자 정보를 이용하여 입력값과 비교합니다.{"isSuccess": true, "userId": "apple"} 형식의 JSON 데이터를 반환하고, 실패 시 {"isSuccess": false} 데이터를 반환합니다.결과 표시
Express를 이용한 서버 구성
app.js에서 Express를 사용하여 미들웨어와 라우팅을 설정하고, 서버를 실행합니다.EJS 템플릿 엔진
set("view engine", "ejs")를 통해 EJS를 템플릿 엔진으로 설정하였습니다.index.ejs를 이용하여 로그인 폼을 작성하였습니다.Axios
/login 경로로 POST 요청합니다.MVC 구조화
User.js에서 사용자 정보를 관리.index.ejs에서 UI 렌더링 및 사용자 인터랙션 관리.Cuser.js에서 로직 처리 및 응답 제어.데이터 검증 및 응답
const express = require("express");
const app = express();
const PORT = 8080;
// 미들웨어 설정
app.set("view engine", "ejs");
app.set("views", "./views");
app.use(express.urlencoded({ extended: false }));
app.use(express.json());
// 라우터 연결
const userRouter = require("./routes/user");
app.use("/", userRouter);
// 포트 열기
app.listen(PORT, () => {
console.log(`http://localhost:${PORT}`);
});
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>MVC 실습</title>
</head>
<body>
<h3>동적폼 로그인 실습문제를 MVC 패턴으로 변경해보기</h3>
<form name="login">
<label for="userId">
<span>아이디</span>
<input type="text" name="userId" id="userId" required />
</label>
<br />
<label for="userPw">
<span>비밀번호</span>
<input type="password" name="userPw" id="userPw" required />
</label>
<br />
<button type="button" onclick="clickLogin()">로그인</button>
</form>
<div class="login-result"></div>
</body>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>
function clickLogin() {
const form = document.forms["login"];
const loginResult = document.querySelector(".login-result");
const data = {
userId: form.userId.value,
userPw: form.userPw.value,
};
console.log(data);
// 유효성 검증
console.log(form.userId.checkValidity());
console.log(form.userPw.checkValidity());
if (!form.userId.checkValidity() || !form.userPw.checkValidity()) {
loginResult.innerText = "아이디와 비밀번호는 필수입니다.";
return;
}
axios({
url: "/login",
method: "post",
data: data,
}).then((res) => {
console.log(res.data);
// {isSuccess: false}
// {isSuccess: true, userId: 'banana'}
if (res.data.isSuccess) {
loginResult.textContent = `${res.data.userId}님 로그인 성공~!😊`;
loginResult.classList.add("success");
loginResult.classList.remove("error");
} else {
loginResult.textContent = "아이디 또는 패스워드 오류입니다🥺";
loginResult.classList.add("error");
loginResult.classList.remove("success");
}
});
}
</script>
</html>
const express = require("express");
const router = express.Router();
const controller = require("../controller/Cuser");
// GET /
router.get("/", controller.main);
// POST /login
router.post("/login", controller.login);
module.exports = router;
exports.userInfo = () => {
return {
realId: "apple",
realPw: "12345",
};
};
const User = require("../model/User");
exports.main = (req, res) => {
res.render("index");
};
exports.login = (req, res) => {
console.log(req.body);
const { realId, realPw } = User.userInfo();
if (realId === req.body.userId && realPw === req.body.userPw) {
res.send({ isSuccess: true, userId: req.body.userId });
} else {
res.send({ isSuccess: false });
}
};