NodeJS

웹 서비스와 같은 서버 기능을 구축할 수 있는 언어
기존에는 파일 입출력 중에는 다른 작업을 못하는 동기 입출력 이었다.

하나의 요청 처리가 끝날 때까지 기다리지 않고 다른 요청을 동시에 처리 -> Non-Blocking IO

동기 방식은 파일의 내용을 읽어 함수의 결과값으로 반환, 결과값이 반환될 때까지 대기함
비동기 방식은 파일 내용을 읽은 후 콜백 함수로 반환함, 파일 읽기가 시작되면 즉시 다음 실행 순서로 넘어감

이러한 비동기 방식을 이벤트 기반 입출력 모델이라고 한다.

node 아키텍처


nodeJS 홈페이지에서 LTS버전을 다운로드한다.
디폴트로 다운로드

주요객체, 메소드

    전역객체 : 
    1. console : 콘솔창에 결과를 보여주는 객체
    2. process : 프로세스의 실행 정보를 다루는 객체
    3. exports : 모듈을 다루는 객체

1.  console의 주요 메소드
    [1] log()
    [2] dir(object) : 객체가 가지는 속성들을 출력
    [3] time(id) : 실행시간을 측정하기 위한 시작 시간을 기록
    [4] timeEnd(id) : 실행시간을 측정하기 위한 끝 시간을 기록

// ex01.js
console.log("Hello NodeJS");
console.log("안녕 노드");

console.log("숫자 출력하기: %d",500);
console.log("문자열 출력하기: %s", "hi node~");
console.log("JSON객체 출력하기: %j", {name:'홍길동',age:22});

var student={no:1,name:'김학생',class:'디지털 융합반'};
console.log(student)

console.dir(student)

var result=0;
console.time('sum'); //시간 측정 시작
for(var i=0;i<10000;i++){
    result+=i;
}
console.timeEnd('sum'); //시간 측정 종료

console.log('result=%d',result);

//전역변수 :__filename, __dirname
console.log('현재 실행 중인 파일명 %s',__filename);
console.log('현재 실행 중인 파일의 경로 %s',__dirname);

2. process의 속성
    1) argv : 프로세스를 실행할 때 전달되는 매개변수 정보
    2) env : 환경변수 정보
    3) exit() : 프로세스를 종료시키는 메소드

프로세스가 종료될 때 함수 (handler) 호출
-node 이벤트 등록하는 방법
1) addListener('이벤트'.핸들러함수)
2) on('이벤트', 핸들러함수)

//ex02.js

console.log("argv속성의 파라미터 수: %d",process.argv.length);
console.dir(process.argv);
process.argv.forEach(function(argv, i){
    console.log(i+": "+argv);
});

console.log("--------------------");

//console.dir(process.env);

//OS환경변수값 알아내기

console.log(process.env.os);
console.log(process.env['OS']);
//console.log(process.evb.classpath)
console.log(process.env['path'])
/*
프로세스가 종료될 때 함수 (handler) 호출
*/
var handler=function(){
    console.log('process Exit bye bye~');
}
process.addListener('exit',handler);

//이벤트를 강제로 발생시키고자 할 때는
//emit('이벤트 종류')
process.on('myevent',function(){
    console.log("Hello I am MyEvent");
});

process.emit('myevent');

3. 모듈화하여 내보내는 방법
  1- 함수를 할당하는 방법 : exports 전역객체에 여러 함수를 등록하여 내보낼 수 있다.
      exports.변수1 = function( ){기능...}
  2- 모듈 안에서 인스턴스 객체를 만들어 할당하는 경우
      module.exports=객체;
  3- 프로토타입 객체를 할당하는 경우
      프로토타입을 먼저 정의한 후
      module.exports에 할당한다. => 그러면 이를 가져다 쓰는 파일에서 new 연산자를 사용할 수 있다.

1 - 함수 할당
module1.js

exports.plus=function(a, b){
    console.log(a+"+"+b+"="+(a+b));
}

exports.plus2=(a,b)=>console.log(a+"+"+b+"="+(a+b));

module2/index.js

exports.multi=function(a,b){
    console.log("곱 결과 값은"+a*b);
}


ex03.js
이때 확장자 js 는 생략 가능하다.
require()하면 먼저 module1.js를 찾는다 해당 파일이 없다면 module1이라는 디렉토리를 찾는다.
해당 디렉토리가 있다면 해당 디렉토리의 index.js를 찾는다.

var obj = require('./module1.js')
var obj1 = require('./module2');

obj.plus(12,23);
obj.plus2(32,12);
obj1.multi(3,5);

2- 객체를 export

//객체를 내보낼 때는 module.exports = 객체
//이 때 객체는 하나만 내보낼 수 있다.

var calc={};

calc.plus=function(x,y){
    return x+y;
}

calc.minus=function(a,b){
    return a-b;
}

module.exports=calc;
var obj = require('./module3.js');

var sum = obj.plus(55,78);
console.log(sum);
var m = obj.minus(12,14);
console.log(m);

3- 프로토타입 객체 할당

function User(name,age){
    this.name=name;
    this.age=age;
}//생성자 함수

User.prototype.show=function(){
    console.log("Name: %s",this.name);
    console.log("Age: %d",this.age);
}

module.exports=User;
var obj = require('./module5.js');

var u1= new obj("홍길동",33);
var u2= new obj("김길동",24);

u1.show();
u2.show();

fs모듈

파일읽기
File System 모듈을 사용해 파일을 읽어보자
동기는 순서대로 출력 비동기는 bye bye~부터 출력

//ex07file.js
var fs = require("fs");

//1. 동기방식으로 파일을 읽을 경우
// var data=fs.readFileSync('readme.txt',"utf8");
// console.log(data);

//2. 비동기방식으로 파일을 읽을 경우

fs.readFile('readme.txt','utf8',function(err,data){
    //해당 파일을 찾아 있으면 읽어들인후 콜백함수의 매개변수 data에 파일내용을 전달
    //해당 파일이 없을 경우 err에 에러객체를 전달함
    if(err) throw err;
    console.log(data);
});

console.log("bye bye~");

파일쓰기
writeFile( 파일명, data, [옵션], 콜백함수) : 비동기방식으로 파일에 씀
writeFileSyne( 파일명, data, [옵션]) : 동기방식

var fs = require("fs");

var data="Hello NodeJS~~~\n";
data+="한글도 안녕";

//1.동기방식
// fs.writeFileSync("readme.txt",data,'utf8');
//2.비동기방식
fs.writeFile('readme.txt',data,function(err){
    if(err) throw err;
    console.log("확인");
})
console.log("bye bye");

os모듈

//os모듈(내장모듈)

var os =require('os');
console.log('시스템의 hosname %s', os.hostname());
console.log('시스템 메모리: %d / %d',os.freemem(),os.totalmem());
console.log('---cpu정보---\n');
console.log(os.cpus());
console.log('---네트워크정보---\n');
console.log(os.networkInterfaces());

path모듈
path.sep 운영체제에 맞게 구분자를 넣어줌
curPath에서 디렉토리명, 파일이름, 확장자를 추출해서 출력
dirname() basename() extname()

var path=require('path');

var dirs=['Workspace','MyNode','Sample']

var dirspath=dirs.join(path.sep);
//운영체제의 파일 구분자 정보를 이용해 디렉토리들을 결합한다.
console.log(dirspath);

var curPath=path.join(__dirname,'note.exe');
console.log(curPath);

//curPath에서 디렉토리명, 파일이름, 확장자를 추출해서 출력
//dirname() basename()

var a = path.dirname(curPath)
console.log(a);
var b = path.basename(curPath)
console.log(b);
var c = path.extname(curPath)
console.log(c)

http모듈

http웹서버와 관련된 모든 기능을 담은 모듈
http모듈의 createServer()메소드를 사용하면 서버객체를 생성한다.

//http모듈
var http=require('http');
var server = http.createServer();

server.on('request',function(code){
    //클이 요청을 보내면 발생되는 이벤트
    console.log('Request On:'+code);
})

server.on('connection',function(code){
    //클이 접속하면 보내면 발생되는 이벤트
    console.log('Connection On:'+code);
})

server.on('close',function(code){
    //서버 종료시
    console.log('Close'+code);
})

//서버 가동
server.listen(3333,function(){
    console.log('server started at http://localhost:3333');
})

 

+ Recent posts