NodeJS
웹 서비스와 같은 서버 기능을 구축할 수 있는 언어
기존에는 파일 입출력 중에는 다른 작업을 못하는 동기 입출력 이었다.
하나의 요청 처리가 끝날 때까지 기다리지 않고 다른 요청을 동시에 처리 -> Non-Blocking IO
동기 방식은 파일의 내용을 읽어 함수의 결과값으로 반환, 결과값이 반환될 때까지 대기함
비동기 방식은 파일 내용을 읽은 후 콜백 함수로 반환함, 파일 읽기가 시작되면 즉시 다음 실행 순서로 넘어감
이러한 비동기 방식을 이벤트 기반 입출력 모델이라고 한다.
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');
})
'개발자 > 국비지원 SW' 카테고리의 다른 글
국비지원 82일차 - NodeJS http, request, url, express, routing (0) | 2020.08.10 |
---|---|
국비지원 81일차 - 장바구니 목록 (0) | 2020.08.07 |
국비지원 79일차 - eXERD 데이터 테이블 관리 프로그램 (0) | 2020.08.05 |
국비지원 78일차 - 네이버 도서 API활용, 페이징처리 (0) | 2020.08.04 |
국비지원 77일차 - 쇼핑몰 상품 목록, 상품 정보 ,MyBatis 모듈화 (0) | 2020.08.03 |