1.TCP 방식으로 HTTP 를 생성하자
http 프로토콜
우리가 브라우저에서 url을 입력하고 엔터를 누르면
HTTP 요청을 보내게 되는데
TCP 3-way hands shaking 과정을 거친다.
3-way hands shakin: 클라이언트와 서버가 데이터 통신을 하기전에
통신준비가 되었다는것을 확인하는 것.
클라이언트가 서버에 연결 요청을 하고
서버는 연결 요청을 받아서 클라이언트에게 연결 요철 수락을 응답해요.
클라이언트는 서버로부터 수락 확인을 보내면 연결이 된다.
SYN(Synchronize Sequence Number),ACK(Acknowledgement)
클라리언트가 syn을 서버에 요청하고
서버는 SYN+ACK을 클라리언트에 연결요청 수락을 응답한다.
클라이언트가 ACK를 보내면 연결이 된다.
서버에 요청과 응답을 한다.
클라이언트가 요청을 보내면 서버가 응답을 하고
4 way-handshake TCP 연결을 종료 수행하는것.
연결을 종료하기위해 클라이언트와 서버의 상태를 서로 확인 한다.
서버가 FIN 메시지를 받고 클라이언트는 데이터가 없다는 것을 의미하는
메시지인 ACK를 보내고 서버는 데이터가 더 없으면 자신이 보내지지 않은 데이터를
확인하고 전송한 후 클라이언트에게 FIN 메시지 전송 클라이언트는 서버가
더이상 전송할 데이터가 없는 것을 확인하는 ACK메시지를 보낸다.
클라이언트와 서버의 연결이 종료되는 것.
http 프로토콜을 사용해서 네트워크 통신을 수행하는 모듈을 가지고 웹서버 개발
요청과 응답을 처리하는 기능을 제공하는 모듈
내장 모듈 http
- Client Server
| |
| SYN --> |
| |
| <-- SYN, ACK |
| |
| ACK --> |
| |
그림과 같이 클라이언트와 서버간에 3번의 경우에 따라 실행된다.
- 그렇다면 4-hand-shake는 어떨까?

const http = require("http");
const { url } = require("inspector");
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader("Content-Type", "application/json", "charset=utf-8");
const URL = req.url;
if (URL == "/favicon.ico") {
res.end();
return;
}
console.log(URL);
switch (URL) {
case "/":
res.end("main page");
break;
case "/list":
res.end("list page");
break;
case "/add":
res.end("add page");
break;
default:
break;
}
});
server.listen(8080, () => {
console.log("서버 잘 열렸음");
});
- 내장 모듈로 변수 생성
const http = require("http");
const { url } = require("inspector");
- 서버를 만들고 헤더와 url설정
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader("Content-Type", "application/json", "charset=utf-8");
const URL = req.url;
if (URL == "/favicon.ico") {
res.end();
return;
}
console.log(URL);
switch (URL) {
case "/":
res.end("main page");
break;
case "/list":
res.end("list page");
break;
case "/add":
res.end("add page");
break;
default:
break;
}
});
- url이 만약 list나 add일 경우 res.end()로 서버를 종료하며 해당 txt를 화면에 띄워준다.
- 마지막으로 대기상태로 만듦
server.listen(8080, () => {
console.log("서버 잘 열렸음");
});
2.파일시스템 접근
const fs = require("fs");
let folder = fs.existsSync("./20230501/test");
console.log(folder);
if (!folder) {
fs.mkdir("./20230501/test", (err) => {
if (err) {
console.log(err);
} else {
console.log("폴더생성");
}
});
}
fs.writeFile("./20230501/test/text.txt", "Hello nodejs", (err) => {
if (err) {
console.log(err);
} else {
console.log("파일 생성 완료");
}
});
fs.readFile("./20230501/test/text.txt", "utf-8", (err, data) => {
if (err) {
console.log(err);
} else {
console.log(data);
}
});
let readFileData = fs.readFileSync("./20230501/test/text.txt", "utf-8");
console.log(readFileData);
- fs 내장 모듈로 existsSync를 사용하여 폴더가 존재하는 지 확인한다.
- 여기서 뒤에 Sync가 붙는것은 동기로 실행된다는 의미이다. 따라서 비동기로 실행시키고 싶다면 Sync를 제거해도 된다.
- 다만 이 때 매개변수가 달라질 수 있으니 주의하자.
3.연동
- 내장모듈 만들기
const http = require("http");
const fs = require("fs");
- server 생성
const server = http.createServer((req, res) => {
res.setHeader("Content-Type", "application/json", "charset=utf-8");
const URL = req.url;
if (URL == "/favicon/ico") {
res.end();
return;
}
switch (URL) {
case "/":
fs.readFile("./20230501/views/main.html", (err, data) => {
if (err) {
res.statusCode = 404;
res.end(err.code);
} else {
res.statusCode=200;
res.setHeader("Content-Type", "text/html", "charset=utf-8");
res.end(data);
}
});
break;
case "/list":
fs.readFile("./20230501/views/list.html", (err, data) => {
if (err) {
res.statusCode = 404;
res.end(err.code);
} else {
res.statusCode=200;
res.setHeader("Content-Type", "text/html", "charset=utf-8");
res.end(data);
}
});
break;
case "/add":
fs.readFile("./20230501/views/add.html", (err, data) => {
if (err) {
res.statusCode = 404;
res.end(err.code);
} else {
res.statusCode=200;
res.setHeader("Content-Type", "text/html", "charset=utf-8");
res.end(data);
}
});
break;
default:
break;
}
});
- header설정
res.setHeader("Content-Type", "application/json", "charset=utf-8");
- URL에 따라 다른 html을 res에 보내주는 구문
switch (URL) {
case "/":
fs.readFile("./20230501/views/main.html", (err, data) => {
if (err) {
res.statusCode = 404;
res.end(err.code);
} else {
res.statusCode=200;
res.setHeader("Content-Type", "text/html", "charset=utf-8");
res.end(data);
}
});
break;
case "/list":
fs.readFile("./20230501/views/list.html", (err, data) => {
if (err) {
res.statusCode = 404;
res.end(err.code);
} else {
res.statusCode=200;
res.setHeader("Content-Type", "text/html", "charset=utf-8");
res.end(data);
}
});
break;
case "/add":
fs.readFile("./20230501/views/add.html", (err, data) => {
if (err) {
res.statusCode = 404;
res.end(err.code);
} else {
res.statusCode=200;
res.setHeader("Content-Type", "text/html", "charset=utf-8");
res.end(data);
}
});
break;
default:
break;
}
- 여기서 res.setHeader("Content-Type", "text/html", "charset=utf-8"); 는 body의 내용이 html로 바꼈기 때문에 json에서 text/html로 변경해준다.
- end안에 있는 파라미터 data는 readFile에서 두번째 매개변수 콜백함수의 두번째 매개변수이다.
파일 안에있는 data를 의미한다. 즉, html
- server 대기상태
server.listen(8080, () => {
console.log("성공했구나 이녀석...");
});
4.pacakage.json
npm init
package.json 파일을 만들어 준다.
파일을 만들 때 속성들을 입력하라고 함...
메타데이터는 데이터들을 설명해주는 데이터
예) 책이 한 권 있다고 가정하면 제목,저자,출판사도 있고 등등의 책의 정보
우리의 프로젝트의 정보를 가지고 있는 json파일이다.
메타데이터 설명을 가지고 있는 json파일 초기화 명령어
모든 설정에 기본값
npm init -y
{
"name": "blockchain",
"version": "1.0.0",
"description": "- git은 뭐냐?",
프로젝트의 설명
"main": "index.js",
모듈화를 시킬 때 메인 파일
패키지리를 require 함수로 불러올 때 명시한 value를 불러 올 수 있다.
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
우리가 실행시킬 때 스크립트의 명령어
"keywords": [],
검색 키워드 배열의 형태로 넣어준다.
"author": "",
패키지 제작자
"license": "ISC"
패키지 라리센스, ISC는 전체 공개
}
scripts: 우리가 자주 실행할 것 같은 명령어를 작성해 두고
npm 명령어로 실행할 수 있다. ex)npm run test
'scripts':{start : 'node index4.js'}=== npm start== node index4.js
5.mySQL 연결하기
- 모듈 가져오기
const mysql2 = require("mysql2");
- createConnection으로 연결
const temp = mysql2.createConnection({
user: "root",
password: "q1w2e3R$",
database: "test2",
});
- query작성 후 테이블 생성
정말 잘 읽었습니다, 고맙습니다!