-
[리팩토링] socket.js 코드 분리하기Project 2021. 8. 5. 01:49
socket.js 코드 좀 깔끔하게 만들고싶은것이 내 숙원이었음..
한 두달 전에 짜 놓은 코드는 socke.io 문서 읽어가며 어영부영 작동시키느라 바빴지만
이번엔 잘 이해해서 좀 읽기 좋게 만들어보고싶었다. 인강과 몇번의 뻘짓으로 드디어 끝냈다.
해냇따구?
socket.js에 무더기로 쌓인 코드 처리하기
이전의 코드는 이런식으로 실행이 됐다.
- app.js에서 app object을 이용해 server listen 실행
- server listen하는 코드는 ` server ` 라는 변수명에 저장
- socket.io를 require하여 app.js 내에서 ` server `를 인자로 사용해서 실행
- socket.js는 인자로 받은 server를 통해 동작
여기서 socket.js의 코드는, socket.io 실행, 설정, 로직이 모두 한 모듈에 뭉태기로 붙어있어서 가독성이 낮았다.
겸사겸사 이전에 잘못 쓴 코드도 눈에 보여서 필요 없는 코드는 삭제하면서 작업을 했다.
현재 코드는 이렇게 실행이 된다.
- app.js에서 서버 listen하는 코드를 분리했다. (server.js)
- 이렇게 해서 app.js에서는 바로 실행 되는 코드가 없게된다. 무조건 server.js를 통해 서버가 켜져야지만 app.js가 실행되게된다.
- server.js에서 http listen 뿐 아니라, socket.js도 require하여 sever.js가 켜지면서 socket.js도 실행된다.
- 이렇게 실행과 로직을 위한 코드를 분리했다.
- 기존에 app object로 실행하던 서버를 http모듈로 실행시키도록 변경하였다.
- 기존엔 app.listen()으로 http.server.listen()을 하였지만 server.js에서 listen하는 부분을 따로 변수에 저장하지 않고 진행해보려고 하다보니, socket.js에서 필요한 서버 인스턴스를 제공할 수 없었고.. 그래서 http 모듈을 사용해서 socket.js에서 서버 인스턴스를 제공했다. 근데 굳이 이럴 필요가 있었던건가? aㅏ..
-
// server.js const http = require("./app"); const port = process.env.EXPRESS_PORT; const dotenv = require("dotenv"); dotenv.config(); require("./socket"); http.listen(port, () => { console.log(`Server start at http://localhost:${port}`); });
- socket.js의 코드를 ` initSocket() `과 ` io.on ` 로 분리해 initSocket에서 로직 처리, io.on에서 해당하는 이벤트 발생 시 실행
- initSocket()은 소켓의 로직을 담당한다. 세가지의 function으로 구성되어있다. 각각 필요한 로직에 대한 함수를 가진 object를 리턴하는 함수이다.
- watchEvnet : 클라이언트에게서 온 socket.on 에 대해 처리
- notifyToChat : chat nameSpace 에 대한 emit 처리
- notifyToGlobal : global nameSpace 에 대한 emit 처리
- 클라이언트에게서 수신한 메세지는 어차피 connection 된 nameSpace의 것만 받아오는데, emit하는 메세지는 그게 안되는 모양.. 그래서 따로 function을 작성해주었다.
- io.on()은 nameSpace별로 분류한다.
-
// 앞의 코드 생략 const chatSpace = io.of("/chat"); const globalSpace = io.of("/global"); chatSpace.on("connection", (socket) => { const { watchJoin, watchSend, watchByebye } = initSocket(socket); watchJoin(); watchSend(); watchByebye(); }); globalSpace.on("connection", (socket) => { const { watchGlobal } = initSocket(socket); watchGlobal(); }); // initSocket 생략
- initSocket()은 소켓의 로직을 담당한다. 세가지의 function으로 구성되어있다. 각각 필요한 로직에 대한 함수를 가진 object를 리턴하는 함수이다.
socket.js 코드가 너무 뭉탱이어서 항상 어떻게든 리팩토링을 하고싶었는데,
드디어 깔끔해진 코드를 보니 행벅하다..
이 버전의 코드 전문은 이 링크에 있습니다.
'Project' 카테고리의 다른 글
크리스마스 해커톤 후기 (0) 2021.12.28 테스트코드 작성하기 (2) 2021.08.08 [리팩토링] 챗봇 추가하기 (4) 2021.07.25 [리팩토링] 유저 가입 코드 수정 (0) 2021.07.15 [OKU] 유효성 검사는 어디에서 발생하는가? (0) 2021.07.02