TIL-JS 이해하기4

Yeons·2022년 2월 4일
0

jsstudy

목록 보기
9/16

4-1. 간단한 웹 서버 만들기

노드에 기본으로 들어있는 http모듈을 사용하면 웹 서버 기능을 담당하는 서버 객체를 만들 수 있습니다. http 모듈을 로딩했을 때 반환되는 객체에는 createServer()메소드가 정의되어 있습니다. 따라서 이 메소드를 호출하면 서버 객체를 만들 수 있습니다.

const http = require('http');

const server = http.createServer();

const port = 3000;

server.listen(port, () => {
  console.log('Running : %d', port);
})

http모듈에 들어 있는 서버 기능을 사용하려면 require()메소드로 http모듈을 불러옵니다. 모듈과 똑같은 http변수를 만든 후 이 변수에 할당합니다.

이 http 객체의 createServer() 메소드를 호출하면 서버 객체가 반환됩니다. 이 서버 객체의 listen() 메소드를 호출하면 웹 서버가 시작됩니다.

서버를 시작할 때는 포트를 3000번으로 지정하여 해당 포트에서 클라이언트의 요청을 대기합니다. listen() 메소드를 호출할 때 전달하는 두 번째 파라미터는 콜백 함수로, 웹 서버가 시작되면 호출됩니다.

웹 서버는 일반적으로 웹 브라우저라고 하는 클라이언트에서 HTTP 프로토콜로 요청한 정보를 처리한 후 응답을 보내주는 역할을 합니다. 이때, PC나 서버 기계에 있는 6만개가 넘는 포트들 중에서 하나를 사용하는데 여기에서는 3000번을 사용합니다.

웹 서버를 만들고 실행하는 과정을 보면, 먼저 createServer() 메소드를 호출하여 웹 서버 객체를 만들고, 그 객체의 listen()메소드를 호출하여 특정 포트에서 대기하도록 설정합니다. createServer() 메소드로 만든 서버 객체에서 사용할 수 있는 대표적인 메소드는 다음과 같습니다.

listen ( port, [hostname], [backlog], [callback] ) : 서버를 실해아여 대기시킵니다.
close ( [callback] ) : 서버를 종료합니다.

서버 게계에 이더넷 카드가 여러개 있는 경우, 서버에서 사용할 수 있는 인터넷 주소, 즉 IP 주소가 여러개 존재할 수 있습니다. 이렇게 IP주소가 여러 개 있을 때는 IP를 지정해서 서버를 실행해야 할 때도 있습니다. 이런 경우에는 listen() 메소드를 호출하면서 IP를 직접 지정합니다. 다음 코드를 사용하면 IP와 함께 백로그(실질적으로 동시 접속 연결 수를 결정하는 정보)를 지정할 수 있습니다.

클라이언트가 웹 서버에 요청할 때 발생하는 이벤트
connection : 클라이언트가 접속하여 연결이 만들어질 때 발생하는 이벤트
request : 클라이언트가 요청할 때 발생하는 이벤트
close : 서버를 종료할 때 발생하는 이벤트

const http = require('http');

const server = http.createServer();

const port = 3000;
server.listen(port, () => {
  console.log('Server Running! : %d', port);
});

server.on('connection', (socket) => {
  const addr = socket.address();
  console.log('클라이언트 접속 : %s, %d', addr.address, addr.port);
});

server.on('request', (req, res) => {
  console.log('클라이언트 요청');
  console.dir(req);
});

*/ //==console.dir(req);
server.on('request', (req, res) => {
  console.log('클라이언트 요청');
  res.writeHead(200, {"Content-Type" : "text/html; charset=utf-8"});
  res.write("<!DOCTYPE html>");
  res.write("<html>");
  res.write("<head>");
  res.write("<title>응답 페이지</title>");
  res.write("</head>");
  res.write("<body>");
  res.write("<h1>노드제이에스로부터의 응답 페이지</h1>");
  res.write("</body>");
  res.write("</html>");
  res.end();
});
/* //위와 동일


server.on('close', () => {
  console.log('서버가 종료');
});

웹 브라우저와 같은 클라이언트가 웹 서버에 연결되면 connection이벤트가 발생합니다. 그러므로 on() 메소드를 호출할 때 첫번째 파라미터로 connecton 이벤트 이름을 전달하고, 두번째 파라미터로 콜백 함수를 전달합니다. 연결이 만들어져 콜백 함수가 호출될 때는 Socket 객체가 파라미터로 전달됩니다. 이 객체는 클라이언트 연결 정보를 담고 있으므로 address() 메소드를 호출하여 클라이언트의 IP와 포트 정보를 확인 할 수 있습니다.

클라이언트가 특정 패스로 요청하면 request 이벤트가 발생합니다. 이때도 앞에서 알아본 것처럼on() 메소드를 사용해 이벤트를 처리합니다. 콜백 메소드로 전달되는 요청 객체를 console.dir()메소드로 화면에 출력하면 어던 정보가 들어있는지 확인할 수 있습니다.

res 객체의 writeHead(), wirte(), end() 메소드를 사용하면 클라이언트로 응답을 보낼 수 있습니다. 이 중에서 end() 메소드는 응답을 모두 보냈다는 것을 의미하며, 일반적으로는 end() 메소드가 호출 될 때 클라이언트로 응답을 전송합니다. 이렇게 해서 클라이언트가 웹 서버에 요청을 보내고 응답을 받을 수 있는 기능을 만들어 보았습니다.

on( ) 메소드는 이벤트를 처리할 때 사용하는 가장 기본적인 메소드입니다. 이 메소드로 connection, request, close 이벤트를 처리할 수 있는 콜백 함수를 각각 등록해 두면 상황에 맞게 자동 호출됩니다. 클라이언트가 요청을 해 왔을 때 발생하는 request 이벤트를 처리할 수 있게 등록해 둔 콜백 함수에서는 res객체를 사용해서 클라이언트로 응답을 보냅니다. res 객체를 사용해서 응답을 보낼 때 사용하는 주요 메소드는 다음과 같습니다.

메소드

writeHead(statusCode [, statusMessage][, headers])
응답으로 보낼 헤더를 만듭니다.

write(chunk[, encoding][, callback]
응답 본문(body) 데이터를 만듭니다. 여러 번 호출될 수 있습니다.

end([data][, encoding][, callback])
클라이언트로 응답을 전송합니다. 파라미터에 데이터가 들어 있다면 이 데이터를 포함시켜 응답을 전송합니다. 클라이언트의 요청이 있을 때 한번은 호출되어야 응답을 보내며, 콜백 함수가 지정되면 응답이 전송된 후 콜백 함수가 호출됩니다.

const http = require('http');

const server = http.createServer( (req, res) => {
  console.log('클라이언트 요청');
  res.writeHead(200, {"Content-Type" : "text/html; charset=utf-8"});
  res.write("<!DOCTYPE html>");
  res.write("<html>");
  res.write("<head>");
  res.write("<title>응답 페이지</title>");
  res.write("</head>");
  res.write("<body>");
  res.write("<h1>노드제이에스로부터의 응답 페이지</h1>");
  res.write("</body>");
  res.write("</html>");
  res.end();
});

const port = 3000;
server.listen(port, () => {
  console.log('Server Running! : %d', port);
});

server.on('connection', (socket) => {
  const addr = socket.address();
  console.log('클라이언트 접속 : %s, %d', addr.address, addr.port);
});

server.on('request', (req, res) => {

});

server.on('close', () => {
  console.log('서버가 종료');
});

equest 이벤트를 사용해서 클라이언트로 응답을 보내지 않고 서버 객체를 만들 때 사용한 createserver() 메소드 호출 부분에 응답 코드를 바로 입력 할 수도 있습니다. 파일을 실행하면 이전 예제와 결과가 똑같이 나타납니다. 이 방법은 request 이벤트를 처리하는콜백함수에서 응답을 보내는것과 다르지 않습니다. 때에 따라서 이렇게 만들수도 있다는 것을 알아두세요.

클라이언트에서 요청이 있을 때 파일을 읽어 응답하기

첫째 장에서 fs 모듈로 파일을 다루는 방법을 알아 보았으니 이제 클라이언트의 요청이 들어왔을 때 파일을 읽고 응답하는 방법을 알아보겠습니다.

많은 도움이 되었습니다.
https://iamdaeyun.tistory.com/entry/do-it-NodeJS-4-1-%EC%9B%B9%EC%84%9C%EB%B2%84-%EB%A7%8C%EB%93%A4%EA%B8%B0?category=903566
이 링크의 게시물을 따라쓰며 개념을 정돈할 수 있었고, 앞으로 Nodejs로 프로젝트를 만들 때, 개념이 필요하면 두고두고 볼 수 있을 것 같습니다.
게시글 작성자님 감사합니당~! 문제될 시 내리겠습니당~!

profile
공부중

0개의 댓글