블록체인_9기/💚 Node.js

28강_Node.js (express, ejs, mysql2, path로 게시판 만들기)

weeji 2023. 5. 8. 13:30
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