728x90
개요
ejs와 node.js, mysql을 사용하여 게시판 페이지를 구현하고자 한다.
index.js에서 서버와 관련된 내용들을 동작시키고, 'page' 폴더에서 ejs파일 생성하여 페이지를 구현한다.
이번 게시판 페이지 구현을 위해 설치받은 모듈은 ' express, ejs, mysql2 '이다.
결과물
💻 index.js_서버와 관련된 모든 작업을 수행한다.
// 사용할 모듈 express ejs mysql2 path
// 모듈 가져오고
const express = require("express");
const mysql2 = require("mysql2");
const path = require("path");
// 서버 인스턴스 만들어서 app에 바인딩
const app = express();
const _mysql = mysql2.createConnection({
user : "root",
password : "000000",
database : "test2",
// 다중 쿼리문 사용할수 있는 옵션
multipleStatements : true
})
// express의 views 속성을 설정(파일들의 경로)
// express에서 서버사이드 렌더링을 지원하기위해 view엔진을 사용한다.
// view엔진이 템플릿 파일을 보여주는 역활을 해줌
// 기본값은 views: 'C:\\Users\\TEST\\Desktop\\20230504\\views'로 경로가 지정되어있고
// views: 'C:\\Users\\TEST\\Desktop\\20230504\\page' 우리가 설정할 경로로 바꿀수 있다.
app.set("views",path.join(__dirname,"page"));
// view엔진으로 ejs를 사용할수 있게 설정
app.set("view engine", "ejs");
// express에서 bodyparser를 지원 한다.
// extended : 깊은 객체를 지원할지 안할지 권장 false
app.use(express.urlencoded({extended : false}));
app.get('/',(req,res)=>{
// render 메서드 view엔진이 문자열을 html로 브라우저에 전달
// 렌더링 해준다.
// 첫번째 매개변수가 파일의 이름
// 두번째 매개변수 전달할 데이터
res.render("main");
})
app.get("/signup",(req,res)=>{
res.render("signup");
})
app.get("/login", (req,res)=>{
res.render("login");
})
app.post('/login',(req,res)=>{
// 요청에 대한 내용은 req 객체에 들어있다.
const {user_id, user_pw} = req.body;
// user_id랑 user_pw를 가지고 데이터를 조회
const sql = "SELECT * FROM users WHERE user_id = ? AND user_pw = ?"
_mysql.query(sql,[user_id,user_pw],(err, result)=>{
if(err){
// 로그인 실패
res.render("mypage");
}else{
// 로그인 성공
console.log(result);
res.render("mypage",{data : result[0]})
}
})
});
// 회원가입
app.post('/signup',(req,res)=>{
const {user_id, user_pw} = req.body;
const sql = "INSERT INTO users (user_id, user_pw)VALUES(?,?)";
_mysql.query(sql,[user_id, user_pw],(err)=>{
// err 에러가 있다면 에러의 내용이 들어오는 객체
if(err){
res.render("signUpErr");
}else{
// 브라우저 url을 login페이지 url로 변경
res.redirect("login");
}
})
});
// 게시판의 글목록 페이지
app.get('/list', (req,res)=>{
const sql = "SELECT * FROM products";
_mysql.query(sql,(err, result)=>{
res.render("list",{data : result});
})
// [{id : 4, name : "sdafas", number : "sadfasd", series : "sadfas"}]
})
// 게시판 등록 페이지
app.get('/insert',(req,res)=>{
res.render("insert");
})
app.post('/insert', (req,res)=>{
const {name, number, series} = req.body;
const sql = "INSERT INTO products (name, number, series)VALUES(?,?,?)";
_mysql.query(sql,[name,number,series],()=>{
res.redirect("/list");
})
})
// 삭제
app.get("/delete/:id",(req,res)=>{
// /delete/1 == req.params = {id : 1}
// req.params.id == 1 이값을 가지고 데이터베이스에 원하는 글 조회를 해서 보여줄수 있겠죠?
const sql = "DELETE FROM products WHERE id = ?; SET @CNT = 0; UPDATE products SET products.id = @CNT:=@CNT+1; ALTER TABLE products AUTO_INCREMENT = 0;";
// DELETE FROM products WHERE id = ? : 값을 제거하라는 명령어인 쿼리문
// 테이블 products의 행에서 ? 에 값을 넣어줄거고
// 우리가 넘겨준 id값을 가지고있는 행을 찾아서 제거시킨다.
// SET @CNT = 0 구문으로 카운트 0으로 초기화
// UPDATE products.id = @CNT:@CNT+1 : products 테이블의 행의 아이디를 다시 갱신 시켜줌
// ALTER TABLE products AUTO_INCREMENT = 0; : AUTO_INCREMENT 속성을 자동으로 1씩 증가시키는 속성을 0으로 변경
_mysql.query(sql,[req.params.id],()=>{
res.redirect("/list");
})
})
// 수정하는 페이지
app.get('/edit/:id', (req,res)=>{
const sql = "SELECT * FROM products WHERE id = ?"
const id = req.params.id;
_mysql.query(sql,[id],(err, result)=>{
res.render("edit",{data : result[0]})
})
})
// 수정 요청
app.post('/edit/:id', (req,res)=>{
const {name, number, series} = req.body;
const sql = "UPDATE products SET name = ?, number=?, series=? WHERE id=?";
const id = req.params.id;
_mysql.query(sql,[name, number, series, id ],()=>{
res.redirect("/list");
})
})
// PORT를 지정 해야하니까
const PORT = 8080;
app.listen(PORT,()=>{
console.log("서버 잘 열림");
})
ejs 페이지들은 비슷한 형식으로 동작하기 때문에 app.post로 서버에 데이터를 보내주고, app.get으로 서버에서 데이터를 받는 코드를 한가지씩 소개하고자 한다.
💻 signup.ejs_form태그를 이용하여 post 요청을 보내, input으로 입력한 데이터를 서버측에 보내준다.
- input의 name 속성에 입력한 값이 서버로 넘어가며 키값이 된다.
<body>
<h2>회원 가입</h2>
<form action="/signup" method="post">
<label for="">아이디</label>
<input type="text" name="user_id">
<label for="">비밀번호</label>
<input type="text" name="user_pw">
<button>회원가입 신청</button>
</form>
</body>
💻 list.ejs_index.js에서 app.get으로 '/list'링크에 서버값을 보내줘 해당 값을 반복문으로 돌면서 그려준다.
- data 배열로 받은 값을 forEach문으로 돌리면서 각 인덱스마다 원하는 값을 뽑아 렌더해준다.
<body>
<h2>리스트 페이지</h2>
<a href="/insert">추가 페이지로 이동</a>
<table>
<tr>
<th>삭제</th>
<th>수정</th>
<th>아이디</th>
<th>이름</th>
<th>전화번호</th>
<th>시리즈</th>
</tr>
<% if(data){ %>
<% data.forEach((el,index) => { %>
<tr>
<td><a href="/delete/<%= el.id %>">삭제</a></td>
<td><a href="/edit/<%= el.id %>">수정</a></td>
<td><%= el.id %></td>
<td><%= el.name %></td>
<td><%= el.number %></td>
<td><%= el.series %></td>
</tr>
<% }); %>
<% }else{ %>
<% } %>
</table>
</body>
<!-- 데이터 베이스로 요청해서 data 객체로 전달 해주면
우리가 데이터베이스에 등록해놓은 지금은
4 sdafas sadfasd sadfas
6 sdfasd wegwe wefwe
이렇게 데이터베이스에 값이 있다고 가정할때
data = [{id : 4, name : sdafas, number : sadfasd, series : sadfas},
{id : 6, name : sdfasd, number : wegwe, series : wefwe}]
-->
728x90
'블록체인_9기 > 💚 Node.js' 카테고리의 다른 글
30강_230512_Node.js(JWT토큰, dotenv, express-session) (0) | 2023.05.16 |
---|---|
29강(과제X)_230508_Node.js(MVC 패턴으로 게시판 페이지 제작) (1) | 2023.05.09 |
27강(과제X)_230502_Nodejs(express, get / post, path, ejs) (0) | 2023.05.03 |
26강(과제X)_230501_Nodejs(HTTP프로토콜, fs모듈, npm, mysql 연결) (0) | 2023.05.02 |
25강(과제X)_230428_Node.js(OSI 전송계층, TCP, UDP, TCP Server, client, Mysql) (0) | 2023.05.01 |