2017년 10월 21일 토요일

Chapter2. NodeJS의 기본 모듈1


학습 목표

1. Node.js의 모듈 시스템을 이해할 수 있습니다.
2. 전역 객체를 알고 사용할 수 있습니다.
3. 콘솔, 유틸리티 모듈을 사용할 수 있습니다.
4. 이벤트가 동작하는 원리를 이해할 수 있습니다.

1. 기본 모듈

◎ 기본 모듈

  • Node.js와 함께 설치
  • 별도의 설치 과정 불필요
◎ 홈페이지 > 도큐 먼트
◎ 주요 기본 모듈
◎ 프로세스 환경
  • os, process, cluster
◎ 파일과 경로, URL
  • fs, path, URL, querystring, stream
◎ 네트워크 모듈
  • http, https, net, dgram, dns

2. 전역 객체

◎ 전역 객체(global)
  • 별도의 모듈 로딩없이 사용
  • global 모듈
    global.console.log()
  • global 생략 가능
    console.log()
◎ 주요 전역 객체

  • process
  • console
  • Buffer(클래스)
  • require
  • __filename, __dirname
  • module
  • exports
  • Timeout 함수
◎ 전역객체 : process
▷ 애플리케이션 프로세스 실행 정보
  • env : 애플리케이션 실행 환경
  • version : Node.js 버전
  • arch, platform : CPU 와 플랫폼 정보
  • argv : 실행 명령 파라미터
▷ 이벤트
  • exit : 애플리케이션 종료 이벤트
  • beforeExit : 종료 되기 전에 발생하는 이벤트
  • uncaughtException : 예외 처리되지 않은 이벤트
▷ 함수
  • exit : 애플리케이션 종료
  • nextTick : 이벤트 루프 내 동작을 모두 실행 후 콜백 실행
▷ 프로세스 실행 정보
  • process.env : {TERM_PROGRAM:'iTerm.app',
    SHELL:'/bin/bash',
    TERM:'xterm-256color',
    PWD:'/Users/wannabewize/Projects/TAcademy/Node-
    Samples/BasicModules',
    ITERM_PROFILE:'Default',
    HOME:'/Users/wannabewize',
    LOGNAME:'wannabewize',
    LC_CTYPE:'UTF-8'}
  • process.arch:x64
  • process.platform: darwin
◎ 프로세스 실행 환경
▷ 실행파라미터 얻기
  • process.arv
▷ 실행 환경
  • $ node processAdd.js 3 5
▷ 결과
  • // 0, 1은 node, processAdd.js
    var i = process.argv[2];
    var j = process.argv[3];
    var sum = parseInt(i) + parseInt(j);
    console.log(sum); // 8

3. 타이머

◎ 타이머 함수
  • 지연 동작 : settTimeout
  • 반복 동작 : setInterval
◎ Timeout
▷ 일정 시간 뒤 호출
  • setTimeout(callback, delay, arg, ...)
  • clearTimeout()
▷ 파라미터
  • callback : 함수 형태
  • delay : 초(milli second)
  • arg : callback 함수의 파라미터
▷ 예제 코드
function.sayHello() {
    console.log('Hello World');
}
// 3초뒤 실행
setTimeout(sayHello, 3*1000);

▷ 타이머 취소
var t = setTimeout(sayHello, 10);
clearTimeout(t);

▷ 반복
setInterval(callback, delay, arg, ...)
clearInterval()

▷ 예제 코드
function sayGoodbye(who) {
    console.log('Good bye', who);
}
setInterval(sayGoodbye, 1*1000, 'Friend');

4. 콘솔

◎ 콘솔(Console)
  • 로그 남기기
  • 실행 시간 측정
◎ 수준별 로그 남기기
  • console.info()
  • console.log()
  • console.warn()
  • console.error
◎ 로그 남기기
▷ 로그 남기기 예
  • console.log('log', 'log message');
  • console.info('info', 'info message');
  • console.warn('warn', 'warn message');
  • console.error('error', 'error message');
▷ 값 출력
var intValue = 3;
console.log('int Value ' + 3);

▷ 객체형 출력
var obj = {
    name : 'IU',
    job : 'Singer'
}
console.log('obj: ' + obj);
console.log('obj: ', obj);

◎ 커스텀 콘솔
▷ 콘솔 타입 로딩

  • var Console = require('console').Console;
▷ 콘솔 객체 생성
  • new Console(stdout[, stderr])
▷ 파라미터 : 출력 스트림
  • stdout : 표준 출력 스트림, infor, log
  • stderr : 에러 출력, warn, error
▷ 파일로 로그 남기는 커스텀 콘솔

  • var output = fs.createWriteStream('./stdout.log');
  • var errorOutput = fs.createWriteStream('./stderr.log');
  • var logger = new Console(output, errorOutput);
◎ 실행 시간 측정
▷ 콘솔 객체로 실행 시간 측정하기
▷ 시작 시점 설정하기
  • console.time(TIMER_NAME)
▷ 종료 시점, 걸린 시간 계산해서 출력
  • console.timeEnd(TIMER_NAME)
▷ 예제 코드
console.time('SUM');
var sum = 0;
for(var i = 1; i < 100000 ; i++) {
    sum += i;
}

console.log('sum : ', sum);

// 시간 측정 시작
console.timeEnd('SUM');

5. 유틸리티

◎ 유틸리티 모듈

◎ 모듈 로딩

  • var util = require('util');
◎ 주요 기능
  • 문자열 포맷
  • 상속
  • is 함수(deprecated)
◎ 유틸리티 - 포맷
▷ 문자열 포맷
  • util.format(format[, ...])
▷ placeholder(형식문자열)
  • %s : String
  • %d : Number
  • %j : JSON
▷ 예제 코드
var str1 = util.format('%d + %d = %d', 1, 2, (1+2));
=> 1 + 2 = 3
var str2 = util.format('%s %s', 'Hello', 'World');
=> Hello World

◎ 유틸리티 - 상속
▷ 상속 : inherits
  • util.inherits(constructor, superConstructor)
▷ 사용 방법
  • util.inherits(ChildClassFunction, ParentClassFunction);
▷ 예제 코드
finction Parent() {
}

function Child() {
}

util.inherits(Child, Parent);

▷ 예제 코드
finction Parent() {
}
Parent.prototype.sayHello = function() {
    console.log('Hello. from Parent Class');
}
function Child() {
}

util.inherits(Child, Parent);

var child = new Child();
child.sayHello();

6. 이벤트

◎ 이벤트 모듈

  • 이벤트 다루기 : EventEmitter
  • 이벤트를 다루는 기능 제공
◎ Node.js 애플리케이션의 이벤트들

▷ 이벤트의 예

  • 클라이언트의 접속 요청
  • 소켓에 데이터 도착
  • 파일 오픈/읽기 완료
▷ 이벤트 처리
  • 비동기 처리
  • 리스너 함수
◎ 이벤트를 다룰 수 있는 타입 : Readline 모듈
▷ Class : Interface
  • rl.close()
  • rl.pause()
▷ Events
  • Event : 'close'
  • Event : 'line'
  • Event : 'pause'
  • Event : 'resume'
  • Event : 'SIGCONT'
  • Event : 'SIGINT'
◎ 타입에 정의된 이벤트 다루기
▷ 이벤트 리스너 함수 등록

  • emitter.addListener(event, listener)
  • emitter.on(event, listener)
  • emitter.once(event, listener)
◎ 이벤트 리스너 등록
▷ 이벤트 리스너 등록 예
process.on('exit', function() {
    console.log('occur exit event');
});

// 한번만 동작
process.once('exit', function() {
    console.log('occur exit event');
});

◎ 이벤트 리스너 함수 삭제

  • emitter.removeListener(event, listener)
  • emitter.removeAllListeners([event])
◎ 최대 이벤트 핸들러 개수(기본 10개)
  • emitter.setMaxListener(n)
  • emitter.getMaxListener()
◎ 실습
▷ 애플리케이션 종료 이벤트
  • process.on('exit', function(code))
▷ 예외처리 되지 않는 상황 - 앱 죽는 상황!
  • process.on('uncaughtException', uncaughtExceptionListener);
◎ 이벤트 발생
▷ 이벤트 발생 시키기(emit)
  • emitter.emit(event[, arg1][, arg2][, ...])
  • event : 이벤트 이름
  • arg : 리스너 함수의 파라미터
  • emit 함수 호출 결과 : true(이벤트 처리), false(이벤트 처리 안됨)
▷ 예
process.emit('exit');
process.emit('exit', 0); // 리스너 함수의 파라미터로 0 전달

◎ 커스텀 이벤트
▷EventEmitter 객체에 커스텀 이벤트
var customEvent = new event.EventEmitter();

customEvent.on('tick' function() {
    console.log('occur custom event');
});

customEvent.emit('tick');

customEvent가 EventEmitter 객체가 아니라면 on 이라는 함수가 정의되지
않았기 때문에 에러가 나게 되면서 프로그램이 crash되게 됨.

◎ 커스텀 이벤트, 상속
▷ util 모듈을 이용해서 EventEmitter 상속
var Person = fuction();
// 상속
var util = require('util');
var EventEmitter = require('events').EventEmitter;
util.inherits(Persion, EventEmitter);

// 객체
var p = new Persion();
p.on('howAreYou', function() {
    console.log('Fine, Thank you and you?')
});

// 이벤트 발생
p.emit('howAreYou');

여기서 잠깐!

※ 리스너 함수, 에러
◎ 모든 리스너 함수의 첫 번재 파라미터 : 에러
▷ 에러 처리
emitter.on('event', function(error, result) {
    if(error) {
        // 에러 처리
    }
    else {
        // 정상 처리
    }
}

학습정리

◎ 지금까지 'Node.JS의 기본모듈!'에 대해 살펴보았습니다.
기본 모듈
별도의 설치 과정 없이 사용할 수 있는 모듈로 Node.js와 함께 설치된다.

전역객체
global 모듈에 속하는 객체와 함수로 모듈 로딩 과정 없이 사용할 수 있다. console,
timeout, __dirname, process 등이 있다.

타이머
타이머 함수인 setTimeout()이나 setInterval() 함수를 이용해서 일정 시간 뒤에
동작하거나, 주기적으로 동작하는 기능을 작성할 수 있다.

콘솔
콘솔(Console)을 이용해서 콘솔 화면에 내용을 출력할 뿐만 아니라 실행 시간을
측정할 수 있다.

유틸리티
유틸리티 모듈을 이용해서 형식 문자열을 작성할 수 있었다. 그리고 클래스 간에
상속 관계를 만들 수 있다.

이벤트
이벤트를 다루는 EventEmitter의 특징과 이벤트를 다루는 방법을 알아봤다. 그리고
유틸리티 모듈의 상속을 통해서 커스텀으로 작성한 타입에서도 이벤트를 다룰 수
있다.









댓글 없음: