수업 복습/Node.js

10월 30일 수업 내용 - Node.js / Day02

김복칠 2023. 10. 30. 14:57

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)