곧 시작할 팀 프로젝트에 앞서서 클라이언트 단도 간단하게 붙이고 싶어서
node 서버와 유니티 클라이언트의 연결 예제를 만들어 보며 연습하려고 했는데 한 차례 크게 막히는 부분이 생겨 트러블 슈팅으로 남기고자 한다.
이전에 이미 완성한 node express 백엔드 단을 바탕으로,
간단하게 api 호출할 수 있도록 유니티 클라이언트를 프로토타이핑하듯이 만드는 과정이었다.
문제는 연결이 잘 되어있고, 입력이 올바른 데에도 불구하고 계속해서 동일한 에러코드를 반환하는 것이었는데..
언제나 그렇듯이 서버단이든 클라이언트 단이든 로깅을 활용해서 에러를 추적해야한다!
모든 에러 가능성을 추적해 본 결과, 서버단에서 받은 req.body가 비어있음을 알 수 있었다.
아마, 정확한 원인은 클라이언트가 보낸 요청의 Content-Type과 서버의 설정이 일치하지 않았기 때문으로 보인다.
const app = express();
// JSON 데이터 파싱
app.use(express.json());
// URL-encoded 데이터 파싱
app.use(express.urlencoded({ extended: true }));
express.urlencoded()는 클라이언트가 URL-encoded 형식으로 데이터를 보냈을 때 이를 파싱하는 미들웨어로 Content-Type: application/x-www-form-urlencoded인 요청을 처리할 때 필요하다.
이런 식으로 서버 설정을 바꿔주거나,
아니면 주요한 이유로는,
익명 객체를 JSON으로 직렬화하는 경우 Unity의 JsonUtility가 제대로 동작하지 않기 때문에,
Unity에서는 System.Serializable 특성을 가진 클래스 사용하여 JsonUtility.ToJson 메서드로 JSON 직렬화를 해야 정상적으로 작동한다.