express를 처음 배울때, 서버를 시작할때는 이렇게 코드를 작성했다.
app.listen으로 바로 서버를 실행가능하다.
const express = require('express');
const app = express();
...
app.listen(8080);
그런데 유튜브에서 바닐라 자바스크립트 채팅앱 클론코딩을 하던 도중 다음과 같은 코드를 작성했다.
위 코드와는 다르게,
express를 http모듈에 담아서 서버를 생성한다.
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 메소드를 업데이트 했나보다.
보통 소켓 통신을 할때, 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 인스턴스를 써야하는 경우가 있다.
위 소켓연결예시, 또는 그 외에 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.listen 의 return값을 server로 받은 뒤,
이 server를 이용해 socket 서버를 실행한다.
app.listen내부적으로 http모듈을 쓰기 때문에,
두 방법은 결국 같다.
좋은 정보 감사합니다