클라이언트에서 서버로 요청을 보내고, 서버는 요청의 내용을 읽고 처리한 뒤 클라이언트에게 응답을 보냅니다.
따라서 서버에는 요청을 받는 부분과 응답을 보내는 부분이 있어야 합니다.
createServer.js
const http = require('http');
http.createServer((req, res) => {
// 응답 내용
})
server1.js
const http = require('http');
http.createServer((req, res) => {
res.write('<h1>Hello Node!</h1>');
res.end('<p>Hello Server!</p>');
}).listen(8080, () => {
console.log('8080번 포트에서 서버 대기 중입니다!');
});
server1-0.js
const http = require('http');
const server = http.createServer((req, res) => {
res.write('<h1>Hello Node!</h1>');
res.end('<p>Hello Server!</p>');
})
server.listen(8080);
server.on('listening', () => {
console.log('8080번 포트에서 서버 대기 중입니다!');
});
server.on('error', error => {
console.error(error);
});
$ node server1
8080번 포트에서 서버 대기 중입니다!
localhost와 포트란?
localhost는 현재 컴퓨터의 내부 주소
localhost 대신 127.0.0.1 도 사용 가능
포트는 서버 내에서 프로세스를 구분하는 번호
보통의 사이트는 포트 번호를 따로 표시하지 않으나, 80번 포트를 사용하기 때문이고 80번 포트를 사용하면 생략 가능
리눅스와 macOS에서는 1024번 이하의 포트 사용시 관리자 권한이 필요하므로 1024번 이하의 포트를 사용한 노드 서버의 실행시에는 앞에 sudo를 추가해야됨
클라이언트에서 보내는 요청에는 한 가지 단점이 존재함.
누가 요청을 보내는지 모른다는 것.
http 상태 코드는 서버에서 보내주는 상태 코드를 보고 요청의 성공 유무를 판단함
http status code 모음
REST API : REpresentational State Transfer의 약어로 네트워크 구조의 방식중 하나. 서버의 자원을 정의하고, 자원에 대한 주소를 지정하는 방법을 가르킴.
GET : 서버의 자원을 가져오고자 할 때 사용함. 용청의 본문(body)에 데이터를 넣지 않음. 데이터는 쿼리스트링을 사용함.
POST : 서버에 자원을 새로 등록하고자 할 때 사용함. 요청의 본문에 새로 등록할 데이터를 넣어 보냄.
PUT : 서버의 자원을 요청에 들어 있는 자원으로 치환하고자 할 때 사용합니다. 요청의 본문에 치환할 데이터를 넣어 보냅니다.
PATCH : 서버 자원의 일부만 수정하고자 할 때 사용함. 요청의 본문에 일부 수정할 데이터를 넣어 보냄.
DELETE : 서버의 자원을 삭제하고자 할 때 사용.
유저 리스트에 특정 유저의 정보를 수정 하고자 할때 patch는 해당 유저의 값을 수정하지만 put 은 전체 리스트를 가져온후 수정하여 값을 반환한다.
https 모듈은 웹 서버에 SSL 암호화를 추가.
http 요청을 중간에 가로채더라도 내용을 확인 할 수 없음(요즘은 적용이 필수)
server1-1.js
const https = require('https');
const fs = require('fs');
https.createServer({
cert: fs.readFileSync('도메인 인증서 경로');
key: fs.readFileSync('도메인 비밀키 경로');
ca: [
fs.readFileSync('상위 인증서 경로'),
fs.readFileSync('상위 인증서 경로'),
],
}, (req, res) => {
res.write('<h1>Hello Node!</h1>');
res.end('<p>Hello Server!</p>');
}).listen(443, () => {
console.log('443번 포트에서 서버 대기 중입니다!');
})
http 모듈과 거의 흡사하나, 첫 번째 인자로 인증서에 관련된 옵션 객체를 받음.
노드의 http2 모듈은 SSl 암호화와 더불어 최신 HTTP 프로토콜인 http/2를 사용할 수 있게 해줌. 기존의 http/1.1보다 훨씬 효율적인 요청이 가능(웹의 속도 개선)
server1-2.js
const http2 = require('http2');
const fs = require('fs');
http2.createSecureServer({
cert: fs.readFileSync('도메인 인증서 경로'),
key: fs.readFileSync('도메인 비밀키 경로'),
ca: [
fs.readFileSync('상위 인증서 경로'),
fs.readFileSync('상우 인증서 경로'),
],
}, (req, res) => {
res.write('<h1>Hello Node!</h1>');
res.end('<p>Hello Server!</p>');
}).listen(443, () => {
console.log('443번 포트에서 서버 대기 중입니다!');
});
https 모듈과 거의 흡사함.
cluster 모듈은 싱글 스레드인 노드가 CPU 코어를 모두 사용 할 수 있게 해주는 모듈.
여러개의 CPU를 사용하여 서버의 부하를 분산 시키지만, 세션 공유가 불가하다는 단점 존재(Redis 등의 서버를 도입하여 해결 가능)
직접 cluster 모듈로 클러스터링을 구현할 수도 있지만, 실무에서는 pm2 등의 모듈로 cluster 기능을 사용.