Node.js | Node.js/Express으로 PostgreSQL 사용 | 테이블 목록 표시

그럼 스크립트를 만들어 보자. 우선은 홈페이지("/“주소)부터 이다. 이것은 routes폴더에 index.js파일로 작업하겠다. 표시용 템플릿은 views폴더에 index.ejs로 만든다.

아래에 각각의 파일의 소스 코드를 올려 두었다. 작성하여 지정된 폴더에 파일을 배치해야 한다.

index.js

var express = require('express');
var router = express.Router();
var pg = require('pg');
 
/* GET home page. */
router.get('/', function(request, response, next) {
    var con = "tcp://이용자:비밀번호@호스트:포트번호/데이터베이스; //★
    pg.connect(con, function(err, client) {
        var query = client.query('select * from mydata;');
        var rows = [];
        query.on('row', function(row) {
            rows.push(row);
        });
        query.on('end', function(row,err) {
            response.render('index', { 
                title: 'Express',
                data:rows
            });
        });
        query.on('error', function(error) {
            console.log("ERROR!!" + error);
            response.render('index', {
                title: title,
                data: null,
                message: "ERROR is occured!"
            });
        });
    });
});
 
module.exports = router;

index.ejs

<!DOCTYPE html>
<html>
 <head>
   <title><%= title %></title>
   <link rel='stylesheet' href='/stylesheets/style.css' />
 </head>
 <body>
   <h1><%= title %></h1>
   <p>Welcome to <%= title %></p>
   <% if (data != null) { %>
       <table border="1">
       <% for(var i=0; i < data.length; i++){ %>
           <tr>
           <td width="200px"><%= data[i].name %></td>
           <td width="200px"><%= data[i].mail %></td>
           <td width="300px"><%= data[i].memo %></td>
           </tr>
       <% } %>
       </table>
   <% } %>
 </body>
</html>

이 상태로는 동작하지 않는다. ★로 표시된 텍스트를 각각의 환경에 맞게 수정한다. 디폴트로는 데이터베이스 이름과 관리자 이름이 postgres가 있고, 암호를 1111 이었다면 아래와 같이 설정하면 된다.

tcp://postgres:1111@localhost:5432/postgres

이것으로 mydata의 데이터를 모두 가져 와서 테이블에 함께 표시한다. 다만. 아직 /add와 /create를 만들지 않기 때문에 이 단계에서 실행해도 잘 동작하지 않을 것이다. 최후까지 완성하고 표시를 확인해야 한다.

그럼, 소스 코드의 설명을 하겠다. Node.js의 pg를 사용하여 데이터베이스에 액세스할 기본 사항을 순서대로 설명하고 있다.

데이터베이스 연결

pg.connect(연결정보, 콜백함수);

데이터베이스에 연결은 pg.connect라는 메소드를 사용한다. 이것은 첫번째 인수에 연결된 주소를 두번째 인수는 연결이 시작되고 나서 실행되는 콜백 함수를 지정한다. 예제 스크립트는 다음과 같이 작성하고 있다.

var con = "tcp://이용자:비밀번호@호스트:포트번호/데이터베이스; //
pg.connect(connectionString, function(err, client) {... 연결시 처리 ...}

연결은 tcp라는 프로토콜 텍스트에서 준비한다. 이용자, 비밀번호, 호스트, 포트 번호, 데이터베이스 등의 정보를 하나로 묶어 작성하기 때문에 틀리지 않도록 주의해야 한다.

connect는 비동기 함수로 연결이 완료된 곳에서 인수의 함수를 호출하여 실행한다. 이 콜백 함수는 두 개의 인수를 준비한다. 첫번째 인수에는 오류가 발생했을 때의 정보를 정리한 객체를 또, 두번째 인수에는 연결된 데이터베이스에 대한 액세스를 관리하는 Client라는 개체가 반환된다.

SQL 쿼리를 실행하기

변수 = client.query(쿼리 문);

연결한 데이터베이스를 조작하려면 Client의 “query"메소드를 사용한다. 이것은 SQL 문을 데이터베이스에 보내고 실행하기 위한 것이다. 인수에는 SQL 쿼리 텍스트를 지정한다.

SQL 문에서는 select처럼 값을 취득하는 처리도 있지만,이 query 메소드 자체에서 리턴 값을 돌려주는 것은 아니기 때문에 주의가 필요하다. 이 query 메서드는 비동기적으로 액세스 한다. 따라서 실행 결과가 되는 반환 값으로 데이터를 받을 수 있는 것은 아니다.

반환되는 값은 “Query"라는 객체이다. 이 Qurery에는 처리의 실행 상황에 따라 발생하는 이벤트 핸들러가 준비되어 있어 이것을 이용하여 작업을 수행한다.

예제를 살펴 보자. 우선 다음과 같이 select 문을 실행하고 Query를 변수로 받고 있다.

var query = client.query('select * from mydata;');

이 query는 두번째 인수에 실행한 후에 처리하는 콜백 함수를 지정할 수 있지만, 여기에서는 단순히 쿼리를 실행하기만하도록 작성하였다. 이 query를 실행한 후에 반환되는 Query 객체의 이벤트를 설정한다. 이 이벤트는 총 3가지 종류 준비되어 있다. 각각 다음과 같이 설정한다.

row의 검색 이벤트

query.on('row', function(row){……처리……} );

select 등 레코드를 검색하는 쿼리를 실행할 때 레코드를 검색 할 때마다 이 row 이벤트가 발생 처리가 호출된다. 인수 row에는 얻은 레코드를 객체로 정리한 것이 저장된다.

종료 이벤트

query.on('end', function(result){……처리……} );

모든 작업이 완료될 때 호출된다. 인수에는 쿼리 실행에 관한 각종 정보를 정리한 Result 객체가 전달된다.

오류 이벤트

query.on('error', function(error){……처리……} );

오류가 발생했을 때에 호출된다. 다만 query 메소드를 호출할 때에 콜백 함수를 설정하고 있던 경우는 그쪽이 우선되어, 이 이벤트는 발생하지 않으므로 주의한다.

이 3개의 이벤트를 조합하여 쿼리 실행 후의 처리를 만들 수 있다. 예제 스크립트에는 row 이벤트에서 얻은 row 객체를 배열에 추가 저장한다. 이렇게 하여 얻은 모든 row 데이터를 하나로 모을 수 있다.

또한 주목해 줬으면 하는 것은 index.js의 렌더링 타이밍이다. 여기에서는 end 이벤트가 발생한 곳에서 render 표시를 렌더링하고 있는 것을 알 수 있다(다른, error일때도 수행하고 있지만 …). 이처럼 처리가 완료되고 표시를 렌더링하지 않으면, 결과를 잘 얻어와도 표시가 되지 않기에 주의해야 한다.