최종 갱신 (KST)

← 일감 목록
T-049

클라 — UI 공유 부품의 자리(`UI/Shared/`) 신설과 거짓 이름 정리

태웅 Closed 우선순위 보통 목표 미정 · 보관됨

배경

폴더가 하이어라키의 거울인데, 씬에 붙지 않는 파일은 비칠 대상이 없다. UI/의 규칙은 <캔버스>/<Presenter>/(UI 규칙.md §5)인데, 프리팹·씬에 붙지 않는 파일에는 대응하는 오브젝트가 없어 갈 곳이 정해져 있지 않다. 그래서 두 자리에 쌓였다.

지금 무엇이 문제인가
Storage/StorageGridPresenter/에 6개 Presenter 1 + 프리팹에 붙는 View 1 + 안 붙는 것 4(공급자 3 · 값 struct 1)가 평평하게 섞였다
UI/System/에 정적 헬퍼 4개 #System Canvas와 무관하고 Login·Main·Market·Storage·Widget이 쓴다. System 규칙.md가 "어디에도 속하지 않는 것들" 이라 적어 두고 그 자리에 두었다

이름도 거짓이다.

  • InventorySlotView·StorageSlotData는 창고 소유가 아니다 — System/GachaResultPresenter가 같은 클래스·같은 프리팹·같은 struct를 쓴다. 위치와 이름이 둘 다 거짓이라 창고를 고치다 가챠 결과창을 조용히 바꾸게 된다.
  • StorageInformationPresenter는 2026-09-04에 판매 목록이 그 자리를 차지해 이름과 역할이 어긋난 채 문서에 미뤄져 있었다(UI 배치 현황.md 4장).

여기에 낡은 서술 10건과 씬 오브젝트 표기 2건이 함께 나왔다. T-048이 표시 방식을 바꿨는데 주석·문서가 안 따라온 것이 7건, 그 전부터 낡은 클래스 이름이 3곳, 그리고 씬의 Presenter 오브젝트 15개 중 둘만 단어를 붙여 썼다.

⚠️ tasks/T-047도 이 일감에서 함께 고친다. T-048이 CharacterSlotSource의 IndustryLabel 호출을 걷어내서 T-047이 적어 둔 호출부 목록과 문서 갱신 항목이 낡았다. 일감 둘이 같은 줄을 다투지 않도록 정정은 여기서 한다.

할 일

1. T-048이 남긴 낡은 서술 (7건)

  • [x] Storage/StorageGridPresenter/InventorySlotView.cs:32-33 — "캐릭터는 배치 상태가 들어와". 두 세대 전 사실이다(배치 상태 → 적성 요약 → 스트립). 캐릭터는 이제 이 자리를 안 쓴다
  • [x] StorageGridPresenter.cs:39 Tooltip — "아이템 한 칸 프리팹". 캐릭터 칸도 이 프리팹이다
  • [x] System/GachaResultPresenter/GachaResultPresenter.cs:8·:30 — "인벤토리와 같은 프리팹". 인벤토리 전용이 아니라 공유 칸이다
  • [x] Main/WorkStationSelectPresenter/WorkStationSelectPresenter.cs:27·:475 — "적성 요약" → 스트립
  • [x] UI 배치 현황.md:245 — "칸 보조 문구 = 적성 요약" → 스트립(5칸 · 위치=산업 · 0은 X)
  • [x] UI 배치 현황.md:42 — 칸 프리팹 줄에 적성 스트립이 없다
  • [x] tasks/T-047:81·:89 — CharacterSlotSource 호출부가 사라졌다(호출부 둘 → 하나, WorkStationSlotView.cs:51). :89의 "Storage 규칙.md를 정정하라" 는 대상이 이미 없다. :88의 System 규칙.md 줄은 유효하니 남긴다

2. 그 전부터 낡아 있던 이름 (2건)

  • [x] GameDesign/design/ui/README.md:320 — InventoryPresenter(2026-09-02에 StorageGridPresenter로 개명됐다 · T-036). 공용 영역이라 이름만 손댄다
  • [x] tasks/T-015:41 — 같은 낡은 이름

Storage 규칙.md:147의 "예전 InventoryPresenter는…" 은 과거임을 명시한 서술이라 그대로 둔다.

3. UI/Shared/ 신설과 이동

AssetDatabase.MoveAsset으로 옮긴다 — .meta가 함께 움직여 GUID가 유지되므로 배선이 안 깨진다. 단일 어셈블리라 using·네임스페이스 수정도 없다.

  • [x] InventorySlotView.cs · StorageSlotData.cs ← Storage/StorageGridPresenter/
  • [x] RarityPalette.cs · ResultMessages.cs · WorkStationProgress.cs · IndustryLabel.cs ← UI/System/ (⚠️ IndustryLabel.cs는 T-047이 끝나면 삭제될 파일이다)
  • [x] Shared 규칙.md 신설 — 들어올 자격("캔버스에 속하지 않고 화면 표현에 쓰인다")과 들어올 수 없는 것(Managers/로 갈 상태 보유 서비스 · Common/으로 갈 게임 모르는 범용 코드 · 한 캔버스만 쓰는 종속 View)을 못박는다. System 규칙.md의 정적 변환표 단락·표를 그대로 옮긴다
  • [x] 공급자 3개는 StorageGridPresenter/에 그대로 — 창고 격자 전용이라 Storage 접두가 사실이다. Sources/ 하위 폴더는 만들지 않는다(이 이동만으로 그 폴더가 Presenter 1 + 공급자 3이 된다)

4. 칸·값 타입 개명 — SlotView / SlotData

  • [x] ⚠️ 파일명과 클래스명을 같이 바꾼다. 한쪽만 바꾸면 MonoBehaviour가 "script cannot be loaded" 로 떨어져 프리팹 배선이 끊긴다
  • [x] 참조: StorageGridPresenter · GachaResultPresenter · 공급자 3 · RarityPalette 주석
  • [x] 프리팹 InventorySlotView.prefab → SlotView.prefab + 루트 오브젝트 이름도 SlotView. [SerializeField] 필드 이름 slotPrefab은 그대로 두므로 인스펙터 배선이 유지된다

5. StorageInformationPresenter → SellCartPresenter

  • [x] 폴더 · 파일명 · 클래스명 (SellCartRowView.cs는 이름·자리 그대로 — 그 Presenter 전용 종속 View다)
  • [x] 씬 오브젝트 Information Presenter (↓ SUB VIEW) → Sell Cart Presenter (↓ SUB VIEW)
  • [x] 주석 참조 4곳 — SellCartModel.cs:11 · WorkStationSelectPresenter.cs:481 · SellCartRowView.cs:26·:44
  • [x] 씬의 m_EditorClassIdentifier 문자열이 낡지 않게 씬을 열어 저장한다
  • [x] ⚠️ UI 규칙.md:168의 이름 규칙 예시가 무효화된다 — 그 줄이 "StorageInformationPresenter처럼 캔버스 이름을 앞에 단다" 인데 SellCartPresenter는 접두가 없다. 예시를 StorageTabPresenter·StorageGridPresenter로 바꾸고 "접두는 바른 이름이 너무 일반적일 때만 붙인다" 를 더한다(MenuPresenter·GachaPresenter도 접두가 없다). 안 고치면 다음 사람이 이 개명을 규칙 위반으로 읽는다
  • [x] UI 배치 현황.md의 "이름과 역할이 어긋나 있다" 경고를 지우고, 좌클릭 상세의 "되살릴지 정하지 않았다" 를 T-050 안내로 바꾼다

6. 씬 오브젝트 표기 통일

씬 Presenter 오브젝트 15개 중 둘만 단어를 붙여 썼다. 나머지는 낱말로 띄운다 (WorkStation List Presenter — WorkStation은 한 낱말인 도메인 용어다).

  • [x] AmountInput Presenter → Amount Input Presenter
  • [x] GachaResult Presenter → Gacha Result Presenter
  • [x] 오브젝트 이름을 코드가 Find로 찾는 곳이 없는지 먼저 확인한다
  • [x] 문서: System 규칙.md:60·:61 · UI 배치 현황.md:88·:90·:265
  • [x] tasks/archive/T-032:93의 경로 표기는 그대로 둔다 — 그때의 기록이다

7. 마스터(Arca Unity Toolkit) 반영

프로젝트 고유명사가 섞이지 않은 범용 규칙만 올린다(/unity-skill-sync · 전역 CLAUDE.md).

  • [x] ugui-mvp/SKILL.md의 낡은 예시 InventoryPresenter(:72·:205-206) → 중립적인 이름. 마스터에는 프로젝트 이름을 남기지 않는 것이 규칙이라, 개명 반영이 아니라 규칙에 맞추는 것이다
  • [x] §5(폴더 규칙)에 "캔버스에 붙지 않는 공용 표현 부품의 자리" 한 절 추가 — 어느 uGUI MVP 프로젝트에나 생기는 문제다. ⚠️ 프로젝트 폴더·클래스 이름은 넣지 않는다
  • [x] 사본과 마스터를 양쪽 비교해서 맞춘다(일방적으로 덮지 않는다) + 상단 최종 업데이트

완료 조건

InventorySlotView · StorageSlotData · StorageInformationPresenter · InventoryPresenter · AmountInput Presenter · GachaResult Presenter · UI/System/{RarityPalette,ResultMessages,IndustryLabel,WorkStationProgress} 가 .claude/Agent/·tasks/archive/(의도적 과거 기록) 밖에서 0건이고, 창고 두 탭 · 가챠 결과창 · 판매 담기→일괄 판매 · 수량 팝업이 플레이에서 그대로 돈다.

막고 있는 것 / 선행 일감

  • 없음. 이동·개명 모두 GUID가 유지되고, 단일 어셈블리라 참조 수정도 파일 안에서 끝난다.
  • T-047과 부분적으로 엮인다 — 본체(엑셀 출처)는 서버 몫이고 여기서는 낡아진 서술과 IndustryLabel.cs 경로만 고친다.

관련 커밋

  • 8342c65 — 캔버스에 속하지 않는 UI 부품에 자리를 만든다 (0~7단계 한 커밋)

참고


진행 (2026-09-12) — 0~7단계 완료 · 플레이 확인만 남음

단계마다 커밋을 끊었다 — 문제가 나면 그 단계만 되돌릴 수 있다.

단계 무엇을 확인
0 일감 등록 (T-049 · T-050) —
1 낡은 서술 7건 + T-048 완료·보관 grep
2 낡은 이름 2건 (InventoryPresenter) grep
3 UI/Shared/ 신설 + 6개 이동 + Shared 규칙.md .meta 6개 동행 · 컴파일 0 에러
4 SlotView / SlotData 개명 (+프리팹) 프리팹 8필드 + 배열 5/5 · 씬의 slotPrefab 둘 다 SlotView
5 SellCartPresenter 개명 (폴더·파일·클래스·씬) 씬 참조 6개 전부 유지
6 씬 표기 통일 (Amount Input · Gacha Result) 컴포넌트 참조 유지 · 씬 diff 4줄
7 ugui-mvp 마스터 반영 (범용 문장) 사본↔마스터 diff = 기존 배너 3줄뿐

결정한 것

갈림길 결정 근거
가르는 축 캔버스/Presenter를 유지하고 예외 폴더 하나만 더한다 역할별 상위 폴더(Presenters/·Views/)로 가르면 "폴더를 열면 이 화면이 무엇으로 이뤄졌나 보인다"가 무너지고 한 화면을 고치려고 세 폴더를 오간다
공급자 3개 옮기지 않았다 창고 격자 전용이라 Storage 접두가 사실이다. Sources/도 안 만들었다 — 이동만으로 그 폴더가 Presenter 1 + 공급자 3이 된다
SellCartPresenter 접두 Storage를 붙이지 않는다 SellCartModel과 짝이 맞는 고유한 이름이다. 그래서 UI 규칙.md의 접두 규칙 문장을 함께 고쳤다 — 안 고치면 다음 사람이 이 개명을 규칙 위반으로 읽는다
마스터 반영 범위 예시 이름 + Shared/ 규칙만 프로젝트 폴더·클래스 이름은 넣지 않았다(전역 CLAUDE.md). 예시도 중립적인 ItemGridPresenter·ItemSlotView로 바꿨다

지뢰 / 주의사항

  • 🔴 m_EditorClassIdentifier는 유니티가 다시 써 주지 않는다. 씬(:1303)과 프리팹(:1031)에 옛 클래스 이름이 문자열로 남았다 — 참조는 GUID라 안 끊기지만 텍스트만 낡는다. SetDirty + 저장으로도 안 바뀌어 파일을 직접 고치고 재임포트했다.
  • ⚠️ 개명은 파일명과 클래스명을 같은 단계에서 바꾼다. 한쪽만 바꾸면 MonoBehaviour가 "script cannot be loaded" 로 떨어져 프리팹·씬 배선이 끊긴다.
  • ⚠️ [SerializeField] 필드 이름(slotPrefab)은 건드리지 않았다 — 타입만 바뀌어서 인스펙터 배선이 그대로 살아남았다. 필드 이름까지 바꾸면 [FormerlySerializedAs]가 필요하다.
  • 씬 diff는 4줄뿐이다(오브젝트 이름 3 + 클래스 문자열 1). T-046 때처럼 RectTransform이 대량으로 다시 쓰이지는 않았다.

남은 것 — 없다 (플레이 확인 통과 · 2026-09-14)

  • [x] 플레이 확인 — 창고 자원·캐릭터 탭 · 가챠 결과 팝업 · 판매 담기 → 일괄 판매 · 수량 팝업. 5·6단계가 씬을 만졌으니 뒤 둘이 핵심이다 — 통과 (2026-09-14)