10월 30일 수업 내용 - Node.js / Day02
1. 버퍼(buffer)
- 메모리에 저장되는 일부 공간
- 바이트 단위로 저장되며 integer 형태의 배열
const buf = Buffer.from('Hi')
console.log(buf); // 'Hi' 가 출력
console.log(buf.length);
console.log(buf[0]); // 인덱스를 이용하여 문자의 맞는 아스키 코드 출력 , 72
console.log(buf[1]);
console.log(buf.toString());
const buf2 = Buffer.alloc(2)
buf2[0] = 72 // 아스키 코드 값을 입력해서 문자 출력 , 'H' 출력
buf2[1] = 105 // 'I' 출력
console.log(buf2.toString());
- 원하는 문자의 인덱스번호를 이용하여 아스키코드를 입력하여 문자 출력이 가능
2. 스트림(Stream)
- 데이터의 흐름을 나타내며, 데이터를 읽는 스트림, 데이터를 쓰는 스트림, 데이터를 읽고 쓰는 스트림이 있음
- 일반적으로 데이터를 효율적으로 처리하고 메모리 사용량을 최적화하기 위해 사용
const fs = require('fs')
const beforeMem = process.memoryUsage().rss
console.log(beforeMem);
fs.readFile('./file.txt',(_, data) => {
fs.writeFile('./file2.txt',data, () => {
console.log('파일 저장 완료');
})
const afterMem = process.memoryUsage().rss
const diff = afterMem - beforeMem
const consumed = diff / 1024 / 1024
console.log(diff);
console.log(`메모리:${consumed}MB`);
})
- fs.writeFile() 을 이용해 기존에 존재하는 file.txt 내용을 그대로 복사하여 file2.txt 를 만들어줌
- process.memoryUsage().rss 를 afterMem 에 저장하여 이후 메모리를 추출
3. pipe()
- 스트림을 연결하고 데이터를 한 스트림에서 다른 스트림으로 자동으로 전달하는 메서드
- 데이터를 효율적으로 처리하고 복사하지 않고도 한 스트림에서 다른 스트림으로 데이터를 전달할 수 있음
const fs = require('fs')
const zlib = require('zlib')
const readStream = fs.createReadStream('./file.txt')
const zlibStream = zlib.createGzip()
const wirteStream = fs.createWriteStream('./file2.txt.gz')
const piping = readStream.pipe(zlibStream).pipe(wirteStream)
piping.on('finish',() => {
console.log('끝났습니다');
})
4. package.json 만들기
- 생성 방법 : npm init 입력 // npm init -y (기본값으로 생성)
- 라이브러리 설치 : npm install 패키지명 // npm i 패키지명
- nodemon 설치 : npm i nodemon --save-dev
{
"name": "day02",
"version": "1.0.0",
"description": "",
"main": "1-buffer.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start":"nodemon 5-test",
"sakong":"node 4-http"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"nodemon": "^3.0.1"
}
}
5. http 모듈
- 웹 서버와 클라이언트를 만들고 관리하는 데 사용되는 핵심 모듈
- HTTP 서버를 만들거나 HTTP 클라이언트 요청을 만들 수 있음
onsole.log('http 모듈 테스트!');
console.log('노드몬이 실행중입니다!');
const http = require('http');
const fs = require('fs');
const server = http.createServer((req,res)=>{
console.log('서버가 동작중입니다.');
console.log(req.headers);
console.log(req.method);
console.log(req.url);
const url = req.url;
res.setHeader('Content-Type', 'text/html');
if(url === '/'){
fs.createReadStream('./html/index.html').pipe(res)
}else if(url === '/mypage'){
fs.createReadStream('./html/mypage.html').pipe(res)
}else{
fs.createReadStream('./html/not-found.html').pipe(res)
}
});
server.listen(8080)
- html 에 입력된 파일이 localhost:8080 으로 연결되어 출력
6. 템플릿 엔진
- 웹 어플리케이션에서 동적으로 HTML을 생성하는 데 사용되는 도구 및 라이브러리
- HTML 페이지 내에서 데이터를 동적으로 삽입하고 조작하는 데 도움이 되며, 주로 웹 어플리케이션에서 뷰 부분을 생성하는데 활용
- EJS, Pug, Handlebars, Nunjucks ...
- ejs 공식 홈페이지(https://ejs.co/)
const http = require('http')
const fs = require('fs')
const ejs = require('ejs')
const userid = 'apple'
const name = '김사과'
const server1 = http.createServer((req,res) => {
const url2 = req.url
res.setHeader('Content-Type','text/html')
if(url2 === '/'){
ejs.renderFile('./template/index.ejs',{userid:userid,name:name}).then((data)=>res.end(data))
}
else if (url2 === '/mypage'){
ejs.renderFile('./template/mypage.ejs',{userid:userid,name:name}).then((data)=>res.end(data))
}
else {
ejs.renderFile('./template/not-found.ejs',{userid:userid,name:name}).then((data)=>res.end(data))
}
})
server1.listen(8080)
// ejs 파일
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>not-found</title>
</head>
<body>
<h2><%=userid%>(<%=name%>)님이 요청하신 페이지를 찾을 수 없습니다</h2>
</body>
</html>
- ejs 에 입력된 파일에 변수 '김사과' 와 'apple' 이 삽입 되어 출력
6. JSON
const http = require('http')
const skills = [{name:'HTML'},{name:'CSS'},{name:'JavaScript'},{name:'Nodejs'},{name:'Python'}]
const server = http.createServer((req,res) => {
const url = req.url;
const method = req.method
if (method === 'GET'){
// res.setHeader('Content-Type','text/html')
// 2XX : 정상적인 호출, 4XX : 잘못된 페이지 호출, 5XX : 서버 에러
res.writeHead(200,{'Content-Type':'application/json'})
res.end(JSON.stringify(skills))
}
})
server.listen(8080)
7. Rest(Representational State Transfer)
- 자원의 이름으로 구분하여 해당 자원의 상태를 주고 받는 모든 것을 의미
- REST API : REST 기반으로 서비스 API 구현한 것
8. API(Application Programming Interface)
- 기능의 집합을 제공해서 컴퓨터 프로그램간의 상호작용을 하도록 하는 것
CRUD Operation
POST : 생성(Create)
GET : 조회(Read)
PUT : 수정(Update)
DELETE : 삭제(Delete)