Odds and Ends

4장 Node.js 강의 정리 - Node의 기본 기능 본문

Node.js 강의 정리

4장 Node.js 강의 정리 - Node의 기본 기능

Squidward 2021. 7. 2. 15:15

[노드의 기본 기능]

 

1. 주소 문자열과 요청 파라미터

* url 모듈

- url모듈을 만들었으면 parse()나 format()이용해 처리

var url = require('url'); //url모듈에서 불러온 객체럴 url변수에 할당

var urlStr = 'https://search.naver.com/search.naver?where=nexearch&sm=top_sug.pre&fbm=1&acr=1&acq=%EB%B0%B0%EA%B3%A0%ED%8C%8C&qdt=0&ie=utf8&query=%EB%B0%B0%EA%B3%A0%ED%8C%8C'

var curUrl = url.parse(urlStr);
console.dir(curUrl);

console.log('query => ' + curUrl.query);

var curStr = url.format(curUrl);
console.log('url -> ' +curStr);

// 검색어만 추출
var querystring=require('querystring');//querystring모듈 불러와 변수에할당
var params = querystring.parse(curUrl.query);
console.log('검색어 : ' + params.query);

 

검색어는 query로 확인, query란?

: 웹 서버에 특정한 정보를 보여달라는 웹 클라이언트 요청

 

2. 이벤트 이해하기

: 한쪽 모듈에서 다른쪽 모듈로 데이터를 전달할 시, 즉 같은 프로그램 내에서 데이터 주고받을 때 이벤트 발생

process.on('exit',function(){ // exit이벤트를 받겠다. exit이벤트 실행시 실행됨
    console.log('exit 이벤트 발생함');
});

setTimeout(function(){
    console.log('2초 후에 실행되었음');
    process.exit();
},2000);//2초후에 실행됨

console.log('2초 후에 실행될 것임.');

결과

: 가장 처음 process.on()은 exit이벤트 실행시 발생되어 가장 마지막에 출력되고,

setTimeout()은 2초 후에 실행됨으로 이후 console.log()문이 실행된 후에 실행된다.

 

1. process 사용 ( process란? 이벤트를 처리하는데 주로 사용되는 전역객체 )

process.on('tick',function(count){
    console.log('tick이벤트 발생함 : '+ count);
});

setTimeout(function(){
    console.log('2초후에 실행되었음');

    process.emit('tick','2'); //tick이벤트 발생시킴
},2000);

: tick이라는 이벤트 직접 생성. 

2. process 사용하지 않고 실행 - 직접 이벤트 emit을 상속해서 만들어보자.

[계산기 예제]

 메인파일 - ch04_test4.js

var Calc = require('./calc3'); //직접 만든 모듈 불러옴

var calc1 = new Calc(); // require으로 프로토타입 객체 반환 받아왔음으로 new연산자 사용하 새로운 객체 생성
calc1.emit('stop'); // stop이벤트 전달

console.log('Calc에 stop 이벤트 전달함');

* emit()이란?

: emit( ) : 이벤트를 발생시키는 함수. 아래 모듈파일의 on( ) 함수에서 'stop'라는 이벤트가 캐치되기 위해서는 emit('stop') 의 형태로 이벤트를 발생시켜야 한다.

 

모듈파일 - calc3.js

var EventEmitter=require('events').EventEmitter;
var util = require('util');

var Calc = function(){
    this.on('stop', function(){
        console.log('Calc에 stop 이벤트 전달됨');
    });
};

util.inherits(Calc,EventEmitter);

Calc.prototype.add = function(a,b){
    return a+b;
};
module.exports = Calc;

: util이라는 모듈 불러와서 상속 사용, 프로토타입 객체 반환

 

3. 파일 다루기

파일 읽기 예제 - readFileSync사용(파일을 다 읽을때까지 대기),  ch04_test5.js

var fs = require('fs');

var data = fs.readFileSync('./package.json','utf8');
console.log(data);

fs 모듈로 파일을 읽을 때 두가지 방식이 있다. -동기,비동기

파일 읽기 예제

- readFile사용(파일을 다 읽을때까지 대기하지 않고 일단 다른 코드 실행, 다 읽으면 그 때 실행) ,  ch04_test6.js

var fs = require('fs');

fs.readFile('./pakage.json','utf8',function(err,data){
    console.log(data);
});

파일 쓰기 예제 - ch04_test7.js

var fs = require('fs');

fs.writeFile('./output.txt','Hello.',function(err){
    if(err){
        console.log('에러 발생.');
        console.dir(err);
        return;
    }

    console.log('output.txt 파일에 데이터 쓰기 완료함');
});

 

*console 객체의 dir() 함수란?

: dir 함수는 객체의 속성을 계층구조로 출력한다.

 

버퍼 객체 사용 - ch04_test8.js

var fs = require('fs');

fs.open('./output.txt','w',function(err,fd){
    if(err){
        console.log('파일 오픈 시 에러 발생');
        console.dir(err);
        return;
    }
    var buf = new Buffer('안녕:\n');
    fs.write(fd, buf, 0, buf.length, null,  function(err, written, buffer){
        if(err){
            console.log('파일 쓰기 시 에러 발생');
            console.dir(err);
            return;
        }
        console.log('파일 쓰기 완료함');

        fs.close(fd, function(){
            console.log('파일 닫기 완료함');
        });
    })
});

* 콜백함수 연결하여 파일 읽기, 종료 알아보기

var fs = require('fs');

var infile = fs.createReadStream('./output.txt',{flags:'r'});

infile.on('data', function(data){ //콜백함수
    console.log('읽어들인 데이터 : '+ data);
});

infile.on('end',function(){ //콜백함수
    console.log('읽기 종료');
});

4. 로그파일 남기기

: 설명 주석 참조

ch04_test9.js

var output = '안녕:';
var buffer1 = new Buffer(10);
var len = buffer1.write(output, 'utf8');
console.log('버퍼에 쓰인 문자열의 길이 : ' +len);
console.log('첫번째 버퍼에 쓰인 문자열 : ' + buffer1.toString());

console.log('버퍼 객체인지 여부 : '+Buffer.isBuffer(buffer1));

var byteLen = Buffer.byteLength(buffer1);
console.log('byteLen : ' + byteLen);

var str1 = buffer1.toString('utf8', 0, 5);
console.log('str1 : ' + str1);

var buffer2 = Buffer.from('Hello','utf8');
console.log('두번째 버퍼의 길이 : ' + Buffer.byteLength(buffer2));

var str2 = buffer2.toString('utf8', 0, Buffer.byteLength(buffer2)); //버퍼의 길이값
console.log('str2 : ' + str2);

 

ch04_test15.js

// 세개의 외장모듈 사용
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'); //이러한 포맷으로 시간 넘겨준다.
}

// logger라고 하는 객체 만듦 - 정보출력위함
var logger = new (winston.createLogger)({//  "winston.Logger is not a constructor"  에러뜨는 이유는 상단에서 객체를 생성했기 때문, Logger->createLogger
    transports: [
        new (winstonDaily)({
            name:'info-file',
            filename:'./log/server',
            dataPattern:'_yyyy-MM-dd.log',
            colorize:false,
            maxsize:50000000,
            maxFiles:1000,
            level:'info',
            showLevel:true,
            json:false,
            tilestamp:timeStampFormat
        }),
        new (winston.transports.Console)({
            name:'debug-console',
            colorize:true,
            level:'debug',
            showLevel:true,
            json:false,
            tilestamp:timeStampFormat
        })
    ]
});

logger.debug('디버깅메시지입니다.');
logger.error('에러 메시지입니다.');

 

 

728x90