버퍼(buffer)
- 메모리에 저장되는 일부 공간
- 바이트 단위로 저장되며 integer 형태의 배열이 저장되는 공간
더보기
const buf = Buffer.from('Hi');
console.log(buf); // <Buffer 48 69>
console.log(buf.length); // 2
console.log(buf[0]); // 72 아스키 코드 값
console.log(buf[1]); // 105
console.log(buf.toString()); // Hi
const buf2 = Buffer.alloc(2); // 2개의 사이즈로 저장할 수 있게 공간을 만들고
buf2[0] = 72; // 값을 넣고
buf2[1] = 105;
console.log(buf2.toString()); // 출력하면 buf와 같은 Hi
// nodejs를 메모리 버퍼에 문자열 사이즈만큼 메모리를 할당하고 문자를 저장
// 단 아스키코드를 사용
const nodejs1 = Buffer.from('nodejs');
console.log(nodejs1[0]);
console.log(nodejs1[1]);
console.log(nodejs1[2]);
console.log(nodejs1[3]);
console.log(nodejs1[4]);
console.log(nodejs1[5]);
const nodejs2 = Buffer.alloc(6);
nodejs2[0] = 110;
nodejs2[1] = 111;
nodejs2[2] = 100;
nodejs2[3] = 101;
nodejs2[4] = 106;
nodejs2[5] = 115;
console.log(nodejs2.toString()); // nodejs
// 버퍼 합치기
const newBuf = Buffer.concat([buf, buf2, nodejs2])
console.log(newBuf.toString()); //HiHinodejs
스트림(Stream)
- 데이터의 흐름을 나타내며 데이터를 읽는 스트림, 데이터를 쓰는 스트림, 데이터를 읽고 쓰는 스트림 등이 있음
- 일반적으로 데이터를 효율적으로 처리하고 메모리 사용량을 최적화하기 위해 사용
더보기
const fs = require('fs');
const beforeMem = process.memoryUsage().rss; // process 모듈, 메모리 사용량, 현재
console.log(beforeMem); // 24363008
// 에러는 언더바로 처리
fs.readFile('./test.html', (_, data) => {
fs.writeFile('./file.txt', data, () => {
console.log('파일 저장 완료!');
});
const afterMem = process.memoryUsage().rss;
const diff = afterMem - beforeMem;
const result = diff / 1024 / 1024
// 차이를 1024로 나누면 키로 바이트 한 번 더 나누면 메가바이트
console.log(diff); // 1597440
console.log(`메모리 사용 : ${result} MB`);
// 메모리 사용 : 1.5234375 MB
});
pipe(): 스트림을 연결하고 데이터를 한 스트림에서 다른 스트림으로 자동으로 전달하는 메서드. 데이터를 효율적으로 처리하고 복사하지 않고도 한 스트림에서 다른 스트림으로 데이터를 전달할 수 있음
더보기
const fs = require('fs');
const zlib = require('zlib');
const readStream = fs.createReadStream('./file.txt');
const zlibStream = zlib.createGzip();
const writeStream = fs.createWriteStream('./file2.txt.gz');
const piping = readStream.pipe(zlibStream).pipe(writeStream);
// 객체.on = 이벤트를 연결해줌
piping.on('finish', () => { // 파이프가 다 실행됐다면 콜백함수 출력
console.log('끝')
});
http 모듈
- 웹 서버와 클라이언트를 만들고 관리하는데 사용되는 핵심 모듈
- HTTP 서버를 만들거나 HTTP 클라이언트 요청을 만들 수 있음
더보기
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'); // (response) 사용자에게 header를 html로 보내기
if(url === '/'){
fs.createReadStream('./page/index.html').pipe(res);
// index를 읽어서 사용자에게 전달하겠다
console.log('index.html');
}else if(url === '/news'){
fs.createReadStream('./page/news.html').pipe(res);
console.log('news.html');
}else{
fs.createReadStream('./page/not-found.html').pipe(res);
console.log('not-found.html');
}
});
// localhost:8080 호출 시 접속
server.listen(8080); //포트번호
EJS
더보기
템플릿 엔진
- 웹 어플리케이션에서 동적으로 HTML을 생성하는데 사용하는 도구 및 라이브러리
- HTML 페이지 내에서 데이터를 동적으로 삽입하고 조작하는데 도움이 되며 주로 웹 어플리케이션에서 뷰 부분을 생성하는데 활용된다
- EJS, Pug, Handlebars, Nunjucks ...
- ejs 공식 홈페이지(https://ejs.co)
const http = require('http');
const fs = require('fs');
const ejs = require('ejs');
const name = '김사과';
const jobs = [
{job : '학생'},
{job : '개발자'},
{job : '교사'},
{job : '공무원'},
{job : '취준생'}
];
const userid = 'apple';
const server = http.createServer((req, res) => {
const url = req.url;
res.setHeader('Content-Type', 'text.html');
if(url === '/'){
ejs.renderFile('./template/index.ejs', {name:name}).then((data) => res.end(data));
}else if(url === '/news'){
ejs.renderFile('./template/news.ejs', {jobs:jobs}).then((data) => res.end(data));
}else {
ejs.renderFile('./template/not-found.ejs', {name:name, userid:userid}).then((data) => res.end(data));
}
});
server.listen(8080);
REST(Representational State Transfer)
자원을 이름으로 구분하여 해당 자원의 상태를 주고 받는 모든 것을 의미
REST API
REST 기반으로 서비스 API를 구현한 것
API (Application Programing Interface)
기능의 집합을 제공해서 컴퓨터 프로그램간의 상호작용을 하도록 하는 것
더보기
const http = require('http');
const skills = [
{name: 'Python'},
{name: 'MySQL'},
{name: 'HTML'},
{name: 'CSS'},
{name: 'JavaScript'}
]
const server = http.createServer((req, res) => {
const url = req.url;
const method = req.method;
if(method === 'GET'){
// 200번대 : 정상적인 호출, 400번대 : 페이지 없음, 500번대 : 서버 오류
res.writeHead(200, {'Content-Type' : 'application/json'});
res.end(JSON.stringify(skills));
}
});
server.listen(8080);
Express 웹 프레임 워크
- 웹 서버를 생성하고 HTTP 요청에 대한 라우팅 및 처리, 미들웨어를 통힌 요청 및 응답 처리등을 간단하게 구현할 수 있음
- 다양한 확장 기능과 모듈을 제공하여 개발 생산성을 높일 수 있음
- npm i Express
더보기
import express from 'express';
// 객체 생성
const app = express();
// 미들웨어
// next : 다음 미들웨어를 호출
app.use((req, res, next) =>{
res.setHeader('node-skill', 'node middleware!');
next();
});
app.get('/', (req, res, next) => {
res.send('<h2>익스프레스 서버로 만든 첫 번째 페이지 </h2>');
next();
});
app.get('/hello', (req, res, next) => {
res.setHeader('Content-type', 'application/json');
res.status(200).json({userid:'apple', name:'김사과', age:20});
next();
});
app.listen(8080);
Get
더보기
import bodyParser from 'body-parser';
import express from 'express';
// npm i body-parser
const app = express();
app.use(bodyParser.urlencoded({extended :true}));
app.get('/', (req, res) => {
res.send('<h2>로그인</h2><form action="/login" method="post"><p>아이디: <input type="text" name="userid" id="userid"></p><p>비밀번호: <input type="password" name="userpw" id="userpw"></p><p><button type="submit">로그인</button></p></form>');
});
// localhost:8080/posts
// localhost:8080/posts?id=1 = > query : { id: '1' }
// localhost:8080/posts?id=1&userid=apple&name=김사과
app.get('/posts', (req, res) =>{
console.log('post 호출!');
console.log('path :', req.path);
console.log('query :' , req.query);
res.sendStatus(200);
});
// localhost:8080/posts/1
// localhost:8080/posts/1?id=10 //query : { id: '10' }, params : { id: '1' }
app.get('/posts/:id', (req, res) =>{
console.log('post 호출!');
console.log('path :', req.path);
console.log('query :' , req.query);
console.log('params :' , req.params);
res.sendStatus(200);});
// http://localhost:8080/mypage // path : /mypage
// http://localhost:8080/myroom // path : /myroom
app.get(['/mypage', '/myroom'], (req, res) => {
console.log('path :', req.path);
res.send(`<h2> ${req.path} 페이지 </h2>`)
});
// http://localhost:8080/member/10 /10 호출, 10번 멤버가 호출됨
app.get('/member/:userid', (req, res) =>{
console.log(req.path, '호출');
console.log(`${req.params.userid}번 멤버가 출력됨`);
res.sendStatus(200);
});
app.get('/login', (req, res) =>{
console.log('login 호출!');
console.log('path :', req.path);
console.log('query :' , req.query);
res.sendStatus(200);
});
// login 호출!
// path : /login
// query : { userid: 'apple', userpw: '1111' }
// http://localhost:8080에서 로그인 정보를 입력하면 주소가
// http://localhost:8080/login?userid=apple&userpw=1111
// http://localhost:8080/login 로그인
app.post('/login', (req, res) =>{
console.log('login 호출!');
console.log(req.body);
res.status(200).send('로그인 되었습니다!')
});
// login 호출!
app.listen(8080);
그 외 기타
CRUD Operation
POST : 생성(create)
GET : 조회(read)
PUT : 수정(update)
DELETE : 삭제(delete)
package.json 기본 값으로 생성하기
npm init -y
라이브러리 설치
npm install 패키지명
npm i 패키지명
nodemon 설치 ((ctrl + c) 서버를 내렸다 올렸다 할 필요 없게 해줌)
npm i nodemon --save-dev
'Nodejs' 카테고리의 다른 글
params, query (0) | 2024.04.29 |
---|---|
route 활용 (tweet 예제) (2024-04-26) (0) | 2024.04.26 |
post, error, route (2024-04-25) (0) | 2024.04.25 |
Promise, async, await, JSON, fetch(2024-04-23) (0) | 2024.04.23 |
node.js 함수, 객체, 클래스, 상속 (2024-04-19) (1) | 2024.04.19 |