개발자로/MinecraftMod

ProccupationWar #008, @minecraft/server-net

ReasonyB 2024. 11. 25. 18:30

우여곡절이 있었지만 일단 서버에 적용시키는 것까지 확인을 했다. server-net 모듈과 server-admin의 경우 클라이언트용(서버로 따지면 리슨 서버)에서는 사용을 하지말라고 빨간 섹션으로 표기를 해놨다. 더더군다나, typescript로 npm run <task> 중 build와 local-deploy는 명령어 단계 자체에서 거부당한다. server-net 모듈을 임포트하는 과정에서 모르는 모듈이라 불가능 하다고 표기가 되었다.

> 그래도 해결은 가능하다. BP에서 script를 활용하는 경우, typescript로 작성하더라도 main.js 하나로 작동하게 된다. 모든 내용이 링크된 파일 하나로 만들어사 작동시키는 듯 하다. 때문에 npm run build를 거치면 모르는 모듈이라고 에러 코드를 띄울지언정 lib 폴더에 링크된 main.js 파일을 생성하긴 한다. 이 파일 내역을 서버 폴더 안 해당하는 BP 안 script 폴더에 복붙하면 실행이 가능하다.

 

다음은 HttpRequest 예제를 작성하여 scriptevent로 테스트 해보았을 때이다. 사용이 잘못되었던 아니었던 일단 handle이 없어서 발생하였다는 문제인듯 하다. 그래서 그건 어떻게 하는건데...


minecraft/server-net.HttpRequest Class | Microsoft Learn

 

minecraft/server-net.HttpRequest Class

Contents of the @minecraft/server-net.HttpRequest class.

learn.microsoft.com

위의 코드는 예시 과정을 따라 하며 실제로 작성한 코드이다. 가장 기본적인 내용부터 체크하고자 하는 목적으로 작성되었기에 문제가 많다. 일단 handler를 어떤 방식으로 작성해야하는지를 고민하였다. Request 객체가 요청에 관련된 내용이고 Handler가 실행이후의 내용에 대해 처리하는 내용이라면, 마지막 줄의 http.request에 답이 있을 것 같았다.

@minecraft/server-net 모듈의 끝 내용에는 고유 명사처럼 사용하는 http 객체가 HttpClient 타입이라는 내용을 확인할 수 있었다. HttpClinet 클래스의 request 함수는 promise라는 자료형의 값을 반환하는데, js나 ts는 따로 공부한 적이 없어서 알지 못했다. 검색의 결과로 비동기 함수를 위한 상태를 저장하는 값이라는 것과 함께, then함수의 존재까지 알 수 있었다.

 

결과적으로 http.request(req).then(() =>{});같은 방식으로 작성하면 될 듯 싶다.


 

내용이 달라지긴 했지만, 오류를 해결하는데 있어 handler 문제는 아니었던 것 같다. 처음 스크립트를 작성할 때만 해도, Method 값에 대해 문제가 좀 있어서 직접적으로 수정하기 보다는 클래스에서 제공하는 함수를 활용해 수정하고 나서 뜬 에러 코드가 맨 처음 캡쳐본이었다. 일단 최소한의 Handler를 작성하였음에도 비슷한 소리를 한다는 것은 내가 말귀를 못 알아먹었거나, 일부 해결은 했지만 다른 문제가 많기 때문일 것이다.


고민을 해본 결과 문제를 크게 한두가지로 좁힐 수 있을 것 같다.

1. server-net에서 제공하는 http 연결이 BDS(Bedrock Dedicated Server)과 Client 간의 통신이 아닌 BDS와 로컬 혹은 공적인 WAS 간의 통신이기에 구조적인 문제가 발생하고 있는데 파악을 못하고 있는 것이다.

  <근거>

   > RequestMethod의 종류는 GET, POST, DELETE, PUT 등이 있다. 이들은 모두 과거 잠깐 공부했던 웹프로그래밍과 벡엔드 프로그래밍에서 잠깐 배웠던 데이터 처리에 관용적으로 사용하는 이름이다.

2. 그냥 단순히 디버깅을 잘 못하고 있는것이다.

  <근거>

     > server-net에서 server-admin 모듈이 임포트된다. 이 server-admin의 예제에서 다루는 값들과 형태는 얕게 배웠던 웹프 지식에 기반한 웹서버 내용의 데이터 처리보단 게임 처리에 좀 더 가까운 느낌이다. 

 

server-admin에서 다루는 secret과 variable이 어떤 식으로 작동하는지에 대해 알아야지 감이 잡힐 것 같다. 제일 궁금한건 HttpHeader의 내용 중 'Content-Type'-'application/json' 페어가 정해진 약어라 서버단에서 수신하는 것 만으로 어떠한 처리를 담당하는 내용이 있는지이지만 자료형의 구성만 보았을 때에는 기능적인 측면으로 파고들긴 쉽지 않아보이기 때문에 최대한 주변 내용을 통해 점진적으로 파악할 수 있을 것 같다. 

 


웹프로그래밍 프로젝트를 진행하며 파악한 사항(25.04.30)

1. Http 연결은 백엔드에 요청하는 방식이 맞았다.

> 그럼 server-net 패키지는 WAS와 통신한다는 의미

> 일단 WAS를 만들어야하는 것은 확실하다.

2. Content-type 태그와 application/json은 웹프로젝트에서 프론트단에서 HTTP 통신 패키지를 만들며 생기는 태그이다.

> Boby의 context가 파싱 데이터 중에 json 파일 방식을 활용한다는 의미이다.

> 즉, server-net의 Http 통신 내용을 만드는 패킷은 웹프로젝트로 치면 프론트엔드와 비슷한 위치이다.

> minecraft bedrock server의 구조는 BDS와 연결된 다수의 클라이언트들과 백엔드 역할을 하는 WAS로 구성되어있다.

3. json 파일로 전달하는 걸로 보아 백엔드에서 따로 파싱절차를 걸치지 않는다면 NoSql DB로 통으로 관리하게 될 것 같다.