Download presentation
Presentation is loading. Please wait.
Published byAde Lesmana Modified 5년 전
1
노드의 기본 기능 알아보기 4장 Do it! Node.js 프로그래밍 이지스퍼블리싱 제공 강의 교안 2017/03
○ 본 강의 자료는 이지스퍼블리싱에서 제공하는 강의 교안입니다. ○ 본 강의 교안은 아래 출판 서적의 내용을 기준으로 구성되었습니다. 또한 다수의 기타 서적이나 사이트를 참조하였습니다. 레퍼런스를 참조하십시오. 2017, 정재곤, “Do it! Node.js 프로그래밍 (개정판)”, 이지스퍼블리싱 - 강의 교안에 사용된 화면 캡처나 실습 자료의 경우에는 문서 업데이트에 따라 변경될 수 있습니다.
2
강의 주제 및 목차 노드의 기본 기능 알아보기 강의 주제 목 차 주소 문자열과 요청 파라미터 다루기 이벤트 이해하기
목 차 1 주소 문자열과 요청 파라미터 다루기 2 이벤트 이해하기 3 파일 다루기 4 로그 파일 남기기
3
1. 주소 문자열과 요청 파라미터 다루기 난이도 소요시간 15분
4
주소 문자열을 구분할 때 사용하는 url 모듈 일반 문자열을 URL 객체로 만들거나 URL 객체를 일반 문자열로 변환
5
url 모듈의 주요 메소드 var url = require('url');
parse 와 format 사용 메소드 이름 설명 parse( ) 주소 문자열을 파싱하여 URL 객체를 만들어 줍니다. format( ) URL 객체를 주소 문자열로 변환합니다. var url = require('url'); var curURL = url.parse(' query=steve+jobs&where=m&sm=mtp_hty'); var curStr = url.format(curURL); console.log('주소 문자열 : %s', curStr); console.dir(curURL);
6
parse 메소드로 URL 파싱하기 파싱된 결과 화면
7
요청 파라미터를 확인할 때 사용하는 querystring 모듈
& 기호로 구분되는 요청 파라미터를 분리하는 데 사용 require 메소드로 모듈을 불러온 후 parse와 stringify 메소드 사용 ...중략 var querystring = require('querystring'); var param = querystring.parse(curURL.query); console.log('요청 파라미터 중 query의 값 : %s', param.query); console.log('원본 요청 파라미터 : %s', querystring.stringify(param));
8
querystring 모듈의 메소드 parse 와 stringify 사용 메소드 이름 설명 parse( )
요청 파라미터 문자열을 파싱하여 요청 파라미터 객체를 만들어 줍니다. stringify( ) 요청 파라미터 객체를 문자열로 변환합니다.
9
2. 이벤트 이해하기 난이도 소요시간 15분
10
이벤트란? 비동기 방식으로 처리하기 위해 한 쪽에서 다른 쪽으로 데이터 전달 EventEmitter 사용
한 쪽에서 이벤트를 emit으로 보내고 다른 쪽에서 리스너를 등록하여 on으로 받음
11
이벤트 보내고 받기 on 으로 리스너 등록, emit으로 이벤트 전송
메소드 이름 설명 on(event, listener) 지정한 이벤트의 리스너를 추가합니다. once(event, listener) 지정한 이벤트의 리스너를 추가하지만 한 번 실행한 후에 자동으로 리스너가 제거됩니다. removeListener(event, listener) 지정한 이벤트에 대한 리스너를 제거합니다. emit(event, param) 이벤트를 전송합니다. process.on('tick', function(count) { console.log('tick 이벤트 발생함 : %s', count); }); setTimeout(function() { console.log('2초 후에 tick 이벤트 전달 시도함.'); process.emit('tick', '2'); }, 2000);
12
계산기 객체를 모듈로 구성 계산기 객체가 EventEmitter를 상속하면 emit과 on 메소드 사용 가능
var util = require('util'); var EventEmitter = require('events').EventEmitter; var Calc = function() { var self = this; this.on('stop', function() { console.log('Calc에 stop event 전달됨.'); }); }; util.inherits(Calc, EventEmitter); Calc.prototype.add = function(a, b) { return a + b; } module.exports = Calc; module.exports.title = 'calculator';
13
메인 파일에서 계산기 객체 사용 var Calc = require('./calc3');
emit 으로 이벤트 전송 var Calc = require('./calc3'); var calc = new Calc(); calc.emit('stop'); console.log(Calc.title + '에 stop 이벤트 전달함.');
14
3. 파일 다루기 난이도 소요시간 20분
15
노드의 파일 시스템 var fs = require('fs');
동기식 IO와 비동기식 IO 모두 제공 동기식 IO는 파일 작업이 끝날 때까지 대기한다는 점에 주의 동기식 IO 메소드에서는 Sync 라는 단어가 붙음 var fs = require('fs'); var data = fs.readFileSync('./package.json', 'utf8'); console.log(data);
16
비동기식으로 파일 읽기 var fs = require('fs');
readFile 메소드 사용하면서 콜백 함수를 파라미터로 전달 var fs = require('fs'); fs.readFile('./package.json', 'utf8', function(err, data) { console.log(data); }); console.log('프로젝트 폴더 안의 package.json 파일을 읽도록 요청했습니다.');
17
fs 모듈의 주요 메소드 readFile로 읽고 writeFile로 쓰기 메소드 이름 설명
readFile(filename, [encoding], [callback]) 비동기식 IO로 파일을 읽어 들입니다. readFileSync(filename, [encoding]) 동기식 IO로 파일을 읽어 들입니다. writeFile(filename, data, encoding=’utf8’, [callback]) 비동기식 IO로 파일을 씁니다. writeFileSync(filename, data, encoding=’utf8’) 동기식 IO로 파일을 씁니다.
18
비동기식으로 파일 쓰기 var fs = require('fs');
readFile 메소드 사용하면서 콜백 함수를 파라미터로 전달 var fs = require('fs'); fs.writeFile('./output.txt', 'Hello World!', function(err) { if(err) { console.log('Error : ' + err); } console.log('output.txt 파일에 데이터 쓰기 완료.'); });
19
파일을 직접 열고 닫으면서 읽거나 쓰기 open, read, write, close 등의 메소드가 사용됨 메소드 이름 설명
open(path, flags [, mode] [, callback]) 파일을 엽니다. read(fd, buffer, offset, length, position [, callback]) 지정한 부분의 파일 내용을 읽어 들입니다. write(fd, buffer, offset, length, position [, callback]) 파일의 지정한 부분에 데이터를 씁니다. close(fd [, callback]) 파일을 닫아 줍니다.
20
파일을 직접 열고 데이터 쓰기 open 으로 열고 write로 쓰기 var fs = require('fs');
fs.open('./output.txt', 'w', function(err, fd) { if(err) throw err; var buf = new Buffer('안녕!\n'); fs.write(fd, buf, 0, buf.length, null, function(err, written, buffer) { console.log(err, written, buffer); fs.close(fd, function() { console.log('파일 열고 데이터 쓰고 파일 닫기 완료.'); });
21
파일 처리 플로우 open 으로 열고 write로 쓰는 과정
22
파일 직접 열고 읽기 open 으로 열고 read로 읽기, 버퍼 사용 var fs = require('fs');
fs.open('./output.txt', 'r', function(err, fd) { if(err) throw err; var buf = new Buffer(10); console.log('버퍼 타입 : %s', Buffer.isBuffer(buf)); fs.read(fd, buf, 0, buf.length, null, function(err, bytesRead, buffer) { var inStr = buffer.toString('utf8', 0, bytesRead); console.log('파일에서 읽은 데이터 : %s', inStr); console.log(err, bytesRead, buffer); fs.close(fd, function() { console.log('output.txt 파일을 열고 읽기 완료.'); });
23
버퍼 사용하기 new로 만들고 Buffer.isBuffer(), Buffer.concat() 등의 메소드 사용 가능
var output = '안녕 1!'; var buffer1 = new Buffer(10); var len = buffer1.write(output, 'utf8'); console.log('첫 번째 버퍼의 문자열 : %s', buffer1.toString()); var buffer2 = new Buffer('안녕 2!', 'utf8'); console.log('두 번째 버퍼의 문자열 : %s', buffer2.toString()); console.log('버퍼 객체의 타입 : %s', Buffer.isBuffer(buffer1)); var byteLen = Buffer.byteLength(output); var str1 = buffer1.toString('utf8', 0, byteLen); var str2 = buffer2.toString('utf8'); buffer1.copy(buffer2, 0, 0, len); console.log('두 번째 버퍼에 복사한 후의 문자열 : %s', buffer2.toString('utf8'));
24
스트림 단위로 파일 읽고 쓰기 createReadStream으로 읽기 위해 열고, createWriteStream으로 쓰기 위해 열기 var fs = require('fs'); var infile = fs.createReadStream('./output.txt', {flags: 'r'} ); var outfile = fs.createWriteStream('./output2.txt', {flags: 'w'}); infile.on('data', function(data) { console.log('읽어 들인 데이터', data); outfile.write(data); }); infile.on('end', function() { console.log('파일 읽기 종료.'); outfile.end(function() { console.log('파일 쓰기 종료.');
25
http 모듈로 요청받은 파일 내용을 읽고 응답하기
스트림으로 읽어 pipe로 연결함 var fs = require('fs'); var http = require('http'); var server = http.createServer(function(req, res) { // 파일을 읽어 응답 스트림과 pipe()로 연결합니다. var instream = fs.createReadStream('./output.txt'); instream.pipe(res); }); server.listen(7001, ' ');
26
새 디렉터리 만들고 삭제하기 mkdir로 만들고 rmdir로 삭제 var fs = require('fs');
fs.mkdir('./docs', 0666, function(err) { if(err) throw err; console.log('새로운 docs 폴더를 만들었습니다.'); fs.rmdir('./docs', function(err) { console.log('docs 폴더를 삭제했습니다.'); });
27
4. 로그 파일 남기기 난이도 소요시간 10분
28
winston 모듈을 이용해 로그 남기기 var winston = require('winston'); // 로그 처리 모듈
로그를 남길 수 있도록 도와주는 모듈에는 여러 가지가 있음 실무에서는 일자별로 로그를 남기는 것이 좋음 winston 모듈에서 다양한 설정 가능 var winston = require('winston'); // 로그 처리 모듈 var winstonDaily = require('winston-daily-rotate-file'); // 로그 일별 처리 모듈 var moment = require('moment'); // 시간 처리 모듈 function timeStampFormat() { return moment().format('YYYY-MM-DD HH:mm:ss.SSS ZZ'); // ' :14: ' };
29
winston 모듈 설정 로그 파일이 남는 위치 등 설정 가능 var logger = new (winston.Logger)({
transports: [ new (winstonDaily)({ name: 'info-file', filename: './log/server', datePattern: '_yyyy-MM-dd.log', colorize: false, maxsize: , maxFiles: 1000, level: 'info', showLevel: true, json: false, timestamp: timeStampFormat }), new (winston.transports.Console)({ name: 'debug-console', colorize: true, level: 'debug', }) ],
30
winston 모듈 설정 로그 파일이 남는 위치 등 설정 가능 exceptionHandlers: [
new (winstonDaily)({ name: 'exception-file', filename: './log/exception', datePattern: '_yyyy-MM-dd.log', colorize: false, maxsize: , maxFiles: 1000, level: 'error', showLevel: true, json: false, timestamp: timeStampFormat }), new (winston.transports.Console)({ name: 'exception-console', colorize: true, level: 'debug', }) ] });
31
winston 모듈 사용 파일 복사하는 코드에서 logger.info() 메소드로 로그 남기기
var fs = require('fs'); var inname = './output.txt'; var outname = './output2.txt'; fs.exists(outname, function (exists) { if (exists) { fs.unlink(outname, function (err) { if (err) throw err; logger.info('기존 파일 [' + outname +'] 삭제함.'); }); } var infile = fs.createReadStream(inname, {flags: 'r'} ); var outfile = fs.createWriteStream(outname, {flags: 'w'}); infile.pipe(outfile); logger.info('파일 복사 [' + inname + '] -> [' + outname + ']');
32
winston 모듈 사용 외장 모듈 설치 % npm install winston --save
% npm install winston-daily-rotate-file --save % npm install moment --save
33
참고 문헌 [ References] 기본 서적
2017, 정재곤, “Do it! Node.js 프로그래밍 (개정판)”, 이지스퍼블리싱 Node.js Site
Similar presentations