Node.js 모듈
1. 기본모듈
: Node.js 와 함께 설치
: 별도의 설치 과정 불필요
* 주요 기본 모듈
- 프로세스 환경
: os, process, cluster
- 파일과 경로, URL
: fs, path, URL, querystring, stream
- 네트워크 모듈
: http, https, net, dgram, dns
2. 전역 객체
: global 모듈에 속해 있는 것들 // global 생략가능
: 별도의 모듈 로딩 없이 사용
* 주요 전역 객체
: process, console, Buffer (클래스), require, _filename, _dirname, module exports, Timeout 함수
* 전역객체 : process
: 애플리케이션 프로세스 실행정보
- env : 애플리케이션 실행 환경
- version : Node.js 버전
- arch, platform : CPU와 플랫폼 정보
- argv : 실행 명령 파라미터
: 이벤트
- exit : 앱 종료 이벤트
- beforeExit : 종료전 발생 이벤트
- uncaughtException : 예외처리 되지 않는 예외 이벤트
: 함수
- exit : 앱 종료
- nexTick : 이벤트 루프 내 동작을 모두 실행 후 콜백 실행
3. 타이머 함수
: 지연동작 : setTimeout
: 반복동작 : setInterval
: 일정 시간 뒤 호출
: setTimeout(callback, delay, arg...)
: clearTimeout()
: 파라미터
: callback : 함수형태
: delay, arg
: 반복
: setInterval(callback, delay, arg)
4. 콘솔
* 콘솔
: 로그 남기기
: 실행 시간 측정
* 수준별 로그 남기기
: console.log, console.info, console.warn, console.error
* 객체형 출력
> console.log('obj:' + obj) // [object Object]
> console.log('obj:', obj) // {name : 'IU', job: 'Singer'}
* 커스텀 콘솔
1. 콘솔 타입 로딩
2. 콘솔 객체 생성
3. 파라미터 : 출력 스트링
* 파일로 로그를 남기는 커스텀 콘솔
> 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)
5. 유틸리티
> var util = require('util')
: 문자열 포멧, 상속, is 함수(deprecated)
* 상속
: util.inherits(자식생성자, 부모 생성자)
6. 이벤트
: 이벤트 다루기 : EventEmitter
: 이벤트를 다루는 기능 제공
* Node.js 앱의 이벤트들
: 이벤트 예
: 클라이언트의 접속 요청
: 소켓에 데이터 도착
: 파일 오픈/읽기 완료
: 이벤트 처리
: 비동기 처리
: 리스너 함수
* 이벤트를 다룰 수 있는 타입 : Readline 모듈
* 타입에 정의된 이벤트 다루기
: 이벤트 리스너 함수 등록
> emitter.addListener(event, listener)
> emitter.on(event,listener)
> emitter.once(event,listener)
: 이벤트 리스너 함수 삭제
>emitter.removeListener
>emitter.removeAllListener
: 최대 이벤트 핸들러 개수(기본10개)
> 조정가능
* 이벤트 발생
: 이벤트 발생시키기
: emitter.emit(이벤트이름, arg...) // 호출결과 : true(이벤트 처리),false(이벤트처리안됨)
* 커스텀 이벤트
> var customEvent = new event.EventEmitter() // 이벤트 이미터에 on을 통해 추가해서 정의해두고, emit을 통해 이벤트를 활성화 시켜야함.
* 커스텀 이벤트, 상속
> var Person = function(){}
> var util = require('util')
> var EventEmitter = require('events').EventEmitter
> util.inherits(Person, EventEmitter)
* 꿀팁!
: 에러처리
: 이벤트 리스너의 콜백함수는 error, result로 구성되기 때문에, error코드에 대한 예외처리를 먼저 작성하고 result를 작성하는 구성이 적당하다
모듈2
1. 경로다루기
* path 모듈 : 파일경로 다루기
: 경로 정규화, 경로생성, 디렉토리/파일 이름 추출, 파일 확장자 추출
* 경로 정보
: 현재 실행파일 경로, 폴더 경로
: 전역객체 - _filename, _dirname
* 경로 다듬기
>path.normalize()
* 경로 구성 요소
: path.basename() : 파일 이름, 경로중 마지막 요소
: path.dirname() : 파일이 포함된 폴더 경로
: path.extname() : 확장자
: path.parse : 구성요소 객체를 얻을 수 있음
* 경로 만들기
: pathUtil.sep, pathUtil.join(), pathUtil.format()
2. 파일시스템 다루기
: 파일 시스템 모듈 : fs
* 주요기능
: 파일 생성/읽기/쓰기/삭제, 파일 접근성/속성, 디렉토리 생성/읽기/삭제, 파일 스트림
* 특징
: 비동기와 동기 방식 함수 모두 제공
* 비동기식/동기식 API
: 에러 처리 방법
: 동기식 - try-catch 사용
: 비동기식 - 콜백함수의 에러 파라미터를 사용
* 파일 다루기
: 파일 디스크립터
: fd를 사용
: fs.openSync를 통해 얻어온다.
: r,w,a플래그를 통해 속성정할 수 있음
: fs.close를 통해 닫아주어야 함.
: 파일 경로
: filename사용
* 파일 읽기
> fs.read(), fs.readFile(), fs.readFileSync()
* 파일 종류
: 문자열 읽기 - 인코딩해야함, 바이너리 읽기 - buffer
* 인코딩 설정안하면 buffer
* 파일 상태 확인
> fs.access(Sync) : 파일 접근 상태 얻기
> fs.stat(Sync) : 파일 상태 얻기
: 파일 상태 확인 후 읽기 하는 방법을 쓰자
* 파일에 저장
> fs.write, fs.writeFile.... : 파일 생성해서 쓰기
> fs.appendFile : 파일에 추가, 없다면 생성
> fs.unlink, fs.unlinkSync : 파일 삭제, 파일이 없으면 에러
* 디렉토리 생성/삭제
> fs.mkdir // fs.rmdir
* 파일스트림
> fs.createReadStream
3. 버퍼
: 바이너리 데이터를 다루는 모듈이다.
: global 이므로 별도의 로딩 불필요
: var fileBuffer = fs.readFileSync('image.jpg'); // 파일에서 읽기
: socket.on(,function(data){data가 버퍼})
: 생성후 크기 변경 불가
: 버퍼를 통해 문자열을 다양한 형태로 인코딩할 수 있다.
: 버퍼에 쓸때에는 버퍼의 크기까지만 써진다.
모듈3
1. 스트림
: 데이터의 전송흐름
: 콘솔 입력/출력
: 파일 읽기/쓰기
: 서버/클라이언트 - 데이터 전송
: 스트림을 다루기 위한 추상 인터페이스
: 다양한 스트림을 같은 인터페이스로 다룰 수 있다.
: 읽기,쓰기,변환 스트림이 존재함.
* Readable Stream
: 읽기 스트림
: flowing mode
: 데이터를 자동으로 읽는 모드, 데이터 유실의 가능성 존재
: paused mode
: 데이터가 도착하면 대기, read()함수로 읽기
> readable.read / setEncoding / pause/ resume/ pipe/ unpipe
: 이벤트
: readable - 읽기가능, data - 읽을수 있는 데이터 도착, end, close, error
: flowing mode
: data 이벤트 구현, pipe 연결, resume 호출
* Writable Stream
: 데이터 출력
: http 클라이언트 요청을 보낼 때, http서버의 응답을 보낼때, 파일 쓰기 스트림, tcp소켓
: 이벤트
: drain - 모두 보냄, error, finish, pipe, unpipe
* 표준 입출력 스트림
: process.stdin : 콘솔 입력
: process.stdout : 콘솔 출력
* 스트림 연결
: 스트림 연결과 해체
: 연결 이벤트
: 스트림 연결
2. URL 다루기
* 네트워킹
: 네트워킹의 시작
: 서버의 주소, 요청 위치, 파일의 위치
* URL
: 프로토콜, 호스트, 포트번호, 경로, 쿼리, 프래그먼트 등등...
: URL 모듈
* URL 분석하기
: url.parse()
* URL과 쿼리 문자열
* URL 인코딩
: urlencode
3. 쿼리 스트링
: URL 외에도 사용, HTTP 메시지 바디로 정보를 전달할 떄도 사용
: require('querystring')
: 쿼리스트링의 배열
: group = d & member = 5 & member = 5 ...
: 객체를 쿼리 스트링으로 만들 수 있음.
4. 클러스터
: 여러 시스템을 하나로 묶어서 사용하는 기술
: 멀티 프로세스, 멀티 코어
: 노드 어플리케이션 : 1개의 싱글 쓰레드
: 멅티코어의 장점을 살리기 위해서는 클러스터를 사용해야 한다.
: 클러스터 사용시 포트 공유 - 서버 작성 편리
: 코어의 개수만큼 사용
* 클러스터
: 마스터, 워크 프로세스로 구성
: 마스터
: 메인 프로세스, 워커 생성
: 워커
: 보조 프로세스, 마스터가 생성
* 클러스터 모듈
: require('cluster')
: cluster.fork() // 클러스터 생성
: cluster.isMaster/isWorker 로 클러스터 확인
* 클러스터 이벤트
: 마스터의 이벤트
: fork, online, listening, disconnect, exit
: 워커의 이벤트
: fomessage, disconnect
* 마스터와 워커 분리
: 별도의 파일로 분리하기
> cluster.setupMaster
: exec: 워커파일