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모듈을 쓰기 때문에,
두 방법은 결국 같다.
좋은 정보 감사합니다