Node.js에서 동기(Synchronous)와 비동기(Asynchronous)


Node.js의 홈페이지의 첫 화면을 보게되면 아래와 같이 쓰여있는 것을 확인 할 수 있다. 




이중에 non-blocking(논 블로킹) I/o 모델을 사용해 가볍고 효율적이라고 하였는데

non-blocking이라는 것이 비동기화 방식을 말하는 말이다.


동기(synchronous)와 비동기(asynchronous)를 blocking과 non-blocking 이라고 말할 수 있다.

그중 blocking은 우리가 많이 경험해 본 것인데 

함수호출 순서에서 함수의 콜백이 이루어졌을때 콜백의 결과를 기다렸다가 다음줄을 실행하는 경우를 뜻하고

그와 반대로 non-blocking 은 

함수호출 순서에서 함수의 콜백이 이루어졌을때 콜백의 결과를 기다리는 것이 아닌 콜백함수를 호출하면서 다음줄을 실행하는 경우를 뜻 한다. 


아래 예제 소스 파일을 보면 이해가 더 쉬울 것이다.


ex) node.js의 fs.writefileSync와 fs.writefile 사용

//동기 방식(blocking) fs.writeFileSync (Sync)가 붙은걸 확인


const fs = require('fs'); console.log('A point'); fs.writeFileSync('message.txt','Hello Node.js');

console.log('B point');


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


//비동기 방식(non-blocking) fs.writFile (Sync)가 안붙은걸 확인


const fs = require('fs'); console.log('A point'); fs.writeFile('message2.txt','Hello Node.js',function() { console.log('file wrote'); }); console.log("B point");


동기 방식과 비동기 방식을 구현했다. 

결과는 어떻게 나올까?


//동기 방식(blocking)

A point

B point


// 비동기 방식 (non-blocking)

A point

B point

file wrote

라고 출력된것을 확인 할 수 있고, 

비동시 방식에서 보면 file wrote가 코드순서와는 다르게 맨 마지막에 cosole.log가 찍힌것을 볼 수 있다.


Callback 함수


한마디로 "누군가 에게 호출된 함수" 라고 할 수 있겠다

풀어서 말하면  '누군가(다른 함수)에게 (나중에)호출된 (기존의)함수' 라고 할 수 있겠다.


예를 들어 < 참조 : JavaScript sort array : http://www.w3schools.com/jsref/jsref_sort.asp >

a = [3,1,2]; console.log(a);

// [3, 1, 2]


a = [3,1,2]; a.sort(); console.log(a);

// [1, 2, 3]


a = [3,1,2]; function b(v1, v2) {return v1-v2 }; a.sort(b); console.log(a);

// [1, 2, 3] 오름차순


a = [3,1,2]; function b(v1, v2) {return v2-v1 }; a.sort(b); console.log(a);

// [3, 2, 1] 내림차순


a = [3,1,2]; function b(v1, v2) {return 0 }; a.sort(b); console.log(a);

// [3, 1, 2] 정렬안됨


a = [3,1,2]; function b(v1, v2) {console.log('c',v1,v2); return 0 }; a.sort(b); console.log(a);

// c 3 1

// c 1 2

// [3, 1, 2] 정렬안됨

마지막 번 정렬을 확인하게 되면 v1, v2값을 비교해서 비교한 값을 가지고 정렬을 한다는 것을 알 수 있다. 

총 2번 b함수가 호출된것을 알 수 있다. 


배열의 입력같으로 함수를 준다. 

그리고 sort라는 함수의 인자로 다른 함수를 전달 했고 이렇게 전달된 함수를

Callback 함수라고 부르게 된다. 


Callback함수(위에서 function b)를 우리가 만들었지만 우리가 호출한 것이 아닌 a.sort()를 통해 호출 되어졌다.


일회성으로만 줄 경우에는 이름을 굳이 줄 필요가 없다. 따라서 이렇게 구현 가능하다. 

익명함수 라고도 한다. 

a = [3,1,2]; a.sort(function(v1, v2){return v2-v1;}); console.log(a);

// [3, 2, 1] 내림차순

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

//callback 함수가 실행되는 과정 예를 들어 설명


function sort(callback){callback();};

sort(function(){console.log('Hello Callback')});

function() --> console.log('Hello Callback');

function()함수가 정의가 됐고 sort의 인자로 전달되고 sort가 실행이된다. 

callback이라는 매개변수를 가진 callback()(콜백함수)를 호출해 실행시킨다.



Node.js v.6.94 doc : https://nodejs.org/dist/latest-v6.x/docs/api/



http모듈 사용해보기

const http = require('http');
 
const hostname = '127.0.0.1';
const port = 1337;
 
http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello World\n');
}).listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

상수를 나타내는 const를 사용해서 변하지 않는 것을 사용했다. 

Node.js docs를 확인해서 HTTP모듈에 대한 사용설명서 (API)를 확인한다. 

모듈이라는 것은 부품이라고 할 수 있는데 부품을 가져다 사용할때는 'require'을 통해 사용할 수 있다. 



os모듈 사용해보기

var o = require('os');

console.log(o.platform());




다른사람이 만든 모듈 사용해보기 : NPM

Node Package Manager


JavaScript(+Node.js)가 제공하는 모듈이 아닌 타인의 모듈을 사용하는 방법을 알아보자


npm 사이트(https://www.npmjs.com/) 에서 검색후 cmd창에서 npm install ......  하는 명령을 입력해주고 설치 할 수 있다. 


여기서 설치 명령중 끝에 -g가 붙은것을 확인 할 수 있는데 

g는 global이라는 의미이며 컴퓨터 전역에서 사용하는 독립적인 소프트웨어가 설치된다.

g를 없이 사용하게 되면 현재 npm을 설치하는 프로그램 프로젝트안에서 부품으로 사용하겠다는 의미이다.



ex) 독립적인 소프트웨어로 uglify 설치하고 사용해보기

npm install uglify-js -g

uglifyjs _____.js

uglifyjs _____.js -m

uglifyjs ______.js -o 새로저장할파일명.js -m

uglifyjs ______.js -o _________.min.js -m



ex) _underscore 프로그램 프로젝트 안에서 부품으로 사용해보기

설치하기 이전에 프로젝트 디렉토리를 npm의 패키지의 일종으로 지정을 해줘야한다.

설정할 프로젝트 디렉토리에 들어가서 

npm init 실행

name지정(프로젝트이름) discription입력 entry point(어떠한게 패키지를 구동시키는 자바스크립트인지 지정, 후에 바꿀 수 있다.) test테스트명령어 입력 git repository올리고 싶으면 주소써라 엔터엔터 yes하고 끝

이렇게 실행하고 나면 package.json이 생긴다. 그러면 끝 (프로젝트폴더가 생성된것이다.)

나중에 우리가 만든 프로젝트를 공유할 수 있고, 다른사람것을 사용할 수 있는 준비가 되었다는 것이다.

npm install underscore

설치가 완료되면 node. 과 unsderscore폴더가 생긴다. 


TIP!!! 설치중에 No repository field. 라는 것이 발생 할 수 있는데 이것은 git repository가 저장되어 있지 않아 발생하는 경고이다. 

오류가 발생한것이 아닌 단순 경고!! 그냥 github에 연결되어있지 않다는 이야기.


설치완료창을 보면 extraneous(외부의,부가적인)써있는데 온전하게 포함하지 않았다는 얘기이다.

따라서 npm install underscore --save를 하면 조금 달라지게 생성된다.(플래그생성)

이전에 없었던 dependencies라는 란이 생기게 된다. 

플래그로 선언된 프로젝트버전을 언제든지 내프로젝트에 포함할 수 있다는 이야기이다.

일시적으로 사용해야 할 경우에는 save를 빼고 설치하면된다 (코딩하는 경우에서 잠깐사용할 때 쓰면 될 것 같다.)



underscore는 매우유용한 라이브러리이다. (진짜 개조은듯)

모듈 디렉토리를 사용해야하니 모듈 디렉토리를 선언해주고 사용한다.

const _ = require('underscore');

var arr = [3,6,9,1,12];

console.log(arr[0]);    // 3

console.log(_.first(arr));    // 3

console.log(arr[arr.length-1]);    // 12

console.log(_.last(arr));    // 12



윈도우10에서 관리자모드가아닌 일반모드로 cmd를 실행하였을때

권한에 대해서 오류가 발생하는 것을 확인 했다.

따라서 일반모드가 아닌 관리자 모드를 통해서 npm 설치를 진행하여야한다.






+ Recent posts