TIL - 220721(목)

Jason Moon·2022년 7월 21일
0

TIL

목록 보기
37/47

오늘 한 일

  • 프로젝트 알람기능 고민
  • 타입스크립트 공부
  • 자바스크립트 공부
  • 알고리즘 1문제 풀기

프로젝트에서 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를 난 모르는구나라는 걸 알게 됐고 공부하는 시간을 가졌다.

고민

알람 기능을 어떻게 구현할 것인가?

  1. 예약을 하면 예약 받는 사람에게 누가 예약을 언제 했다고 알람을 보낸다.
  • 프론트에서 예약한 사람, 예약 시간 정보 데이터를 socket을 통해 넘긴다.
  • 프론트에서 보낸 데이터를 백엔드에서 socket으로 예약 받은 사람에게 보내준다.
    (여기서 의문은 예약 받은 상대방이 들어와 있지 않다면? 굳이 socket을 이용해 실시간으로 알릴 필요가 있을까? 아니면 상대방이 접속해있는지 정보도 파악해서 접속해 있을 때만 실시간으로 전달하는게 나을까?) -> 상대방이 온라인인지 아닌지 부터 확인하고 온라인이라면 socket으로 데이터를 전송해준다.
    그럼 프론트는 예약 받은 유저에게 알람을 띄워주고 그 데이터를 언제까지 가지고 있어야하는가? 실시간 알람이라면 굳이 데이터를 DB에 저장할 필요가 있을까?
    예약을 받는 유저가 온라인이 아니라면 나중에라도 정보를 전달해야하기 때문에 DB에는 데이터를 저장해야한다.

내일은 우선 위 고민들을 코드를 짜면서 하나씩 테스트해 봐야겠다.

profile
어려워 보여도 시간을 들여서 해보면 누구나 할 수 있는 일이다

0개의 댓글