SlideShare uma empresa Scribd logo
1 de 62
Baixar para ler offline
+
MEAN 스택을 사용한 IoT 개발
박재호(jrogue@gmail.com)
+
MEAN이란?
+
+
TESSEL 모듈 유형
+
TESSEL 스펙
+
Beagle Bone Black
+
bonescript
n  Beagle Bone에서 아두이노 스타일의 프로그램이 가능하게 만들어
주는 자바스크립트 라이브러리
+
AWS Lambda(1)
+
AWS Lambda(2)
+
AWS Lambda(3)
+
heimcontrol.js(1)
Raspberry PI and Arduino using Node.js
+
heimcontrol.js(2)
Socket.io(for Websockets)
Requirejs
HTML5/CSS3
Jade(for
templating)
+
Node.js인 이유는?(1)
+
Node.js인 이유는?(2)
n  개발 시간과 성능의 조화
n  아무리 성능이 좋더라도 개발 시간이 오래 걸릴 경우 생산성이 떨어진다
n  주의: 1행을 작성하는 시간은 어셈블리나 SQL이나 비슷하다
n  스크립트 언어의 경우 빨리 개발은 가능하지만 성능이 떨어진다
n  자바스크립트를 사용한 Node.js는 개발과 성능 양쪽 모두 뛰어나다
n  스타트업 vs 기업
n  스타트업은 빨리 변화하는 생태계에서 살아남기 위해 필연적으로 오픈
소스에 매진한다
n  대기업은 유지보수와 안정성, 그리고 성능에 관심이 많다
n  Node.js는 양쪽 모두를 만족시킨다(오픈 소스 기반, 자바와 같은 강력한
생태계)
+
Node.js인 이유는?(3)
n  뛰어난 성능
n  월마트는 블랙 프라이데이에 Node.js로 전제 모바일 사이트 오픈
n  초당 두 배 요청을 받아들이고 응답시간을 35%(200ms) 줄임
n  서버 CPU 사용량이 2%, 200만 명 온라인 접속 방어
n  이벤트 아키텍처
n  스레드가 아닌 단일 프로세스
n  대신 동기식 차단이 아닌 비동기식 I/O
n  웹 브라우저 특성상 이미 자바스크립트는 콜백을 사용하는 이벤트 구
동 방식을 지원(비동기식 코드에 대한 표현력이 강함)
+
동기식 입출력 vs 비동기식 입출력
+
멀티 스레드 vs 단일 스레드
+
LAMP vs MEAN
+
자기 조직화
+
MEAN stack 아키텍처
+
선행조건
n  MEAN 기본 스택 준비
n  Node.js 설치: http://nodejs.org/
n  MongoDB 설치: http://www.mongodb.org/
n  자바스크립트 편집기는 brackets 추천: http://brackets.io/
n  예제 소스 코드 저장소 위치
n  Node.js용 node-collector: https://bitbucket.org/jrogue/node-
collector
n  AngularJS용 angular-lamp-app: https://bitbucket.org/jrogue/
angular-lamp-app
+
무엇을 만들어볼까?
lamp 관리 시스템
+
기본 아키텍처
+
첫 Node.js 프로그램: /
server_plain_vanilla.js
/*jslint node: true */
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello Worldn');
}).listen(3000, '127.0.0.1');
console.log('Server running at http://127.0.0.1:3000/');
+
Node.js 프로그램을 위한 패키지 설
정: /package.json
{
"name": "node-collector",
"private": true,
"version": "0.1.0",
"description": "A starter project for Node.js",
"license": "MIT",
"devDependencies": {
"express": "4.x",
"body-parser": "1.4.x“,
"mongoose": "^3.8.20"
}
}
+
의존성 설치와 목록
+
Node.js를 사용한 첫 RESTful 프로그
램: /server.js
var express = require('express');
var app = express();
app.get('/lamps', function(req, res) {
res.send([{name: 'lamp1'}, {name: ‘lamp2'}]);
});
app.get('/lamps/:id', function(req, res) {
res.send({id:req.params.id, name: "lamp" + req.params.id, status: "lamp
ready"});
});
app.listen(3000);
console.log('Listening on port 3000...');
+
실행과 테스트 방법
+
Node.js 모듈 사용: /routes/lamps.js
exports.findAll = function (req, res) {
res.send([{name: 'lamp1'}, {name: 'lamp2'}, {name: ‘lamp3'}]);
};
exports.findById = function (req, res) {
res.send({id: req.params.id, name: "lamp" + req.params.id, status: "lamp
ready"});
};
var express = require('express'),
bodyParser = require('body-parser'),
lamps = require('./routes/lamps.js');
var app = express();
app.get('/lamps', lamps.findAll);
app.get('/lamps/:id', lamps.findById);
app.listen(3000);
console.log('Listening on port 3000...');
+
몽고DB 연동을 위한 준비: /db.js
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/lamps', function () {
console.log('mongodb connected')
});
module.exports = mongoose;
+
몽고DB 모델 생성: /models/lamp.js
var db = require('../db');
var Lamp = db.model('Lamp', {
lampname: { type: String, required: true },
status: { type: String, required: true },
date: { type: Date, required: true, default: Date.now }
});
module.exports = Lamp;
+
Node.js 모듈 내용 변경(1): /routes/
lamps.js
var Lamp = require('../models/lamp');
exports.addLamp = function (req, res, next) {
var lamp = new Lamp({
lampname: req.body.lampname,
status: req.body.status
});
lamp.save(function (err, lamp) {
if (err) { return next(err); }
res.status(201).json(lamp);
});
};
+
Node.js 모듈 내용 변경(2): /routes/
lamps.js
exports.updateLamp = function (req, res, next) {
Lamp.findOne({ _id: req.params.id }, function (err, lamp) {
if (err) { return next(err); }
lamp.status = req.body.status;
lamp.save(function (err, lamp) {
if (err) { return next(err); }
res.status(201).json(lamp);
});
});
};
exports.deleteLamp = function (req, res, next) {
Lamp.remove({ _id: req.params.id }, function (err, lamp) {
if (err) { return next(err); }
res.status(201).json(lamp);
});
};
+
Node.js 모듈 내용 변경(3): /routes/
lamps.js
exports.findAll = function (req, res, next) {
Lamp.find(function (err, lamps) {
if (err) { return next(err); }
res.status(201).json(lamps);
});
};
exports.findById = function (req, res, next) {
Lamp.findOne({ _id: req.params.id }, function (err, lamp)
{
if (err) { return next(err); }
res.status(201).json(lamp);
});
};
+
CRUD 전체 정의를 위한 변경: /
server.js
var express = require('express'),
bodyParser = require('body-parser'),
lamps = require('./routes/lamps.js');
var app = express();
app.use(bodyParser.json());
app.post('/lamps', lamps.addLamp);
app.get('/lamps', lamps.findAll);
app.get('/lamps/:id', lamps.findById);
app.put('/lamps/:id', lamps.updateLamp);
app.delete('/lamps/:id', lamps.deleteLamp);
app.listen(3000);
console.log('Listening on port 3000...');
+
서버 시작
n  서버 시작
n  $ node server
n  주의: 서버 시작에 앞서 지역 호스트(localhost)에 몽고DB를 설치
하고 시작했는지 반드시 확인하자!
+
단말 쪽 프로그래밍
n  REST 방식으로 API를 호출하면 된다
n  단말 조건: TCP/IP 스택이 설치되어 있으며, REST 클라이언트 라이브러
리를 사용할 수 있어야 한다.
n  만일 리눅스 기반으로 동작하는 단말인 경우 뒤에 테스트 예제에서
설명하는 curl을 system으로 호출하면 아주 쉽게 구현 가능하다.
n  C 언어로 개발할 경우 libcurl을 사용할 수도 있다.
n  스크립트 언어로 개발할 경우 스크립트 언어의 REST 클라이언트 패
키지를 사용하면 몇 줄로 서버 쪽에 자신의 상태를 전달할 수 있다.
n  이어지는 테스트 예제를 보며 CRUD 전달 방식을 확인하자.
+
CRUD 테스트: POSTMAN vs curl
크롬 확장: REST 클라이언트
http://curl.haxx.se/ (홈페이지)
http://www.confusedbycode.com/curl/ (윈도우 32비트/64비트)
참고: 여기서는 설명의 편의를 위해 cURL을 사용한다!
+
서버 구동 후 생성 테스트(curl 사용)
+
몽고DB 셸을 사용한 확인
+
(전체) 읽기 테스트
+
변경 테스트
+
(변경 내역 반영 검증을 위한) 읽기 테
스트
+
삭제 테스트
+
최종 확인
+
Single Page Application
+
MVC vs MVVM
+
AngularJS 샘플 앱의 디렉터리 구조
+
/index.html
<!DOCTYPE html>
<html ng-app="LampApp">
<head>
<link href="styles/main.css" rel="stylesheet">
<link rel="stylesheet" ref="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
</head>
<body>
<ul class="menu">
<li><a href="#/notice">notice</a></li>
<li><a href="#/list">list</a></li>
</ul>
<div class="container" ng-view=""></div>
<script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.5/angular.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.5/angular-resource.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.5/angular-route.min.js"></script>
<script src="scripts/app.js"></script>
<script src="scripts/services/services.js"></script>
<script src="scripts/controllers/controllers.js"></script>
</body>
</html>
+
views/list.html
<div class="span6">
<table class="table table-striped table-condensed">
<thead>
<tr>
<th style="min-width: 300px;">Lamp ID</th>
<th style="min-width: 120px;">Name</th>
<th style="min-width: 120px;">Status</th>
<th style="min-width: 120px;">Action</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="lamp in lamps">
<td>{{ lamp._id }}</td>
<td>{{ lamp.lampname }}</td>
<td>{{ lamp.status }}</td>
<td><input type="radio" value="on"> on <input type="radio" value="off"> off</td>
</tr>
</tbody>
</table>
</div>
+
views/notice.html
<div>
<p>환영합니다.</p>
<p>{{ message }}</p>
</div>
+
scripts/services/services.js
'use strict';
var services = angular.module('lampApp.services', ['ngResource']);
var baseUrl = 'http://localhost:3000';
services.factory('NoticeFactory', function ($resource) {
return $resource(baseUrl + '/notice', {}, {
query: { method: 'GET', params: {} }
});
});
services.factory('LampsFactory', function ($resource) {
return $resource(baseUrl + '/lamps', {}, {
query: { method: 'GET', isArray: true }
});
});
services.factory('LampFactory', function ($resource) {
return $resource(baseUrl + '/lamps/:id', {}, {
show: { method: 'GET' }
});
});
+
scripts/controller/controller.js
'use strict';
var app = angular.module('lampApp.controllers', []);
// Clear browser cache (in development mode)
//
// http://stackoverflow.com/questions/14718826/angularjs-disable-partial-caching-on-
dev-machine
app.run(function ($rootScope, $templateCache) {
$rootScope.$on('$viewContentLoaded', function () {
$templateCache.removeAll();
});
});
app.controller('NoticeCtrl', ['$scope', 'NoticeFactory', function ($scope, NoticeFactory) {
$scope.message = '간단한 AngularJS 테스트 프로그램입니다. Lamp 상태를 보여줍니다. 아
직 Lamp 조작 기능은 구현되어 있지 않습니다.';
}]);
app.controller('ListCtrl', ['$scope', 'LampsFactory', function ($scope, LampsFactory) {
$scope.lamps = LampsFactory.query();
}]);
+
scripts/app.js
"use strict";
// Declare app level module which depends on views, and components
angular.module('LampApp', [
'ngResource',
'ngRoute',
'lampApp.services',
'lampApp.controllers'
]).
config(['$routeProvider', function ($routeProvider, $httpProvider) {
$routeProvider.when('/notice', { templateUrl: 'views/notice.html', controller: 'NoticeCtrl'});
$routeProvider.when('/list', { templateUrl: 'views/list.html', controller: 'ListCtrl'});
$routeProvider.otherwise({redirectTo: '/notice'});
}]);
+
HTTP 서버 사용하기
n  Node용 간이 http 서버 설치
n  npm install http-server –g
n  AngularJS를 서비스 하기 위한 HTTP 서버 시작
n  cd angular-app
n  http-server
실시간 미
리 보기
또는 Brackets에서
+
앱 결과 화면(index.html)
+
앱 결과 화면(index.html에서 list)
+
도전 과제
n  socket.io를 사용해 polling하지 않고서 추가/변경/삭제되는 Lamp
목록을 보여준다.
n  hard coded된 notice 문구 대신, 특정 Lamp에 문제가 생겼을 경
우 서버에서 경고를 받아 출력한다.
n  Action을 추가해, Lamp를 켜고/끄게 만든다.
n  bower를 사용해 AngularJS 개발 과정에서 복잡한 프론트엔드 의
존성을 자동으로 관리하게 만든다.
+
실제 사례
+
참고 자료
n  http://docs.aws.amazon.com/lambda/latest/dg/
walkthrough-custom-events.html
n  http://ni-c.github.io/heimcontrol.js/
n  http://coenraets.org/blog/2012/10/creating-a-rest-api-
using-node-js-express-and-mongodb/
n  https://blog.codecentric.de/en/2013/03/home-automation-
with-angularjs-and-node-js-on-a-raspberry-pi/
n  http://mean.io/
n  http://bcho.tistory.com/881
+
참고 서적(팩트 서적은 번역 진행 중)
+

Mais conteúdo relacionado

Mais procurados

Universal Rendering
Universal RenderingUniversal Rendering
Universal RenderingTaegon Kim
 
[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱NAVER D2
 
서버리스 기반의 프론트엔드 서버 구축(Serverless frontend web server)
서버리스 기반의 프론트엔드 서버 구축(Serverless frontend web server)서버리스 기반의 프론트엔드 서버 구축(Serverless frontend web server)
서버리스 기반의 프론트엔드 서버 구축(Serverless frontend web server)ChanMin Park
 
Meteor 0.3.6 Preview
Meteor 0.3.6 PreviewMeteor 0.3.6 Preview
Meteor 0.3.6 PreviewJuntai Park
 
Node.js
Node.jsNode.js
Node.jsymtech
 
[123] electron 김성훈
[123] electron 김성훈[123] electron 김성훈
[123] electron 김성훈NAVER D2
 
Isomorphicspring Isomorphic - spring web seminar 2015
Isomorphicspring Isomorphic - spring web seminar 2015Isomorphicspring Isomorphic - spring web seminar 2015
Isomorphicspring Isomorphic - spring web seminar 2015sung yong jung
 
Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012Daum DNA
 
Nodejs 발표자료
Nodejs 발표자료Nodejs 발표자료
Nodejs 발표자료shanka2
 
Facebook은 React를 왜 만들었을까?
Facebook은 React를 왜 만들었을까? Facebook은 React를 왜 만들었을까?
Facebook은 React를 왜 만들었을까? Kim Hunmin
 
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기Chang W. Doh
 
[213]monitoringwithscouter 이건희
[213]monitoringwithscouter 이건희[213]monitoringwithscouter 이건희
[213]monitoringwithscouter 이건희NAVER D2
 
20131217 html5
20131217 html520131217 html5
20131217 html5DK Lee
 
AngularJS의 개발방식에 대하여
AngularJS의 개발방식에 대하여AngularJS의 개발방식에 대하여
AngularJS의 개발방식에 대하여Jin wook
 
AngularJS 2, version 1 and ReactJS
AngularJS 2, version 1 and ReactJSAngularJS 2, version 1 and ReactJS
AngularJS 2, version 1 and ReactJSKenneth Ceyer
 
Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나JeongHun Byeon
 
React Native를 사용한
 초간단 커뮤니티 앱 제작
React Native를 사용한
 초간단 커뮤니티 앱 제작React Native를 사용한
 초간단 커뮤니티 앱 제작
React Native를 사용한
 초간단 커뮤니티 앱 제작Taegon Kim
 
막하는 스터디 네 번째 만남 AngularJs (20151108)
막하는 스터디 네 번째 만남 AngularJs (20151108)막하는 스터디 네 번째 만남 AngularJs (20151108)
막하는 스터디 네 번째 만남 AngularJs (20151108)연웅 조
 

Mais procurados (20)

Universal Rendering
Universal RenderingUniversal Rendering
Universal Rendering
 
Deview2013 track1 session7
Deview2013 track1 session7Deview2013 track1 session7
Deview2013 track1 session7
 
[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱
 
서버리스 기반의 프론트엔드 서버 구축(Serverless frontend web server)
서버리스 기반의 프론트엔드 서버 구축(Serverless frontend web server)서버리스 기반의 프론트엔드 서버 구축(Serverless frontend web server)
서버리스 기반의 프론트엔드 서버 구축(Serverless frontend web server)
 
Meteor 0.3.6 Preview
Meteor 0.3.6 PreviewMeteor 0.3.6 Preview
Meteor 0.3.6 Preview
 
Node.js
Node.jsNode.js
Node.js
 
[123] electron 김성훈
[123] electron 김성훈[123] electron 김성훈
[123] electron 김성훈
 
Isomorphicspring Isomorphic - spring web seminar 2015
Isomorphicspring Isomorphic - spring web seminar 2015Isomorphicspring Isomorphic - spring web seminar 2015
Isomorphicspring Isomorphic - spring web seminar 2015
 
Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012
 
Nodejs 발표자료
Nodejs 발표자료Nodejs 발표자료
Nodejs 발표자료
 
Facebook은 React를 왜 만들었을까?
Facebook은 React를 왜 만들었을까? Facebook은 React를 왜 만들었을까?
Facebook은 React를 왜 만들었을까?
 
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
 
[213]monitoringwithscouter 이건희
[213]monitoringwithscouter 이건희[213]monitoringwithscouter 이건희
[213]monitoringwithscouter 이건희
 
20131217 html5
20131217 html520131217 html5
20131217 html5
 
AngularJS의 개발방식에 대하여
AngularJS의 개발방식에 대하여AngularJS의 개발방식에 대하여
AngularJS의 개발방식에 대하여
 
역시 Redux
역시 Redux역시 Redux
역시 Redux
 
AngularJS 2, version 1 and ReactJS
AngularJS 2, version 1 and ReactJSAngularJS 2, version 1 and ReactJS
AngularJS 2, version 1 and ReactJS
 
Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나
 
React Native를 사용한
 초간단 커뮤니티 앱 제작
React Native를 사용한
 초간단 커뮤니티 앱 제작React Native를 사용한
 초간단 커뮤니티 앱 제작
React Native를 사용한
 초간단 커뮤니티 앱 제작
 
막하는 스터디 네 번째 만남 AngularJs (20151108)
막하는 스터디 네 번째 만남 AngularJs (20151108)막하는 스터디 네 번째 만남 AngularJs (20151108)
막하는 스터디 네 번째 만남 AngularJs (20151108)
 

Semelhante a Mean 스택을 사용한 IoT 개발

Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs기동 이
 
Node.js and react
Node.js and reactNode.js and react
Node.js and reactHyungKuIm
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSCirculus
 
overview of spring4
overview of spring4overview of spring4
overview of spring4Arawn Park
 
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)LanarkSeung
 
Node.js의 도입과 활용
Node.js의 도입과 활용Node.js의 도입과 활용
Node.js의 도입과 활용Jin wook
 
Express framework tutorial
Express framework tutorialExpress framework tutorial
Express framework tutorial우림 류
 
7가지 동시성 모델 람다아키텍처
7가지 동시성 모델  람다아키텍처7가지 동시성 모델  람다아키텍처
7가지 동시성 모델 람다아키텍처Sunggon Song
 
[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rd[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rdPark Jonggun
 
막하는스터디 두번째만남 Express(20151025)
막하는스터디 두번째만남 Express(20151025)막하는스터디 두번째만남 Express(20151025)
막하는스터디 두번째만남 Express(20151025)연웅 조
 
Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)Sungjoon Yoon
 
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Ryu with OpenFlow 1.3, REST API
Ryu with OpenFlow 1.3, REST APIRyu with OpenFlow 1.3, REST API
Ryu with OpenFlow 1.3, REST APIjieun kim
 
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Terraform을 이용한 Infrastructure as Code 실전 구성하기 :: 변정훈::AWS Summit Seoul 2018
 Terraform을 이용한 Infrastructure as Code 실전 구성하기 :: 변정훈::AWS Summit Seoul 2018 Terraform을 이용한 Infrastructure as Code 실전 구성하기 :: 변정훈::AWS Summit Seoul 2018
Terraform을 이용한 Infrastructure as Code 실전 구성하기 :: 변정훈::AWS Summit Seoul 2018Amazon Web Services Korea
 
Terraform을 이용한 Infrastructure as Code 실전 구성하기
Terraform을 이용한 Infrastructure as Code 실전 구성하기Terraform을 이용한 Infrastructure as Code 실전 구성하기
Terraform을 이용한 Infrastructure as Code 실전 구성하기JeongHun Byeon
 

Semelhante a Mean 스택을 사용한 IoT 개발 (20)

Nodejs express
Nodejs expressNodejs express
Nodejs express
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
 
Node.js and react
Node.js and reactNode.js and react
Node.js and react
 
One-day-codelab
One-day-codelabOne-day-codelab
One-day-codelab
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JS
 
overview of spring4
overview of spring4overview of spring4
overview of spring4
 
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
 
Node.js 심화과정
Node.js 심화과정Node.js 심화과정
Node.js 심화과정
 
Node.js의 도입과 활용
Node.js의 도입과 활용Node.js의 도입과 활용
Node.js의 도입과 활용
 
Express framework tutorial
Express framework tutorialExpress framework tutorial
Express framework tutorial
 
7가지 동시성 모델 람다아키텍처
7가지 동시성 모델  람다아키텍처7가지 동시성 모델  람다아키텍처
7가지 동시성 모델 람다아키텍처
 
[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rd[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rd
 
막하는스터디 두번째만남 Express(20151025)
막하는스터디 두번째만남 Express(20151025)막하는스터디 두번째만남 Express(20151025)
막하는스터디 두번째만남 Express(20151025)
 
Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)
 
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 
Ryu with OpenFlow 1.3, REST API
Ryu with OpenFlow 1.3, REST APIRyu with OpenFlow 1.3, REST API
Ryu with OpenFlow 1.3, REST API
 
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
 
Mongo db 최범균
Mongo db 최범균Mongo db 최범균
Mongo db 최범균
 
Terraform을 이용한 Infrastructure as Code 실전 구성하기 :: 변정훈::AWS Summit Seoul 2018
 Terraform을 이용한 Infrastructure as Code 실전 구성하기 :: 변정훈::AWS Summit Seoul 2018 Terraform을 이용한 Infrastructure as Code 실전 구성하기 :: 변정훈::AWS Summit Seoul 2018
Terraform을 이용한 Infrastructure as Code 실전 구성하기 :: 변정훈::AWS Summit Seoul 2018
 
Terraform을 이용한 Infrastructure as Code 실전 구성하기
Terraform을 이용한 Infrastructure as Code 실전 구성하기Terraform을 이용한 Infrastructure as Code 실전 구성하기
Terraform을 이용한 Infrastructure as Code 실전 구성하기
 

Mais de Jay Park

(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?Jay Park
 
(독서광) 쉽고 빠르게 익히는 실전 LLM - ChatGPT 활용부터 LLM 파인튜닝, 임베딩, 고급 프롬프트 엔지니어링까지
(독서광) 쉽고 빠르게 익히는 실전 LLM - ChatGPT 활용부터 LLM 파인튜닝, 임베딩, 고급 프롬프트 엔지니어링까지(독서광) 쉽고 빠르게 익히는 실전 LLM - ChatGPT 활용부터 LLM 파인튜닝, 임베딩, 고급 프롬프트 엔지니어링까지
(독서광) 쉽고 빠르게 익히는 실전 LLM - ChatGPT 활용부터 LLM 파인튜닝, 임베딩, 고급 프롬프트 엔지니어링까지Jay Park
 
(독서광) LEAN HR - 당신의 스타트업은 안녕하십니까 (한빛미디어 2024)
(독서광) LEAN HR - 당신의 스타트업은 안녕하십니까 (한빛미디어 2024)(독서광) LEAN HR - 당신의 스타트업은 안녕하십니까 (한빛미디어 2024)
(독서광) LEAN HR - 당신의 스타트업은 안녕하십니까 (한빛미디어 2024)Jay Park
 
(독서광) 구술 문화와 문자 문화: 출간 30주년 기념판 (전후 해제 포함)
(독서광) 구술 문화와 문자 문화: 출간 30주년 기념판 (전후 해제 포함)(독서광) 구술 문화와 문자 문화: 출간 30주년 기념판 (전후 해제 포함)
(독서광) 구술 문화와 문자 문화: 출간 30주년 기념판 (전후 해제 포함)Jay Park
 
(독서광) 테드 창의 숨 (아홉 가지 단편/중편 SF 과학 소설 모음집)
(독서광) 테드 창의 숨 (아홉 가지 단편/중편 SF 과학 소설 모음집)(독서광) 테드 창의 숨 (아홉 가지 단편/중편 SF 과학 소설 모음집)
(독서광) 테드 창의 숨 (아홉 가지 단편/중편 SF 과학 소설 모음집)Jay Park
 
(독서광) 이제는 이기는 인생을 살고 싶다 - 적을 만들지 않고 단번에 갈등을 풀어내는 백전백승 변호사의 지혜지략
(독서광) 이제는 이기는 인생을 살고 싶다 - 적을 만들지 않고 단번에 갈등을 풀어내는 백전백승 변호사의 지혜지략(독서광) 이제는 이기는 인생을 살고 싶다 - 적을 만들지 않고 단번에 갈등을 풀어내는 백전백승 변호사의 지혜지략
(독서광) 이제는 이기는 인생을 살고 싶다 - 적을 만들지 않고 단번에 갈등을 풀어내는 백전백승 변호사의 지혜지략Jay Park
 
(독서광) 프로덕트 매니저 원칙: 10년이 가도 변하지 않을 PM/PO로 살아가는 원칙과 철학
(독서광) 프로덕트 매니저 원칙: 10년이 가도 변하지 않을 PM/PO로 살아가는 원칙과 철학(독서광) 프로덕트 매니저 원칙: 10년이 가도 변하지 않을 PM/PO로 살아가는 원칙과 철학
(독서광) 프로덕트 매니저 원칙: 10년이 가도 변하지 않을 PM/PO로 살아가는 원칙과 철학Jay Park
 
(독서광) 개발자로 첫 출근했어요 - 사내 개발 도구, 기술, 문화 적응 가이드
(독서광) 개발자로 첫 출근했어요 - 사내 개발 도구, 기술, 문화 적응 가이드(독서광) 개발자로 첫 출근했어요 - 사내 개발 도구, 기술, 문화 적응 가이드
(독서광) 개발자로 첫 출근했어요 - 사내 개발 도구, 기술, 문화 적응 가이드Jay Park
 
(독서광) 책 vs 책: 코딩 테스트 합격자 되기 vs 파이썬 알고리즘 인터뷰
(독서광) 책 vs 책: 코딩 테스트 합격자 되기 vs 파이썬 알고리즘 인터뷰(독서광) 책 vs 책: 코딩 테스트 합격자 되기 vs 파이썬 알고리즘 인터뷰
(독서광) 책 vs 책: 코딩 테스트 합격자 되기 vs 파이썬 알고리즘 인터뷰Jay Park
 
(독서광) 테니스 이너 게임
(독서광) 테니스 이너 게임(독서광) 테니스 이너 게임
(독서광) 테니스 이너 게임Jay Park
 
(독서광) 인간 vs. AI 정규표현식 문제 풀이 대결
(독서광) 인간 vs. AI 정규표현식 문제 풀이 대결(독서광) 인간 vs. AI 정규표현식 문제 풀이 대결
(독서광) 인간 vs. AI 정규표현식 문제 풀이 대결Jay Park
 
(독서광) 모던 리눅스 교과서
(독서광) 모던 리눅스 교과서(독서광) 모던 리눅스 교과서
(독서광) 모던 리눅스 교과서Jay Park
 
(독서광) 상자 밖에 있는 사람
(독서광) 상자 밖에 있는 사람(독서광) 상자 밖에 있는 사람
(독서광) 상자 밖에 있는 사람Jay Park
 
(독서광) 자바 알고리즘 인터뷰 with 코틀린
(독서광) 자바 알고리즘 인터뷰 with 코틀린(독서광) 자바 알고리즘 인터뷰 with 코틀린
(독서광) 자바 알고리즘 인터뷰 with 코틀린Jay Park
 
(독서광) 리그 오브 레전드 플레이어 중심주의
(독서광) 리그 오브 레전드 플레이어 중심주의(독서광) 리그 오브 레전드 플레이어 중심주의
(독서광) 리그 오브 레전드 플레이어 중심주의Jay Park
 
(일상다반사) 2023년 구독자 3,000명 돌파 이벤트
(일상다반사) 2023년 구독자 3,000명 돌파 이벤트(일상다반사) 2023년 구독자 3,000명 돌파 이벤트
(일상다반사) 2023년 구독자 3,000명 돌파 이벤트Jay Park
 
(독서광) 오늘날 우리는 컴퓨터라 부른다
(독서광) 오늘날 우리는 컴퓨터라 부른다(독서광) 오늘날 우리는 컴퓨터라 부른다
(독서광) 오늘날 우리는 컴퓨터라 부른다Jay Park
 
(독서광) 사실은 이것도 디자인입니다
(독서광) 사실은 이것도 디자인입니다(독서광) 사실은 이것도 디자인입니다
(독서광) 사실은 이것도 디자인입니다Jay Park
 
(독서광) 프로덕트 매니지먼트
(독서광) 프로덕트 매니지먼트(독서광) 프로덕트 매니지먼트
(독서광) 프로덕트 매니지먼트Jay Park
 
(독서광) 슬기로운 파이썬 트릭
(독서광) 슬기로운 파이썬 트릭(독서광) 슬기로운 파이썬 트릭
(독서광) 슬기로운 파이썬 트릭Jay Park
 

Mais de Jay Park (20)

(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
 
(독서광) 쉽고 빠르게 익히는 실전 LLM - ChatGPT 활용부터 LLM 파인튜닝, 임베딩, 고급 프롬프트 엔지니어링까지
(독서광) 쉽고 빠르게 익히는 실전 LLM - ChatGPT 활용부터 LLM 파인튜닝, 임베딩, 고급 프롬프트 엔지니어링까지(독서광) 쉽고 빠르게 익히는 실전 LLM - ChatGPT 활용부터 LLM 파인튜닝, 임베딩, 고급 프롬프트 엔지니어링까지
(독서광) 쉽고 빠르게 익히는 실전 LLM - ChatGPT 활용부터 LLM 파인튜닝, 임베딩, 고급 프롬프트 엔지니어링까지
 
(독서광) LEAN HR - 당신의 스타트업은 안녕하십니까 (한빛미디어 2024)
(독서광) LEAN HR - 당신의 스타트업은 안녕하십니까 (한빛미디어 2024)(독서광) LEAN HR - 당신의 스타트업은 안녕하십니까 (한빛미디어 2024)
(독서광) LEAN HR - 당신의 스타트업은 안녕하십니까 (한빛미디어 2024)
 
(독서광) 구술 문화와 문자 문화: 출간 30주년 기념판 (전후 해제 포함)
(독서광) 구술 문화와 문자 문화: 출간 30주년 기념판 (전후 해제 포함)(독서광) 구술 문화와 문자 문화: 출간 30주년 기념판 (전후 해제 포함)
(독서광) 구술 문화와 문자 문화: 출간 30주년 기념판 (전후 해제 포함)
 
(독서광) 테드 창의 숨 (아홉 가지 단편/중편 SF 과학 소설 모음집)
(독서광) 테드 창의 숨 (아홉 가지 단편/중편 SF 과학 소설 모음집)(독서광) 테드 창의 숨 (아홉 가지 단편/중편 SF 과학 소설 모음집)
(독서광) 테드 창의 숨 (아홉 가지 단편/중편 SF 과학 소설 모음집)
 
(독서광) 이제는 이기는 인생을 살고 싶다 - 적을 만들지 않고 단번에 갈등을 풀어내는 백전백승 변호사의 지혜지략
(독서광) 이제는 이기는 인생을 살고 싶다 - 적을 만들지 않고 단번에 갈등을 풀어내는 백전백승 변호사의 지혜지략(독서광) 이제는 이기는 인생을 살고 싶다 - 적을 만들지 않고 단번에 갈등을 풀어내는 백전백승 변호사의 지혜지략
(독서광) 이제는 이기는 인생을 살고 싶다 - 적을 만들지 않고 단번에 갈등을 풀어내는 백전백승 변호사의 지혜지략
 
(독서광) 프로덕트 매니저 원칙: 10년이 가도 변하지 않을 PM/PO로 살아가는 원칙과 철학
(독서광) 프로덕트 매니저 원칙: 10년이 가도 변하지 않을 PM/PO로 살아가는 원칙과 철학(독서광) 프로덕트 매니저 원칙: 10년이 가도 변하지 않을 PM/PO로 살아가는 원칙과 철학
(독서광) 프로덕트 매니저 원칙: 10년이 가도 변하지 않을 PM/PO로 살아가는 원칙과 철학
 
(독서광) 개발자로 첫 출근했어요 - 사내 개발 도구, 기술, 문화 적응 가이드
(독서광) 개발자로 첫 출근했어요 - 사내 개발 도구, 기술, 문화 적응 가이드(독서광) 개발자로 첫 출근했어요 - 사내 개발 도구, 기술, 문화 적응 가이드
(독서광) 개발자로 첫 출근했어요 - 사내 개발 도구, 기술, 문화 적응 가이드
 
(독서광) 책 vs 책: 코딩 테스트 합격자 되기 vs 파이썬 알고리즘 인터뷰
(독서광) 책 vs 책: 코딩 테스트 합격자 되기 vs 파이썬 알고리즘 인터뷰(독서광) 책 vs 책: 코딩 테스트 합격자 되기 vs 파이썬 알고리즘 인터뷰
(독서광) 책 vs 책: 코딩 테스트 합격자 되기 vs 파이썬 알고리즘 인터뷰
 
(독서광) 테니스 이너 게임
(독서광) 테니스 이너 게임(독서광) 테니스 이너 게임
(독서광) 테니스 이너 게임
 
(독서광) 인간 vs. AI 정규표현식 문제 풀이 대결
(독서광) 인간 vs. AI 정규표현식 문제 풀이 대결(독서광) 인간 vs. AI 정규표현식 문제 풀이 대결
(독서광) 인간 vs. AI 정규표현식 문제 풀이 대결
 
(독서광) 모던 리눅스 교과서
(독서광) 모던 리눅스 교과서(독서광) 모던 리눅스 교과서
(독서광) 모던 리눅스 교과서
 
(독서광) 상자 밖에 있는 사람
(독서광) 상자 밖에 있는 사람(독서광) 상자 밖에 있는 사람
(독서광) 상자 밖에 있는 사람
 
(독서광) 자바 알고리즘 인터뷰 with 코틀린
(독서광) 자바 알고리즘 인터뷰 with 코틀린(독서광) 자바 알고리즘 인터뷰 with 코틀린
(독서광) 자바 알고리즘 인터뷰 with 코틀린
 
(독서광) 리그 오브 레전드 플레이어 중심주의
(독서광) 리그 오브 레전드 플레이어 중심주의(독서광) 리그 오브 레전드 플레이어 중심주의
(독서광) 리그 오브 레전드 플레이어 중심주의
 
(일상다반사) 2023년 구독자 3,000명 돌파 이벤트
(일상다반사) 2023년 구독자 3,000명 돌파 이벤트(일상다반사) 2023년 구독자 3,000명 돌파 이벤트
(일상다반사) 2023년 구독자 3,000명 돌파 이벤트
 
(독서광) 오늘날 우리는 컴퓨터라 부른다
(독서광) 오늘날 우리는 컴퓨터라 부른다(독서광) 오늘날 우리는 컴퓨터라 부른다
(독서광) 오늘날 우리는 컴퓨터라 부른다
 
(독서광) 사실은 이것도 디자인입니다
(독서광) 사실은 이것도 디자인입니다(독서광) 사실은 이것도 디자인입니다
(독서광) 사실은 이것도 디자인입니다
 
(독서광) 프로덕트 매니지먼트
(독서광) 프로덕트 매니지먼트(독서광) 프로덕트 매니지먼트
(독서광) 프로덕트 매니지먼트
 
(독서광) 슬기로운 파이썬 트릭
(독서광) 슬기로운 파이썬 트릭(독서광) 슬기로운 파이썬 트릭
(독서광) 슬기로운 파이썬 트릭
 

Último

캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Wonjun Hwang
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)Tae Young Lee
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Kim Daeun
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionKim Daeun
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Wonjun Hwang
 

Último (6)

캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
 

Mean 스택을 사용한 IoT 개발

  • 1. + MEAN 스택을 사용한 IoT 개발 박재호(jrogue@gmail.com)
  • 3. +
  • 7. + bonescript n  Beagle Bone에서 아두이노 스타일의 프로그램이 가능하게 만들어 주는 자바스크립트 라이브러리
  • 11. + heimcontrol.js(1) Raspberry PI and Arduino using Node.js
  • 14. + Node.js인 이유는?(2) n  개발 시간과 성능의 조화 n  아무리 성능이 좋더라도 개발 시간이 오래 걸릴 경우 생산성이 떨어진다 n  주의: 1행을 작성하는 시간은 어셈블리나 SQL이나 비슷하다 n  스크립트 언어의 경우 빨리 개발은 가능하지만 성능이 떨어진다 n  자바스크립트를 사용한 Node.js는 개발과 성능 양쪽 모두 뛰어나다 n  스타트업 vs 기업 n  스타트업은 빨리 변화하는 생태계에서 살아남기 위해 필연적으로 오픈 소스에 매진한다 n  대기업은 유지보수와 안정성, 그리고 성능에 관심이 많다 n  Node.js는 양쪽 모두를 만족시킨다(오픈 소스 기반, 자바와 같은 강력한 생태계)
  • 15. + Node.js인 이유는?(3) n  뛰어난 성능 n  월마트는 블랙 프라이데이에 Node.js로 전제 모바일 사이트 오픈 n  초당 두 배 요청을 받아들이고 응답시간을 35%(200ms) 줄임 n  서버 CPU 사용량이 2%, 200만 명 온라인 접속 방어 n  이벤트 아키텍처 n  스레드가 아닌 단일 프로세스 n  대신 동기식 차단이 아닌 비동기식 I/O n  웹 브라우저 특성상 이미 자바스크립트는 콜백을 사용하는 이벤트 구 동 방식을 지원(비동기식 코드에 대한 표현력이 강함)
  • 16. + 동기식 입출력 vs 비동기식 입출력
  • 17. + 멀티 스레드 vs 단일 스레드
  • 21. + 선행조건 n  MEAN 기본 스택 준비 n  Node.js 설치: http://nodejs.org/ n  MongoDB 설치: http://www.mongodb.org/ n  자바스크립트 편집기는 brackets 추천: http://brackets.io/ n  예제 소스 코드 저장소 위치 n  Node.js용 node-collector: https://bitbucket.org/jrogue/node- collector n  AngularJS용 angular-lamp-app: https://bitbucket.org/jrogue/ angular-lamp-app
  • 24. + 첫 Node.js 프로그램: / server_plain_vanilla.js /*jslint node: true */ var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello Worldn'); }).listen(3000, '127.0.0.1'); console.log('Server running at http://127.0.0.1:3000/');
  • 25. + Node.js 프로그램을 위한 패키지 설 정: /package.json { "name": "node-collector", "private": true, "version": "0.1.0", "description": "A starter project for Node.js", "license": "MIT", "devDependencies": { "express": "4.x", "body-parser": "1.4.x“, "mongoose": "^3.8.20" } }
  • 27. + Node.js를 사용한 첫 RESTful 프로그 램: /server.js var express = require('express'); var app = express(); app.get('/lamps', function(req, res) { res.send([{name: 'lamp1'}, {name: ‘lamp2'}]); }); app.get('/lamps/:id', function(req, res) { res.send({id:req.params.id, name: "lamp" + req.params.id, status: "lamp ready"}); }); app.listen(3000); console.log('Listening on port 3000...');
  • 29. + Node.js 모듈 사용: /routes/lamps.js exports.findAll = function (req, res) { res.send([{name: 'lamp1'}, {name: 'lamp2'}, {name: ‘lamp3'}]); }; exports.findById = function (req, res) { res.send({id: req.params.id, name: "lamp" + req.params.id, status: "lamp ready"}); }; var express = require('express'), bodyParser = require('body-parser'), lamps = require('./routes/lamps.js'); var app = express(); app.get('/lamps', lamps.findAll); app.get('/lamps/:id', lamps.findById); app.listen(3000); console.log('Listening on port 3000...');
  • 30. + 몽고DB 연동을 위한 준비: /db.js var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/lamps', function () { console.log('mongodb connected') }); module.exports = mongoose;
  • 31. + 몽고DB 모델 생성: /models/lamp.js var db = require('../db'); var Lamp = db.model('Lamp', { lampname: { type: String, required: true }, status: { type: String, required: true }, date: { type: Date, required: true, default: Date.now } }); module.exports = Lamp;
  • 32. + Node.js 모듈 내용 변경(1): /routes/ lamps.js var Lamp = require('../models/lamp'); exports.addLamp = function (req, res, next) { var lamp = new Lamp({ lampname: req.body.lampname, status: req.body.status }); lamp.save(function (err, lamp) { if (err) { return next(err); } res.status(201).json(lamp); }); };
  • 33. + Node.js 모듈 내용 변경(2): /routes/ lamps.js exports.updateLamp = function (req, res, next) { Lamp.findOne({ _id: req.params.id }, function (err, lamp) { if (err) { return next(err); } lamp.status = req.body.status; lamp.save(function (err, lamp) { if (err) { return next(err); } res.status(201).json(lamp); }); }); }; exports.deleteLamp = function (req, res, next) { Lamp.remove({ _id: req.params.id }, function (err, lamp) { if (err) { return next(err); } res.status(201).json(lamp); }); };
  • 34. + Node.js 모듈 내용 변경(3): /routes/ lamps.js exports.findAll = function (req, res, next) { Lamp.find(function (err, lamps) { if (err) { return next(err); } res.status(201).json(lamps); }); }; exports.findById = function (req, res, next) { Lamp.findOne({ _id: req.params.id }, function (err, lamp) { if (err) { return next(err); } res.status(201).json(lamp); }); };
  • 35. + CRUD 전체 정의를 위한 변경: / server.js var express = require('express'), bodyParser = require('body-parser'), lamps = require('./routes/lamps.js'); var app = express(); app.use(bodyParser.json()); app.post('/lamps', lamps.addLamp); app.get('/lamps', lamps.findAll); app.get('/lamps/:id', lamps.findById); app.put('/lamps/:id', lamps.updateLamp); app.delete('/lamps/:id', lamps.deleteLamp); app.listen(3000); console.log('Listening on port 3000...');
  • 36. + 서버 시작 n  서버 시작 n  $ node server n  주의: 서버 시작에 앞서 지역 호스트(localhost)에 몽고DB를 설치 하고 시작했는지 반드시 확인하자!
  • 37. + 단말 쪽 프로그래밍 n  REST 방식으로 API를 호출하면 된다 n  단말 조건: TCP/IP 스택이 설치되어 있으며, REST 클라이언트 라이브러 리를 사용할 수 있어야 한다. n  만일 리눅스 기반으로 동작하는 단말인 경우 뒤에 테스트 예제에서 설명하는 curl을 system으로 호출하면 아주 쉽게 구현 가능하다. n  C 언어로 개발할 경우 libcurl을 사용할 수도 있다. n  스크립트 언어로 개발할 경우 스크립트 언어의 REST 클라이언트 패 키지를 사용하면 몇 줄로 서버 쪽에 자신의 상태를 전달할 수 있다. n  이어지는 테스트 예제를 보며 CRUD 전달 방식을 확인하자.
  • 38. + CRUD 테스트: POSTMAN vs curl 크롬 확장: REST 클라이언트 http://curl.haxx.se/ (홈페이지) http://www.confusedbycode.com/curl/ (윈도우 32비트/64비트) 참고: 여기서는 설명의 편의를 위해 cURL을 사용한다!
  • 39. + 서버 구동 후 생성 테스트(curl 사용)
  • 43. + (변경 내역 반영 검증을 위한) 읽기 테 스트
  • 48. + AngularJS 샘플 앱의 디렉터리 구조
  • 49. + /index.html <!DOCTYPE html> <html ng-app="LampApp"> <head> <link href="styles/main.css" rel="stylesheet"> <link rel="stylesheet" ref="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css"> </head> <body> <ul class="menu"> <li><a href="#/notice">notice</a></li> <li><a href="#/list">list</a></li> </ul> <div class="container" ng-view=""></div> <script src="https://code.jquery.com/jquery-2.1.1.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.5/angular.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.5/angular-resource.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.5/angular-route.min.js"></script> <script src="scripts/app.js"></script> <script src="scripts/services/services.js"></script> <script src="scripts/controllers/controllers.js"></script> </body> </html>
  • 50. + views/list.html <div class="span6"> <table class="table table-striped table-condensed"> <thead> <tr> <th style="min-width: 300px;">Lamp ID</th> <th style="min-width: 120px;">Name</th> <th style="min-width: 120px;">Status</th> <th style="min-width: 120px;">Action</th> </tr> </thead> <tbody> <tr ng-repeat="lamp in lamps"> <td>{{ lamp._id }}</td> <td>{{ lamp.lampname }}</td> <td>{{ lamp.status }}</td> <td><input type="radio" value="on"> on <input type="radio" value="off"> off</td> </tr> </tbody> </table> </div>
  • 52. + scripts/services/services.js 'use strict'; var services = angular.module('lampApp.services', ['ngResource']); var baseUrl = 'http://localhost:3000'; services.factory('NoticeFactory', function ($resource) { return $resource(baseUrl + '/notice', {}, { query: { method: 'GET', params: {} } }); }); services.factory('LampsFactory', function ($resource) { return $resource(baseUrl + '/lamps', {}, { query: { method: 'GET', isArray: true } }); }); services.factory('LampFactory', function ($resource) { return $resource(baseUrl + '/lamps/:id', {}, { show: { method: 'GET' } }); });
  • 53. + scripts/controller/controller.js 'use strict'; var app = angular.module('lampApp.controllers', []); // Clear browser cache (in development mode) // // http://stackoverflow.com/questions/14718826/angularjs-disable-partial-caching-on- dev-machine app.run(function ($rootScope, $templateCache) { $rootScope.$on('$viewContentLoaded', function () { $templateCache.removeAll(); }); }); app.controller('NoticeCtrl', ['$scope', 'NoticeFactory', function ($scope, NoticeFactory) { $scope.message = '간단한 AngularJS 테스트 프로그램입니다. Lamp 상태를 보여줍니다. 아 직 Lamp 조작 기능은 구현되어 있지 않습니다.'; }]); app.controller('ListCtrl', ['$scope', 'LampsFactory', function ($scope, LampsFactory) { $scope.lamps = LampsFactory.query(); }]);
  • 54. + scripts/app.js "use strict"; // Declare app level module which depends on views, and components angular.module('LampApp', [ 'ngResource', 'ngRoute', 'lampApp.services', 'lampApp.controllers' ]). config(['$routeProvider', function ($routeProvider, $httpProvider) { $routeProvider.when('/notice', { templateUrl: 'views/notice.html', controller: 'NoticeCtrl'}); $routeProvider.when('/list', { templateUrl: 'views/list.html', controller: 'ListCtrl'}); $routeProvider.otherwise({redirectTo: '/notice'}); }]);
  • 55. + HTTP 서버 사용하기 n  Node용 간이 http 서버 설치 n  npm install http-server –g n  AngularJS를 서비스 하기 위한 HTTP 서버 시작 n  cd angular-app n  http-server 실시간 미 리 보기 또는 Brackets에서
  • 58. + 도전 과제 n  socket.io를 사용해 polling하지 않고서 추가/변경/삭제되는 Lamp 목록을 보여준다. n  hard coded된 notice 문구 대신, 특정 Lamp에 문제가 생겼을 경 우 서버에서 경고를 받아 출력한다. n  Action을 추가해, Lamp를 켜고/끄게 만든다. n  bower를 사용해 AngularJS 개발 과정에서 복잡한 프론트엔드 의 존성을 자동으로 관리하게 만든다.
  • 60. + 참고 자료 n  http://docs.aws.amazon.com/lambda/latest/dg/ walkthrough-custom-events.html n  http://ni-c.github.io/heimcontrol.js/ n  http://coenraets.org/blog/2012/10/creating-a-rest-api- using-node-js-express-and-mongodb/ n  https://blog.codecentric.de/en/2013/03/home-automation- with-angularjs-and-node-js-on-a-raspberry-pi/ n  http://mean.io/ n  http://bcho.tistory.com/881
  • 61. + 참고 서적(팩트 서적은 번역 진행 중)
  • 62. +