백엔드를 전혀 할 줄 모르기 때문에 입문으로 뭐가 좋을까 하다가 기왕 책이 있는 김에 Node.js로 시작을 하기로 했다. 읽고 있는 책은 '웹 서비스를 만들며 배우는 node.js 프로그래밍'이라는 책이다.
사실 처음 이 책을 읽기 시작한 건 올해 8월?9월 쯤이었는데 '준비하기' 단계에서 멈춰놓고 다른 일들 때문에 미뤘었다. 이제는 다시 시작하려 한다. 공부한 날에 무엇을 공부했는지 작성하면서 remind하고, 나중에 다시 찾아보기 쉽게 정리하려 한다.
const http = require('http');
const port = 80;
const hostname = '127.0.0.1';
const server = http.createServer((req,res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
});
server.listen(port, (err) => {
if(err){
console.log(err);
}
console.log('Server running');
})
각 라인별로 다시 정리하자면,
const http = require('http');
const server = http.createServer((req,res) => {
var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
console.log("ip: " , ip);
console.log("url: ", req.url);
console.log("headers: ", req.headers);
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n' + JSON.stringify(req.headers, null, 4));
});
server.listen(80, (err) => {
if(err){
console.log(err);
}
console.log('Server running');
})
위의 코드와 살짝 다른 점이 있다.
코드를 보면 마지막에 res.end로 통신을 종료하면서 Hello World를 출력함과 동시에 JSON형식으로 req.headers를 출력해 주었다.
처음에 들었던 의문은 terminal에서 아래와 같이 왜 두번 출력되는지였는데,
그 이유는 하나는 메인 페이지에 대한 요청이고, 또 다른 하나는 파비콘(favicon)에 대한 요청이라고 한다.
user-agent를 통해 접속한 클라이언트의 웹 브라우저 종류를 알 수 있으며,
그 밑에 줄의 accept를 통해 해당 브라우저가 받아들일 수 있는 파일의 종류가 나온다.
accept-encoding의 경우는 해당 브라우저가 어떤 압축 방식으로 된 파일들을 주고받을 수 있는지 알 수 있고, 일반 브라우저의 경우는 gzip을 지원하므로 텍스트 문서의 경우에는 gzip으로 압축하면 많은 데이터에서 이득을 볼 수 있다고 한다.
accept-language는 사용자가 설정해 놓은 언어 수용도를 의미한다.
그리고 현재는 statusCode를 200으로 설정했지만, 여러 다른 http 응답 코드들이 있다고 한다.
200 (ok) 정상적인 요청에 정상적으로 응답함
206 (Partial Content) 서버가 일부 콘텐츠를 전송함301(Moved Permanently) 현재 요청한 페이지는 영구적으로 다른 주소로 이동됨
302(Moved Temporarily) 현재 요청된 페이지는 임시로 다른 주소로 이동됨
304(Not Modified) 마지막 접속 요청 후 페이지가 변경되지 않았음403(Forbidden) 요청된 주소는 접근이 막혀 있음
404(Not Found) 요청된 페이지를 찾을 수 없음
500(Internal Server Error) 서버에 오류가 생겨 해당 요청을 처리할 수 없음
또, end의 경우 매우 중요하며, 크게 보내는 방법에는 두 가지가 있다고 한다.
하나는 write이고, 또 다른 하나는 end이다. 가장 큰 차이점은 write는 한 번 보낸 뒤에도 그 다음에 write 혹은 end를 통해서 여러 번 보낼 수 있지만, end는 한 번 해당 데이터를 보낸 뒤 서버와 클라이언트와의 접속이 종료된다는 점이다.
아직 확실하지는 않지만 뭔가 블로그처럼 정적인 페이지들을 다룰 때는 write보다 end를 써서 해당 데이터를 뿌려주는걸로 끝내지 않을까 하는 생각이다.
저도 node.js에 대해 관심이 있는데, 나중에 한 번 따라해봐야겠어요