본문 바로가기

NodeJS/Do it Node.js 내용정리

[ do it NodeJS - 1 ]NodeJS에 대해 알아봅시다.

[ Ch00 ] 노드로 만들 수 있는 대표적인 서버와 용도

api란? : 프로그램을 쉽게 제작할 수 있게 미리 만들어 놓은 것들의 모음.

클라이언트(Client) : 다른 곳에 있는 단말에 데이터를 달라고 요청하는 프로그램.

서버(Server) : 다른 곳에서 요청 받은 명령을 처리해 주는 프로그램.

서버는 포트를 지정하여 그 포트로 요청을 받을 수가 있음.

포트 번호

 설명

0번 ~ 1023번 

 잘 알려진 포트

1024번 ~ 49151번

 등록된 포트

49152번 ~ 65535번

 동적 포트

포트란 ? 단말에 접속하기 위한 '논리적인 접속 위치'. 즉, 인터넷을 사용할 때는 클라이언트 프로그램은은 서버의 프로그램이 지정하는 포트로 접속하게 됩니다. 

웹브라우저에서 접속하는 서버를 웹 서버라고 하며, HTTP 프로토콜을 사용합니다.

프로토콜(Protcol)이란? 데이터를 서로 어떤 형태로 주고 받을 것인지를 정한 것. 간단하게 데이터의 형태라고 이해하기. 

 

웹서버는 웹 프레임워크인 익스프레스(Express)로 기본 구조를 만들고 몽고디비(MongoDB)를 이용해서 데이터를 저장하거나 조회. 뷰 템플릿(View template)은 클라이언트에 응답을 보낼 때 사용하려고 미리 웹문서의 원형을 만들어 놓은 것이며, 패스포트(Passport)는 사용자 로그인이나 회원가입을 위해 사용합니다. 

 

익스프레스(Express)가 웹 서버에 필요한 파일드을 자동으로 만들어 줌으로써  좀 더 쉽게 웹 서버를 제작할 수 있도록 도와줍니다. 

 

JSON-RPC 서버는 서버 쪽에 함수를 만들어 두고 클라이언트에서 함수를 호출하듯이 데이터를 요청하면 응답하는 서버입니다. 주로 데이터만 주고 받을 때 사용합니다. 서버에 등록된 함수를 보통 핸들러라고 부르는데, 더하기나 빼기 같은 계산 기능을 하나의 함수로 만들어 등록하면 클라이언트에서 더하거나 빼기 기능을 호출하여 계산 결과를 받아 볼 수 있습니다. 

 

위치 정보는 경도와 위도 자표를 사용하는데, 위도와 경도 두 가지 숫자 값을 데이터베이스에 그대로 저장하면 데이터 양이 늘어나게 됩니다. 또한 두 개의 값을 한꺼번에 비교하여 조회하면 검색 속도는 현저하게 떨어 집니다. 이 책에서는 노드에서 작동하는 몽고디비 데이터베이스를 사용해서 위치 정보를 저장하고 조회하는 방법을 살펴봅니다.

 

----------------------------------------------------------------------------------------------------------------------

 

[ ch 01 ] 노드란 무엇일까?

노드란 무엇일까? 

자바스크립트를 이용해서 서버를 만들 수 있는 개발 도구 입니다.

 

2009년에는 해결하기 위해 라이언 달(Ryan Dahl)이 새로운 방식의 서버 개발 도구를 만들었습니다. 그게 바로 Node.js. 당시에는 내 PC의 문서파일을 업로드 할 때, 파일 업로드를 완료하기 전에는 서버에 있는 다른 요청하는 것이 불가능해서 대기해야 했습니다. 지금은 이런 문제를 해결 할 수 있는 방법이 많이 나와 있어서 큰 문제가 되지 않습니다.

 

노드의 비동기 입출력 방식

비동기 입출력 방식이 노드의 대표적인 특징. 하나의 요청 처리가 끝날 때까지 기다리지 않고 다른 요청을 동시에 처리할 수 있는 비동기 입출력(논블로킹 입출력, Non-Blocking IO) 방식.

 

파일을 '비동기 방식으로 읽는다'는 것은 파일 시스템에 읽기 요청을 한 후 프로그램이 대기하지 않고 다른 작업을 진행한다는 것을 의미합니다.

 

프로그램에서 해당 파일의 내용을 처리할 수 있는 시점이 되면 콜백함수(Callback Function)가 호출.

 

콜백함수(Callback Function) : 자바스크립트에서는 변수에 함수를 할당할 수 있습니다. 따라서 변수에 할당된 함수를 다른 함수의 파라미터로 전달 할 수 있습니다. 이렇게 파라미터로 전달된 함수를 다른 함수의 내부에서 호출하는 것입니다.

 

모듈(Module) : 메인이 되는 자바스크립트 파일의 일부 코드를 떼어 별도의 파일로 만들 수 있습니다. module_1.js라는 이름의 파일로 저장한 후 이 파일에 들어 있는 코드를 사용하고 싶다면 require() 함수로 모듈을 호출하면 됩니다. 이렇게 불러들인 파일은 자바스크립트 객체로 인식되며, 그 객체를 참조하여 파일에 넣어 둔 기능을 사용 할 수 있습니다.

 

정리하자면 노드는 기본적으로 자바스크립트를 프로그래밍 언어로 사용하며 3가지 주요 특징인, '비동기 입출력', '이벤트 기반 입출력', '모듈과 패키지'이 있습니다.

 

클라우드의 성장과 더불어 빠르게 발전해 이제 노드는 서버를 구출할 때 필수로 배워야 할 개발 도구이자 플랫폼이 되었습니다.

 

----------------------------------------------------------------------------------------------------------------------

 

[ ch02 ] 노드 간단하게 살펴보기

 

console 객체는 전역 객체(Global Object)라고 부르며 필요할 때 코드의 어느 부분에서나 사용할 수 있습니다. 함수 안과 밖에서 모두 사용할 수 있도록 범위를 제한하지 않습니다. 

 

 전역 객체 이름

설 명 

 console

콘솔 창에 결과를 보여주는 객체 

 process

프로세스의 실행에 대한 정보를 다루는 객체 

 exports

모듈을 다루는 객체 


console 객체의 메소드

메소드 이름

설 명

dir(object)

자바스크립트 객체의 속성을 출력 

time(id)

실행 시간을 측정하기 위한 시작 시간을 기록 

timeEnd(id)

실행 시간을 츠정하기 위한 끝 시간을 기록

 

process 객체의 메소드

메소드 이름

설 명

argv

프로세스를 실행할 때 전달되는 파라미터(매개변수) 정보 

env

사용자의 환경 변수 정보, 시스템 환경변수 정보 

exit()

프로세스를 끝내는 메소드 

 

JSON 포맷 : 

자바스크립트의 객체 포맷으로 단말끼리 데이터를 주고받을 때 많이 사용합니다. JSON 포맷은 자바스크립트에서 객체를 만들 때 사용하는 형식과 같습니다. 즉, { } 중괄호를 이용해 객체를 만들 수 있으며, 그 안에 키(key)와 값(value)로 구성된 속성들은 콤마( , )로 구분 합니다.

{ "name" : "소녀시대", "age" : "20" }

 

'함수' or '메소드'

객체 지향 언어에서는 함수를 메소드(Method)라고도 부릅니다. 자바스크립트는 객체 지향 언어의 특징인 객체(Object)를 만들 수 있는데, 객체를 만들었을 때 그 안에 정의한 함수는 특별히 메소드라고부릅니다. 그러나 이름을 어떻게 부르든 의미 전달에는 큰 차이가 없기 때문에 이 책에서는 함수와 메소드를 정확히 구별하지 않고 사용합니다.

 

노드에서 모듈사용하기

메인 파일의 코드 중에서 독립적인 기능은 별도 파일로 분리할 수 있으며, 메인 파일에서는 전체적인 실행 순서나 흐름만 제어합니다. 이렇게 분리된 파일을 노드에서는 모듈이라고 부릅니다. 모듈이란 별도의 파일로 분리된 독립 기능의 모음이라서 모듈을 만들어 놓으면 다른 파일에서 모듈을 불러와 사용 할 수 있습니다.

 

노드는 CommonJs의 표준스펙을 따라 모듈을 사용할 수 있게 합니다. 이 과정에서 exports 전역 객체를 사용합니다.

 

[main.js]

const module1 = require('module1');
module1.함수이름();

[module1.js]

exports.함수이름 = 함수정의 ;

모듈을 만들 때는 module1.js 처럼 별도의 자바스크립트 파일을 만든 후 그 코드에서 exports 객체를 사용. exports 객체 속성으로 변수나 함수를 지정하면 그 소석을 main.j에서 불러와서 사용가능합니다.

 

모듈을 불러올 때는 require() 함수를 사용하고, 모듈로 만들어 둔 파일 이름을 이 함수의 파라미터로 전달합니다. require() 함수를 호출하면 모듈 객체가 반환되는데, 그 모듈에서 exports 객체에 서렁한 속성들은 이 모듈 객체를 통해 접근 할 수 있습니다.

 

exports외에 module.exports를 사용 할 수도 있습니다. 

exports에는 속성을 추가할 수 있어 여러 개의 변수나 함수를 각각 속성으로 추가 가능.

module.exports에는 하나의 변수나 함수 또는 객체를 직접할당. 일반적으로 객체 그대로 할당하며, 일허게 할당한 객체 안에 넣어둔 변수나 함수를 메인 파일에서도 사용할 수 있습니다.

 

[module1.js]

exports.add = function(a,b){
  return a+B;
};

exports.multiply = function(a,b){
  return a*b;
};

[module2.js]

var calc = {};

calc.add = function(a,b) {
  return a+b;
};

calc.multiply = function(a,b){
  return a*b;
};

module.exports = calc;

 

시스템 정보를 알려주는 os 모듈

메소드 이름 설 명
hostname() 운영체제의 호스트 이름.
totalmem() 시스템의 전체 메모리의 용량.
freemem() 시스템에서 사용 가능한 메모리 용량
cpus() CPU 정보
networkinerfaces() 네트워크 인터페이스 정보를 담은 배열 객체를 반환

파일 패스를 다루는 path 모듈

메소드 이름 설 명
join()

여러 개의 이름을 모두 합쳐 하나의 파일 패스로 만듬.

파일 패스를 완성할 때 구분자 등을 알아서 조정

dirnme() 파일 패스에서 디렉터리 이름을 반환
basename() 파일 패스에서 파일의 확장자를 제외한 이름을 반환
extname() 파일 패스에서 파일의 확장자를 반환
var path = require('path');

var directories = ['Users', 'Mars', 'docs'];
var dirStr = directories.join();
console.log('dir : ', dirStr);

var dirStr2 = directories.join(path.sep);
console.log('dir2 : ', dirStr2);

var dirStr3 = path.join('/Users/Mars', 'notepad.exe');
console.log('dir3 : ', dirStr3);

var filepath = path.join('/Users/Mars', 'notepad.exe');
console.log('filepath : ', filepath);

var dirname = path.dirname(filepath);
console.log('dirname : ', dirname);

var basename = path.basename(filepath);
console.log('basename : ', basename);

var extname = path.extname(filepath);
console.log('extname : ', extname);

 

 

 

 

 

참고한 책 : do it Node.js 

728x90
300x250