[ 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