TIL

[멋사 부트캠프 TIL 회고] 03.20 ~ 03.22 오류 수정

Cadi 2025. 3. 22. 20:01

 

어제 오류를 말씀드렸더니 수정해주셨다. 

이를 바탕으로 또 테스트 해 보고, 오늘은 서버/메인 관련 코드를 손 볼 예정이다. 

 

목표

1. CurrentIndex 관련 오류 테스트

2. 회원가입 / 로그인 / 로그아웃 / 회원 정보 수정 등 작업 

 

 

01. CurrentIndex 관련 오류 테스트

여전히 실행되지 않는 모습이 보임, 디버깅으로 찍어볼 예정

 

깃허브 데스크탑에서 Update from main을 했는데 왜 안되었던건지 모르겠다.

정상 작동 한다. 

 

02. 서버 배포 시 , 동작 오류 문제. 

 

현재 서버에서 RequestMatch가 제대로 인식되지 않는 문제가 있음. 

GameManager.Instance.OnDelegate(() =>
{
    _multiplayManager.RequestMatch(18);
}, 1f);

 

로컬서버에서는 잘 작동하기 때문에 , 큰 이슈는 아닐 것이라고 생각했고 중간에 정상 작동하는 로그도 한 번 찍혀서

서버 연결문제라고 추측하고 서버 연결 속도가 원래 설정해놨던 대기 시간 ( 0.1초 ) 보다 길면 서버에 연결되기 전에 요청을 보내서 안되는 문제라고 판단. 서버 연결을 기다리는 시간을 늘려주었음 .

정상작동 !! 

그러나 이 방법도 불완전한 방법으로 콜백 함수를 사용하여 멀티플레이 매니저가 연결이 완료되면 실행하는 방식으로 할 예정. 

 

 

02. 회원가입 / 로그인 / 로그아웃 / 회원 정보 수정 등 작업 

 

 

현재 올바른 데이터를 주고받지 못하는 문제가 있었다. 

 

[System.Serializable]
public struct SigninResult
{
    public int result;
    public string userId;
    public string nickName;
    public int coin;
    public int win;
    public int draw;
    public int lose;
    public int grade;
    public int gradeScore;
    public int profileIndex;
}

 

클라이언트쪽에서 직렬화를 하지 않아서 발생했던 문제

 

서버에서는 세션이 제대로 동작하지 않는 문제

 

로컬서버에서는 제대로 동작하는데, HTTP 서버에 올리면 동작하지 않는 문제가 있었다. 

3가지 설정 때문에 발생했던 문제였다. 

 

1. 클라우드 서버에서는 세션 파일을 생성하기 힘든 문제. 

 

현재 session-file-store와 같은 모듈을 사용하여 요청이 들어오면 서버에 파일을 만들어 세션 정보를 저장한다.

그러나 이 방법은 로컬에서는 적합하지만, 클라우드 서버로 운영할 때 (특히 무료 버전에서는 )

Koyeb나 Vercel, Railway같은 서버리스 환경은 파일 기반 세션 저장이 근본적으로 불안정해서 발생하는 문제였다.

내가 사용하는 Render도 마찬가지의 환경이기 때문에 올바르게 세션을 저장하고, 사용하지 못했던 것이다. 

 

그래서 세션을 몽고DB에 새로운 파일을 만들어서 저장해 주었다. 

 

 

var MongoStore = require('connect-mongo');
app.use(cookieParser());
 
app.use(session({
  secret: process.env.SESSION_SECRET || 'session-login',
  resave: false,
  saveUninitialized: false,
  store: MongoStore.create({
    mongoUrl: databaseURL,
    ttl: 24 * 60 * 60,
    reapInterval: 60 * 60
  }),
  cookie: {
    httpOnly: false,
    secure: process.env.NODE_ENV === 'production',
    maxAge: 24 * 60 * 60 *  1000
  }
}));

 

2. 보안 문제 (프록시 문제 ) 

app.set('trust proxy', 1)

다음과 같은 코드가 필요했다.

대부분의 클라우드 서비스( Koyeb, Render 등) 은 "프록시 서버 뒤에서 Express 앱을실행한다 .

클라이언트 > 프록시(HTTPS) > 내부 express 앱(HTTP) 구조로 진행되게 되는데

Express 입장에서는 프록시 서버에서 요청을 보낸줄 알고 있기 때문에 쿠키를 보내지 않게 된다.

그래서 바꿔주어야 한다. 

 

 

* 추가적으로 쿠키 파서를 설치해줬다. 

 

 

로그인 오류 문제

 

분명 로컬 서버, 그리고 직접 했을 때는 로그인이 잘 되었는데, 다른 분이 하니까 안되서 계속 찾아봤다. 

잘...들어 왔는데 왜 안되지 ??? 하고 한 삼십분 고민했다. 

결국 DB를 까 보니, 비밀번호가 제대로 저장이 안되고 있었다. 

 var userId = req.body.userId;
        var userPassword = req.body.password;

서버쪽에서 비밀번호를 이렇게 받아 놓고

 

        const newUser = new users(req.body);
 

 

req에 있는 것으로 저장해서 생긴 문제였다. (둘이 변수명이 다름 )

 

        const newUser = new users({userId: userId, userPassword: userPassword});
 

 

바꿔주었다. 

 

 

leaveRoom이 제대로 동작하지 않는 문제 

 

 서버에 leaveRoom을 보낼 때도, 그렇지 못할 때도 있었다. 

 

분명 같은 코드로 실험을 하고 있는데, 다른 분은 안되던 상황에서 내가 될 때가 있어서 다음과 같이 예상하고 풀었다.

 

 

이것도 한참 찾다가 저번에 발생했던 문제랑 비슷한 문제라고 판단했다. 신호를 보내는 것과 Disconnect를 같은 프레임에 

실행하게 되면, 신호를 보내기 전에 (혹은 보냈다가 받기 전에 ) 서버와의 연결을 끊어버려서 정상적으로 동작할 때도, 그렇지 못할 때도 있는 상황이 발생한다. 이를 고쳐주었다. 

 

 

 

room을 삭제하는 문제

 

현재 서버 코드에서는 room을 따로 삭제하는 코드가 없어서, 언젠가 룸이 점차 쌓이게 된다면 문제가 발생할 것이라고 생각하고 공식 문서를 찾아봤다. 

 

https://socket.io/docs/v4/rooms/

 

Rooms | Socket.IO

A room is an arbitrary channel that sockets can join and leave. It can be used to broadcast events to a subset of clients:

socket.io

 

Room에 연결된 객체가 하나도 없다면, 자동으로 삭제하는 것 같다. 
(따로 teardown할 필요가 없다고 하는 것을 보니 ) 


짧아...보이지만 서버 수정만 7~8시간은 한 것 같다. 그래도 일단 실행되니 한 잔해 ~ 

 

 

번외 : 싱글톤 문제

 

현재 게임을 한 번 실행하고, 나가면 메인 패널에 있는 Button들이 다 missing이 되어 버려서 뭐가 문제인지 한참 찾았다. 

https://febelo0524.tistory.com/124

 

[멋쟁이사자처럼 부트캠프 TIL회고] 71일차 : 틱택토 빌드

오늘 배운 것1. 자투리 지식2. 틱택토 게임 빌드3. 버그 수정 1. 자투리 지식 Altlas여러개의 텍스쳐를 하나의 큰 텍스쳐로 합쳐서 관리하는 기술텍스쳐가 많아질수록, 드로우 콜 횟수가 증가하여

febelo0524.tistory.com

예전에 발생한 적 있던 클로저 문제인줄 알고 한참 찾았으나 , 아닌것 같아서 생각을 바꿔 보았다. 

 

게임 씬 자체에 게임매니저 함수가 있는 것도 아닌데 왜 추가된 게임 매니저 객체가 삭제되어서 문제가 발생할까 ? 라고만 생각했었는데 오히려 반대였다.  새로 추가된 게임 매니저 함수가 삭제되어서 문제가 발생했다. 

버튼들은 게임 매니저의 특정 함수를 받아 동작한다. 그런데 중요한 점은 그 객체에 있는 함수를 받아 동작한다는 것이다. 

그렇기 때문에 싱글톤으로 만든 객체가 하이얼아키 상에 존재하고, 처음에 누를 때는 정상 작동하지만 씬이 넘어갔다 왔을 때는 버튼들이 새로운 게임매니저 객체에 할당되어 있는데, 싱글톤의 코드 특성상 나중에 생긴 게임매니저 함수를 삭제하기 때문에 문제가 발생한 것이었다. 

 

그래서 테스트용 코드로 원래 있었던 것을 삭제하고 다시 실행했더니 된다. 다만 이렇게 하면 많은 정보들이 사라지기 때문에 그냥 패널컨트롤러를 하나 만들고 이에 할당하는 것이 맞는것 같다.