인프런 : https://www.inflearn.com/course/web2-node-js#
생활 코딩 : https://opentutorials.org/module/3549
소스 : https://github.com/braverokmc79/WEB2-Nodejs
Node.js
1.수업소개
2.수업의 목적
Node.js 설치
3.설치
4.Windows
5.MacOS
6.Linux & Codeanywhere
프로그래밍 언어를 웹에서 실행하고 공유도 가능한 사이트
https://blog.gaerae.com/2015/06/website-run-execute-code-online.html
JavaScript의 기본문법 & Node.js의 주요 기능 & 웹앱
7.공부방법
8.웹서버 만들기
강좌 : https://opentutorials.org/module/3549/21032
소스 : https://github.com/web-n/web1_html_internet
9.Data type - Number
Number.js
console.log(1 + 1); console.log(4 - 1); console.log(2 * 2); console.log(10 / 2);
10.Data type - String
11.변수의 형식
var a = 1; console.log(a); a = 2; console.log(a); //1 = 2;
12.변수의 활용
13.Template Literal
ES6 이전엔 표현식을 다음과 같이 일반 문자열 안에 집어넣었습니다.
var a = 20; var b = 8; var c = "자바스크립트"; var str = "저는 " + (a + b) + "살이고 " + c + "를 좋아합니다."; console.log(str); //저는 28살이고 자바스크립트를 좋아합니다.
템플릿 리터럴에서는 아래와 같이 $와 중괄호{}를 사용하여 표현식을 표기할 수 있습니다.
let a = 20; let b = 8; let c = "자바스크립트"; let str = `저는 ${a+b}살이고 ${c}를 좋아합니다.`; console.log(str); //저는 28살이고 자바스크립트를 좋아합니다.
위 처럼 + 연산자로 문자열을 연결해주는 것보다 가독성이 더 좋습니다.
14.URL의 이해
15.URL을 통해서 입력된 값 사용하기
var http = require('http'); var fs = require('fs'); var url = require("url"); var app = http.createServer(function (request, response) { var _url = request.url; var queryData = url.parse(_url, true).query; console.log(queryData.id); if (_url == '/') { _url = '/index.html'; } if (_url == '/favicon.ico') { response.writeHead(404); response.end(); return; } response.writeHead(200); //response.end(fs.readFileSync(__dirname + url)); response.end(queryData.id); }); app.listen(3000);
16.동적인 웹페이지 만들기
17.Node.js의 파일 읽기 기능
fileboard.js
var fs = require("fs"); fs.readFile('sample.txt', 'utf8', function (err, data) { console.log(data); });
18.파일을 이용해 본문 구현
var http = require('http'); var fs = require('fs'); var url = require("url"); var app = http.createServer(function (request, response) { var _url = request.url; var queryData = url.parse(_url, true).query; var title = queryData.id; if (_url == '/') { _url = '/index.html'; } if (_url == '/favicon.ico') { response.writeHead(404); response.end(); return; } response.writeHead(200); fs.readFile(`data/${queryData.id}`, 'utf-8', function (err, data) { console.log(data); var template = ` <!doctype html> <html> <head> <title>WEB1 - ${title}</title> <meta charset="utf-8"> </head> <body> <h1><a href="index.html">WEB</a></h1> <ol> <li><a href="?id=HTML">HTML</a></li> <li><a href="?id=CSS">CSS</a></li> <li><a href="?id=JavaScript">JavaScript</a></li> </ol> <h2>${title}</h2> <p><a href="https://www.w3.org/TR/html5/" target="_blank" title="html5 speicification"> Hypertext Markup Language (HTML)</a> is the standard markup language for <strong>creating <u>web</u> pages</strong> and web applications.Web browsers receive HTML documents from a web server or from local storage and render them into multimedia web pages. HTML describes the structure of a web page semantically and originally included cues for the appearance of the document. <img src="coding.jpg" width="100%"> </p><p style="margin-top:45px;">${data} </p> </body> </html> `; response.end(template); }); }); app.listen(3000);
19.Boolean
20.비교연산자
21.제어문
22.조건문
23.Node JS콘솔에서의 입력값
.
24.Not found 구현
var http = require('http'); var fs = require('fs'); var url = require("url"); var app = http.createServer(function (request, response) { var _url = request.url; var queryData = url.parse(_url, true).query; var title = queryData.id; var pathname = url.parse(_url, true).pathname; if (pathname === '/') { response.writeHead(200); fs.readFile(`data/${queryData.id}`, 'utf-8', function (err, data) { console.log(data); var template = ` <!doctype html> <html> <head> <title>WEB1 - ${title}</title> <meta charset="utf-8"> </head> <body> <h1><a href="index.html">WEB</a></h1> <ol> <li><a href="?id=HTML">HTML</a></li> <li><a href="?id=CSS">CSS</a></li> <li><a href="?id=JavaScript">JavaScript</a></li> </ol> <h2>${title}</h2> <p><a href="https://www.w3.org/TR/html5/" target="_blank" title="html5 speicification"> Hypertext Markup Language (HTML)</a> is the standard markup language for <strong>creating <u>web</u> pages</strong> and web applications.Web browsers receive HTML documents from a web server or from local storage and render them into multimedia web pages. HTML describes the structure of a web page semantically and originally included cues for the appearance of the document. <img src="coding.jpg" width="100%"> </p><p style="margin-top:45px;">${data} </p> </body> </html> `; response.end(template); }); } else { response.writeHead(400); response.end("Not found"); } }); app.listen(3000);
25.홈페이지 구현
var http = require('http'); var fs = require('fs'); var url = require("url"); var app = http.createServer(function (request, response) { var _url = request.url; var queryData = url.parse(_url, true).query; var title = queryData.id; var pathname = url.parse(_url, true).pathname; if (pathname === '/') { fs.readFile(`data/${queryData.id}`, 'utf-8', function (err, description) { if (queryData.id === undefined) { title = "Welcome"; description = "Hello, Node.js"; } var template = ` <!doctype html> <html> <head> <title>WEB1 - ${title}</title> <meta charset="utf-8"> </head> <body> <h1><a href="index.html">WEB</a></h1> <ol> <li><a href="?id=HTML">HTML</a></li> <li><a href="?id=CSS">CSS</a></li> <li><a href="?id=JavaScript">JavaScript</a></li> </ol> <h2>${title}</h2> <p><a href="https://www.w3.org/TR/html5/" target="_blank" title="html5 speicification"> Hypertext Markup Language (HTML)</a> is the standard markup language for <strong>creating <u>web</u> pages</strong> and web applications.Web browsers receive HTML documents from a web server or from local storage and render them into multimedia web pages. HTML describes the structure of a web page semantically and originally included cues for the appearance of the document. <img src="coding.jpg" width="100%"> </p><p style="margin-top:45px;">${description} </p> </body> </html> `; response.writeHead(200); response.end(template); }); } else { response.writeHead(400); response.end("Not found"); } }); app.listen(3000);
26.반복문
27.배열
28.배열과 반복문
29.Node.js에서 파일목록 알아내기
var testFolder = '../data'; var fs = require('fs'); fs.readdir(testFolder, function (err, fileList) { console.log(fileList); })
30.글목록 출력하기
app.js
const http = require('http'); const fs = require('fs'); const url = require("url"); const app = http.createServer(function (request, response) { const _url = request.url; const queryData = url.parse(_url, true).query; const pathname = url.parse(_url, true).pathname; let title = queryData.id; let menuList = ""; if (pathname === '/') { //readdirSync 동기식처리 let filelist = fs.readdirSync('../data'); filelist.forEach(item => { menuList += ` <li><a href="?id=${item}">${item}</a></li> `; }) fs.readFile(`../data/${queryData.id}`, 'utf-8', function (err, description) { if (queryData.id === undefined) { title = "Welcome"; description = "Hello, Node.js"; } var template = ` <!doctype html> <html> <head> <title>WEB1 - ${title}</title> <meta charset="utf-8"> </head> <body> <h1><a href="/">WEB</a></h1> <ol> ${menuList} </ol> <h2>${title}</h2> <p><a href="https://www.w3.org/TR/html5/" target="_blank" title="html5 speicification"> Hypertext Markup Language (HTML)</a> is the standard markup language for <strong>creating <u>web</u> pages</strong> and web applications.Web browsers receive HTML documents from a web server or from local storage and render them into multimedia web pages. HTML describes the structure of a web page semantically and originally included cues for the appearance of the document. <img src="coding.jpg" width="100%"> </p><p style="margin-top:45px;">${description} </p> </body> </html> `; response.writeHead(200); response.end(template); }); } else { response.writeHead(400); response.end("Not found"); } }); app.listen(3000);
31.함수의 기본 문법
32.함수의 입력
33.함수의 출력
34.함수를 이용해서 정리
const http = require('http'); const fs = require('fs'); const url = require("url"); function templateHTML(title, menuList, body) { return ` <!doctype html> <html> <head> <title>WEB1 - ${title}</title> <meta charset="utf-8"> </head> <body> <h1><a href="/">WEB</a></h1> <ol>${menuList}</ol> ${body} </body> </html> `; } function templateList(filelist) { let menuList = ""; filelist.forEach(item => { menuList += `<li><a href="?id=${item}">${item}</a></li>`; }) return menuList; } const app = http.createServer(function (request, response) { const _url = request.url; const queryData = url.parse(_url, true).query; const pathname = url.parse(_url, true).pathname; let title = queryData.id; if (pathname === '/') { //readdirSync 동기식처리 파일 목록 읽기 const filelist = fs.readdirSync('../data'); let menuList = templateList(filelist); fs.readFile(`../data/${queryData.id}`, 'utf-8', function (err, description) { if (queryData.id === undefined) { title = "Welcome"; description = "Hello, Node.js"; } const template = templateHTML(title, menuList, `<h2>${title}</h2>${description}`); response.writeHead(200); response.end(template); }); } else { response.writeHead(400); response.end("Not found"); } }); app.listen(3000);
수업의 정상
35.수업의 정상
36.Nodejs에서 동기와 비동기 (1/2)
37.Nodejs에서 동기와 비동기 (2/2)
const fs = require("fs"); //readFileSync // console.log('A'); // const result = fs.readFileSync('sample.txt', 'utf8'); // console.log(result); // console.log('C'); console.log('A'); fs.readFile('sample.txt', 'utf8', function (err, result) { console.log(result); }); console.log('C');
38.callback
// function a() { // console.log('A'); // } var a = function () { console.log('A'); } function b() { console.log('B'); } function slowfunc(callback) { callback(); } slowfunc(a);
39.패키지 매니저와 PM2
설치
$ npm install pm2@latest -g # or $ yarn global add pm2
앱 시작
$ pm2 start *.js # default $ pm2 start *.sh / *.py / binary-file... # 여러가지 포맷의 파일 지원
- 기본 명령어로 pm2를 이용해 앱을 실행한다면 fork모드로 설정되어서, 단일 인스턴스는 단일 스레드로 실행되는 Node의 특징을 따르게 된다.
- pm2 에서는 Cluster 모드도 사용가능하다. 관련하여 알고 싶다면 여기를 참조해보자!
CLI 로 전달가능한 옵션들
# 앱 이름 지정 --name <app_name> # 항상 모니터링하다가, 관련해서 파일이 변경되면 앱 재시작 --watch # watch옵션시에 특정 폴더 경로는 무시해야할 때 (log 폴더 지정하면...이거 이용해서 제거해주자. 아니면 무한 재실행을 볼 수 있다.) --watch --ignore-watch="[dir]/*" # 앱이 리로드 될때 최대의 메모리 지정 --max-memory-restart <200MB> # 로그 파일 패스 지정 --log <log_path> # 스크립트에 추가 인수 전달 -- arg1 arg2 arg3 # 재시작할때의 딜레이 지정 --restart-delay <delay in ms> # 로그 남길때 프리픽스로 시간 지정 --time # 재시작 불가하도록 설정 --no-autorestart # 주기적으로 강제 재시작이 필요할때 설정 (cron) --cron <cron_pattern> # Attach to application log --no-daemon
앱 관리
$ pm2 restart app_name # 프로세스 종료하고 재시작 $ pm2 reload app_name # 프로세스 종료없이 재시작 $ pm2 stop app_name # 프로세스 스탑 $ pm2 delete app_name # 프로세스 삭제
- app_name 대신에 all, id를 넣을 수 있다.
- all : 모든 프로세스 대상
- id : 특정 프로세스 대상
모니터링
$ pm2 status $ pm2 ls $ pm2 list $ pm2 prettylist # json $ pm2 monit
해당 명령어를 치면 현재 실행중인 프로세스에 대해서 모니터링이 진행가능하다.
다른 명령어들과 다르게, monit 명령어는 실시간 상태를 확인할 수 있는 모니터링 창을 열어준다.
Scale
Scale 관리
# 프로세스 4개 늘리기 $ pm2 scale app +4 # 프로세스 4개 줄이기 $ pm2 scale app -4 # 프로세스 4개로 설정하기 $ pm2 scale app 4
Log
pm2 에서 진행중인 프로세스에 대해서 로그를 확인하고 싶다면 다음 명령어를 사용하면 된다.
# all $ pm2 logs # specific process log $ pm2 logs [process name | process id] # lines option $ pm2 logs --lines 200
Log Rotate
pm2에서 Log Rotate 관리를 위해서는 pm2-logrotate 플러그인을 설치하면 됩니다.
# npm으로 설치하는 것이 아닌 pm2로 설치 $ pm2 install pm2-logrotate # 옵션 설정은 다음과 같이 설정 $ pm2 set pm2-logrotate:<option> <value>
Options
- max_size: 로그 파일 사이즈 제한 크기 (기본값은 10M)
- retain: 로그 파일을 최대 몇개까지 가지고 있을 것인지 설정 (기본값은 30개)
- compress: 로그 파일을 gzip으로 압축할 것인지 여부 (기본값은 false)
- dateFormat: 로그 파일 날짜 폼새 (기본값은 YYYY-MM-DD_HH-mm-ss)
- workerInterval: 로그 파일 사이즈를 확인하는 1초마다의 회수 (기본값 초당 30회)
- rotateInterval: cron job (기본값은 '0 0 * * *')
Update
# update pm2 $ npm install pm2@latest -g $ pm2 update
- 두 명령어 모두 실행해야한다.
참고
https://pm2.keymetrics.io/docs/usage/quick-start/
https://velog.io/@altmshfkgudtjr/PM2-Node.js-%EB%AC%B4%EC%A4%91%EB%8B%A8-%EC%84%9C%EB%B9%84%EC%8A%A4
40.HTML - Form
댓글 ( 4)
댓글 남기기