프로젝트에서 socket.io 부분을 class로 변경하는 작업을 했다. class로 바꿔주려했던 이유는 현재 socket.js 파일에서만 socket에 대한 작업을 해주고 있는데 실시간 알람 기능을 추가하기 위해 특정 이벤트가 다른 파일에서 발생했을 때 데이터를 socket에 연결된 클라이언트에게 바로 전달해주기 위해서이다.
class를 알고 있었다 생각했는데 가장 기본적인 new 연산자와 클래스 이름을 이용해 인스턴스를 생성하면 constructor가 자동 실행된다는 걸 제대로 알지 못하고 있었다.
그래서 아래와 같이 코드를 짰는데 클라이언트에서 서버에 연결하면 연결됐다는 콘솔이 찍히는 걸 보고 왜? 인스턴스 생성만 해줬는데 바로 연결이 되지? 라는 바보같은 질문을 하고 있었다.
server.js
const Http = require('http');
const app = require('./app');
const db = require('./models');
const { initSocket } = require('./dist/modules/socket');
const port = process.env.PORT;
const http = Http.createServer(app);
initSocket(http);
db.sequelize
.sync({ force: false, logging: false })
.then(() => console.log('🟢 db 연결 성공'))
.catch(console.error);
http.listen(port, () => {
console.log('🟢 서버 연결');
});
socket.js
const { Server } = require('socket.io');
const jwt = require('jsonwebtoken');
class Socket {
constructor(server) {
this.io = new Server(server, {
cors: {
origin: '*',
},
});
this.io.use((socket, next) => {
const token = socket.handshake.auth.token;
if (!token) {
return next(new Error('Authentication error'));
}
jwt.verify(token, process.env.SECRET_KEY, (error, decoded) => {
if (error) {
return next(new Error('Authentication error'));
}
next();
});
});
this.io.on('connection', (socket) => {
console.log('연결됐습니다!');
});
}
}
let socket;
function initSocket(server) {
if (!socket) {
socket = new Socket(server);
}
}
덕분에 class를 난 모르는구나라는 걸 알게 됐고 공부하는 시간을 가졌다.
알람 기능을 어떻게 구현할 것인가?
내일은 우선 위 고민들을 코드를 짜면서 하나씩 테스트해 봐야겠다.