nodejs 는 싱글스레드로 동작하는 시스템이기 때문에 동기적 방식으로 프로그램 로직을 작성한다면 성능면에서 문제가 될것이다.

그 이유는 이러하다. 하나의 로직이 있다고 가정하자.

그런데, 그 로직을 동기적 방식으로 처리한다면 100분이 걸린다. 그 로직을 전부 처리할 때까지 마냥 기다리게 되면 비효율적인 프로그램이 될것이다. 

따라서 비동기적인 방식으로 로직을 작성해야하는 이유를 반드시 알아야 하고, 또한 콜백함수의 개념을 정확하게 인지하고 있어야 한다. 


nodejs에서 기본적으로 제공되는 FileSystem 모듈에 대하여 알아보자. 

const fs = require('fs'); 


동기화 방식과 비동기화 방식에 대해 알아보자. 


1. 동기화 방식

fs.readFileSync(file[,options])

var data = fs,readFileSync('data.txt',{encoding:'utf-8'});

파일을 읽어올 때 동기화 방식으로 data.txt 파일을 읽어서 data라는 변수에 담아주고 있음.


option으로 인코딩에 대해 지정할 수 있다. 

data.txt 파일을 utf-8방식으로 저장했으므로, 파일을 읽어올때도 인코딩옵션에 대하여 utf-8로 명시해줘야 한다.

{encoding:'utf-8'}



2. 비동기화 방식

fs.readFile(file[,options], callback)  << recommended

반면, 비동기화 방식의 경우에는 data.txt 파일을 전부 읽어올 때까지 기다려서 해당 data(data.txt 파일에 있는 내용)를 변수에 담아주는 것이 아닌, 함수를 먼저 반환(리턴) >> 다른 작업을 수행하고, fs.readFile(file[,options], callback)  함수는 다른 백그라운드 응용프로그램에게 이 작업의 책임을 전가한다. 이 후에 작업이 완료되면 콜백함수가 실행되면서 결과를 가져온다. 


===================================================================================

sync_and_async.js  파일을 분석해보자.


const fs = require('fs');

// Sync

console.log(1);

var data = fs.readFileSync('data.txt',{encoding:'utf-8'});

console.log(data);

// 작업 요청을 했을 때 그 요청의 결과값(리턴값)을 직접 받는 것. 

// 요청의 결과값이 리턴값과 동일하다. 

// 코드에서 보다시피 fs.readFileSync('data.txt',{encoding:'utf-8'}) 를 호출하여 결과값(리턴값)을 직접 받아 data변수에 담아주는 것을 볼 수 있다. 

// 동기화 방식의 경우에는 받을 data가 있으면 그 data를 다 받을 때까지 해당 함수를 벗어날 수 없다. 

// 동기 + 블로킹 : 결과가 처리되어 나올때까지 기다렸다가 리턴값으로 결과를 전달한다.



// Async

console.log(2);

fs.readFile('data.txt',{encoding:'utf-8'}, function(error, contents){     //contents는 data.txt 파일 안의 data를 읽어온 것을 의미한다.

console.log(3);

console.log(contents);

});

console.log(4);

// ​작업 요청을 했을 때 그 요청의 결과값을 간접적으로 받는 것. 

// 코드에서 보다시피 fs.readFile('data.txt',{encoding:'utf-8'}, function(err, contents){

// console.log(3);

// console.log(contents);

// })

// 를 호출하여 결과값을 직접 받아서 변수에 담아주는 것이 아니라 함수를 호출하고 해당 함수를 곧 바로 반환한다음에 console.log(4)를 곧바로 실행하고, readFile함수의 

// 일련의 작업을 마친 후에 콜백함수(익명함수로됨)안에 console.log(3) 과 console.log(contents)가 실행되어 결과를 전달해준다.

// ※ callback 함수란 

// (마치 자바 프로그래밍에서 return null;이더라도 메소드 내부는 전부 실행되는 것 생각해주기, 해당 함수를 사용하려고 빌렸다가 곧바로 반환하는것으로 이해하기, 

// ATM기에 카드를 넣었는데, 카드를 인식한 후 카드는 곧바로 반환, 

// 그다음에 일련의 process에 의해 응용프로그램이 인식한 후, ATM기 내부 다른 작업들을 수행하고 다 끝나면 결과를 전달한다.)

// 요청의 결과값이 리턴값과 다르다. 1.함수리턴 2.결과는 나중에 가져옴.

// 해당 요청작업은 별도의 쓰레드에서 실행하게 됨

// 어떤 비동기 입출력 함수를 호출하면 입출력 작업을 운영체제에 요청한 후 해당 함수는 곧바로 리턴한다.  

// 운영체제는 입출력 작업을 완료하면 특별한 방법을 통해 응용 프로그램에 이 사실을 알린다.  

// 따라서 비동기 입출력 방식을 사용하면 함수 호출 시점과 입출력 시작 시점은 일치하지만, 

// 입출력 완료 시점과 함수 리턴 시점은 일치하지 않는다

// 비동기 + 넌블로킹 : 작업 요청을 받아서 별도의 프로세서에서 진행하게 하고 바로 리턴한다.

// 결과는 별도의 작업 후 간접적으로 전달한다.



★ 동기 비동기 그림으로 이해하기 .



동기 방식                                                           비동기 방식



☆ 동기 비동기 이해 +++

http://blog.naver.com/success87pch/220723722826




파일에 코드를 작성하여 cmd 창을 open하여 node 파일명.js로 해당 파일을 실행시킬 수 있다. 


이 방법 이외에도 마치 크롬 개발도구처럼 cmd 창에서 node라는 명령어를 입력하고 code를 직접 작성하면서 해당 코드를 곧바로 실행 시킬 수 있다. 



위에서 callback 함수 >> b,c,d 이다.


callback 함수린?

function b(){return 0};     << 콜백함수

a.sort(b) 

sort라는 함수의 인자로 b라는 함수를 전달했다. 이렇게 전달되는 함수를 callback함수라고 한다. 

이 때, 전달되는 함수인 콜백함수는 우리가 직접 호출하는 것이 아니라, 'sort라는 함수가' 필요할 때마다 내부적으로 function b를 호출하고 있는 것이다. 

(콜백함수는 언제든지 나중에 호출당할 수 있다. 특정 함수가 전부 실행된 후에.) 


또한 콜백함수를 나중에 여러 번 호출하고 싶을 경우에는 콜백함수의 이름을 정해주면 되지만, 1회성으로 사용될 함수(인자로 전달될 함수:콜백함수)라고 한다면 굳이 

함수에 이름을 줄 필요가 없다. 

이럴때는 function b를 만들어주고 a.sort(b)로 하지 않고, 익명함수를 사용해도 된다 >> a.sort(function(v1,v2){return v1-v2;});


(※ 함수명을 따로 주지 않을 때, 그 함수를 익명함수라고 한다.)

a.sort(function(v1,v2){return v1-v2;});에서는 

이것이 callback 함수이다. >>  function(v1,v2){return v1-v2;}



좀 더 심도있게 콜백함수(callback function)에 대하여 이해하기를 원한다면 

http://yubylab.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EC%BD%9C%EB%B0%B1%ED%95%A8%EC%88%98-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0



'nodejs' 카테고리의 다른 글

(8) http모듈을 사용하여 서버를 생성해보자.  (0) 2016.05.31
(7) 동기 vs 비동기  (0) 2016.05.31
(5) NPM을 이용하여 외부 모듈을 사용해보자.  (0) 2016.05.30
(4) NPM 이란?  (0) 2016.05.30
(3) 모듈(module)  (0) 2016.05.29

npm을 이용해서 다른사람이 만든 외부 소프트웨어(모듈)를 자신의 소프트웨어(모듈)로 사용하는 방법을 알아보자.

underscorejs.org 로 들어가자. 

Installation 쪽으로 가면 여러가지 방법을 설치할수있음을 볼 수 있다. 

우리는 nodejs를 하고 있으므로 underscorejs.org 사이트에서 installation쪽에 나와있는 node.js로 설치하는 것을알아보자. 


1. 먼저 자신이 작업하는 디렉터리를 패키지로 만드는 법을 배워보자. 

다른사람의 패키지를 들여오기에 앞서 지금 프로젝트를 진행하고 있는 디렉터리(server_side_javascript)를 패키지로 지정해야할 필요가 있다. 


cmd창에서 cd C:\Users\Sean Park\dev\js\server_side_javascript 를 입력하여 

server_side_javascript 디렉터리까지 진입한 상태에서 

cmd 창에 npm init 을 입력하면 패키지를 만들 준비를 하게 된다. 

name:(server_side_javascript)가 나타나는데 사용자가 임의로 프로젝트명(패키지명)을 변경 할 수 있다. 

만약 곧 바로 엔터를 치면 괄호안의 것이 그대로 프로젝트명(패키지명)이 된다. 

description은 직접 달아주자. ex_ Server side javascript tutorials

entrypoint : 어떠한 javascript가 이 패키지를 구동시키는 자바스크립트 인가?


test command: 이 패키지에서 tdd를 할때 어떤 명령을 실행하면 테스트를 실행할것인지 지정해주는 것이다. 그러나 여기서는 테스트를 하지 않을 것이므로 생략하자. 


git repository : git에 올라가게 될 경우 그 저장소의 주소를 적으라는 부분이다. 

패키지(즉 프로젝트 폴더를 미리 깃헙상에 올려놓을 경우에 npm이 자동적으로 알아서 지정해준다 .괄호이용)

but 나는 해당 디렉토리(패키지)를 아직 깃헙상에 올려놓지 않았기 때문에 넘어가자.

이후 keyword, author, license 를 기본값으로 두고y( yes)를 해주면 해당 디렉터리에 package.json 파일이 생성된다. 

이렇게 package.json 파일이 생성된 디렉터리는 npm을 사용하여 패키지로 선언하게 되는것이다. 열어보면 패키지에 대한 정보임을 알 수 있다. 





2. 다른사람의 모듈을 자신의 프로젝트에 포함시키려면? 
npm install underscore : underscore를 다운받아서 우리의 프로젝트에 포함시키는 것. node_modules 라는 디렉터리가 생성된다. 
생성된 node_modules 의 하위에 underscore 디렉토리 안에 underscore 모듈이 위치해있다.



3. npm install underscore  vs  npm install underscore --save  

npm install underscore만 하였을 경우에는 package.json을 열어볼 경우 underscore 에 대한 내용이 따로 등록되어있지 않다.
하지만 npm install underscore --save를 할 경우에는 package.json을 열어볼 경우 underscore와 해당 underscore에 대한
버전 정보가 나타나게 된다. 

즉. --save를 해주면 그 패키지는 underscore 1.83버전 패키지에 의존한다는 것을 명시하게 되는 것이다. 

--save 를 해줄 경우에는 package.json 파일만 있다면 언제든지 자신의 프로젝트(패키지)에 underscore 모듈을 포함시킬 수 있다는 의미가 된다.

즉,--save를 해줘야만 자신의 프로젝트에 특정 모듈을 포함시킬 수 있다는 의미가 되는 것이다. 
결과적으로 어떠한 모듈을 내가 만든 프로젝트에 포함시키고 싶을 때는 npm install 모듈명 --save를 해주면 되는 것이다. 

--save가 없는 경우를 생각해보자.  
일시적으로 필요할 때(소스코드에 포함시키지 않고 지금 잠깐 해당 모듈을 사용해야 할 때) --save를 입력하지 않아도 된다.





4. 다른사람이 만든 모듈을 자신의 프로젝트(패키지)에 포함시켜 사용하는 방법을 알아보자. 


해당 프로젝트에서 javascript파일을 만들어서 사용하는데, underscore(모듈)가 필요할 경우에는 require 함수가 필요하다. 

통상적으로 underscore 모듈을 변수에 담을 때는 const _ = require('underscore'); 변수명을 underscore의 의미인 underbar_를 사용한다.

(※const는 상수임을 의미)

(※var _ = require('underscore')로 var을 사용하여도 된다.)

underscore 모듈을 사용하면 좋은 점에 대해서 알아보자. 

var arr = [3,4,5,6,7,9];

을 정의하였을 때 underscore 모듈을 담은 _ 개체의 기능들을 사용할 수 있다. 

_.first or _.last등을 사용할 수 있음.    

console.log를 사용하여 찍어보자.

colsole.log(_.first(arr));

colsole.log(_.last(arr));



1) ex_underscore 이라는 이름을 가진 파일을 만들어서 코드를 작성해주자.


2) node ex_underscor.js를 입력하여 해당 js 파일을 실행시켜보자. 




<정리> 


npm을 사용하여 다른사람의 모듈을 설치하기 위해(ex. npm install underscore --save)서는 자신의 프로젝트를 패키지로 만들어야 한다.

따라서 npm init을 입력하여 해당 디렉터리를 패키지화 해야 한다. 

그러면 해당 디렉터리에는 package.json 파일이 생성되면서 그 디렉터리는 패키지가 되는 것이다. 

이 후에 npm install underscore --save를 하여 외부의 모듈을 해당 패키지 내에 설치할 수 있게 되는 것이다. 

(※-g의 경우 전역으로 사용할 때 쓰인다.)


소프트웨어가 발전하게 된 것 : 여러개의 모듈(부품)들이 잘 결합되어 확대 된 것. 따라서 여러 개의 모듈을 합쳐주는 역할을 하는 npm은 핵심역할을 하게 된 것이다. 따라서 npm을 사용하는 것 많이 배워두자 굉장히 중요하다.



'nodejs' 카테고리의 다른 글

(7) 동기 vs 비동기  (0) 2016.05.31
(6) 콜백함수(callback function)  (0) 2016.05.31
(4) NPM 이란?  (0) 2016.05.30
(3) 모듈(module)  (0) 2016.05.29
(2) 포트번호의 이해, 서버생성, 서버설정  (0) 2016.05.29


javascript가 제공하는 모듈 : ex.date, String, Array ..etc...

nodejs가 제공하는 모듈: http, os...etc...

javascript가 제공하는 모듈과 nodejs가 제공하는 모듈은 다르다.

이것들을 여러 방법으로 결합해서 사용할 수 있다는 것을 알아두자. 



nodejs가 직접 제공하는 모듈 외에 타인의 모듈 혹은 독립적인 소프트웨어를 사용하는 방법에 대해 알아보자.

npm이란: node package manager의 약자 -  설치, 삭제, 업그레이드, 의존성관리를 해주는 것이다. 

현재는 npm을 nodejs 에서만 사용하는 것이 아니라, nodejs를 사용하여 만들어진 소프트웨어이지만 여느 소프트웨어 프로그램에서도 npm을 이용하여 타인이 만든 소프트웨어를(플러그인, 라이브러리, 모듈 포함) 사용할 수 있다. 


uglify-js라는 플러그인(독립적인 앱)을 설치해 보자. 

uglify-js : 

가독성을 증가시키기 위한 줄바꿈 등과 같은 띄어씌기 공백들이(데이터들이 됨) 전부 사라지고 붙게 된다. 

javascript 파일을 전송할 때는 네트워크를 사용하기 때문에 코드의 내용이 많아지면, 그만큼 비싸지고 느려지게 된다.

이 때 uglify-js프로그램을 실행시키면 실제로 기계가 처리하는데 필요한 필수적인 코드를 제외하고는 나머지것들 전부 제거된다.



http://npmjs.com 에 들어가서 uglyfy-js를 설치하는 방법을 살펴보자. 

Installation and Typical Usage in Node


코드: npm install ugliy-js -g  (g는 global:글로버의 약자이다.)

g를 붙이게 되면 컴퓨터 전역에서 사용하는 독립적인 소프트웨어로 설치가 된다는 의미이고,

g를 붙이지 않을 경우에는 현재 npm을 설치한 패키지 내의 프로그램에서만 사용하겠다는 의미가 된다.


※ uglifyjs --help 을 해주면 uglifyjs 도움말이 나온다. 

pretty.js 에 코드를 작성한 후 해당파일을 위치시켜 놓은곳에

cmd를 통하여 cd C:\Users\Sean Park\dev\js\server_side_javascript 로 들어가서 

uglifyjs pretty.js 를 입력하여uglifyjs (플러그인)을 사용해보자.


위를 보면 알 수 있듯이 코드 중 공백이 사라진 상태의 코드가 나타난다.

 

uglifyjs 플러그인을 사용한 파일을 만들어보자.

uglifyjs pretty.js -o 새로만들 파일명 -m    

-o의 경우에 파일을 생성하기위함.

-m의 경우에는 파일내 변수명을 최대한 간단하게 한다는 의미. 예를 들어 var notification 이 있을 경우에 해당 변수를 o등으로 간단하게 변환시켜 코드를 만들게 한다. m 은 mangle의 이니셜  (여기서는 -m 기능을 볼 수 없다. )


해당 디렉토리에 가보면 uglified라는 이름을 가진 새로운 파일이 생성되어 있음을 볼 수 있다. 

일반적으로 파일명을 지어줄 때에는 해당 파일의 코드를 최소화 시킨다는 의미에서 원래파일명.min.js로 지어준다.

원래 파일명 : pretty.js

uglifyjs를 사용한 새로운 파일명 : pretty.min.js


 

해당 파일을 열어 uglifyjs 가 적용 됐는지 확인해 보자.



정상적으로 적용되었음을 확인 할 수 있다. 





1. 모듈(module)이란?


module이라고 하는 것은 부품이라고 생각하면 된다. 

nodejs가 이미 마련해둔 웹 서버 모듈을 우리가 가져다만 쓰는것.

코드로 알아보자 !

예제코드가 바로 그것이다. 

const http = require ('http'); 아래에 작성되어있는 로직 즉, 애플리케이션이 작동되기 위해서는 Nodejs에서 

미리 마련해둔 http 모듈(부품)이 필요하다. 

const는 일정한 이란 의미를 가진 constant의 약자이다. 

varialble var의 경우에는 변수로써 값이 변할 수 있다.

그러나 constant const의 경우네는 상수로써 값이 한 번 할당 될 경우 바뀌어서는 안된다.


마치 자바 언어세서 final 과 같은 역할을 한다.  


const http = require('http'); 를 정의 해주는 것은 http 모듈(부품)을 http 상수에 담아서 쓰겠다는 것이 된다. 

nodejs.org 에 들어가서 doc이라는 탭으로 들어가게 되면 해당 모듈들의 사용 설명서가 나와있다. 


마치 자바 언어에서 api문서가 존재하듯!


http 모듈의 경우에 http.createServer()라는 메소드를 호출하면 Returns a new instance of http.Server

즉,새로운 http.Server 객체를 리턴한다고 써져있다. (in DOC of nodejs.org)

이 때 리턴된 Server의 경우에는 listen이라고 하는 메소드를 가지고 있기 때문에 다시 listen으로 host와 port를 매개 변수로 

서버를 호출하였던 것이다. 



2. 모듈 사용 한 번 더 해보기 (os모듈을 사용해보자.)

os.js라는 파일을 만들어 실습해보자.

os.platform()  (console.log를 사용하여 찍어보자.)

os라는 모듈의 platform 메소드를 호출한다. 

: Returns the operating system platform. Possible values are 'ex.win32 ' .....  Returns the value of process.platform.

라고 설명되어있다.


cmd 창을 열고 node os.js를 입력해보면 사용중인 os의 정보가 나타난다.



1. 포트번호에 대하여 이해해보자.


설치되어있는 서버들 (웹서버, 데이터베이스 서버, 게임 서버, 채팅 서버)이 여러개 있을 때 어떻게 웹서버를 실행시킬까?


 0~ 65535개의 포트가 있다. 

기본적으로 웹 서버는 80번 포트를 리스닝하고 있다.  


따라서 사용자가 http://opentutorials.org 라고 입력할 경우 

opentutorials.org (ip를 도메인 네임시스템을 사용한것. 알아보기 쉽게) 컴퓨터를 찾아가게 된다.

이 때 http://opentutorials.org 에는 기본적으로 :80번이 생략된 것이다. 

http://블라블라로 들어 갈 경우 해당 컴퓨터의 80번 포트로 자동 연결이 되는 것이다. 


http://opentutorials.org:1337 을 입력하였을 때는 반응을 하지 않는다.

이 때  웹서버가 응답해주기 위해서는 웹서버가 1337번 포트를 리스닝하게 설정 해주면 되는 것이다.



2. nodejs를 이용하여 서버를 생성하고 열어보자. 

(웹서버를 와일드하게 생성하는 것 자체는 어렵다. 그래서 ★ nodejs에서 미리 만들어놓은 http모듈(부품)을 사용하여 웹서버를 생성하는 것이다. )


1) webserver.js 파일을 만들어 코드를 작성해보자. 



2) cmd 창을 열어 node webserver.js 를 입력하여 서버를 실행시키자. (웹서버가 2016포트를 바라 보고있게 설정해놨음)



3) 127.0.0.1:2016 로 접속해보자. 




※ Content-Type

이 헤더는 메시지의 타입과 서브타입을 나타낸다. 예를 들면 Content-Type: text/plain

타입과 서브타입을 합쳐 MIME 타입이라 부른다. Internet media type 이라고도 부른다. 다양한 파일 포맷이 MIME 타입으로 등록되어 있다. text 타입은 charset 인자를 가질 수 있으며 이 인자는 문자 인코딩을 지정한다.


===================================================================================




nodejs는 구글에서 만든 V8 엔진을 기반으로 하고 있으므로 성능이 상당히 좋다. (속도등이 매우 빠름) 


※ Windows 기준

폴더 생성 명령어 in cmd : md 폴더명

폴더 삭제 명령어 in cmd : rd 폴더명



 
1. node.js 설치
--> http://nodejs.org 들어가서 download 권장되는 것을 다운받으면 된다. recommended
cmd 창을 열고 node --version을 입력해보자.
버전에 대한 정보가 나오면 정상적으로 설치된것이다.





2. notepad로 node.js라는 이름의 파일을 생성해보자. 

3. node.js 에 console.log('hello world') 를 입력하자.

4. cmd 창에 hello world 를 띄워보자.  

5. cmd 창 open  dir/w 를 입력하면 디렉터리들 쭉 나옴

작성해놓은 코드가 있는 디렉터리에 들어가서  node hello.js 로 입력하면 hello.js 에 작성해 놓은 로직이 실행된다.





'nodejs' 카테고리의 다른 글

(6) 콜백함수(callback function)  (0) 2016.05.31
(5) NPM을 이용하여 외부 모듈을 사용해보자.  (0) 2016.05.30
(4) NPM 이란?  (0) 2016.05.30
(3) 모듈(module)  (0) 2016.05.29
(2) 포트번호의 이해, 서버생성, 서버설정  (0) 2016.05.29

+ Recent posts