본문 바로가기
멀티캠퍼스 풀스택 과정/백엔드

[Node.js] 6. express 모듈(ejs)을 사용해 DB연결해서 게시판 보이기

by 이쟝 2022. 4. 1.
Express란 Node.js 모듈 중에 하나이며,
 http 모듈에 여러 기능을 추가해서 쉽게 사용할 수 있게 만든 모듈이다.
Node.js상에서 동작하는 웹 개발 프레임워크 


Express를 이용하면 웹 프레임워크를 굉장히 가볍게 구성할 수 있다.

이때까지는 Http 내장 모듈로 웹서버를 실행시켰다. Express 모듈을 설치하게 되면 Express는 프레임워크이므로 Node.js의 http 내장 모듈을 사용하여 웹서버를 띄울 수 있다. 

express 모듈은 외부 모듈이라서 설치가 필요하다. (npm install express)

 express 모듈은 웹 서버를 위해 만들어진 것으로 http 모듈 위에서 동작한다. 그래서 express 모듈을 사용할 때는 항상 http 모듈도 함께 불러들여야 한다.

express 메서드

use ( ) 미들웨어 함수 사용
get ( ), post (  ) get으로 클라이언트 정보를 전달 받음 / post로 클라이언트 정보를 전달 받음
set ( ) 서버 설정을 위한 속성을 지정 
redirect( )  웹 페이지의 경로를 강제로 이동
send ( ) 클라이언트에게 응답 데이터를 보냄
header( ) 헤더를 확인

EJS(Embedded JavaScript Template)
Express에서 dynamic website를 만들기 위해 template으로 사용되는 파일
즉 자바스크립트가 내장되어 있는 HTML 파일

 

데이터를 입력받아 문서에 출력할 수 있는 템플릿 엔진(HTML 안에 Javascript 코드를 삽입한다)

ejs 템플릿 엔진을 사용하기 위해서는 express와 마찬가지로 ejs 모듈을 설치해야 한다.(npm install ejs) 

EJS는 html + js 형태이다. 데이터를 표시할 때는 <% %> 안에 들어가야 한다. (el태그와 동일)
줄 바꿈을 하면 새로운 <% %>를 이용해야 한다.

<%= a %> : a라는 변수 출력 <% JS 코드 %> : Java script 코드 실행

반드시 views 디렉터리를 만든 후 거기에 ejs 파일을 저장한다.


ejs파일을 사용하기 위해서는 페이지를 표시하기 위해 템플릿을 렌더링 하여 작성해야한다 => response.render( )

1. html 홈페이지에서 게시판을 보여주고 클릭하면 게시판으로 넘어가게 한다.(DB 연동)

1. 프로젝트 폴더(mysqlJdbc)를 생성하고 home 페이지(index.html)와 게시판으로 넘어갈 ejs 파일(list.ejs), html 파일을 맵핑할 js파일(mainProcess.js)을 생성한다.

DB는 예전 실습 때 만들어 놓았던 campusdb를 사용한다.

 

index.html

맵핑 주소는 임의 생성

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <a href="/login">로그인</a>
    <a href="/logout">로그아웃</a>
    <a href="/list">게시판</a>
</body>
</html>

 

2. 필요한 모듈을 다운로드한다. (npm install 모듈명)

http 모듈이 아닌 express 모듈을 사용하기 위해서 express 모듈을 다운
ejs 모듈을 사용하기 위해서 ejs 모듈을 다운
접속자의 ip를 구해주는 모듈인 request-ip 모듈을 다운(게시판(board) DB에 접속자의 ip 컬럼이 있기 때문)
2-4. DB 연동하는 모듈인 mysql2 모듈을 다운

 

3. html 파일을 맵핑할 js파일(mainProcess.js) 작성

let http = new require('http');
let express = new require('express'); // 모듈 추출
let ejs = new require('ejs'); 
let fs = new require('fs'); // 파일을 읽기 위해서

// express 객체를 이용해 서버를 생성한다.
let app = express(); 
let server = http.createServer(app);

server.listen(10009, function(){
    console.log('server start http://127.0.0.1:10009/index');
});

4. express 모듈을 이용한 홈페이지 Get 방식 접속(index.html 홈페이지) 

let http = new require('http');
let express = new require('express'); // 모듈 추출
let ejs = new require('ejs'); 
let fs = new require('fs');

let app = express(); 
let server = http.createServer(app);

// (1)
app.get('/index', function(request, response){
    fs.readFile(__dirname+'/index.html', 'utf-8', function(err, idxData){
        response.writeHead(200, {'Content-Type':'text/html; charset=utf-8'});
        response.end(idxData);
    });
});

server.listen(10009, function(){
    console.log('server start http://127.0.0.1:10009/index');
});

(1) GET방식으로 홈페이지에 대한 접속 처리하기

  • .get( )를 사용한다. 첫 번째 매개변수로 get방식으로 접속할 파일명을 적어준다. 
    • fs.readFile(__dirname+'index.html') = fs.readFile(__dirname+request.url+'.html')

5. express 모듈을 이용한 게시판 Get 방식 접속(게시판을 클릭하면 게시판 리스트로 이동)

5-1. 파일 상단에 mysql connection DB 관련 정보를 먼저 기술한다. (게시판 DB와 연결)

// DB 연동
let mysql = new require('mysql2');

// DB 연결 
let connection = mysql.createConnection({
    host : 'localhost',
    port : 포트번호,
    user : '사용자',
    password : '비밀번호',
    database : 'DB이름'
});

connection.connect();

5-2. 게시판 리스트에 대한 Get 방식 접속 처리하기 

app.get('/list', function(request, response){
    // (1)
    let sql = "select userid, no, subject, hit, date_format(writedate, '%m-%d %H:%i')writedate ";
    sql += "from board order by no desc";
    
    // (2)
    connection.execute(sql, function(error, result){
        
        let totalRecord = result.length; // (3)
        if(result.length>0){ // (4)
            fs.readFile(__dirname+'/list.ejs','utf-8', function(error, resultData){
                response.writeHead(200, {'Content-Type':'text/html; charset=utf-8'});
                response.end(
                    ejs.render(resultData,{  // (5)
                        results : result,
                        paging : { 
                            totalRecord : totalRecord, 
                            nowPage : 3,
                            startPage : 1, 
                            onePageRecord : 5
                        }
                    }) 
                ); // (6)
            });
        };
    });
});

server.listen(10010, function(){
    console.log('server start http://127.0.0.1:10010/index');
});
(1) 게시판 리스트를 보여줄 select 쿼리문 생성

(2) 쿼리문을 실행하기 위해 execute( ) 메서드 사용 [첫 번째 매개변수:쿼리문, 두 번째 매개변수:콜백함수()]
- 쿼리문에 대한 데이터가 result안에 들어가게 된다.(select한 코드로 쿼리문에 대한 결과)

(3) 현재 DB에 있는 선택한 레코드 수

(4) 선택한 레코드가 있는 경우에만 list 페이지(게시판)로 데이터를 보낸다. 

(5) ejs 파일을 사용하기 위해서는 render( )를 사용해야 한다.
- render( ) 함수의 첫 번째 매개변수는 String으로 와야 하는데 utf-8이 없으면 object로 오게 된다.
- 두 번째 매개변수는 json 형식으로!(object 형식)
- 모든 레코드, 현재 페이지, 시작 페이지, 한 페이지에 나타낼 레코드 수는 임의 생성(데이터를 보내기 위해)
- 모든 데이터는 resultData에 담겨 있다. 

(6) list.ejs에게 모든 데이터가 들어있는 resultData를 보내게 된다. 

5-3. 게시판을 보여주기 위해서 list.ejs 파일 생성(위에서 get방식으로 처리한 데이터를 보낸다.)

    <h1>게시판 글 목록</h1>
    <a href="">글 작성하기</a><br/>
    총 레코드 수 : , 현재 페이지 : 
    한 페이지 출력 레코드 : , 시작 페이지 : 
    <ul class="bList">
        <li>번호</li><li>제목</li><li>작성자</li><li>조회수</li><li>등록일</li>
        <li>번호</li>
        <li>제목</li>
        <li>작성자</li>
        <li>조회수</li>
        <li>등록일</li>
    </ul>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>게시판 목록</title>
	<link rel="stylesheet" href="style.css" type="text/css"/>
</head>
<body>
    <h1>게시판 글 목록</h1>
    <a href="">글 작성하기</a><br/>
    총 레코드 수 : <%=paging.totalRecord%> , 현재 페이지 : <%=paging.nowPage%>
    한 페이지 출력 레코드 : <%=paging.onePageRecord%>, 시작 페이지 : <%=paging.startPage%>
    <ul class="bList">
        <li>번호</li><li>제목</li><li>작성자</li><li>조회수</li><li>등록일</li>
        <% for(var i=0; i<results.length; i++){ %>  
            <li><%=results[i].no%></li>
            <li><a href="?no=<%=results[i].no%>"><%=results[i].subject%></a></li>
            <li><%=results[i].userid%></li>
            <li><%=results[i].hit%></li>
            <li><%=results[i].writedate%></li>
        <% } %>
    </ul>
</body>
</html>
<%=변수명%> 변수명을 적어서 데이터를 js파일에서 가져온다.
<% js코드 %> for문을 돌려서 데이터를 출력했다. for문 안의 변수는 임의 생성!