반응형

nestjs homepage

* 본 문서는 nestjs 홈페이지(https://docs.nestjs.com/)를 참조하였습니다.

* nestjs 한글 홈페이지 주소 : https://docs.nestjs.kr/

 

네스트JS 한국어 매뉴얼 사이트

네스트JS 한국, 네스트JS Korea 한국어 매뉴얼

docs.nestjs.kr

 

이 글의 동영상 강의입니다.

https://youtu.be/QniEcuwvLSU

 

Nest(NestJS)의 특징

  • Nest는 nodejs 서버 애플리케이션을 구축하기 위한 프레임워크입니다.
  • Nest는 서버 애플리케이션 개발시 필요한 많은 부분들을 기본적으로 제공하고 있습니다.
  • Nest는 Express 기반으로 만들어졌습니다.
  • Nest는Typescript를 사용합니다. javascript도 코딩이 가능합니다.
  • Nest는 다음 요소를 포함합니다.
    • OOP - 객체지향 프로그래밍
    • FP - Functional 프로그래밍
    • FRP - Functional React 프로그래밍
  • Nest는 외부 모듈을 자유롭게 이용할 수 있습니다.
  • Nest는 unit 테스트와 e2e 테스트를 할 수 있는 툴을 제공합니다.

Nest의 탄생배경

  • 최근 Nodejs로 인해 javascript를 이용한 풀스택(클라이언트+서버) 개발이 활발해졌습니다.
  • javascript라는 한가지 언어로 개발을 하기 때문에 생산성을 향상시키고 빠른 개발이 가능해졌습니다.
  • 그러나 Node.js의 높은 자유도로 인해 Architecture 구성이 어렵고 효과적이지 못했습니다.
  • 이를 해결하기 위해 Angular의 아키텍처 사상을 기반으로 Nest가 만들어졌습니다.

 

Nest를 사용하면 좋은 점

  • Nest는 Java의 Spring과 같이 규칙을 제공합니다. 
    이로 인해 개발자들이 아키텍처의 구성에 대해 고민해야 할 부분이 많이 줄어듭니다.
  • 기본적으로 제공하는 라우팅, 보안등의 기능이 많이 탑재되어 있어 편리합니다.
  • 외부모듈을 통한 확장이 얼마든지 가능합니다.
  • Java+Spring 사용자라면 아키텍처 구조가 비슷해서 쉽게 배울 수 있습니다.
  • Angular 사용자라면 기본적인 사용법이 동일하므로 쉽게 배울 수 있습니다.

반응형
반응형

이 글의 동영상 강의 입니다.

https://youtu.be/wb4qGjfocwI

 

Express에서 라우팅을 별도의 파일로 분리할 수 있습니다.

 

한개의 파일로 분리하는 경우

  • 다음과 같이 router.js 파일을 만듭니다.
const express = require('express');
var router = express.Router();

router.get('/', function (req, res) {
  res.send('Express Server!');
});

module.exports = router;
  • index.js 파일에서 router.js를 사용하도록 코드를 추가합니다.
const express = require('express');
const app = express();
 
app.listen(3000);

app.use(require('./router'));

 

여러개의 파일로 분리하는 경우

  • user-router.js 파일을 만들고 다음 코드를 추가합니다.
const express = require('express');
var router = express.Router();

router.get('/', function (req, res) {
  res.send('This is user-router!');
});

module.exports = router;
  • board-router.js 파일을 만들고 다음 코드를 추가합니다.
const express = require('express');
var router = express.Router();

router.get('/', function (req, res) {
  res.send('This is board-router!');
});

module.exports = router;
  • index.js를 다음과 같이 수정합니다.
const express = require('express');
const app = express();
 
app.listen(3000);

app.use('/', require('./router'));
app.use('/user', require('./user-router'));
app.use('/board', require('./board-router'));

 

반응형
반응형

아래는 이 글의 동영상 강의입니다.

https://youtu.be/ceNqxXQMuKw

 

* 본 문서는 아래 사이트를 참고하여 작성하였습니다.
https://expressjs.com/ko/guide/using-middleware.html

 

Express 미들웨어 사용

미들웨어 사용 Express는 자체적인 최소한의 기능을 갖춘 라우팅 및 미들웨어 웹 프레임워크이며, Express 애플리케이션은 기본적으로 일련의 미들웨어 함수 호출입니다. 미들웨어 함수는 요청 오

expressjs.com

 

Express는 client의 요청을 받아 처리할때 미들웨어라는 개념을 사용합니다.

Express 애플리케이션은 기본적으로 일련의 미들웨어 함수 호출입니다.

 

Express에는 다음과 같은 유형의 미들웨어가 있습니다.

  • 애플리케이션 레벨 미들웨어
  • 라우터 레벨 미들웨어
  • 오류 처리 미들웨어
  • 기본 제공 미들웨어
  • 써드파티 미들웨어

 

애플리케이션 레벨 미들웨어

  • 애플리케이션 미들웨어는 다음과 같이 사용할 수 있습니다.
  • app.use(미들웨어);
  • app.use(미들웨어1, 미들웨어2...);
  • app.use에서 선언된 function이 미들웨어 입니다.
const express = require('express');
const app = express();
app.listen(3000);

app.use(function(req, res){
  res.send('Express Server!!!');
});
  • 한개의 요청을 여러개의 미들웨어가 처리할 수 있습니다.
    • 요청 경로(path)가 포함되지 않은 요청은 항상 실행됩니다.
    • function에서 next 인자를 처리하면 하위 스택을 처리하게 됩니다.
app.use(function (req, res, next) {
  console.log('Time:', Date.now());
  next();
});
  • client의 요청 경로(path)가 포함된 경우는 다음과 같이 처리합니다.
    • app.use(path, 미들웨어함수);
app.use('/user/:id', function (req, res, next) {
  console.log('Request Type:', req.method);
  next();
});
  • 다음은 라우트를 사용하는 방법입니다.
    라우트는 client의 요청을 http method별로 처리할 수 있습니다.
    • app.메소드(path, 미들웨어);
app.get('/user/:id', function (req, res, next) {
  res.send('USER');
});
  • next를 사용해서 미들웨어를 여러개 실행할 수도 있습니다.
app.use('/user/:id', function(req, res, next) {
  console.log('Request URL:', req.originalUrl);
  next();
}, function (req, res, next) {
  console.log('Request Type:', req.method);
  next();
});
  • 라우트 핸들러는 하나의 경로에 여러개의 라우트를 정의할 수 있습니다. 하지만 동일한 메소드를 2개 이상 만들고 앞에서 response를 처리하면 다음 메소드는 실행되지 않습니다.
app.get('/user/:id', function (req, res, next) {
  console.log('ID:', req.params.id);
  next();
}, function (req, res, next) {
  res.send('User Info');
});

// handler for the /user/:id path, which prints the user ID
app.get('/user/:id', function (req, res, next) {
  res.end(req.params.id);
});

 

라우터레벨 미들웨어

  • express.Router()를 사용하면 라우터 레벨의 미들웨어를 사용할 수 있습니다.
var app = express();
var router = express.Router();
  • 위 선언으로 라우터레벨 미들웨어를 다음과 같이 사용할 수 있습니다.
    라우터에서도 use와 method를 사용합니다.
// a middleware function with no mount path. This code is executed for every request to the router
router.use(function (req, res, next) {
  console.log('Time:', Date.now());
  next();
});

// a middleware sub-stack shows request info for any type of HTTP request to the /user/:id path
router.use('/user/:id', function(req, res, next) {
  console.log('Request URL:', req.originalUrl);
  next();
}, function (req, res, next) {
  console.log('Request Type:', req.method);
  next();
});

// a middleware sub-stack that handles GET requests to the /user/:id path
router.get('/user/:id', function (req, res, next) {
  // if the user ID is 0, skip to the next router
  if (req.params.id == 0) next('route');
  // otherwise pass control to the next middleware function in this stack
  else next(); //
}, function (req, res, next) {
  // render a regular page
  res.render('regular');
});

// handler for the /user/:id path, which renders a special page
router.get('/user/:id', function (req, res, next) {
  console.log(req.params.id);
  res.render('special');
});

// mount the router on the app
app.use('/', router);

 

오류 처리 미들웨어

  • 오류 처리 미들웨어는 function의 parameter 첫번째 인자로 error를 받아 처리합니다.
app.use(function(err, req, res, next) {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

 

기본 제공 미들웨어

  • express에서 기본적으로 제공하는 미들웨어가 있습니다.
  • 다음은 기본제공 미들웨어 중 정적 모듈을 처리하는 static 미들웨어의 예제입니다.
app.use(express.static(__dirname+'/public'))
  • static으로 html 처리
    • http://localhost:3000/index.html 로 요청이 올경우 /public/index.html을 찾아 응답하게 됩니다.
  • static으로 이미지 처리
    • http://localhost:3000/logo.png 로 요청이 올경우 /public/logo.png를 찾아 응답하게 됩니다.
  • index.html 처리하기
    • http://localhost:3000 을 응답하는 코드는 다음과 같습니다.
app.get('/', function(req, res) {
  res.sendFile(__dirname+'/public/index.html')
});

 

써드 파티 미들웨어

  • express에서는 다양한 써드파티 미들웨어를 사용할 수 있습니다.
  • 필요한 기능에 따라 npm install을 사용하여 모듈을 설치하여 사용합니다.
  • 아래는 쿠키 구문 분석 미들웨어인 cookie-parser의 사용 방법 입니다.
  • 우선 cookie-parser 설치합니다.
npm install cookie-parser
  • 사용법은 다음과 같습니다.
var express = require('express');
var app = express();
var cookieParser = require('cookie-parser');

// load the cookie-parsing middleware
app.use(cookieParser());
  • 써드파티 미들웨어는 다음 링크에서 확인할 수 있습니다.

https://expressjs.com/ko/resources/middleware.html

 

Express 미들웨어

Express 미들웨어 목록에 적힌 Express 미들웨어 모듈들은 Expressjs 팀이 유지보수합니다. 미들웨어 모듈 설명 내장 함수 (Express 3) body-parser HTTP 요청 body를 파싱합니다. body, co-body, 그리고 raw-body도 참

expressjs.com

 

이상으로 express의 미들웨어에 대해 알아보았습니다.

반응형
반응형

NodeJS의 내부모듈인 http module을 사용해서 서버를 만들때 복잡하고 불편한 점들이 있습니다.

이를 개선한 NodeJS의 확장모듈인 express를 사용하는 방법을 알아봅니다.

 

다음은 이 글의 동영상 강의입니다.

https://youtu.be/Ej-N6c9JCbY

 

Express의 특징

  • Express는 모바일 및 웹용 애플리케이션 제작을 위한 일련의 기능을 제공하는 프레임워크입니다.
  • Express는 수많은 HTTP 유틸리티 메소드와 미들웨어를 통해 쉽고 빠르게 강력한 API를 제작할 수 있습니다.
  • Express는 빠른 성능을 제공합니다.
  • 많은 NodeJS 프레임워크들이 Express를 기반으로 하고 있습니다.

참조 : https://expressjs.com/ko

 

Express - Node.js 웹 애플리케이션 프레임워크

Node.js를 위한 빠르고 개방적인 간결한 웹 프레임워크 $ npm install express --save

expressjs.com

 

 

프로젝트 만들기

  • 프로젝트 폴더를 생성한 후 visual studio code를 실행합니다.
  • vscode의 메뉴에서 파일-폴더열기를 선택한 후 프로젝트폴더를 선택합니다.
  • 메뉴 터미널-새터미널을 선택한 후 다음을 입력하여 Nodejs프로젝트를 생성합니다.
npm init -y

 

express 설치

  • 우선 express 설치를 위해 npmjs.com에서 express를 검색합니다.
    리스트 중 제일 상단의 express (작성자:dougwilson)를 선택합니다.

npmjs.com

  • express의 설치 방법 사용예제 등을 확인합니다.

 

  • visual studio code의 터미널에서 다음 코드를 이용하여 expres를 설치합니다.
npm i express

 

프로그램 개발

  • vscode에서 index.js파일을 만들고 express 예제 코드를 아래와 같이 입력합니다.
const express = require('express')
const app = express()
 
app.get('/', function (req, res) {
  res.send('Hello World')
})
 
app.listen(3000)

 

서버 실행 및 확인

  • vscode의 터미널에서 다음 코드를 입력합니다.
node index
  • 브라우저를 실행하고 주소창에 다음 url을 입력합니다.
http://localhost:3000
  • 브라우저 결과는 다음과 같습니다.

이상으로 express의 설치와 실행방법에 대해 알아보았습니다.

반응형
반응형

이 글의 동영상 강의 1편입니다.

https://youtu.be/560LIgIiU8g

다음은 동영상 강의 2편입니다.

https://youtu.be/LoZhQXs85r8

 

이 글은 NodeJS 공식 홈페이지의 다음 글을 참고하여 작성하였습니다.

https://nodejs.org/ko/docs/guides/anatomy-of-an-http-transaction/

 

HTTP 트랜잭션 해부 | Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

 

NodeJS로 서버를 개발하려고 하려면 HTTP의 처리 과정을 이해하여야 합니다.

NodeJS에서 제공하는 http 모듈의 사용법과 같이 배워보도록 하겠습니다.

 

웹서버 만들기

  • 우선 웹서버 객체를 만듭니다.
const http = require('http');

const server = http.createServer((request, response) => {
});
  • 이때 사용된 createServer는 server 객체를 생성하고 발생한 이벤트를 전달하는 역할을 하므로 다음과 같이 변경할 수 있습니다.
const server = http.createServer();
server.listen(8080);
server.on('listening', () => {
   console.log(`listen on 8080 !!!`);
});

 

Request 처리하기

  • 생성한 서버에서 request를 받아 처리할 수 있습니다.
server.on('request', (request, response) => {
   console.log(request.headers);
   response.write('<h1>Node Server</h1>');
   response.end();
});
  • request에는 url, method, header 등의 정보가 포함됩니다.
server.on('request', (request, response) => {
  const { headers, method, url } = request;
  const userAgent = headers['user-agent'];
  console.log(`method : ${method}`);
  console.log(`url : ${url }`);
  console.log(`userAgent : ${userAgent}`);

  response.write('<h1>Node Server</h1>');
  response.end();
});
  • post나 put의 request에서 stream으로 전달되는 data와 end를 이용하면 body를 읽어올 수 있습니다.
  let body = [];
  request.on('error', (err) => {
    console.error(err);
  }).on('data', (chunk) => {
    body.push(chunk);
  }).on('end', () => {
    body = Buffer.concat(body).toString();
    console.log(body);

    response.write('<h1>Node Server</h1>');
    response.end();
  });
  • 테스트를 위해서 postman에서 다음과 같이 변경 합니다.
    • request method를 GET에서 POST로 바꿉니다.
    • headers에 다음 값을 추가합니다.
      • Content-Type: application/json

  • Body탭에서 다음 항목을 변경합니다.
    • body type을 none에서 raw로 변경합니다.
    • data type을 JSON으로 변경합니다.

  • Send를 클릭하면 다음과 같은 결과를 확인할 수 있습니다.

  • request에서 error 이벤트를 받아 오류를 처리할 수 있습니다.
request.on('error', (err) => {
  // 여기서 `stderr`에 오류 메시지와 스택 트레이스를 출력합니다.
  console.error(err.stack);
});

 

Response 사용하기

  • statusCode를 이용해 상태 코드를 전달할 수 있습니다.
    지정하지 않을 경우의 상태코드는 항상 200입니다.
response.statusCode = 404; // 클라이언트에게 리소스를 찾을 수 없다고 알려줍니다.
  • setHeader를 이용해 header를 설정할 수 있습니다.
response.setHeader('Content-Type', 'application/json');
response.setHeader('X-Powered-By', 'bacon');
  • 아래와 같이 명시적으로 header를 정의 할 수 있습니다.
response.writeHead(200, {
  'Content-Type': 'application/json',
  'X-Powered-By': 'bacon'
});
  • write와 end를 이용해 response body를 만들 수 있습니다.
response.write('<html>');
response.write('<body>');
response.write('<h1>Hello, World!</h1>');
response.write('</body>');
response.write('</html>');
response.end();
// 또는
response.end('<html><body><h1>Hello, World!</h1></body></html>');
  • respone에서 error event는 다음과 같이 처리할 수 있습니다.
response.on('error', (err) => {
  console.error(err);
});
  • 지금 까지의 내용을 정리하면 다음과 같이 코드를 작성할 수 있습니다.
const http = require('http');

http.createServer((request, response) => {
  const { headers, method, url } = request;
  let body = [];
  request.on('error', (err) => {
    console.error(err);
  }).on('data', (chunk) => {
    body.push(chunk);
  }).on('end', () => {
    body = Buffer.concat(body).toString();

    response.on('error', (err) => {
      console.error(err);
    });

    response.writeHead(200, {'Content-Type': 'application/json'})
    const responseBody = { headers, method, url, body };
    response.end(JSON.stringify(responseBody))
  });
}).listen(8080);

에코 서버 만들기

  • 다음과 같이 /echo로 요청하는 post 메소드에 대해서 응답하는 서버를 만들 수 있습니다.
const http = require('http');

http.createServer((request, response) => {
  request.on('error', (err) => {
    console.error(err);
    response.statusCode = 400;
    response.end();
  });
  response.on('error', (err) => {
    console.error(err);
  });
  if (request.method === 'POST' && request.url === '/echo') {
    request.pipe(response);
  } else {
    response.statusCode = 404;
    response.end();
  }
}).listen(8080);

이상으로 nodejs의 http 요청을 처리하는 기본적인 방법에 대해 알아보았습니다.

 

반응형

+ Recent posts