TIL

내일배움캠프 7주차 수요일 TIL

news0516 2024. 12. 11. 21:20

강의 내용 정리


[게임서버개발 심화] 5. 서버 로직 개발

1. 데이터 테이블 로드
import loadGameAssets from './init/assets.js'; 이렇게 임포트했을때는,
./init/assets.js 모듈에서 default로 내보내는(export) 항목이 없다는 오류가 발생하였다

이 문제를 해결하려면 ./init/assets.js의  loadGameAssets 함수가 default로 내보내야 한다.

const loadGameAssets = async () => {
  // 함수 내용
};

export default loadGameAssets; // default로 내보내기


혹은 임포트문을 이렇게 수정한다.

import { loadGameAssets } from './init/assets.js';


Default Export로 함수를 내보낸 경우 : 모듈당 하나만 존재하며, import 시 {} 없이 직접 가져옵니다.
>> 모듈에서 하나의 기본 값을 내보낼 때 사용, 원하는 이름으로 import 가능
Named Export로 (강의 내 코드, 현재 내 코드) 함수를 내보낸 경우: 여러 개가 가능하며, import 시 {}를 사용하여 특정 항목을 선택적으로 가져옵니다.
>> 모듈에서 여러개의 값을 내보낼 수 있으며, 가져올 때는 내보낸 이름과 일치해야 import 가능(중괄호 사용)

2.  유저 접속 관리

유저 접속 시 서버가 받는 데이터


양방향 통신의 기본은 소켓
- 소켓 id는  각 소켓의 고유 식별자로 사용
- 고유한 값인 소켓 id를 통해  각 클라이언트의 연결 상태를 구분, 관리하는 것이 중요

핸들러( 이벤트를 처리하는 함수 ) 생성 - 유저 관리를 위해 register.handler.js 생성 > 각종 핸들러를 서버에 등록하는 함수|
register.handler.js에 registerHandler 함수를 선언
socket.js에서 registerHandler호출

유저가 접속하면 정보를 저장하기도 하고 삭제하기도 해야하니 데이터의 CRUD와 관련된 메서드 및 함수는 ‘model’ 이라는 이름으로 관리

register.handler.js 에 addUser 함수를 호출해 유저의 정보를 저장

handlers 폴더 안에 helper.js 파일을 생성 - 컨텐츠 외에 필수 이벤트 처리 핸들러들이 선언될 파일
방금전에 만들었던 removeUser 함수를 호출해준 뒤 현재 남은 유저 확인을 위해 콘솔에 getUser() 함수를 호출해서 로그에 남겨준다

>> 파일 및 폴더 구조 개요
handles
helper.js: 사용자 연결 해제 시 처리 로직을 담고 있다. (user.model.js에서 사용자 조회, 삭제 함수 import)
register.handler.js: 사용자의 소켓 연결 대기, 연결 시 로직을 담고 있다. (user.model.js에서 사용자 등록 함수 import)

init 서버 초기화 및 자산 로딩 관련 파일을 포함
assets.js: assets을 비동기적으로 로드하는 기능을 제공합니다.
socket.js: Socket.IO 서버를 초기화하고 클라이언트로 부터 오는 이벤트를 처리할 핸들러 등록

models 사용자 데이터 모델을 관리합니다.
user.model.js: 사용자 추가, 삭제 및 조회 기능을 제공합니다.

app.js: 서버를 시작하고 초기화하는 역할을 합니다.


소켓 서버 초기화 (socket.js):
initSocket 함수가 서버 인스턴스를 받아 Socket.IO 서버를 초기화
이곳에서 registerHandler를 호출하여 클라이언트의 연결 이벤트를 처리할 핸들러를 등록합니다.

사용자 등록 및 연결 처리 (register.handler.js)
클라이언트가 소켓 서버에 연결되면 registerHandler가 호출
새로운 UUID가 생성되고, 사용자의 소켓 ID와 함께 addUser 함수를 통해 사용자 목록에 추가
사용자가 연결을 끊을 경우 handleDisconnect 함수가 호출되어 해당 사용자가 목록에서 제거됩니다.

사용자 관리 (user.model.js)
addUser, removeUser, getUsers 함수는 사용자 목록을 관리
addUser는 새로운 사용자를 배열에 추가하고, removeUser는 소켓 ID를 기반으로 사용자를 삭제
getUsers는 현재 연결된 사용자 목록을 반환

연결 해제 처리 (helper.js)
handleDisconnect 함수는 사용자가 연결을 끊을 때 호출
해당 소켓 ID를 사용하여 사용자를 삭제하고, 현재 연결된 사용자 목록을 콘솔에 출력합니다.

assets 로딩 (assets.js):
loadGameAssets 함수는 비동기적으로 assets(스테이지, 아이템 등)을 JSON 파일에서 읽어와 gameAssets 객체에 저장
getGameAssets 함수는 현재 로드된 assets을 반환

여기까지 흐름을 보자면..
클라이언트가 서버에 연결하면, registerHandler가 호출되어 사용자 등록 >
사용자가 연결을 끊으면 handleDisconnect가 호출되어 해당 사용자가 목록에서 제거 >
assets 은 서버가 시작될 때 loadGameAssets를 통해 로드, 필요할 때 getGameAssets를 통해 접근