노드의 기본 기능 알아보기 4장 Do it! Node.js 프로그래밍 이지스퍼블리싱 제공 강의 교안 2017/03

Slides:



Advertisements
Similar presentations
1/37 한글에는 전문적인 문서 편집을 위한 고급 기능이 있다. 문서를 편리하게 수 정할 수 있도록 도와주는 찾기 / 찾아 바꾸기, 다른 위치로 이동할 수 있는 책 갈피와 하이퍼링크에 대해 알아보자. 그리고 자주 사용하는 서식을 미리 정 해 놓고 쓰는 스타일 활용법과 스타일이.
Advertisements

2016 유성환 Hybrid MOBILE.
네트워크 프로그래밍 및 실습.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
김태원 심재일 김상래 강신택. 김태원 심재일 김상래 강신택 인터넷 통신망의 정보를 제공하는 서비스 인터넷의 자원 및 정보는 NIC가 관리 IP주소 또는 도메인으로 정보 검색 이용자 및 통신망 관한 정보를 제공.
패스포트로 사용자 인증하기 9장 Do it! Node.js 프로그래밍 이지스퍼블리싱 제공 강의 교안 2017/03
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
5강. Servlet 본격적으로 살펴보기-I 프로젝트 만들기 doGet() doPost()
채팅 서버 만들기 10장 Do it! Node.js 프로그래밍 이지스퍼블리싱 제공 강의 교안 2017/03
10장 예외 Lab 10-1.
데이터 파일 C 데이터 파일과 스트림(Stream) 텍스트 파일 처리
조 병 규 Software Quality Lab. 한국교통대학교
Unix Project2 <test character device 생성>
Lesson 5. 레퍼런스 데이터형.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
forms 객체 입력상자 체크상자, 라디오 버튼 목록상자
4장. 웹로직 서버상에서의 JDBC와 JTA의 운용
게시판 만들기 14장 Do it! Node.js 프로그래밍 이지스퍼블리싱 제공 강의 교안 2017/03
JSON-RPC 서버 만들기 11장 Do it! Node.js 프로그래밍 이지스퍼블리싱 제공 강의 교안 2017/03
양방향 파이프의 활용 양방향 통신 파이프는 기본적으로 단방향이므로 양방향 통신을 위해서는 파이프를 2개 생성한다.
07. 디바이스 드라이버의 초기화와 종료 김진홍
CHAPTER 02 OpenCV 개요 PART 01 영상 처리 개요 및 OpenCV 소개.
1. C++ 시작하기.
Heesang kim PL/SQL 3 Heesang kim.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
부트로더와 Self Programming
파일 기술자 파일 기술자 현재 열려있는 파일을 구분하는 정수값 저수준 파일 입출력에서 열린 파일을 참조하는데 사용
프로그래밍 랩 – 7주 리스트.
파일 입출력 12.
뷰 템플릿 적용하기 8장 Do it! Node.js 프로그래밍 이지스퍼블리싱 제공 강의 교안 2017/03
TCP/IP Socket Programming…
속성과 리스너 초기화 파라미터 외 파라미터에 대해 이해한다. 리스너를 생성해보고 사용에 대해 이해한다.
웹 어플리케이션 보안 2016년 2학기 3. Mongo db.
인터넷응용프로그래밍 JavaScript(Intro).
㈜시스원이 제공하는 시스템 관리 통합 솔루션 SysmanagerOne Agent설치 안내서
27장. 모듈화 프로그래밍.
Java의 정석 제 5 장 배 열 Java 정석 남궁성 강의 의
유승석 FILE I/O File Input/Output 유승석 SD50 – C# & .NET Platform.
영상처리 실습 인공지능연구실.
홍익대학교 메일 시스템 구축 그룹웨어 메일 이전 하기.
HTTP 프로토콜의 요청과 응답 동작을 이해한다. 서블릿 및 JSP 를 알아보고 역할을 이해한다.
24장. 파일 입출력.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
노드 간단하게 살펴보기 2장 Do it! Node.js 프로그래밍 이지스퍼블리싱 제공 강의 교안 2017/03
15강. 폼 데이터 값 검증 Validator를 이용한 검증 ValidationUtils 클래스
Files and Exceptions Byoungjun Kim
14강. 세션 세션이란? 세션 문법 Lecturer Kim Myoung-Ho Nickname 블스
CHAP 21. 전화, SMS, 주소록.
Canary value 스택 가드(Stack Guard).
STS 에서 웹 서버 설치 방법.
파일 입출력과 그리기.
12강. 컨트롤러 컨트롤러 클래스 제작 요청 처리 메소드 제작 뷰에 데이터 전달
13주 실습강의 학기, 소프트웨어 설계 및 실험(Ⅰ).
01. 분산 파일 시스템의 개요 네트워크에 분산된 파일을 사용자가 쉽게 접근하고 관리할 수 있게 해준다.
세션에 대해 알아보고 HttpSession 에 대해 이해한다 세션 관리에 사용되는 요소들을 살펴본다
함수, 모듈.
MIDP 네트워크 프로그래밍 ps lab 김윤경.
Android -Data Base 윤수진 GyeongSang Univ. IT 1.
동적메모리와 연결 리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
JSP Programming with a Workbook
06. 디바이스의 등록과 해제 김진홍
Microsoft Word 2002 제1장 문자열의 삽입과 변경.
숙제 작성 및 제출 과정 김진하 2008/03/14.
CODE INJECTION 시스템B 김한슬.
6 객체.
타이머를 시작하려면 슬라이드 쇼 메뉴에서 쇼 보기를 클릭하십시오.
20 XMLHttpRequest.
Presentation transcript:

노드의 기본 기능 알아보기 4장 Do it! Node.js 프로그래밍 이지스퍼블리싱 제공 강의 교안 2017/03 ○ 본 강의 자료는 이지스퍼블리싱에서 제공하는 강의 교안입니다. ○ 본 강의 교안은 아래 출판 서적의 내용을 기준으로 구성되었습니다. 또한 다수의 기타 서적이나 사이트를 참조하였습니다. 레퍼런스를 참조하십시오. 2017, 정재곤, “Do it! Node.js 프로그래밍 (개정판)”, 이지스퍼블리싱 - 강의 교안에 사용된 화면 캡처나 실습 자료의 경우에는 문서 업데이트에 따라 변경될 수 있습니다.

강의 주제 및 목차 노드의 기본 기능 알아보기 강의 주제 목 차 주소 문자열과 요청 파라미터 다루기 이벤트 이해하기 목 차 1 주소 문자열과 요청 파라미터 다루기 2 이벤트 이해하기 3 파일 다루기 4 로그 파일 남기기

1. 주소 문자열과 요청 파라미터 다루기 난이도 소요시간 15분

주소 문자열을 구분할 때 사용하는 url 모듈 일반 문자열을 URL 객체로 만들거나 URL 객체를 일반 문자열로 변환

url 모듈의 주요 메소드 var url = require('url'); parse 와 format 사용 메소드 이름 설명 parse( ) 주소 문자열을 파싱하여 URL 객체를 만들어 줍니다. format( ) URL 객체를 주소 문자열로 변환합니다. var url = require('url'); var curURL = url.parse('https://m.search.naver.com/search.naver? query=steve+jobs&where=m&sm=mtp_hty'); var curStr = url.format(curURL); console.log('주소 문자열 : %s', curStr); console.dir(curURL);

parse 메소드로 URL 파싱하기 파싱된 결과 화면

요청 파라미터를 확인할 때 사용하는 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));

querystring 모듈의 메소드 parse 와 stringify 사용 메소드 이름 설명 parse( ) 요청 파라미터 문자열을 파싱하여 요청 파라미터 객체를 만들어 줍니다. stringify( ) 요청 파라미터 객체를 문자열로 변환합니다.

2. 이벤트 이해하기 난이도 소요시간 15분

이벤트란? 비동기 방식으로 처리하기 위해 한 쪽에서 다른 쪽으로 데이터 전달 EventEmitter 사용 한 쪽에서 이벤트를 emit으로 보내고 다른 쪽에서 리스너를 등록하여 on으로 받음

이벤트 보내고 받기 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);

계산기 객체를 모듈로 구성 계산기 객체가 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';

메인 파일에서 계산기 객체 사용 var Calc = require('./calc3'); emit 으로 이벤트 전송 var Calc = require('./calc3'); var calc = new Calc(); calc.emit('stop'); console.log(Calc.title + '에 stop 이벤트 전달함.');

3. 파일 다루기 난이도 소요시간 20분

노드의 파일 시스템 var fs = require('fs'); 동기식 IO와 비동기식 IO 모두 제공 동기식 IO는 파일 작업이 끝날 때까지 대기한다는 점에 주의 동기식 IO 메소드에서는 Sync 라는 단어가 붙음 var fs = require('fs'); var data = fs.readFileSync('./package.json', 'utf8'); console.log(data);

비동기식으로 파일 읽기 var fs = require('fs'); readFile 메소드 사용하면서 콜백 함수를 파라미터로 전달 var fs = require('fs'); fs.readFile('./package.json', 'utf8', function(err, data) { console.log(data); }); console.log('프로젝트 폴더 안의 package.json 파일을 읽도록 요청했습니다.');

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로 파일을 씁니다.

비동기식으로 파일 쓰기 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 파일에 데이터 쓰기 완료.'); });

파일을 직접 열고 닫으면서 읽거나 쓰기 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]) 파일을 닫아 줍니다.

파일을 직접 열고 데이터 쓰기 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('파일 열고 데이터 쓰고 파일 닫기 완료.'); });

파일 처리 플로우 open 으로 열고 write로 쓰는 과정

파일 직접 열고 읽기 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 파일을 열고 읽기 완료.'); });

버퍼 사용하기 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'));

스트림 단위로 파일 읽고 쓰기 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('파일 쓰기 종료.');

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, '127.0.0.1');

새 디렉터리 만들고 삭제하기 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 폴더를 삭제했습니다.'); });

4. 로그 파일 남기기 난이도 소요시간 10분

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'); // '2016-05-01 20:14:28.500 +0900' };

winston 모듈 설정 로그 파일이 남는 위치 등 설정 가능 var logger = new (winston.Logger)({ transports: [ new (winstonDaily)({ name: 'info-file', filename: './log/server', datePattern: '_yyyy-MM-dd.log', colorize: false, maxsize: 50000000, maxFiles: 1000, level: 'info', showLevel: true, json: false, timestamp: timeStampFormat }), new (winston.transports.Console)({ name: 'debug-console', colorize: true, level: 'debug', }) ],

winston 모듈 설정 로그 파일이 남는 위치 등 설정 가능 exceptionHandlers: [ new (winstonDaily)({ name: 'exception-file', filename: './log/exception', datePattern: '_yyyy-MM-dd.log', colorize: false, maxsize: 50000000, maxFiles: 1000, level: 'error', showLevel: true, json: false, timestamp: timeStampFormat }), new (winston.transports.Console)({ name: 'exception-console', colorize: true, level: 'debug', }) ] });

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 + ']');

winston 모듈 사용 외장 모듈 설치 % npm install winston --save % npm install winston-daily-rotate-file --save % npm install moment --save

참고 문헌 [ References] 기본 서적 2017, 정재곤, “Do it! Node.js 프로그래밍 (개정판)”, 이지스퍼블리싱 Node.js Site http://nodejs.org/