Juni_Dev_log

(node.js) [Part.6] 데이터 베이스 사용하기 - 익스프레스에서 몽고디비 사용하기 본문

Theorem (정리)/node.js

(node.js) [Part.6] 데이터 베이스 사용하기 - 익스프레스에서 몽고디비 사용하기

Juni_K 2020. 12. 18. 17:39

익스프레스는 웹 서버를 만들 때 필요한 파일들을 자동으로 만들어주는데 이런 웹 서버에서도 데이터베이스를 사용할 경우가 많다. 그런데 익스프레스에서 몽고디비를 사용하는 방식은 앞에서 살펴본 것과는 약간 다르다.

특히 익스프레스가 적은 양의 코드로 빠르게 웹 서버를 만들 수 있는 것처럼 익스프레스 안에서 사용되는 몽고디비도 적은 양의 코드로 데이터를 저장하거나 조회할 수 있다.

새로운 프로젝트 만들기

이제 새로운 프로젝트 폴더를 만들고 브라켓에서 프로젝트 폴더로 설정해보자.

파일 탐색기를 열고 새로운 폴더인 [DatabaseExample] 폴더를 만든다. 그리고 브라켓에서 기본 폴더로 지정한다.

 

브라켓에서 프로젝트 폴더를 설정했으니 그 안에 새로운 app.js 파일을 만든다. 그리고 다음 코드를 입력한다.

코드의 상당 부분은 앞에서 만들어졌던 코드를 사용하므로 앞 장의 내용을 이해했다면 어렵지 않을 것이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Express 기본 모듈 사용하기
var express = require('express')
, http = require('http')
, path = require('path');
 
// Express의 미들웨어 불러오기
var bodyParser = require('body-parser')
, cookieParser = require('cookie-parser')
static = require('serve-static')
, errorHandler = require('errorhandler');
 
// 오류 핸들러 모듈 사용
var expressErrorHandler = require('express-error-handler');
 
// Session 미들웨어 불러오기
var expressSession = require('express-session');
 
// 익스프레스 객체 생성
var app = express();
cs

 

앞 장에서 만들었던 코드가 많지만 한 번 각 줄의 코드가  어떤 의미인지 살펴보자.

코드의 첫 부분에서는 필요한 모듈을 불러들이고 express() 메소드를 호출하여 익스프레스 서버를 만든다.

익스프레스에서 사용하는 기본 모듈인 express 모듈, http 모듈과 함께 패스 문자열을 다루는 path 모듈, POST 요청 처리를 다루는 body-parser 모듈, 쿠키와 세션을 다루는 cookie-paresrserve-static 모듈을 불러들인다.

마지막으로 세션을 관리하는 express-session 모듈과 오류를 처리하는 express-error-handler 모듈도 불러들인다.

 

이 부분까지 확인한 후 시험 삼아 app.js 파일을 실행해보자.

그러면 실행했을 때 모듈을 찾을 수 없다는 오류가 발생하는데, 이는 DatabaseExample 폴더 안에 외장 모듈이 없다는 것을 의미한다. 

그렇기 때문에 해당 모듈들을 npm install 로 모두 설치해준다.

그리고 package.json 파일 안에 모듈 정보가 들어가도록 만든다.

 

 

필요한 모듈을 설치할 때마다 --save 옵션을 붙였다면 해당 폴더 안에는 최종적으로 다음과 같은 package.json 파일이 만들어진다.

만약 만들어지지 않았다면, 해당 폴더로 이동한 후에 npm init 명령을 실행하면 package.json 이 만들어진다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
  "name": "databaseexample",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.19.0",
    "cookie-parser": "^1.4.5",
    "errorhandler": "^1.5.1",
    "express": "^4.17.1",
    "express-error-handler": "^1.1.0",
    "express-session": "^1.17.1",
    "http": "0.0.1-security",
    "mongodb": "^3.6.3",
    "path": "^0.12.7",
    "serve-static": "^1.14.1"
  }
}
 
cs

 

이 파일에 포함된 버전 정보는 설치 시점에 따라서 달라질 수 있으니 주의한다.

하지만, 사용한 모듈의 이름은 같다. 이렇게 만든 package.json 파일의 dependencies 정보는 새로운 프로젝트를 만들었을 때 그대로 사용할 수 있다.

만약, 새로운 프로젝트를 만들었을 때 package.json 파일이 만들어져 있다면 각각의 모듈을 따로 설치할 필요없이 다음 명령으로 자동 설치된다.

 

npm install

 

npm 프로그램은 package.json 파일의 dependencies 정보를 확인한 후, 필요한 모듈을 알아서 설치한다.

이렇게 설치한 모듈들은 node_modules 폴더 안에 들어간다.

 

[node_modules] 폴더가 프로젝트 폴더보다 상위에 있을 경우에 프로젝트 폴더에 직접 모듈을 설치하지 않아도 참조하여 사용할 수 있다. 

이 점은 다시 한 번 기억해두기 바란다.

 

app.js 파일에 들어갈 기본 코드를 살펴보자. 다음은 모듈을 불러온 후 초기화하는 부분이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
...
 
// 익스프레스 객체 생성
var app = express();
 
// 기본 속성 설정
app.set('port', process.env.PORT || 3000);
 
// body-parser를 사용해 application/x-www-form-urlencoded 파싱
app.use(bodyParser.urlencoded({extended:false}));
 
// body-parser를 사용해 application/json 파싱
app.use(bodyParser.json());
 
// public 폴더를 static 으로 오픈
app.use('/public'static(path.join(__dirname, 'public')));
 
// cookie-parser 설정
app.use(cookieParser());
 
// 세션 설정
app.use(expressSession({
    secret:'my key',
    resave:true,
    saveUninitialized:true
}));
cs

 

서버에서 사용할 포트 정보는 set() 메소드를 이용해서 port라는 이름으로 설정한다.

그리고 [/public] 폴더를 특정패스로 접근할 수 있도록 static 미들웨어를 사용해 등록한다. 

그 다음에는 body-parser, cookie-parser, express-session 모듈을 사용할 수 있도록 use() 메소드를 호출한다.

그 아래 코드에서 라우터 미들웨어를 사용하면, 이제부터 사용자가 요청한 패스 정보에 따라 라우팅이 가능해진다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
...
 
// 라우터 객체 참조
var router = express.Router();
 
// 로그인 라우터 함수 - 데이터베이스의 정보와 비교
router.route('/process/login').post(function(req,res){
    console.log('/process/login 호출됨.');
    ...
});
 
// 라우터 객체 등록
app.use('/', router);
 
...
 
// ===========404 오류 페이지 처리 ===========//
var errorHandler = expressErrorHandler({
    static:{
        '404':'./public/404.html'
    }
});
 
app.use(expressErrorHandler.httpError(404));
app.use(errorHandler);
 
// ===== 서버 시작 ===== //
http.createServer(app).listen(app.get('port'), function(){
    console.log('서버가 시작되었습니다. 포트 : ' + app.get('port'));
});
cs

 

가장 아래쪽에는 서버를 실행하는 코드가 있으며, 그 위에는 오류 처리에 필요한 express-error-hanlder 모듈을 사용할 수 있게 하는 코드가 추가되어 있다.

앞 장에서 만든 코드가 정리되엇다면 이제 사용자가 로그인했을 때 데이터베이스에 저장된 사용자 정보와 일치하는지 확인하는 기능을 만들어보자.

 

mongodb 모듈을 사용하여 로그인 기능 만들기

먼저 사용자가 로그인하는데 사용할 웹 문서를 [public] 폴더 안에 만든다.

앞에서 만든 ExpressExample 프로젝트의 public 폴더 안에 있는 login2.html 파일과 같은 것을 사용할 것이므로 파일을 복사해서 DatabaseExample 프로젝트의 public 폴더에 넣은 후, login.html 로 변경한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>로그인 테스트</title>
</head>
<body>
    <h1>로그인</h1>
    <br>
    <form method="post" action="/process/login">
        <table>
            <tr>
                <td><label>아이디</label></td>
                <td><input type="text" name="id"></td>
            </tr>
            <tr>
                <td><labeL>비밀번호</labeL></td>
                <td><input type="password" name="password"></td>
            </tr>
        </table>
        <input type="submit" value="전송" name="">    
    </form>
</body>
</html>
cs

 

이제 사용자는 명령 프롬프트에서 노드로 app.js 를 실행하고 웹 브라우저에서 로그인 페이질르 열 수 있다.

이 때 앞에서 설명했던 몽고디비가 실행되어있어야 한다.

즉, 몽고디비를 실행했던 명령 프롬프트 창은 그대로 둔 채 새로운 명령 프롬프트 창을 열고 아래 명령을 실행하면 노드서버가 시작된다.

 

% node app.js

 

localhost:3000/public/login,html 을 들어가보면 로그인 페이지를 볼 수 있고, 로그인 페이지에서 아이디와 비밀번호를 입력한 후, 웹 서버에 요청하면 사용자의 아이디와 비밀번호는 서버 쪽에 요청 파라미터로 전달된다.

요청 파라미터로 전달받은 데이터는 데이터베이스에 저장된 사용자 아이디와 비밀번호를 비교하여 두 값이 일치하는지 확인하는 데 사용할 것이다.

이전에 명령 프롬프트에서 데이터베이스에 추가한 데이터에는 아이디와 비밀번호 정보가 없다. 따라서 기존 문서 객체를 없애고 아이디와 비밀번호를 속성으로 포함하는 새로운 객체를 추가한다.

먼저 새로운 명령 프롬프트 창을 열고 mongo 명령어를 입력하여 몽고디비 셸로 들어간다. 그리고 다음 명령을 차례대로 입력한다.

 

% cls
% use local
% db.users.remove({name:/소녀/})
% db.users.find().pretty()
% db.users.insert({id:'test01', name:'소녀시대', password:'123456'})
% db.users.find().pretty()

 

cls 명령은 명령 프롬프트 화면에 출력한 정보를 화면에서 지워준다.

컬렉션 객체의 remove() 메소드를 사용하면 기존 데이터를 삭제할 수 있는데 이 때 파라미터로 전달된 JSON 객체에는 regexp 표현식으로 표시조건을 넣을 수 있다.

 

예를 들어, {"name":/소녀/} 객체를 전달하면 name 속성의 값에 소녀라는 단어가 들어간 모든 데이터를 찾아낸 후 삭제한다.

 

데이터를 삭제한 후 find() 메소드로 데이터를 조회하면 모든 데이터가 삭제되었기 때문에 어떤 정보도 조회되지 않는다.

데이터가 삭제된 것을 확인하고서 새로운 데이터를 insert() 를 사용해서 추가하고 다시 find() 로 확인해본다.

 

기존 문서 객체를 삭제한 후 id,name,password를 포함한 새로운 문서 객체 추가

 

문서 객체에 id 와 password 속성을 추가했으므로 app.js 파일에 로그인을 처리하는 코드를 추가할 수 있다.

앞에서는 mongo 셸을 사용하여 직접 명령을 입력했지만, 소스코드에서는 셸을 사용하지않고 직접 몽고디비 데이터베이스에 연결해야 하므로 mongodb 모듈을 사용한다.

 

먼저 mongodb 모듈을 설치한다.

 

npm install mongodb --save

 

그리고 app.js 파일에서 라우팅 코드 윗 부분에 다음 코드를 추가한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
...
 
// 몽고디비 모듈 사용
var MongoClient = require('mongodb').MongoClient;
 
// 데이터베이스 객체를 위한 변수 선언
var database;
 
// 데이터베이스에 연결
function connectDB(){
    // 데이터베이스 연결 정보
    var databaseUrl = 'mongodb://localhost:27017/local';
    
    // 데이터베이스 연결
    MongoClient.connect(databaseUrl, function(err,db){
        if(err) throw err;
        
        console.log('데이터베이스에 연결되었습니다. : ' + databaseUrl);
        
        // database 변수에 할당
        database = db;
    });
}
 
...
cs

먼저 몽고디비를 사용할 수 있도록 mongodb 모듈을 불러들인다.

모듈을 불러들이면서 동시에 그 객체 안에 있는 MongoClient 속성을 참조할 수 있다.

그러면 이제부터 이 객체를 사용해서 몽고디비를 사용할 수 있다.

 

connectDB 함수는 mongodb 모듈을 사용해서 몽고디비 데이터베이스에 연결하도록 새로 만드는 것이다.

데이터베이스에 연결하려면 먼저 연결정보를 문자열로 정의해야한다. 문자열의 형식은 다음과 같다.

 

mongodb://%IP정보%:%포트정보%/%데이터베이스 이름%

 

앞뒤에 % 기호가 붙은 것은 여러분이 지정해야하는 정보라는 의미이다.

앞의 코드에서는 로컬PC의 27017 포트에서 실행되고 있는 local 데이터베이스에 연결하도록 연결 정보를 만들었다.

 

데이터베이스에 연결하려면 mongodb 객체인 connect() 메소드를 호출한다.

첫 번째 파라미터로 연결 URL을 전달하고,  두 번째 파라미터로 콜백함수를 전달한다. 데이터베이스가 정상적으로 작동하면 db 객체가 전달되는데 이 객체는 database 변수에 저장한다.

 

서버가 실행되면 connectDB 함수를 호출하여 데이터베이스에 연결한다.

 

다음과 같이 서버가 시작한 후, 호출되는 콜백함수 안에서 connectDB 함수를 호출한다.

 

1
2
3
4
5
6
7
8
9
...
 
// ===== 서버 시작 ===== //
http.createServer(app).listen(app.get('port'), function(){
    console.log('서버가 시작되었습니다. 포트 : ' + app.get('port'));
    
    // 데이터베이스 연결
    connectDB();
});
cs

 

사용자가 보내온 아이디와 비밀번호 비교하기

이제 데이터베이스에 연결되었고 database 변수에 저장된 db객체를 사용해 데이터베이스를 사용할 수 있는 상태가 되었다. 그러면 사용자가 보내온 아이디와 비밀번호를 사용해 데이터베이스 안에 일치하는 문서 객체가 있는지 조회한다.

 

이 기능을 담당하는 authUser 함수를 다음과 같이 만든다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
...
// 사용자를 인증하는 함수
var authUser = function(database, id, password, callback){
    console.log('authUser 호출됨.');
    
    // users 컬렉션 참조
    var users = database.collection('users');
    
    // 아이디와 비밀번호를 사용해 검색
    users.find({"id":id, "password":password}).toArray(function(err,docs){
        if(err) {
            callback(err, null);
            return;
        }
        
        if(docs.length > 0){
            console.log('아이디 [%s]. 비밀번호 [%s]가 일치하는 사용자 찾음,',id,password);
            callback(null,docs);
        }else{
            console.log('일치하는 사용자를 찾지 못함.');
            callback(null,null);
        }
    });
}
 
...
cs

 

authUser() 함수는 데이터베이스 객체, 아이디, 비밀번호를 파라미터로 받으며 콜백함수도 파라미터로 전달받는다.

데이터베이스의 users 컬렉션 안에 사용자 정보가 들어있으므로 database.collection() 메소드로 users 컬렉션 객체를 참조한다.

그다음에는 users 컬렉션 객체의 find() 메소드를 호출하여 데이터를 조회한다.

id 와 password 속성의 값을 파라미터로 전달하여 조회한 후 조회 결과는 toArray() 메소드를 사용해 배열 객체로 반환한다.

toArray() 메소드의 파라미터로 전달되는 콜백 함수에는 toArray()로 변환된 문서 객체가 전달된다.

docs의 값이 0보다 크면 사용자 데이터가 조회된 것이므로 callback 함수를 호출하면서 docs 객체를 파라미터로 전달한다.

이렇게 하면 이 함수를 호출한 쪽에서 콜백함수를 사용해 docs 객체를 전달한다.

 

로그인 처리를 요청하는 패스에 라우팅 함수 추가하기

이제 로그인 처리를 요청하는 /process/login 패스에 라우팅 함수를 추가할 때가 되었다. 다음과 같이 사용자가 있는지 확인한 후 그에 맞는 응답을 보내 주는 코드를 입력한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
...
 
// 로그인 라우터 함수 - 데이터베이스의 정보와 비교
router.route('/process/login').post(function(req,res){
    console.log('/process/login 호출됨.');
    
    var paramId = req.param('id');
    var paramPassword = req.param('password');
    
    if(database){
        authUser(database, paramId, paramPassword, function(err, docs){
            if(err) {throw err;}
            
            if(docs){
                console.dir(docs);
                var username = docs[0].name;
                res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
                res.wirte('<h1>로그인 성공</h1>');
                res.write('<div><p>사용자 아이디 : ' + paramId + '</p></div>');
                res.write('<div><p>사용자 이름 : ' + paramPassword + '</p></div>');
                res.write("<br><br><a href='/public/login.html'>다시 로그인하기</a>");
                res.end();
            }else{
                res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
                res.wirte('<h1>로그인 실패</h1>');
                res.write('<div><p>아이디와 비밀번호를 다시 확인하십시오.</p></div>');
                res.write("<br><br><a href='/public/login.html'>다시 로그인하기</a>");
                res.end();
            }
        });
    }else{
        res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
        res.wirte('<h2>데이터베이스 연결 실패</h2>');
        res.write('<div><p>데이터베이스에 연결하지 못했습니다.</p></div>');
        res.end();
    }
    
});
 
...
 
cs

사용자가 요청한 id 와 password 파라미터를 확인한 후 authUser() 메소드를 호출하여 전달한다.

사용자가 조회되면 docs 문서 객체가 콜백함수의 파라미터로 전달되므로 docs 문서 객체의 첫번째 배열 요소를 참조한 후 사용자 이름을 확인한다.

지금까지 만든 것은 웹 서버에서 몽고디비에 연결한 후, 컬렉션을 참조하고 문서 객체를 찾아내는 과정이다.

이 과정을 순서대로 그려보면 다음과 같다.

 

몽고디비에 연결한 후 문서 객체를 찾아내는 과정

이 처리 과정을 보면, mongodb 모듈로 몽고디비 데이터베이스에 연결하고 문서 객체를 찾는 과정을 쉽게 이해할 수 있다. 이 과정을 생각하면서 코드 형태를 다시 한 번 살펴보자.

 

이제 app.js 파일을 실행한 후 웹 브라우저에 접속해본다.

 

http://localhost:3000/public/login.html

 

사용자 인증을 위해 간단하게 만든 로그인 화면

 

로그인 화면이 보이면 아이디 입력란에 test01, 비밀번호 입력란에 123456 을 입력한 후 [전송] 버튼을 누른다. 

그러면, 다음과 같이 로그인에 성공했다는 화면이 나타나면서 사용자 이름이 나온다.

 

사용자 인증 결과를 보여주는 화면

 

서버쪽의 콘솔을 보면 다음과 같이 사용자 인증을 요청했을 때 데이터베이스에 연결하고 문서를 조회하는 과정을 알 수 있는 로그가 표시된다.

 

사용자 인증 결과를 보여주는 서버 쪽 콘솔 화면

이렇게 데이터베이스에 저장된 사용자 정보를 확인하는 기능을 만들어보았다.

 

사용자 추가 기능 만들기

지금부터는 사용자를 추가하는 기능을 만들어보자.

로그인 페이지에서는 보통 회원이 아닌 사람을 위해 사용자 등록과정을 만들고 링크를 걸어두는 경우가 많다.

따라서, 회원가입 페이지를 만들면 웹 서버로 사용자 등록 요청을 하고 사용자 등록 요청을 받은 서버에서는 사용자를 추가하는 기능을 수행해야한다.

app.js 파일을 복사하여 app2.js 파일을 만들고 이 파일 안에 다음과 같이 기능을 처리하는 함수를 만든다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
...
// 사용자를 추가하는 함수
var addUser = function(database, id, password, name, callback){
    console.log('addUser 호출됨 : ' + id + ', ' + password + ', ' + name);
    
    //users 컬렉션 참조
    var users = database.collection('users');
    
    // id, password, username 을 사용해 사용자 추가
    users.insertMany([{"id":id,"password":password,"name":name}],function(err, result){
        if(err) {
            //오류가 발생했을 때 콜백함수를 호출하면서 오류 객체 전달
            callback(err,null);
            return;
        }
        
        // 오류가 아닌 경우, 콜백 함수를 호출하면서 오류 객체 전달
        if(result.insertedCount > 0){
            console.log('사용자 레코드 추가됨 : ' + result.insertedCount);
        } else{
            console.log('추가된 레코드 없음');
        }
        
        callback(null,result);
    })
}
 
...
 
cs

addUser 함수에는 데이터베이스 객체와 함께 사용자에게 요청받은 id, password, name 파라미터 값을 전달한다.

마지막 파라미터는 콜백 함수로서 이 함수를 호출하는 쪽에 결과 객체를 보내기 위해서 전달받는다.

users 컬렉션을 참조한 후 insertMany(0 메소드를 호출하여 데이터를 추가한다.

insertMany() 메소드를 호출할 때 전달하는 콜백함수로 결과가 넘어오면 데이터가 성공적으로 추가되었는지 알 수 있다.

 

결과 객체 안에 있는 insertedCount 속성은 추가된 레코드의 개수를 알려준다.

따라서 이 개수가 0보다 크면 정상적으로 추가된 것이다.

 

다음에는 클라이언트에서 사용자 추가를 위해 요청할 /process/adduser 패스를 라우팅하는 함수를 만들어준다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
...
app.use('/process/adduser').post(function(req,res){
    console.log('/process/adduser 호출됨.');
    
    var paramId = req.body.id || req.query.id;
    var paramPassword = req.body.password || req.query.password;
    var paramName = req.body.name || req.query.name;
    
    console.log('요청 파라미터 : ' + paramId + ', ' + paramPassword + ', ' + paramName);
    
    // 데이터베이스 객체가 초기화된 경우, addUser 함수 호출하여 사용자 추가
    if (database){
        addUser(database, paramId, paramPassword, paramName, function(err, result){
            if(err) {throw err;}
            
            //결과 객체 확인하여 추가된 데이터 있으면 성공 응답 전송
            if(result && result.insertedCount > 0){
                console.dir(result);
                
                res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
                res.write('<h2>사용자 추가 성공</h2>');
                res.end();
            }else{
                res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
                res.write('<h2>사용자 추가 실패</h2>');
                res.end();
            }
        });
    }else{
        // 데이터베이스 객체가 초기화되지 않는 경우 실패응답 전송
        res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
        res.write('<h2>데이터베이스 연결 실패</h2>');
        res.end();
    }
    
});
...
cs

addUser() 함수를 호출하면서 동시에 사용자로부터 전달받은 id, password, name 파라미터를 전달한다.

콜백 함수에 결과 객체가 전달되면 정상적으로 사용자가 데이터베이스에 추가되었는지 여부를 확인한다.

result 라는 이름으로 전달된 파라미터에 값이 들어있고, 그 안에 들어있는 insertedCount 속성의 값이 0보다 큰 경우에는 클라이언트가 성공했다는 응답을 보낸다.

그리고 그렇지 않다면 실패했다는 응답을 보낸다.

 

이제 다음과 같이 사용자 등록을 위한 웹 문서를 만들어 [public] 폴더 밑에 추가한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>사용자 추가 테스트</title>
</head>
<body>
    <h1>사용자 추가</h1>
    <br>
    <form method="post" action="/process/adduser">
        <table>
            <tr>
                <td><label>아이디</label></td>
                <td><input type="text" name="id"></td>
            </tr>
            <tr>
                <td><label>비밀번호</label></td>
                <td><input type="password" name="password"></td>
            </tr>
            <tr>
                <td><labeL>사용자명</labeL></td>
                <td><input type="text" name="name"></td>
            </tr>
        </table>
        <input type="submit" value="전송" name="">
    </form>
</body>
</html>
cs

이 웹 문서는 이전에 만들었던 로그인 화면과 거의 비슷하다.

app2.js 파일을 실행하고 웹 브라우저에서 다음 주소로 요청한다.

 

http://localhost:3000/public/adduser.html

 

사용자 추가를 위해 만든 화면

 

public 폴더는 /public 요청 패스로 접근할 수 있도록 되어 있다.

앞에서 코드를 사용해서 public 폴더를 /public 요청 패스로 접근할 수 있도록 설정했다.
app.use('/public', static(path.join(__dirname, 'public')));

따라서 public 폴더 안에 넣어둔 adduser.html 페이지는 /public/adduser.html 요청 패스로 접근할 수 있다.

 

사용자를 추가할 수 있는 화면이 보이면 아이디에 test02 , 비밀번호 입력란에 123456, 사용자 이름란에 걸스데이를 입력한 후 전송 버튼을 누른다.

 

사용자가 정상적으로 추가되면 다음과 같이 성공 메세지가 표시된다.

 

사용자 추가한 후의 결과 화면

 

서버 창 콘솔쪽을 보면 서버 쪽에서 사용자를 데이터베이스에 추가했다는 알림 메세지가 표시된다.

 

사용자 추가 결과를 보여주는 서버쪽 콘솔 화면

 

지금까지 사용자가 웹 브라우저에서 사용자 인증이나 등록을 욫어하면 익스프레스 서버의 라우팅 함수가 실행되면서 몽고디비 데이터베이스에 저장되어있는 사용자를 확인하거나 새로운 사용자를 추가하는 방법에 대해서 배워보았다.

코드가 조금 길지만 사용되는 패턴을 이해하면 쉽게 구현할 수 있다.

 

 


공부하다가 

database.collection is not a function

라는 에러가 발생해서 해당 오류를 디버깅하는데 사용했던 사이트이다.

 

heewon26.tistory.com/43

 

(Node.js)database.collection is not a function

 In mongodb version >= 3.0, That database variable is actually the parent object of the object you are trying to access with database.collection('whatever'). To access the correct object, you ne..

heewon26.tistory.com

 

Comments