Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Node #26

Open
raycon opened this issue Dec 22, 2020 · 1 comment
Open

Node #26

raycon opened this issue Dec 22, 2020 · 1 comment

Comments

@raycon
Copy link
Owner

raycon commented Dec 22, 2020

Node

비동기 이벤트 주도 JavaScript 런타임

  • Highly-scalable, data-intensive and real-time apps
  • Node is a runtime environment for executing JavaScript code
    • 자바스크립트로 파일 시스템, OS, 네트워크를 사용할 수 있는 환경을 제공해준다.
  • Non-blocking (Asynchronous)
  • Single Thread 로 여러 Request를 처리한다.
    • 기존(ASP.NET)에는 요청 하나당 스레드 하나가 생성되어서, 모든 스레드가 사용중이면 대기를 해야 했다.
  • Node is ideal for I/O-intensive apps.
    • 쿼리를 실행하고 다른 요청을 처리할 수 있음
  • Do not use Node for CPU-intensive apps. (Video encoding, Image population)
    • 요청을 처리하는 동안 다른 요청이 기다려야함

Global Objects

console, setTimeout(), clearTimeout(), setInterval(), clearInterval() 등의 객체가 있다. 브라우저에서는 모든 Global Object를 window Object를 통해서 접근할 수 있다.

window.console.log(...)
var message = '';
window.message

node 는 window 대신 global 객체가 있다.

var message = '';
console.log(global.message) // undefined!
global.setTimeout(...)

window와는 다르게 변수나 함수가 global 객체에 추가되지 않는다.

Modules

  • 같은 이름의 함수를 다른 파일에서 선언하면, 나중에 불러온 함수가 window에 추가되어서 기존의 함수를 Overload 한다.
  • 각각의 파일이 각각의 모듈이 된다.
  • 파일 안에서 module 객체를 사용할 수 있다.
// logger.js
var url = "http://mylogger.io/log";

function log(message) {
  // Send an HTTP request
  console.log(message);
}

module.exports.log = log;
// module.exports.endPoint = url;
// app.js
// module.exports 객체가 logger로 할당된다.
const logger = require('./logger');
console.log(logger);
// output: { log: [Function: log] }

logger.log('message');
// output: message

module.exports에 변수나 함수를 직접 할당할 수 있다.

// logger.js
function log(message) {
  console.log(message);
}
module.exports = log;
// app.js
const log = require('./logger');
log('message')

Module Wrapper Function

모듈은 exports, require, module, __filename, __dirname이 파라미터로 전달되는 Module Wrapper Function에 의해 감싸진다.

// 간략한 버전
(function (exports, require, module, __filename, __dirname) {

  function log(message) {
    console.log(message);
  }

  module.exports = log;
  // 같은 의미로 사용할 수 있다.
  // module.exports.log = log;
  // exports.log = log;

  // export는 module.exports에 대한 참조라서 아래와 같이 선언할 수 없다.
  // exports = log;
}

Built-in Modules

OS

const os = require('os');
var totalMemory = os.totalmem();
var freeMemory = os.freemem();

console.log('Total Memory: '+ totalMemory);
console.log(`Free Memory: ${freeMemory}`);  // ES6 / ECMA2015 문법

File System

const fs = require('fs');

// 동기
// 성능 저하의 원인
const files = fs.readdirSync('./');
console.log(files);

// 비동기. 콜백으로 결과를 받는다.
fs.readdir('./', function(err, files) {
  if(err) console.log('Error', err);
  else console.log('Result', files);
});

Events

Event Emitter 클래스를 사용한다. 노드가 제공하는 기본 모듈들은 Event Emitter를 구현하는 것이 많다.

const EventEmitter = require('events');
const emitter = new EventEmitter();

// Register a listener
// emitter.on('messageLogged', function(arg) {
//    console.log('Listener called', arg);
// });

emitter.on('messageLogged', (arg) => {
    console.log('Listener called', arg);
});

// Raise an event
// emit: Making anoise, produce - signalling
emitter.emit('messageLogged', { id: 1, url: 'http://' });

HTTP

http.Servernet.Server를 상속받는다. net.ServerEventEmitter를 상속 받는다.

Class: net.Server#
Added in: v0.1.90
Extends: <EventEmitter>
const http = require('http');

const server = http.createServer((req, res) => {
  if (req.url === '/') {
    res.write('Hello World');
    res.end();
  }

  if (req.url === '/api/courses') {
    res.write(JSON.stringify([1, 2, 3]));
    res.end();
  }
});

server.listen(3000);

console.log('Listening on port 3000...');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant