Node.js 공부기(1)

n0wkim·2020년 12월 26일
2

Node.js 공부기

목록 보기
1/4
post-thumbnail

시작


백엔드를 전혀 할 줄 모르기 때문에 입문으로 뭐가 좋을까 하다가 기왕 책이 있는 김에 Node.js로 시작을 하기로 했다. 읽고 있는 책은 '웹 서비스를 만들며 배우는 node.js 프로그래밍'이라는 책이다.

사실 처음 이 책을 읽기 시작한 건 올해 8월?9월 쯤이었는데 '준비하기' 단계에서 멈춰놓고 다른 일들 때문에 미뤘었다. 이제는 다시 시작하려 한다. 공부한 날에 무엇을 공부했는지 작성하면서 remind하고, 나중에 다시 찾아보기 쉽게 정리하려 한다.

Node.js의 Hello World


책에서 처음 다루는 코드이고, 설명이 잘 되어 있어서 이해하기 쉬웠다.
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');
})

각 라인별로 다시 정리하자면,

  • http라는 모듈을 불러온다.
  • http 서비스의 경우는 80, https의 경우는 443 포트로 설정하기 때문에 80으로 설정.
  • 서버가 응답을 할 IP에 대해 설정하는 부분이다. 서버를 run 한 후, 브라우저로 127.0.0.1이나 localhost로 접속하면 접속이 된다.
  • createServer에서 req(request)와 res(response)로 나눠져 있고, '이러한 방식으로 서버를 만들고, 만든 서버를 사용해서 웹 브라우저의 요청을 듣는다' 정도로 이해하면 된다고 한다.
  • listen 부분은 실제로 서버 모듈을 동작하도록 '실행'하는 부분이다.

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');
})

위의 코드와 살짝 다른 점이 있다.

  • ip를 지정하지 않고, 클라이언트 측 ip를 받아들이는 부분을 넣었다.
  • ['x-forwarded-for'] 라고 하는 헤더 값을 사용해서 실제 IP를 헤더 값에 포함시켰다.

코드를 보면 마지막에 res.end로 통신을 종료하면서 Hello World를 출력함과 동시에 JSON형식으로 req.headers를 출력해 주었다.

처음에 들었던 의문은 terminal에서 아래와 같이 왜 두번 출력되는지였는데,
그 이유는 하나는 메인 페이지에 대한 요청이고, 또 다른 하나는 파비콘(favicon)에 대한 요청이라고 한다.

user-agent를 통해 접속한 클라이언트의 웹 브라우저 종류를 알 수 있으며,
그 밑에 줄의 accept를 통해 해당 브라우저가 받아들일 수 있는 파일의 종류가 나온다.
accept-encoding의 경우는 해당 브라우저가 어떤 압축 방식으로 된 파일들을 주고받을 수 있는지 알 수 있고, 일반 브라우저의 경우는 gzip을 지원하므로 텍스트 문서의 경우에는 gzip으로 압축하면 많은 데이터에서 이득을 볼 수 있다고 한다.
accept-language는 사용자가 설정해 놓은 언어 수용도를 의미한다.

그리고 현재는 statusCode를 200으로 설정했지만, 여러 다른 http 응답 코드들이 있다고 한다.

여러 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를 써서 해당 데이터를 뿌려주는걸로 끝내지 않을까 하는 생각이다.

profile
끙끙대며 배우는 중

1개의 댓글

comment-user-thumbnail
2020년 12월 29일

저도 node.js에 대해 관심이 있는데, 나중에 한 번 따라해봐야겠어요

답글 달기