본문 바로가기
코딩과 알고리즘

node.js with module | 모듈 설명

지난 스토리에서는 node.js 를 실행했던 리눅스 터미널을 종료해도 계속해서 웹서버가 작동되게 하는 pm2 라는 백그라운드 실행에 대해 다루어 보았습니다.

https://itadventure.tistory.com/432

 

node.js with pm2 | 백그라운드 실행/중지/재시작/다중포트

인간은 호흡을 하지 않으면 살 수 없습니다. 호흡하지 않는 사람을 우리는 '죽은 사람'이라 일컫지요. 사람뿐만 아니라 모든 자연 만물은 날마다 그 호흡으로 살아 있음을 증명합니다. 재미있는

itadventure.tistory.com

 


모듈 불러오기 require

 

node.js 는 모듈형 스크립트 언어입니다.
그래서 모듈단위로 스크립트를 짜고 해당 모듈을 불러와 사용하는 방식을 채택하고 있는데요.

클래스와 비슷해 보이기도 하나 약간 다릅니다.
이전 소스에서 http 모듈을 불러와 정의하는 부분은 아래와 같았지요.

var http = require('http');

require('http') 라는 부분이 http 라는 모듈을 불러오는 부분이고 var http = 이라는 부분은 불러온 모듈을 받아와 http 라는 변수에 넣는 부분입니다.

왼쪽의 http는 다른 이름으로 변경이 가능하나 오른쪽은 안됩니다. 불러오는 모듈 자체가 바뀌어버리거든요.

var http = require('http');

=> 변경 가능

var web = require('http');

 


모듈 사용법

 

node.js 에는 이런 모듈이 대단히 많은데요.
모듈마다 각각 사용법이 다릅니다.

http 모듈의 경우 사용법은 아래와 같습니다.

// 웹페이지 요청을 받으면 실행할 함수를 정의
http.createServer(function (req, res) {

    : 
    
}).listen(8080);  // 포트는 8080번을 오픈


참고로 여기서 http 는 var 로 선언한 http변수를 의미하는 것이지,
http 모듈을 말하는 것이 아닌데요.

앞에서 아래와 같이 web 으로 모듈변수를 선언했다면

var web = require('http');


아래와 같이 web 이라는 명칭을 사용해야 합니다.

web.createServer(function (req, res) {

    : 
    
}).listen(8080);


모든 웹요청은 이 안에서 처리하면 되는데요.
자세히 보시면 2개의 파라미터가 있을 겁니다.

(req, res)


첫번째 파라미터 req 는 request ( 요청 ) 의 약어로 사용자가 텍스트 상자에 무언가를 입력하거나
선택상자를 체크한 정보등이 넘어옵니다. 이러한 정보를 받는 용도이고,
두번째 파라미터 res 는 response ( 응답 ) 의 약어입니다.
웹페이지에 보여줄 내용은 res 를 통해 처리하면 되지요.

지난 소스에서는 2가지의 동작을 처리하였는데요.

첫번째는 아래 행이었습니다. 

res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});

이 내용은 웹페이지의 헤더(Header)라고 해서 정상(200) 이라는 응답코드와 함께
현재 어떤 내용을 보내려고 하는지 사전 언지를 줍니다.

HTML 웹페이지를 보내주겠다는 표현과 동시에

'Content-Type': 'text/html;


utf-8이라는 다국어코드를 사용하겠다는 것입니다.
utf-8을 사용하면 미국이나 일본같은데서도 한글로 된 홈페이지를 볼 수 있습니다.

charset=utf-8


여기서 res 변수를 사용하고 있지요. 사용자의 웹페이지로 보내줄 내용을 전달하기 위해서는 이 파라미터를 사용해야 합니다.

두번째 행은 아래와 같습니다.

res.end('안녕! Node.js 행복한 시간!--');

역시 res 파라미터를 이용하고 있는데요.
res.end 는 응답을 끝마치겠다는 의미입니다.
그러면서 웹화면에 표시할 내용을 전달하여 사용자의 웹브라우저에 그 내용이 표시되는 것이지요.

모듈에 포함된 이러한 기능을 모듈함수 ( Module Function ) 이라고 부르며,
모듈의 함수목록을 보고 싶으신 경우 아래 명령을 사용하면 됩니다.
그러면 모든 함수 목록이 리눅스 터미널 화면에 표시됩니다.

var http = require('http');
console.dir(Object.keys(http));

<출력화면>
[
  '_connectionListener', 'METHODS',
  'STATUS_CODES',        'Agent',
  'ClientRequest',       'IncomingMessage',
  'OutgoingMessage',     'Server',
  'ServerResponse',      'createServer',
  'validateHeaderName',  'validateHeaderValue',
  'get',                 'request',
  'maxHeaderSize',       'globalAgent'
]

 


사용자 정의 모듈

 

여기서 사용자란 개발자를 의미합니다 :)
node.js 로 스크립트를 개발하는 개발자가 직접 모듈을 만들 수도 있는데요

주사위를 던져 그 숫자를 반환하는 부분을 모듈을 이용해서 구현한다고 생각해볼까요?
모듈명은 dice 로 정하기로 합시다.

우선 node.js 가 실행중이라면 Ctrl+C 키를 눌러 node.js 실행을 모두 끝낸 다음에 진행해 주세요,

먼저 아래내용을 dice.js 라는 파일로 저장한 다음에 ( 새로운 폴더 또는 /home/nodejs1 폴더에 그대로 해 주셔도 됩니다 )

exports.draw = function () {
	return Math.floor(Math.random() * 5.99) + 1;
};

 

이어서 아래내용을 sample.js 라는 파일로 저장합니다.

var http = require('http');

var dice = require('./dice.js');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
  res.write("주사위 : " + String(dice.draw()) + "\n");
  res.end();
}).listen(8080);

 

단순한 테스트니까 pm2 가 아닌 node 로 가도록 합시다.
서버를 시작한 다음

node sample.js

 

웹브라우저에서 퍼블릭IP:8080 주소로 접속해보면 아래와 비슷한 결과가 보이실 겁니다.

 

그리고 새로고침(F5) 키를 누를 때마다 주사위의 숫자가 바뀌는 것을 보실수 있는데요..

 

dice 모듈내의 draw 함수가 1~6까지의 숫자중 랜덤한 숫자를 뽑아 주기 때문입니다.

이 경우 dice.js 라는 모듈을 받아와 dice 라는 변수에 저장해 주었는데요.

var dice = require('./dice.js');

뒷 부분의 .js  는 생략이 가능합니다.

var dice = require('./dice');

 

dice 모듈의 사용법은 아래와 같습니다.
dice 모듈에서는 draw() 라는 함수를 딱 1개 제공하고 있는데요.

dice.draw()

 

이 함수는 주사위를 던져서 나올수 있는 1~6 의 숫자를 결과로 반환해 줍니다.
이 함수의 내용도 소스로 정의되어 있는데요.
아래와 같습니다. dice.js 파일의 내용이지요.

exports.draw = function () {
	return Math.floor(Math.random() * 5.99) + 1;
};

아래 부분은 이 파일을 모듈로 사용할 때 draw 라는 함수를 모듈 밖에서 사용할 수 있도록 정의해 주는 것입니다.

 

exports.draw = function () { ... }


그래서 dice.draw() 라고 모듈함수를 호출할 때 이 함수 안쪽에 있는 부분이 실행되는 것이지요.

함수 안의 내용은 이렇습니다.
Math.random() 은 0~0.999 의 랜덤한 숫자를 생성하는 기능입니다.
거기에 5.99를 곱하면 ( Math.random() * 5.99 ), 0~5.999 의 랜덤한 숫자가 생성되며
소숫점을 자르는 함수 Math.Floor 을 이용하여 0~5로 바꿔주는 것입니다.
이어서 그 결과값이 1을 더해서 ( + 1 ) 1~6의 랜덤한 숫자값을 만든 다음에
결과 값을 함수를 호출한 곳에 전달해주는 것이지요.

return Math.floor(Math.random() * 5.99) + 1;

여기서 5.99 가 아닌 6으로 했을 경우 가끔 이상하게 결과값이 7 이 나오는 경우가 있어
6에 근사한 수치인 5.99로 한 것입니다.

주사위 값을 웹브라우저에 출력할 때 String( ) 으로 묶어준 것을 보실 수 있는데요,

String(dice.draw())

이는 res.write 함수가 숫자를 바로 출력할 수 없도록 되어 있기 때문입니다.
기본적으로 res.write 로 숫자값을 출력할 떄는 문자로 바꿔주는 String() 함수를 사용하여야 합니다.


아무쪼록 필요하신 분에게 도움이 되셨을지요?
오늘도 여기까지 읽어주셔서 감사합니다.


다음 스토리 : node.js with fs 모듈

https://itadventure.tistory.com/434

 

node.js with fs 모듈 | 파일 시스템으로 첫페이지 보여주기

오늘날 웹서비스는 유저들에게 보여줄 파일을 html 파일로 작성하고, 요청이 들어오면 해당 페이지를 보여주도록 되어 있지요? Node.js 도 그러한 부분이 가능한데요. 오늘은 파일 시스템을 통하여

itadventure.tistory.com