[express] app.listen 과 server.listen의 차이점

yoxxin·2022년 1월 16일
7

express

목록 보기
5/5

1. 어떤 점이 다를까?

express를 처음 배울때, 서버를 시작할때는 이렇게 코드를 작성했다.

app.listen으로 바로 서버를 실행가능하다.

const express = require('express');
const app = express();
...
app.listen(8080);

그런데 유튜브에서 바닐라 자바스크립트 채팅앱 클론코딩을 하던 도중 다음과 같은 코드를 작성했다.

위 코드와는 다르게,

expresshttp모듈에 담아서 서버를 생성한다.

const express = require('express');
const http = require('http');
const app = express();
const server = http.createServer(app);

server.listen(8080)

둘 다 직접 실행해봤지만 별 차이가 없었다. 똑같아 보였다

그러던중..

https://stackoverflow.com/questions/17696801/express-js-app-listen-vs-server-listen 에서

정답을 찾을 수 있었는데,

app.listen = function(){
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};

app.listen()내부에서 http모듈로 감싸서 return 해주고 있었다.

Doit Nodejs 프로그래밍 책에서는 반드시 http모듈을 감싸주어야 한다고 되어있는 걸 보면,

나중에 app.listen 메소드를 업데이트 했나보다.

2. 유의할 점: http 인스턴스를 사용해야 할 때

Socket.io를 사용할때 (소켓통신)

보통 소켓 통신을 할때, socket.io 모듈을 설치해서 사용한다.

socket.io는 http 인스턴스를 이용해서 서버를 실행한다.

즉, socket 서버모듈은 http 서버 위에서 동작한다.

코드는 다음과 같다.

const express = require("express");
const http = require("http"); // node 기본모듈
const app = express();
const server = http.createServer(app);
const socketIO = require("socket.io");

const PORT = process.env.PORT || 3000;

const io = socketIO(server); // socket 서버 실행

io.on("connection", (socket) => {
  console.log('클라이언트와 socket 연결되었습니다.');
});

server.listen(PORT, () => console.log(`server is running ${PORT}`));

const io = socketIO(server) 처럼,

http instance인 server를 이용해서 소켓서버를 실행해야 한다.

다음 코드는 에러가 나는 경우이다.

const io = socketIO(app) // error: express 인스턴스

즉, 이처럼 http 인스턴스를 써야하는 경우가 있다.

3. 난 app.listen 만 쓰고싶어!

위 소켓연결예시, 또는 그 외에 http 인스턴스를 사용해야 하는 경우에도

express를 활용한 app.listen만 쓰고싶은 사람이 있을 수 있다.

내가 그랬다.

app.listen을 다시보자.

app.listen = function(){
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};

어차피 내부적으로 http 인스턴스를 return하기 때문에, 이것을 이용하면 된다.

const express = require("express");
// const http = require("http"); 
const app = express();
// const server = http.createServer(app);
const socketIO = require("socket.io");

const PORT = process.env.PORT || 3000;

// http 서버실행
// server == http instance
const server = app.listen(PORT, () => console.log(`server is running ${PORT}`));

// socket 서버실행
const io = socketIO(server); // socket 서버 실행
io.on("connection", (socket) => {
  console.log('클라이언트와 socket 연결되었습니다.');
});

app.listenreturn값을 server로 받은 뒤,

server를 이용해 socket 서버를 실행한다.

결론

app.listen내부적으로 http모듈을 쓰기 때문에,

두 방법은 결국 같다.

2개의 댓글

comment-user-thumbnail
2022년 6월 14일

좋은 정보 감사합니다

답글 달기
comment-user-thumbnail
2022년 6월 21일

천재신가요... 워후

답글 달기