개발일지/TIL(Today I Learned)74 2025-01-14 <트러블 슈팅> - 게임 종료 및 세션 삭제 구현하기 내일배움캠프 Node.js 트랙 54일차 - 게임 종료 및 세션 삭제 구현하기게임이 정상적으로 종료되지 않던 문제 유니티 에디터를 통해서 실행을 종료할 때, 클라이언트 연결이 정상적으로 종료되지 않던 문제가 있었다. 위 에러 메시지는 종료가 제대로 이루어지지 않아서 소켓 오류가 났다는 것인데... 사실 이런 에러가 나는 건 어쩔 수 없는 부분이긴 했다.(오류가 나면 에러 메시지를 뱉게끔 코드를 짰기 때문에)다만, 종료 이후에 이루어져야 할 로직들(세션에서 유저 삭제, 유저 세션에서 삭제 등등…)이 에러로 인해 실행되지 않는 게 문제였다. 에러 메시지는 그대로 두되, 그 외의 작동이 정상적으로 수행될 순 없는 걸까. 고민을 좀 해보다가 종료 방식을 바꿔보기로 결정했다.TCP 연결 종료 방식 변경그래서 Di.. 개발일지/TIL(Today I Learned) 2025. 1. 14. 2025-01-13 <네트워크 WRAP-UP과 중앙처리장치(CPU)> 내일배움캠프 Node.js 트랙 53일차네트워크 WRAP-UP전송계층 프로토콜전송 계층은 네트워크 계층과 응용 계층 사이에 존재하는 통신 계층입니다. 기존에 네트워크 계층의 프로토콜이 가지고 있던 약점을 보완해 주기도 하고, 또 응용계층의 하위 계층으로서 그 기반 역할을 수행합니다. 여기서 네트워크 계층이 가진 한계가 무엇이냐 하면, 최선형 전달 방식에 비연결 지향 통신이라고 말할 수 있겠습니다. 말 그대로 최선을 다해서 호스트에서 호스트까지 패킷을 전송은 하지만 어플리케이션 레벨에서 정말로 패킷이 전송 되었는지는 보장하지 않습니다. 중간에 패킷이 손실되거나 잘못 전송되어도 이를 확인하거나 복구할 기능이 포함되어 있지 않습니다. 물론 이런 방식이 마냥 나쁜 것만은 아닙니다. 동영상 스트리밍처럼 때론 신뢰.. 개발일지/TIL(Today I Learned) 2025. 1. 13. 2025-01-10 <추측항법을 어떻게 구현할까? (2)> 내일배움캠프 Node.js 트랙 52일차추측항법을 어떻게 구현할까? (2)지난 8일 TIL에서 이미 추측항법에 대해 작성한 바 있지만, 프로젝트를 계속 진행해본 중에 조금 더 많은 고민거리가 생겨났다. 처음 코드를 작성했을 땐 싱글 플레이라서 하나의 클라이언트만 고려하면 됐지만 멀티 플레이 기능을 추가한 이후론 동기화 방식이 더 자연스러웠으면 좋겠다는 희망사항이 생겼기 때문이다. 충돌 로직까지 서버에서 구현하기로 결심한 이상, 동기화 문제를 당장에 해결하는 건 요원해 보인다. 그래도 관련된 정보를 정리하며 차근차근 구현을 해볼까 한다.(이하 내용은 배현직 저자의 에서 참고하였다.)게임 플레이 네트워킹서버 - 클라이언트 간 네트워킹 방식엔 크게 두 종류가 있다. 모든 로직을 서버가 도맡는 방식과 렌더링을 .. 개발일지/TIL(Today I Learned) 2025. 1. 10. 2025-01-09 <스트림이란 무엇일까> 내일배움캠프 Node.js 트랙 51일차스트림이란 무엇일까부트캠프 튜터님과 이야기하던 중, 이런 질문을 받게 되었다."TCP는 데이터를 통째로 보내나요?"나는 배운대로 답을 했다."아니요. 스트림 형식으로 보낸다고 알고 있습니다."그러자 튜터님은 또다시 질문하셨다."스트림 형식이 뭔데요?" 말문이 턱 막혔다. TCP가 스트림 소켓이란 건 앞서 소켓 프로그래밍을 공부하며 알게 되었지만, 정확히 스트림 형식이란 게 뭔지 몰랐기 때문이다.이걸 아직도 알아볼 생각을 안 하고 있었다니 스스로 놀랍고 당혹스러웠다. 이렇게 된 김에 오늘 TIL에는 스트림 형식에 대해 적어볼까 한다. 이제부터 작성할 정보는 최근에 구입한 책 에서 발췌한 내용들이다.스트림 형식스트림이란 데이터의 흐름이다. TCP 프로토콜이 연결 지향이.. 개발일지/TIL(Today I Learned) 2025. 1. 9. 2025-01-08 <추측항법을 어떻게 구현할까?> 내일배움캠프 Node.js 트랙 50일차추측항법을 어떻게 구현할까?레이턴시레이턴시란 한 지점에서 다른 지점으로 이동하는 데 걸리는 시간을 의미한다.게임 서버를 예로 들어보자. 클라이언트가 본인의 위치를 서버로 보내어 동기화를 시도할 때, 레이턴시가 길어진다면 어떨까. 아마 게임 속 캐릭터가 뚝뚝 끊기면서 이동하게 될 테고 사용자 경험은 곤두박질칠 것이다.추측항법추측항법의 기본 원리는 현재 상태를 바탕으로 미래 상태를 예측하는 것이다. 이를 테면, 서버가 클라이언트의 레이턴시가 100ms 인 상황에서 속도가 v인 오브젝트의 미래를 예측하여 클라이언트에게 미리 공지하는 것이다. 거리 = 속도 x 시간이므로, 다음과 같은 정보가 필요하다.초기 위치 (Initial Position): 계산의 시작점이 되는 위치.. 개발일지/TIL(Today I Learned) 2025. 1. 8. 2025-01-07 <라디안과 삼각함수를 이용해 게임 로직 구현하기> 내일배움캠프 Node.js 트랙 49일차라디안과 삼각함수라디안우리는 각도에 대해 얘기할 때 호도법보다는 육십분법을 많이 사용한다. 여기서 육십분법이란 우리가 흔히 사용하는 직각을 90도로 정의하는 방식을 말한다. 그러나 각도를 다른 방식(보다 수학적으로)으로 나타내는 방법도 있는데 그것이 바로 고등학교 때 배우는 호도법이다.호도법호도법은 호의 길이를 통해 각도를 나타내는 방식이다. 왜 하필 호의 길이인가 의문이 들 수 있는데, 이는 부채꼴에서 호의 길이가 중심각에 비례하기 때문이다. 그렇다면 호의 길이는 어떻게 구할까. 원의 둘레를 구하는 공식을 기억하고 있다면 어렵지 않게 추론할 수 있다. 알다시피 원의 둘레는 2πR로 구할 수 있다. R(원의 반지름)이야 어찌됐건 우리가 주목해야 할 점은, 부채꼴의 .. 개발일지/TIL(Today I Learned) 2025. 1. 7. 2025-01-06 <프로토콜 버퍼를 이용한 TCP 서버 통신> 내일배움캠프 Node.js 트랙 48일차프로토콜 버퍼를 이용한 TCP 서버 통신직렬화와 역직렬화웹소켓을 통해 게임서버를 만들 때부터, 우리는 클라이언트와 서버 간에 패킷을 주고받았다. 아래는 이번 프로젝트에서 사용하게 될 공통 패킷 구조이다. 프로토버프 구조(요청/응답)필드 명타입설명handlerIduint32핸들러 ID (4바이트)userIdstring유저 ID (UUID)versionstring클라이언트 버전 (문자열)payloadbytes실제 데이터 필드 명타입설명handlerIduint32핸들러 IDresponseCodeuint32응답 코드 (성공: 0, 실패: 에러 코드)timestampint64메시지 생성 타임스탬프 (Unix 타임스탬프)databytes실제 응답 데이터 (선택적 필드) 이니셜.. 개발일지/TIL(Today I Learned) 2025. 1. 6. 2025-01-03 내일배움캠프 Node.js 트랙 47일차Node.js와 소켓 프로그래밍net 모듈지난 TIL에서는 소켓이 무엇인지, 소켓의 종류에는 무엇이 있는지, 그리고 소켓 통신은 어떻게 이루어지는지 살펴보았다. 특히 KOCW 강의 자료를 참고하여 C언어 기반으로 쓰여진 코드들을 살펴봤는데, 모듈의 천국인 Node.js로 눈을 돌린다면 훨씬 쉬운 방식으로 TCP 서버를 여는 것이 가능하다. 그 역할을 해주는 것이 바로 net 모듈이다. Node.js의 net 모듈은 TCP(Transmission Control Protocol) 및 IPC(Inter-Process Communication) 기반의 네트워크 애플리케이션을 생성하기 위해 제공되는 내장 모듈이다. 이 모듈을 사용하면 저수준의 네트워크 통신을 손쉽게 처리할 .. 개발일지/TIL(Today I Learned) 2025. 1. 3. 2025-01-02 <응용 계층에 대하여(1)> 내일배움캠프 Node.js 트랙 46일차소켓 프로그래밍소켓이란?소켓은 애플리케이션과 네트워크 사이의 인터페이스(연결부) 역할을 한다.(인터페이스: 서로 다른 두 개의 시스템, 장치 사이에서 정보나 신호를 주고받는 접점이나 경계면) 애플리케이션은 소켓을 생성하고, 소켓의 타입에 의해 소통 방식이 결정된다.(reliable vs. best effort / connection-oriented vs. connectionless) 처음 소켓이 설정되면, 애플리케이션은 네트워크 통신을 위해 데이터를 소켓으로 통과시킬 수 있게 된다. 이런 과정을 거쳐, 다른 호스트가 보낸 데이터를 소켓을 통해 전달 받게 되는 것이다. (여담 : 애플리케이션 계층에서 소켓 통신을 하는 이유는 전송 계층의 프로토콜에 따라야 하기 때문이.. 개발일지/TIL(Today I Learned) 2025. 1. 2. 2024-12-31 개발일지/TIL(Today I Learned) 2024. 12. 31. 2024-12-30 내일배움캠프 Node.js 트랙 45일차git 폴더, 파일명 변경하기이 글에선 우리 팀에서 실제로 일어났던 이슈와 그에 대한 해결책에 대해 적어보려고 한다. 저번 주, 우리 팀원 중 한 분이 원격 저장소에 이미 업로드되었던 Socket.js라는 파일의 이름을 socket.js로 변경했다가 무한 커밋의 굴레에 빠지게 되셨다. 각종 깃헙 프로그램, 플러그인들이 socket.js를 커밋하던 순간 Socket.js에 변동사항이 있다며 재차 커밋을 하라고 요구하기 시작했다. 이후 dev를 통해 pr을 시작하자 무한 커밋의 굴레는 모든 팀원에게 바이러스처럼 퍼지기 시작했다. 이와 비슷한 일을 겪었던 내 짧은 식견으론 아래와 같은 명령어를 시도해보는 게 최선이었다.git rm --cached 해당 명령어는 원격 저.. 개발일지/TIL(Today I Learned) 2024. 12. 30. 2024-12-27 내일배움캠프 Node.js 트랙 44일차몬스터 경로 생성하기타워 디펜스 게임에서 매 라운드마다 몬스터의 공격로를 랜덤하게 생성하고 싶다면 어떻게 코드를 작성해야 할까?어쩌면 미리 맵을 생성하는 방식이 있을 것이고, 좌표로 위아래로 랜덤하게 이동하게 만드는 방식도 있을 것이다.그런데 만약 게임을 그리드로 나누어서 영역에 따라 경로가 이어져야한다면 어떻게 생성하는 게 가장 효율적일까? 꼬불꼬불한 공격로를 생성하면서도 중복되지 않고 일정 길이를 가지길 바란다면? 위와 같은 고민을 하던 중, 같은 트랙을 듣던 어느 재야의 고수로부터 랜덤 워크 이론으로 작성된 코드를 전수 받게 되었다.랜덤 워크 이론이란?랜덤 워크 이론이란 주어진 공간에서 매 순간 랜덤으로, 즉 확률적으로 이동하는 모습을 수학적으로 표현한 것이다.. 개발일지/TIL(Today I Learned) 2024. 12. 27. 이전 1 2 3 4 ··· 7 다음