이번 TCP 멀티플레이어 게임을 만들어보는 강의를 따라해보면서 겪은 문제이다.
본 강의는 JS로 진행하지만 TS 경험을 쌓기 위해 TS를 사용해서 진행해보았다.
Data, End, Error 이벤트를 구분하고 바이트 배열을 분해해서
서버와 클라이언트 간에 데이터가 제대로 오고 가는지 확인하고 있었을때 문제가 생겼다.
TS랑 nodemon이랑 같이 사용하려면 package.json의 script 속성에
"script": {
"dev": "tsc && nodemon ./dist/server.js",
}
이렇게 사용해야 하는데
서버는 정상적으로 실행되고 클라이언트에서 서버로 값도 제대로 전달되지만
서버가 값을 전달받자마자 다시 재시작되는 현상이였다.
// 서버 콘솔 로그
[nodemon] starting `node ./dist/server.js`
server listening on 127.0.0.1:5555
Server is running on: { address: '127.0.0.1', family: 'IPv4', port: 5555 }
[nodemon] restarting due to changes...
[nodemon] restarting due to changes...
[nodemon] restarting due to changes...
[nodemon] restarting due to changes...
[nodemon] restarting due to changes...
[nodemon] restarting due to changes...
[nodemon] restarting due to changes...
[nodemon] restarting due to changes...
[nodemon] restarting due to changes...
[nodemon] restarting due to changes...
[nodemon] restarting due to changes...
[nodemon] starting `node ./dist/server.js`
server listening on 127.0.0.1:5555
Server is running on: { address: '127.0.0.1', family: 'IPv4', port: 5555 }
그래서 찾아봤는데
ts파일을 실행할때는 ts파일을 컴파일해서 js로 변환시킨 후 실행하게 되는데
nodemon이 ts파일을 컴파일할 때 dist의 js로 변환되는 부분을 수정으로 인식해
재시작이 되는 문제였다.
클라이언트도 같은 루트에 존재하기 때문에 클라이언트가 실행될때도 ts파일이 컴파일 되면서 이런 문제가 생기는 것 같다.
// nodemon.json
{
"watch": ["src/**/*.ts"],
"ext": "ts",
"exec": "tsc && node ./dist/server.js"
}
그래서 nodemon.json이라는
nodemon에 대해서 설정할 수 있는 파일을 만들어서
src 내부의 *.ts파일이 수정될 때만 재시작되도록 했다.
// 서버측 콘솔 로그
[nodemon] starting `tsc && node ./dist/server.js ./dist/server.js`
server listening on 127.0.0.1:5555
Server is running on: { address: '127.0.0.1', family: 'IPv4', port: 5555 }
Client connected from: 127.0.0.1:9799
length: 15, packetType: 0, packet: Hi, There!
// 클라이언트측 콘솔 로그
> multi-player-server@1.0.0 client
> tsc && node ./dist/client.js
Connected to server
정상적으로 동작하는 모습.
이후 .ts 파일이 수정되면 서버가 재시작되고 클라이언트의 접속이 끊어진다.
이건 자연스러운 현상으로 보인다.
근데 이 부분은 재연결 시도 등 개선할 수 있을 것 같다.