Javascript

Node.js - http모듈로 서버 만들기

http 모듈로 서버 생성하기

const http = require('http'); // http 모듈 불러오기

const hostname = '127.0.0.1'; // 서버의 주소는 호스트 네임이라 한다.
const port = 3000; // 서버의 여러 포트 중 3000번을 열어서 클라이언트와 통신

// http의 createServer 메서드로 서버 객체 생성
// createServer에 전달되는 콜백함수는 클라이언트가 접속했을 때 동작함
const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World\n'); // end 메서드를 통해 문자열을 클라이언트에 전송
});

// server의 listen 메서드는 서버를 요청 대기 상태로 만들어 줌
// 서버는 클라이언트의 요청을 받기 위해서 종료하지 않고 계속 대기 함
// listen 함수는 포트, 호스트네임, 콜백함수를 파라미터로 받음
// 여기서 콜백은 listen 메서드가 완료되면 동작하는 함수
server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

로컬 서버, 포트 3000번에 서버를 생성했다.

 

http 요청으로 확인하려면 터미널에서 아래 명령어 입력

curl -X GET 'localhost:3000'

Hello World 가 출력되는 것을 확인할 수 있다.

 

서버의 주소를 호스트네임이라고 합니다. 서버의 여러 포트중 3000번 포트를 통해 클라이언트와 통신합니다. 요청대기상태: 서버가 클라이언트의 요청을 받을수 있게 종료하기 않고 계속 대기하도록 하는 함수. listen() 함수로 동작합니다.

 

단, 이렇게 만든 서버는 root 경로에만 접속이 가능하다.

사용자가 자신의 요청에 따라 다른 경로로 접속할 수 있도록 라우팅을 추가해줘야 한다.

 

라우팅 추가하기

유저의 접속하는 url을 알고자 한다면 req 객체를 확인하면 된다.

const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  console.log(req.url);
  if (req.url === '/'){
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Hello World\\n');
  } else {
    res.statusCode = 404;
    res.end('Not Found\\n');
  }
});

console.log(typeof server)

server.listen(port, hostname, () => {
  console.log(`Server running at <http://$>{hostname}:${port}/`);
});

url 에 따라 다른 응답을 하도록 createServer의 콜백 함수를 수정했다.

 

서버에 http 요청을 하게 되면 url에 따라 다른 응답을 받을 수 있다. 만약 응답을 좀 더 상세히 보고 싶다면 -v 옵션을 추가해주면 된다.

curl -X GET 'localhost:3000/users' -v

 

유효하지 않은 경로에 접속한 결과는 아래와 같다.

*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 3000 (#0)
> GET /users HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.64.1
> Accept: */*
> 
< HTTP/1.1 404 Not Found
< Date: Thu, 25 Nov 2021 21:17:43 GMT
< Connection: keep-alive
< Keep-Alive: timeout=5
< Content-Length: 10
< 
Not Found
* Connection #0 to host localhost left intact
* Closing connection 0

단, 이렇게 경로에 따라 분기문을 추가한다면 중복 코드가 많아지고, 코드가 길어짐에 따라 관리하기도 어렵다.

 

다음 포스팅에서는 express 프레임워크를 활용해보자.

 

 

'Javascript' 카테고리의 다른 글

map()과 forEach()차이  (0) 2022.01.07
Node.js - Express로 서버 만들기  (0) 2021.12.14
Node.js - 모듈/동기/비동기  (0) 2021.12.14
코어 자바스크립트 - 클래스  (0) 2021.11.18
코어 자바스크립트 - 프로토 타입  (0) 2021.11.18