01강_Node.js - Node.js 기초 과정 Kyunghoon Jang ( 주)Neuromeka jkjang27@gmail.com
02강_Node.js - Node.js 기초 과정 Kyunghoon Jang ( 주)Neuromeka jkjang27@gmail.com
03강_Node.js - Node.js 기초 과정 Kyunghoon Jang ( 주)Neuromeka jkjang27@gmail.com
04강_Node.js - Node.js 기초 과정 Kyunghoon Jang ( 주)Neuromeka jkjang27@gmail.com
05강_Node.js - Node.js 기초 과정 Kyunghoon Jang ( 주)Neuromeka jkjang27@gmail.com
06강_Node.js - Node.js 기초 과정 Kyunghoon Jang ( 주)Neuromeka jkjang27@gmail.com
1. Node.js Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js' package ecosystem, npm, is the largest ecosystem of open source libraries in the world. http://nodejs.org/en Node.js®는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임입니다. Node.js는 이벤트 기반, 논 블로킹 I/O 모델을 사용해 가볍고 효율적입니다. Node.js의 패키지 생태계인 npm은 세계에서 가장 큰 오픈 소스 라이브러리 생태계이기도 합니다. http://nodejs.org/ko Node.js는 javascript runtime 임. 이벤트기반 , 논블로킹 I/O모델을 사용함. Npm이라는 오픈소스라이브러리가 있음.
https://developers.google.com/v8/ 1. Node.js V8 is Google's open source high-performance JavaScript engine, written in C++ and used in Google Chrome, the open source browser from Google. It implements ECMAScript as specified in ECMA-262, 3rd edition, and runs on Windows XP or later, Mac OS X 10.5+, and Linux systems that use IA-32, ARM or MIPS processors. V8 can run standalone, or can be embedded into any C++ application. https://developers.google.com/v8/ Nodejs 는 chrome v8 javascript engine기반임. 다양한 플랫폼에 대한 지원을 하고 있음. 크롬 v8에 대한 자세한 내용은 https://developers.google.com/v8/ 참조
https://www.npmjs.com/package/you-dont-know-node 1. Node.js Event driven, non-blocking I/O 모델을 특징으로 함.
https://www.npmjs.com/package/you-dont-know-node 1. Node.js Blocking I/O 방식은 자원에 접근하는 사람이 늘어나게 되면 lock이 발생함. 즉 1개의 접근이 들어올 때는 문제가 없지만, 2개, 3개의 접근이 들어오게 되면 순차적으로 처리를 해야 하기 때문에 1번, 2번의 대기가 발생을 하게 됨.
https://www.npmjs.com/package/you-dont-know-node 1. Node.js Non-blocking I/O 방식은 자원에 접근하는 사람이 늘어나게 되어도 접근(요청) 자체가 queue를 통해 관리가 되고 처리 결과를 비동기로 전송하기 때문에 lock이 발생하지 않음.
^data1->Hello Capital One->data2->Hello SECON! 1. Node.js https://www.npmjs.com/package/you-dont-know-node Blocking Node.js Code console.log('Step: 1') for (var i = 1; i<1000000000; i++) { // This will take 100-1000ms } console.log('Step: 2') Blocking Node.js Code var fs = require('fs'); var contents = fs.readFileSync('accounts.txt','utf8'); console.log(contents); console.log('Hello Capital One\n'); var contents = fs.readFileSync('ips.txt','utf8'); console.log('Hello SECON!'); ^data1->Hello Capital One->data2->Hello SECON! 일반적으로 nodejs에서는 non-blocking I/O로 처리되는 것이 정석이나, 별도로 blocking I/O로 처리하는 경우도 있음. 이 예제의 readFileSync 함수는 readFile 함수의 Sync 버전임. fs.readfileSync(‘account.txt’,’utf8’){}); 처음 인자는 읽을 파일명, 두번째 인자는 읽을 형식임. 이 함수의 리턴 값이 파일 내용임. Blocking I/O 예제임. 위 코드의 실행 결과는 Step:1 > Step:2 아래 코드의 실행 결과는 Data1 > Hello Capital One > data2 > Hello SECON! 모든 코드가 순차적으로 실행이 됨.
Non-Blocking Node.js Code https://www.npmjs.com/package/you-dont-know-node Non-Blocking Node.js Code var fs = require('fs'); fs.readFile('accounts.txt','utf8', function(err,contents){ console.log(contents); }); console.log('Hello Capital One\n'); fs.readFile('ips.txt','utf8', function(err,contents){ console.log("Hello SECON!"); ^Hello Capital One->Hello SECON->data1->data2 Non-blocking I/O 예제임. fs.readfile(‘account.txt’,’utf8’,function(err.contents){}); 처음 인자는 읽을 파일명, 두번째 인자는 읽을 형식, 세번째 인자는 읽기 완료 후 실행 될 callback function임. readFile명령은 queue에 저장이 되어 순차적으로 실행이 되고, 실행 후 함수 실행 시 등록해 둔 callback 함수가 실행이 됨. 실행 결과는 Hello Capital One->Hello SECON->data1->data2
What can you make with 350,000 building blocks? 1. Node.js https://www.npmjs.com/ Build amazing things npm is the package manager for JavaScript. Find, share, and reuse packages of code from hundreds of thousands of developers — and assemble them in powerful new ways. What can you make with 350,000 building blocks? The npm registry hosts over a quarter million packages of reusable code — the largest code registry in the world. Find Popular libraries like JQuery, Bootstrap, React, and Angular, and components from frameworks including Polymer. Discover Packages for mobile, IoT, front end, back end, robotics… everything you need to start building amazing things. Build Assemble packages like building blocks to quickly develop awesome new projects. Npm은 현재 35만개 이상의 패키지가 모여있는 오픈소스 라이브러리임. node.js가 인기있는 이유중 하나가 엄청나게 많은 패키지들이 오픈되어 있다는 점임. 무엇을 만들지 생각하고, 필요한 것이 무엇일지 검토한 후에 검색된 모듈들을 활용하여 개발을 하면 됨. 너무나 많은 모듈이 있는 것이 문제점임. 검색된 패키지는 릴리즈 횟수. 다운로드 통계 등을 고려하여 선택하는 것이 좋음.
https://nodejs.org/en/download 1. Node.js https://nodejs.org/en/download Linux : NVM(Node Version Manager) https://github.com/creationix/nvm Install script $ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash $ nvm ls-remote $ nvm ls $ nvm install 6.9.1 $ nvm install 4.6.1 $ nvm use 6.9.1 $ nvm uninstall 6.9.1 $ nvm install 0.12.15 $ nvm alias default 4.6.1 Nodejs는 다양한 버전이 존재하며 패키지들의 경우 특정 버전에서만 동작하는 경우도 있음. 또한 현재 사용중인 OS 버전에 따라 설치가 곤란한 버전도 있음. 실제 사용 시 다양한 버전의 nodejs 가 필요한 경우가 있음. Nvm 을 사용하게 되면 간단히 여러 버전을 설치하고 골라서 사용할 수 있음. 라즈베리파이, 비글본 등에서는 curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash 명령을 통해 nvm을 설치할 수 있음. 설치 직후에는 환경설정이 되지 않아 동작하지 않을 수 있음. 사용하고 있는 shell 에 따라 환경설정이 자동으로 되니. Logout 후 log in 하면 정상 동작하게 됨. $ nvm ls-remote : 설치할 수 있는 버전 목록 보기 $ nvm ls : 설치된 버전 목록 보기 $ nvm install 6.9.1 : 버전 6.9.1 설치하기. -> 현재 시스템에 맞도록 미리 컴파일 된 배포본이 있는 경우 금방 설치가 되나, 배포본이 없는 경우 소스를 다운로드 하여 직접 컴파일을 하게 됨. 장비에 따라 1시간 이상 시간이 소요되기도 함. $ nvm use 6.9.1 : 설치되어 있는 nodejs 중 6.9.1을 사용하도록 세팅 함. Log out시 이 설정은 무시됨. $ nvm uninstall 6.9.1 : 설치되어 있느 nodejs 6.9.1 버전을 삭제함. $ nvm alias default 4.6.1 : 설치되어 있는 nodejs 4.6.1을 시스템 디폴트로 사용하도록 함. 시스템 리부팅 후에도 이 값은 유효함.
$ wget http://nodejs.org/dist/v0.12.15/node-v0.12.15.tar.gz 1. Node.js $ mkdir ~/nodejs $ cd ~/nodejs $ wget http://nodejs.org/dist/v0.12.15/node-v0.12.15.tar.gz $ tar zxvf node-v0.12.15.tar.gz $ cd node-v0.12.15 $ ./configure --without-snapshot --prefix=/usr $ make $ make install 비글본 또는 라즈베리파이에서 Nvm을 사용하지 않고 수동으로 특정 버전의 nodejs를 설치하는 예제임. Wget으로 소스를 받고, 압축을 해제한 후 컴파일/인스톨 하는 코드임.
console.log('Hello World'); 1. Node.js //app.js console.log('Hello World'); $ node app.js $ node -v Vi 또는 nano 등을 이용하여 아래 1줄 코드를 내용으로 하는 app.js 파일을 생성함. Node app.js 하게 되면 Hello World 가 출력됨. Nodejs가 동작하는 것을 확인 할 수 있음. 참고로 현재 node 버전을 확인 하려면 $ node -v
var http = require('http'); 1. Node.js //app.js var http = require('http'); var server = http.createServer(function (req, res) { res.writeHead(200, { 'Content-Type' : 'text/plain' }); res.end('Hello World'); }); server.listen(8000); $ node app.js http://192.168.7.2:8000 5줄 짜리 웹서버 Hello World를 출력하는 웹 서버임. 포트는 8000으로 설정함. 위 파일을 실행 시킨 후 브라우저에서 웹서버IP:8000 으로 접속하면 Hello World가 나오는 것을 확인 할 수 있음.
var http = require('http'); var url = require("url"); 1. Node.js //app.js var http = require('http'); var url = require("url"); var server = http.createServer(function (req, res) { var pathname = url.parse(req.url).pathname; res.writeHead(200, { 'Content-Type' : 'text/plain' }); switch (pathname) { case "/": res.end("Hello World"); break; default: res.end("Hello " + pathname.substring(1)); break; } }); server.listen(8000); $ node app.js http://192.168.7.2:8000 http://192.168.7.2:8000/Kim 앞의 예제는 모든 url 에 대해서 Hello World를 출력해 주는 서버였음. 이번 예제를 실행 후 http://192.168.7.2:8000 을 호출하는 경우에는 Hello World가 출력이 되고 http://192.168.7.2:8000/Kim 을 호출하게 되면 hello Kim 이 출력됨. 사용자가 요청한 URL 정보를 활용하기 위해서는 “url” 패키지(모듈)을 활용 하여야 함. http, url은 nodejs에서 기본 제공되는 모듈이므로 nodejs document에 API 설명이 포함되어 있음.
var express = require('express') , http = require('http') 1. Node.js //app.js var express = require('express') , http = require('http') , app = express() , server = http.createServer(app); app.get('/', function (req, res) { res.send('Hello World'); }); app.get('/users', function (req, res) { res.send('Hello Users'); server.listen(8000, function() { console.log('Express server listening on port ' + server.address().port); $ node app.js http://192.168.7.2:8000 http://192.168.7.2:8000/Kim http://192.168.7.2:8000/users Express 라는 웹 플랫폼 모듈을 사용한 예임. http://192.168.7.2:8000 을 호출하는 경우에는 Hello World가 출력이 되고 http://192.168.7.2:8000/users 을 호출하게 되면 Hello Users 가 출력됨. http://192.168.7.2:8000/Kim 을 호출한 경우에는 404 에러 페이지를 보여주게 됨. Express 모듈(패키지)을 사용하게 되면 기본적인 웹서버가 가져야 할 틀을 모두 잡아 주기 때문에 쉽게 웹 서비스 개발이 가능함.
Fast, unopinionated, minimalist web framework for Node.js http://expressjs.com/ Fast, unopinionated, minimalist web framework for Node.js $ npm install –g express $ npm install –g express-generator Express는 nodejs에서 많이 사용되는 웹 프레임워크임 Express-generator를 이용하면 간단히 express형태의 웹 프로젝트를 시작할 수 있음.
$ express –ejs http://www.embeddedjs.com/ $ npm install $ npm start 1. Node.js $ express –ejs $ npm install $ npm start http://www.embeddedjs.com/ Express –ejs 실행시 기본 디렉토리 형태가 생성 됨. Npm install로 기본적으로 필요한 모듈(패키지)들을 설치하게 됨. Npm start로 기본 앱 시작. Package.json 파일 내에 start 에 관련된 스크립트가 정의되어 있음.
1. Node.js 기본 디렉토리 구성은 정적 html 모듈들이 위치할 public 폴더 Routes 를 처리할 routes 폴더 화면 구성을 처리할 views 폴더 로 구성됨. 정적 모듈은 이미지, 자바스크립트(브라우저단에서 실행 될 스크립트임), CSS 파일 등으로 구성됨