메이플스토리월드 :: 인벤토리 구현 02

chooha·2026년 7월 28일

메이플스토리월드

목록 보기
2/15

📝 개발일지 - InventoryContainer 다중 반환값 경고 트러블슈팅

👨‍💻 오늘의 개발 작업

인벤토리 컨테이너(InventoryContainer)의 AddItem/MergeSlot 메서드를 구현하면서, "성공 여부"와 "실제 처리된 수량"을 동시에 반환해야 하는데 에디터가 경고를 띄우는 문제를 발견하고 해결했음


💡 오늘의 기록

1. 문제 상황 - 리턴값 두 개를 반환하려다 발생한 경고

AddItem은 인벤토리가 가득 차서 일부만 추가된 경우를 호출부가 구분할 수 있어야 해서, 처음엔 값을 두 개 반환하도록 짰음

-- AddItem 내부
return isFullySucceeded, totalAdded  -- success, amount 두 값 반환

Lua는 애초에 return a, b처럼 값 여러 개를 한 번에 반환하는 걸 언어 차원에서 기본 지원한다. 그래서 이 문법 자체를 쓰는 데는 아무 문제가 없다고 생각하고 그대로 짰음

문제는 MSW 에디터에서 메서드를 정의할 때, Return 타입 설정란은 boolean 하나만 선택해둔 상태였다는 것. 매개변수는 "Add Parameter" 버튼으로 여러 개를 자유롭게 추가할 수 있어서, Return도 당연히 같은 방식으로 여러 개 선언할 수 있을 거라 생각했는데, 실제로 확인해보니 Return 쪽에는 그 "추가" 버튼 자체가 없었음

그 상태로 호출부에서 값 두 개를 받으니 에디터가 경고를 띄웠음

local success, addedAmount = self._T.container:AddItem(itemId, amount, maxStack)
-- ⚠️ 리턴값이 1개인데 변수 2개에 할당하려 함

2. 해결 과정 - 경고의 정체를 실측으로 확인 ⚠️

경고가 뜨는 게 "정말 두 번째 값이 유실된다"는 뜻인지, 아니면 "타입 선언과 실제 반환 개수가 안 맞는다"는 정적 경고일 뿐인지가 불확실했음. Lua 언어 자체는 다중 반환을 지원하는 게 맞지만, MSW의 mLua 에디터가 메서드 하나당 함수 몸통(Code)만 코드로 작성하고, 실제 함수 시그니처(function Name(...))는 에디터가 Name/Arguments/Return 설정을 조합해 자동으로 생성하는 구조라, 이 자동 생성된 시그니처가 선언된 Return 타입 개수로 강제되는지가 관건이었음

말로 추측하지 않고 별도의 임시 테스트 컴포넌트를 만들어 직접 실측함

-- TestFunc, Return 타입은 boolean 하나만 선언
return true, 999
-- OnBeginPlay (server only)
local success, extra = self:TestFunc()
log(success)
log(extra)

콘솔에 true와 999가 둘 다 정상적으로 찍힘을 확인함. 즉 mLua 자체가 다중 반환을 막는 게 아니라, 에디터의 Return 타입 선언란(UI)이 1개 슬롯만 제공할 뿐이고, 그 밑에서 실제로 실행되는 Lua 런타임은 선언된 개수와 무관하게 다중 반환을 그대로 통과시킴. 경고는 "타입 선언과 실제 동작이 다르다"는 정적 경고였을 뿐, 실행에는 문제가 없었음

3. 최종 해결 - 결과 전용 StructType으로 감싸기

동작 자체는 문제없지만, 선언(boolean 하나)과 실제 반환(두 값)이 다른 채로 두면 나중에 코드를 다시 볼 때(또는 다른 사람이 볼 때) 두 번째 값의 존재를 코드를 직접 열어보기 전엔 알 수 없고, 호출할 때마다 경고도 계속 떠서 정리하기로 함

값 두 개를 각각 반환하는 대신, success/amount 필드를 가진 InventoryUpdateResult라는 StructType 하나를 만들어 통째로 반환하도록 변경함

-- InventoryUpdateResult (StructType)
-- success: boolean, amount: integer

-- AddItem
local result = InventoryUpdateResult()
result.success = (remaining == 0)
result.amount = totalAdded
return result

Return 타입도 InventoryUpdateResult 하나로 선언하니 실제 반환값과 정확히 일치해서 경고가 사라짐. AddItem과 MergeSlot이 둘 다 "성공 여부 + 처리 수량"이라는 같은 모양의 결과가 필요해서, 타입 하나를 공유해 중복도 줄임

4. 성과와 개선 효과

  • ✅ 경고 제거: Return 타입 선언과 실제 반환값이 일치하게 되어 정적 경고가 사라짐
  • ✅ 인터페이스 명시성 확보: 메서드 시그니처만 봐도 success/amount 두 값이 반환된다는 게 드러남
  • ✅ 중복 제거: AddItem, MergeSlot이 같은 결과 타입을 공유해 별도 타입을 두 개 만들 필요가 없어짐
  • ✅ 원인의 정확한 이해: "Lua 언어가 다중 반환을 지원하는 것"과 "MSW 에디터의 Return 타입 선언 UI가 1개만 지원하는 것"은 서로 다른 레이어의 문제라는 걸 추측이 아니라 실측으로 확인함

📚 개발 참고

  • 함수 — MSW 공식 크리에이터 센터
    함수의 Return 타입 설정 방법을 다루는 문서. 매개변수와 달리 Return 타입에는 "추가" 절차 자체가 언급되지 않아, 에디터가 1개만 지원한다는 것의 근거로 참고함

0개의 댓글