본문 바로가기
코리아 IT아카데미/node.js~~~

2022_0117 | FileSystem 모듈, http 모듈, 시스템 이벤트, 익스프레스 모듈

by Sharon kim 2022. 1. 25.

터미널에서 ctrl + c -> 빠져나오기


01.js

 

const http = require('http');// 모듈을 현재 파일에 연결

const hostname = '127.0.0.1'; // 서버 
const port = 3000;// 포트

const server = http.createServer((req, res) => {// 요청, 응답
  res.statusCode = 200;// 응답상태 정상코드 200
  res.setHeader('Content-Type', 'text/plain');// 응답을 받을 때 파일의 방식
  res.end('Hello World');// 응답 받는 결과
});

server.listen(port, hostname, () => { // 서버에서 파일을 실행했을 때 클라이언트에게 상태를 전달하는 부분
  console.log(`Server running at http://${hostname}:${port}/`);
});

FileSystem 모듈

파일처리와 관련된 모듈
node.js에서 가장 중요하고 기초가 되는 모듈

메소드
readFile() : 파일을 비동기적으로 읽는다.
readFileSync() : 파일을 동기적으로 읽는다.
writeFile() : 파일을 비동기적으로 쓴다.
writeFilesync() : 파일을 동기적으로 쓴다.
 

* 동기와 비동기
프로그램이 동작하는 상태에서 완전히 해당 내용을 끝내고 다음으로 제어를 넘기는 방식을 동기식, 
동작이 끝나지 않은 상태에서도 제어권을 넘긴 후 프로그램을 계속 진행하면 비동기식이라고 합니다.
예외 처리(Exception)
프로그램이 실행되고 있는 런타임시에 에러가 발생할 경우 처리할 수 있는 프로그램 구간을 의미합니다
try {
    예외 상황이 발생할 수 있는 문장
    ....
}catch(e){
    예외 상황이 발생했을 경우 처리할 문장(e는 Exception 객체)
}finally{
    예외 상황이 발생하거나 발생하지 않아도 무조건 실행될 문장(생략가능)
}

이벤트 루프(Event Loop)
node.js는 서버가 가동되면 변수들을 초기화하고 함수를 선언하고 이벤트가 발생할 때까지 기다립니다. 
이벤트가 감지되었을 때 call back 함수를 호출합니다.


02-0.js

const fs = require('fs'); //파일을 다루는 모듈을 연결

fs.readFile('text1.txt','utf-8',(err,data) => {//비동기식
  if(err){
    console.log(err);
  }else{
    console.log(`비동기식으로 읽음:${data}`)
  }
});

const text = fs.readFileSync('text1.txt','utf-8');//동기식
console.log(`동기식으로 읽음:${text}`);

02-1.js

const fs = require('fs'); //파일을 다루는 모듈을 연결
const data = "Hello Node.js!";
              //text2.txt
fs.writeFile('text2-11.txt',data,'utf-8',(err) => { // 파일을 만듦
  if(err){
    console.log('에러발생');
  }else{
    console.log('저장완료/비동기식');
  }
});
fs.writeFileSync('text3.txt',data,'utf-8');
console.log('저장완료/동기식');

02-2.js

const fs = require('fs'); //파일을 다루는 모듈을 연결

//비동기 처리는 예외처리를 할 필요가 없다.
fs.readFile('text11.txt','utf-8',(err, data) => {
  if(err){
    console.log('에러발생/비동기')
  }else{
    console.log(data);
  }

});

try {
  const text = fs.readFileSync('text12.txt','utf-8');
  console.log(`동기식으로 읽음 ${text}`)
} catch (e) {
  console.log(`에러발생/동기식`);
}
console.log(`프로그램 종료`);

1. http 모듈
node.js에서 가장 기본적이고 중요한 서버 모듈입니다.
HTTP 웹 서버를 생성하는 것과 관련된 모든 기능을 담당합니다.

메소드
listen() : 서버를 실행하고 클라이언트를 기다립니다.
close() : 서버를 종료합니다.

2. request 객체
클라이언트가 서버에게 전달하는 메세지(정보)를 담는 객체입니다.

속성
method : 클라이언트 요청 방식을 나타냅니다. (GET, POST)
url : 클라이언트가 요청한 URL을 나타냅니다.

3. response 객체
서버에서 클라이언트로 응답 메세지를 전송시켜주는 객체입니다.

메소드
writeHead() : 응답 헤더를 작성합니다.
end() : 응답 본문을 작성합니다.

MIME 형식
text/plain : 일반적인 text 파일
text/html : html 형식 파일
text/css : css 형식 파일
text/xml : xml 형식 파일
image/jpeg : jpeg 이미지 파일
image/png : png 이미지 파일
video/mpeg : mpeg 동영상 파일
audio/mp3 : mp3 음악 파일

http://127.0.0.1:3000 -> 외우기(설정을 안하고 http에서 실행한다)
http://127.0.0.1:3001
http://127.0.0.1:3002

03-0.js

const http = require('http');

http.createServer((req,res) => {
res.writeHead(200,{'content-type':'text/html'});
res.end('<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>모듈 테스트</title></head><body style="background-color : deepskyblue;"><h2>http 모듈 테스트</h2><p>처음으로 실행하는 node.js http 서버</p></body></html>');

}).listen(3000, () => {
    console.log('서버 실행중....');
});

test.html / 03-1.js

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>http 모듈 테스트</title>
</head>
<body style="background-color: blueviolet;">
    <h2>모듈테스트</h2>
    <p>처음으로 실행하는 Node.js http서버</p>
</body>
</html>
const http = require('http');
const fs = require('fs');

http.createServer((req, res) => {
    fs.readFile('test.html',(err,data)=>{
        if(err){
            console.log(err);
        }else{
            res.writeHead(200, {'content-type':'text/html'});
            res.end(data);
        }
    })
}).listen(3000, () => {
    console.log('서버 실행중....')
});

03-2.js

const http = require('http');
const fs = require('fs');

//이미지 
http.createServer((req, res) => {
    fs.readFile('node.png', (err, data) => {
        if(err){
            console.log(err);
        }else{
            res.writeHead(200,{'content-type' : 'image/png'});
            res.end(data);
        }
    });
}).listen(3000,() => {
    console.log('이미지 서버 실행중...')
});

 // 음악 파일
 http.createServer((req, res)=>{
    fs.readFile('sunny.mp3', (err, data) => {
        if(err){
            console.log(err);
        }else{
            res.writeHead(200,{'content-type' : 'audio/mp3'});
            res.end(data);
        }
    });
}).listen(3001,() => {
    console.log('사운드 서버 실행중...')
});

events

이벤트 위주의 프로그램을 작성할 때 사용하는 모듈입니다.

메소드
on() : 지정한 이벤트의 리스너를 추가합니다.
once() : 지정한 이벤트의 리스너를 추가하지만 한번 실행 이후 자동 제거됩니다.
removelistener() : 지정한 이벤트에 대한 리스너를 제거합니다.
emit() : 지정한 이벤트를 발생시킵니다.

04.js

const event = require('events');

//이벤트 관련 메소드를 사용할 수 있는 EventEmitter 객체를 만듭니다.
const eventEmitter = new event.EventEmitter();

const connectionHandle = function(){ // 3
    console.log('연결성공');
    eventEmitter.emit('data_received'); //다시 이벤트가 발생 4
}

//connection 이벤트와 connectionHandler 핸들러와 연결 - 함수 연결 2
eventEmitter.on('connection', connectionHandle)

//data_receive 이벤트와 익명함수와 연결 5
eventEmitter.on('data_received',() => {
    console.log('데이터수신');
});

eventEmitter.emit('connection'); // 이벤트를 발생 1

시스템 이벤트
process 객체는 노드에서 항상 사용할 수 있는 객체입니다. 
on()과 emit() 메소드는 객체를 생성하거나 모듈을 가져오지 않아도 바로 사용할 수 있습니다. 
on() 메소드를 호출하면서 이벤트 이름을 exit로 지정하면 내부적으로 프로세스가 끝날 때를 알 수 있습니다.


05.js

process.on('exit',() => {
    console.log('exit 이벤트 발생!');
});

setTimeout(() => {
    console.log('3초 후 시스템 종료');
    process.exit;
}, 3000);

익스프레스 모듈
http 모듈만 사용해서 웹 서버를 구성하면 직접 많은 기능을 개발해야 합니다.
이 문제를 해결하기 위해 만들어진 모듈이 익스프레스입니다.
익스프레스 모듈을 사용하면 간단한 코드로 웹 서버의 기능을 대부분 구현할 수 있고,
미들웨어와 라우터를 사용하여 편리하게 웹 서버를 구성할 수 있습니다.


메소드
use() : 미들웨어 함수를 사용합니다.
get() : get으로 사용자 정보를 전달 받습니다.
set() : 서버 설정을 위한 속성을 설정합니다.
redirect() : 웹 페이지의 경로를 강제로 이동시킵니다.
send() : 클라이언트에 응답 데이터를 보냅니다.
        전달할 수 있는 데이터는 html, buffer, json, json 배열.. 등입니다.
header() : 헤더를 확인합니다.

[package 설치하기]
npm install 모듈명(npm i 모듈명)
npm i express


package 복원하기
npm install

06-0.js

const express = require('express');
const app = express();
const port = 3000;
    //┌익스프레스 메소드 들어감 set,get...
app.get('/',(req, res) => {
    res.writeHead('200',{'content-type':'text/html;charset=utf-8'});
    res.end('<h2>익스프레스 서버에서 응답한 메세지 입니다.</h2>');
});

app.listen(port, () => {
    console.log(`${port}포트로 서버 실행 중...`);
});

06-1.js

const express = require('express');
const app = express();
const port = 3000;
    //┌익스프레스 메소드 들어감 set,get...
app.get('/',(req, res) => {
    res.writeHead('200',{'content-type':'text/html;charset=utf-8'});
    res.end('<h2>익스프레스 서버 테스트</h2>');
});

app.listen(port, () => {
    console.log(`${port}포트로 서버 실행 중...`);
});

06-2.js

127.0.0.1:3000 실행시 네이버 페이지로 변환되고

const express = require('express');
const app = express();
const port = 3000;
    //┌익스프레스 메소드 들어감 set,get...
app.get('/', (req, res) => {
    console.log('첫번째 미드웨어 실행');
    res.redirect('http://www.naver.com')
});

app.listen(port, () => {
    console.log(`${port}포트로 서버 실행 중...`);
});

06-3.js

3000포트로 서버 실행 중 이후 127.0.0.1:3000서버 실행하면

const express = require('express');
const app = express();
const port = 3000;

app.use((req, res) => {
    console.log('첫번째 미들웨어 실행');

    console.dir(req.header)
    const userAgent = req.header('User-Agent');
    console.log(userAgent);

    // http://localhost:3000/?userid=apple
    const paramName = req.query.userid; //get방식의 변수값을 가져옴
    console.log(paramName);

});

app.listen(port,() => {
    console.log(`${port}포트로 서버 실행중...`);

});

text 정리

FileSystem 모듈
파일처리와 관련된 모듈입니다. 
node.js에서 가장 중요하고 기초가 되는 모듈입니다.

메소드
readFile() : 파일을 비동기적으로 읽습니다.
readFileSync() : 파일을 동기적으로 읽습니다.
writeFile() : 파일을 비동기적으로 씁니다.
writeFileSync() : 파일을 동기적으로 씁니다.

* 동기와 비동기
프로그램이 동작하는 상태에서 완전히 해당 내용을 끝내고 다음으로 제어를 넘기는 방식을 동기식, 
동작이 끝나지 않은 상태에서도 제어권을 넘긴 후 프로그램을 계속 진행하면 비동기식이라고 합니다.

예외 처리(Exception)
프로그램이 실행되고 있는 런타임시에 에러가 발생할 경우 처리할 수 있는 프로그램 구간을 의미합니다
try {
    예외 상황이 발생할 수 있는 문장
    ....
    ....
}catch(e){
    예외 상황이 발생했을 경우 처리할 문장(e는 Exception 객체)
}finally{
    예외 상황이 발생하거나 발생하지 않아도 무조건 실행될 문장(생략가능)
}

이벤트 루프(Event Loop)
node.js는 서버가 가동되면 변수들을 초기화하고 함수를 선언하고 이벤트가 발생할 때까지 기다립니다. 
이벤트가 감지되었을 때 call back 함수를 호출합니다.

1. http 모듈
node.js에서 가장 기본적이고 중요한 서버 모듈입니다. 
HTTP 웹 서버를 생성하는 것과 관련된 모든 기능을 담당합니다.

메소드
listen() : 서버를 실행하고 클라이언트를 기다립니다.
close() : 서버를 종료합니다.

2. request 객체
클라이언트가 서버에게 전달하는 메세지(정보)를 담는 객체입니다.

속성
method : 클라이언트 요청 방식을 나타냅니다. (GET, POST)
url : 클라이언트가 요청한 URL을 나타냅니다.

3. response 객체
서버에서 클라이언트로 응답 메세지를 전송시켜주는 객체입니다.

메소드
writeHead() : 응답 헤더를 작성합니다.
end() : 응답 본문을 작성합니다.

MIME 형식
text/plain : 일반적인 text 파일
text/html : html 형식 파일
text/css : css 형식 파일
text/xml : xml 형식 파일
image/jpeg : jpeg 이미지 파일
image/png : png 이미지 파일
video/mpeg : mpeg 동영상 파일
audio/mp3 : mp3 음악 파일
...

events
이벤트 위주의 프로그램을 작성할 때 사용하는 모듈입니다.

메소드
on() : 지정한 이벤트의 리스너를 추가합니다.
once() : 지정한 이벤트의 리스너를 추가하지만 한번 실행 이후 자동 제거됩니다.
removelistener() : 지정한 이벤트에 대한 리스너를 제거합니다.
emit() : 지정한 이벤트를 발생시킵니다.

시스템 이벤트
process 객체는 노드에서 항상 사용할 수 있는 객체입니다. 
on()과 emit() 메소드는 객체를 생성하거나 모듈을 가져오지 않아도 바로 사용할 수 있습니다. 
on() 메소드를 호출하면서 이벤트 이름을 exit로 지정하면 내부적으로 프로세스가 끝날 때를 알 수 있습니다.

익스프레스 모듈
http 모듈만 사용해서 웹 서버를 구성하면 직접 많은 기능을 개발해야 합니다. 
이 문제를 해결하기 위해 만들어진 모듈이 익스프레스입니다. 
익스프레스 모듈을 사용하면 간단한 코드로 웹 서버의 기능을 대부분 구현할 수 있고, 
미들웨어와 라우터를 사용하여 편리하게 웹 서버를 구성할 수 있습니다.

메소드
use() : 미들웨어 함수를 사용합니다.
get() : get으로 사용자 정보를 전달 받습니다.
set() : 서버 설정을 위한 속성을 설정합니다.
redirect() : 웹 페이지의 경로를 강제로 이동시킵니다.
send() : 클라이언트에 응답 데이터를 보냅니다. 
        전달할 수 있는 데이터는 html, buffer, json, json 배열.. 등입니다.
header() : 헤더를 확인합니다.

[package 설치하기]
npm install 모듈명(npm i 모듈명)
npm i express

package 복원하기
npm install