본문 바로가기

프로그램 개발

node.js + express.js 로 만드는 Edge Server; 1. 시작하기

node.js + express.js 로 만드는 Edge Server

1. 시작하기

2. Request Handler + MongoDB

오늘은 센서에서 보내는 정보를 수집하고 저장하는 서버를 만들려고 한다. 나중에 분석할 수 있도록 정보를 수집하고 분석 서버로 전달하는 작업을 수행하는 간단한 node.js프로그램을 만들어 보려고 한다.

 

윈도우에 node.js가 설치되어 있지 않으면 아래 링크를 참조해서 설치한다.

 

윈도우 개발 환경 시작하기; 3. 설치속도 개선 후 node.js 설치

윈도우 개발 환경 시작하기 목차 1. 우분투 리눅스 설치 2. Docker 설치 3. 설치속도 개선 후 node.js 설치 4. VScode 설치 5. Docker로 MySQL시작하기 6. Docker로 MongoDB 시작하기 0. node.js에 대해서 프론트엔드

front-it.tistory.com

1. node.js + express.js

frontend에 사용하는 개발 언어는 대부분 자바스크립트를 사용한다. 그래서 backend 언어까지 자바스크립트로 통일한다면 하나의 기술만을 고민해도 되기 때문에 더 작은 수의 개발자로 앱을 개발할 수 있어 많은 스타트업들은 node.js를 선택하고 있는 추세이다. 하나의 main thread에서 앱을 실행한다는 점에도 불구하고 성능이 웹 서버의 성능이 java보다 떨어지지 않는 데다 가볍게 서버기능을 포함시킬 수 있어 마이크로서비스 아키텍처를 적용하기가 더 좋다는 평도 많다.

 

node.js를 사용하여 backend를 개발할 때 많이 사용하는 웹 애플리케이션 프레임워크 (Web Application Framework)가 express.js이다. 최근에는 next.js가 1위로, 가장 많이 사용되는 프레임워크로 올라왔지만 간단한 작업을 위한 웹 서버기능만을 구현한다면 express.js가 가장 선호되는 기술이 아닐까? next.js도 사실 따로 설정하지 않으면 웹 서버 기능은 express.js를 사용한다.

 

2. node.js프로젝트 만들기

  • 먼저 빠르게 프로젝트를 만들기 위해 express-generator를 설치한다.
npm install -g express-generator

node.js에서는 프레임워크들이 이런 도우미 명령을 제공하는 경우가 종종 있다. react, next.js, nest.js 등 인기 있는 프레임워크들이 이런 도우미 명령을 제공해서 처음 사용자에게 친절을 베풀고 있다.

  • express-generator를 사용해서 프로젝트를 만든다.
express germinate-server

 

실행이 끝날 무렵에 해야 할 일이나 참고해야 할 명령어들을 표시해 주는데, 자세히 보니 두 번째 명령어에서 npm install을 실행하라고 나온다. 다시 말해, express-generator는 package.json파일만 만들지 파일 내용에 써져 있는 dependencies를 설치해 주지 않기 때문에 사용자가 직접 npm install을 실행해서 필요한 pakcage를 설치해야 한다는 것이다.

 

 

npm install을 하면 vulnerabilities의 목록에 보안취약성이 있다고 나올 수 있다. 이것은 dependencies에 나와 있는 패키지들이 각자 update 하면서 생기는 일이어서 수시로 바뀔 수 있다. 상용으로 외부에 open 해야 하는 상황이 아니면 아래에 나와 있는

npm audit fix --force

를 실행해야 할 필요는 없다. 버전을 맞추는 작업은 생각보다 주의가 많이 필요하다.

3. express-generator가 만든 구조 살펴보기

이제 package.json 파일을 열어 살펴보면 start script를 실행시키면 bin/www 파일이 실행되는 것을 알 수 있다.

 

bin/www 파일을 열어보면 서버의 port는 환경변수를 지정하지 않으면 default로 3000번을 사용하고, app객체를 "../app.js"에서 가져오는 것을 확인할 수 있다.

 

app.js를 열어보면, app은 express객체의 instance인 것을 확인할 수 있다.

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var app = express();

...

app.use('/', indexRouter);
app.use('/users', usersRouter);

...

module.exports = app;

 

또한, "/"과 "/users" 두 개의 URL에 대해 각각 indexRouter와 userRouter가 등록되어 있는 것을 알 수 있다.

 

indexRouter객체가 있는 ./routers/index.js 파일을 열어보면, get 방식 request handler를 정의해 놨는데 호출되면 jade 템플릿엔진을 사용해서 index.jade 파일을 렌더링 하도록 되어 있다.

... 

router.get('/', function(req, res, next) { res.render('index', { title: 'Express' }); });

...

userRouter객체가 있는 ./routers/users.js 파일을 열어보면, 역시 get 방식이지만 string을 send 하도록 되어 있는 것을 확인할 수 있다.

 

이제 브라우저를 열고 "http://localhost:3000/" 과 "http://localhost:3000/users"를 각각 입력하고 어떤 결과가 나오는지 확인해 보자.

 

http://localhost:3000/
http://localhost:3000/users

4. API 서버 구조 만들기

내가 하는 대부분의 개발은 타입스크립트 (typescript)로 작성을 한다. 타입스크립트로 작성하면 코드의 길이가 늘어나 귀찮은 점은 있지만, 프로그램을 짜면서 발생하는 오타나 암시적인 형변환으로 인해 일어나는 많은 버그를 사전에 잡아준다. 하지만 지금은 node + express를 사용하는 방법을 설명하는데 보다 중심을 두기 때문에 일반 자바스크립트를 사용할 것이다.

 

나는 센서에서 데이터를 받아 DB에 저장하는 것을 목표로 하고 있다. 그래서 먼저 app.js가 있는 위치에 /api 폴더를 만들었다. /api 폴더에는 /api/index.js를 두고 폴더를 import 했을 때 실행되도록 했다. 그리고 sensor로부터 오는 request를 처리하는 핸들러들을 모아 놓을 /api/sensor.js파일을 만들었다. 변경된 구조는 다음과 같다.

 

다음에는 request handler를 만들고 DB에 연결해 보겠다.