티스토리 뷰
Node.js MS-SQL Database REST API Server 구축
1. 소개
Node.js를 이용하여 MS-SQL Database에 URI로 접근하여 CRUD(Create, Read, Update, Delete) 기능을 수행하는 REST API Server 를 구축해보도록 합니다.
해당 내용은 지속적으로 업데이트 될 예정입니다.
2. 왜 REST API Server를 구축하여야 하는가?
일단 저는 보안 이슈와 Front-end 단에서 직접 쿼리를 짜지 않아도 된다는 장점 때문에 이용 하려고 합니다.
3. 환경구축
- Node : 최신 버전으로 설치해주세요...
- NPM : 최신 버전으로 설치해주세요...
- Dependecy (본 기능을 구현하기 위하여 필요한 모듈 정리)
body-parser : client 요청 중 POST 방식의 Body 내용을
Parsing 하기 위하여 사용 합니다.
express : 웹서버 개발을 편리하게 해주는 프레임워크 입니다.
mssql : MS-SQL Database에 접속하기 위한 모듈입니다.
- Insomnia : 브라우저로는 Get 요청만 할 수 있어 Post, Put, Delete 명령을 보내기 위한 테스트 프로그램입니다.
JSON 형태로 전송이 가능하고 응답 또한 확인할 수 있어 개발에 편리합니다.
npm init 명령으로 현재 설치되어 있는 모듈에 대한 package.json을 생성 할 수 있습니다.
새롭게 개발하려는 경로에서 npm install 만 입력하면 package.json파일을 읽어 관련된 패키지들을 자동으로 설치해줍니다.
package.json 내용은 아래와 같습니다.
//package.json
{
"name": "restapiserverformssql",
"version": "1.0.0",
"description": "",
"main": "main.js",
"dependencies": {
"body-parser": "^1.17.1",
"express": "^4.15.2",
"mssql": "^4.0.1"
},
"devDependencies": {},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
4. 폴더 구조 및 테이블 구조
--node_modules : npm 에서 설치되는 모듈들 폴더
--routes : URI 입력에 따라 페이지 분기를 위한 폴더
-index.js : URI 입력에 따라 MS-SQL 쿼리 후 결과를 JSON으로 리턴하는
express 모듈 구현 파일
-main.js : 웹서버 구동을 위한 접속 대기 처리 및 express 모듈 선언 파일
-package.json : 설치되어 있는 npm 모듈들의 정보를 저장해둔 파일
MS-SQL DB Table 구조는 아래 처럼 미리 만들어주세요.
DB 명 : [your db name]
Table 명 : MemberInfo
Column 1 : MemberID (사용자 번호) ex) '1'
Column 2 : Name (사용자 이름) ex) '홍길동'
5. 구현
필요한 모듈들 로드 하고 값들을 설정해 줍니다.
8080 Port로 대기하도록 설정하였으며
http://127.0.0.1:8080/api/users 브라우저 주소창에 입력 시 맴버 전체를 반환하는 Query가 실행 됩니다.
//main.js
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
var port = process.env.PORT || 8080;
var router = require('./routes')(app);
// [RUN SERVER]
var server = app.listen(port, function(){
console.log("Express server has started on port " + port)
});
MS-SQL DB 접속 정보를 설정하고
SQL에 연결을 합니다.
연결이 끝나면 pool 에서 URI 주소 별로 구분된 app.Get, Post, Put, Delete 등의 함수가 설정이 되고 실제 Client 가 접속하여 해당 URI를 입력하게 되면 각 함수의 return pool.request() 부터 시작하게 됩니다.
pool => {} 은 ES6 의 새로운 문법으로 function(pool) { return ... } 과 동일합니다.
// routes/index.js
module.exports = function(app)
{
const sql = require('mssql');
var config = {
user: 'sa',
password: '[your password]',
server: '[your db server ip]\sqlexpress',
database: '[your db name]'
// options: {
// encrypt: true // Use this if you're on Windows Azure
// }
};
sql.connect(config).then(pool => {
// GET ALL USERS
app.get('/api/users', function(req, res){
return pool.request()
.query('select * from MemberInfo')
.then(result => {
res.json(result.recordset);
res.end();
});
});
// GET SINGLE USERS BY USER_ID
app.get('/api/users/:user_id', function(req, res){
return pool.request()
.input('input_parameter', sql.Int, req.params.user_id)
.query('select * from MemberInfo where MemberID = @input_parameter')
.then(result => {
res.json(result.recordset);
res.end();
});
});
// GET SINGLE USERS ID BY NAME
app.get('/api/users/userid/:name', function(req, res){
return pool.request()
.input('input_parameter', req.params.name)
.query('select * from MemberInfo where Name = @input_parameter')
.then(result => {
res.json(result.recordset);
res.end();
});
});
// CREATE USERS
app.post('/api/users', function(req, res){
return pool.request()
.input('input_parameter', req.body.name) // json body에서 name 항목을 찾아서 할당
.query('INSERT INTO MemberInfo (Name) VALUES (@input_parameter)')
.then(result => {
res.json(result.recordset);
res.end();
});
});
// UPDATE THE USERS
app.put('/api/users/:user_id', function(req, res){
return pool.request()
.input('input_parameter_user_id', sql.Int, req.params.user_id)
.input('input_parameter_name', req.body.name)
.query('UPDATE MemberInfo SET Name = @input_parameter_name WHERE MemberID = @input_parameter_user_id')
.then(result => {
res.json(result.recordset);
res.end();
});
});
// DELETE USERS
app.delete('/api/users/:user_id', function(req, res){
return pool.request()
.input('input_parameter', sql.Int, req.params.user_id)
.query('DELETE FROM MemberInfo WHERE MemberID = @input_parameter')
.then(result => {
res.json(result.recordset);
res.end();
});
});
});
}
6. 테스트
CMD 창을 띄우고 main.js 파일이 존재하는 위치로 이동합니다.
node main.js 를 실행하면 서버는 클라이언트의
접속을 수신 할 준비상태가 됩니다.
주소창에 http://127.0.0.1:8080/api/users 입력 시
[{"MemberID":1,"Name":"홍길동"},{"MemberID":2,"Name":"이순신"}]
주소창에 http://127.0.0.1:8080/api/users/1 입력 시
[{"MemberID":1,"Name":"홍길동"}]
주소창에 http://127.0.0.1:8080/api/users/userid/이순신 입력 시
[{"MemberID":2,"Name":"이순신"}]
POST, PUT, DELETE 기능은 Insomnia 프로그램을 사용하여 테스트를 진행합니다.
Insomnia에 전송모드를 POST로 설정하고
http://127.0.0.1:8080/api/users/ 를 입력한 뒤
Body에 추가할 맴버의 이름을 JSON 형태로 입력하고
Send 버튼을 누를 경우 맴버가 추가됩니다.
Insomnia에 전송모드를 PUT으로 설정하고
http://127.0.0.1:8080/api/users/맴버 ID를 입력한 뒤
Body에 수정할 맴버의 이름을 JSON 형태로 입력하고
Send 버튼을 누를 경우 해당 ID의 맴버 이름이 변경됩니다.
Insomnia에 전송모드를 DELETE로 설정하고
http://127.0.0.1:8080/api/users/맴버 ID 를 입력한 뒤
Send 버튼을 누를 경우 맴버가 삭제됩니다.
7. 결론
node.js 를 이용하여 REST API 서버를 매우 간단하게 구현할 수 있음을 알 수 있습니다.