Skip to content

feat: Drag 스토어 Context 주입 및 Stack 노드 드래그/정렬 버그 발견#19

Merged
y-minion merged 20 commits intodevelopfrom
feat/canvas-rendering
Feb 20, 2026
Merged

feat: Drag 스토어 Context 주입 및 Stack 노드 드래그/정렬 버그 발견#19
y-minion merged 20 commits intodevelopfrom
feat/canvas-rendering

Conversation

@y-minion
Copy link
Copy Markdown
Contributor

@y-minion y-minion commented Feb 20, 2026

🚀 작업 내용 요약 (Changes)

1. 드래그 스토어(Drag Store) 관리 개선 및 모노레포 아키텍처 지원

  • createStore를 활용해 Drag Store 객체를 생성.
  • apps/editor의 드래그 스토어를 @repo/ui 패키지에서 사용할 수 있도록 Context를 통해 주입하는 로직을 추가했습니다. 이를 통해 모노레포 구조 상의 의존성 단방향 원칙을 지켰습니다.
  • 하위 컴포넌트가 Context를 통해 스토어 값을 안전하게 구독(useStore)할 수 있도록 환경을 마련했습니다.
  • Zustand 설정 내 immer가 객체를 새로 반환하면서 발생하던 버그를 찾아 기존 상태를 직접 조작(Mutate)하도록 로직을 변경했습니다.

2. 스택(Stack) 노드 상호작용 및 정렬 버그 수정

  • 마우스 추적 로직 개선: 기존에는 스택이 중첩될 경우 항상 Root 스택만 추적하는 문제가 있었으나, 실제 마우스 커서와 가장 가까운 스택 노드부터 추적하도록 개선하여 UX 품질을 높였습니다.
  • 정렬 및 RND 드래그 충돌 수정:
    • position: absolute인 아이템이 스택 내부로 이동할 때 포지션이 강제로 relative로 변하며 이동이 제한되던 분기 조건을 수정했습니다.
    • position: relative인 노드가 드래그 중이 아닐 경우, RND 컴포넌트의 transform 속성을 비활성화하고 CSS 클래스를 통해 스택 내부에서 확실하게 정렬되도록 로직을 분리했습니다.
    • position: relative 노드를 드래그 시작할 때, 기존 좌표계로 돌아가려 하면서 노드가 이상한 위치로 튀는 버그를 발견, 조치 시도 중입니다. (드래그 시작 시 실시간으로 스토어에 위치를 초기화하여 해결시도 -> 실패)
  • 스택 가이드라인 렌더링 최적화: 컨텍스트로 주입된 호버 스택 ID만을 구독하여, 해당하는 스택 노드가 호버 상태일 때만 정확하게 가이드라인이 표시되도록 개선했습니다.

3. 코드 및 데이터 리팩토링

  • 에디터 스토어 내 사용되는 useGetNodeById 훅에 JSDoc 문서화를 적용하고 보류된 TODO를 마무리했습니다.
  • 기존 목데이터(Mock Data)의 노드 타입을 Container에서 STACK으로 일괄 변환하고 관련 스타일 속성을 스택 구현 환경에 맞게 정리했습니다.
  • Zustand/디버깅 환경 보완을 위해 스토어 이름 설정 및 세부 주석을 추가했습니다.

🐛 버그 픽스 (Bug Fixes)

  • 스택 내부 아이템 노드들이 transform 속성으로 인해 정렬되지 않는 현상 조치
  • 스택 내부에서 position: absolute 노드의 드래그/이동이 제한되는 문제 픽스
  • position: relative 적용 노드들의 드래그 시작점 좌표계 이탈 버그(튀는 현상) 조치
  • Store 업데이트 시 immer 상태 반환/교체 간섭 오류 픽스

👀 리뷰어 참고사항 (Review Requirements)

  • RND를 래핑하는 과정에서 임의로 수정된 relative 항목들의 좌표 및 정렬 로직이 드래그 동작 중 의도한 대로 부드럽게 작동하는지, 자식 노드를 스택 외부나 다른 스택으로 옮길 때 정상 동작하는지 테스트를 부탁드립니다.
  • Context API를 통해 주입된 Zustand Store 구독 과정에서 @repo/ui 컴포넌트 측 리렌더링 측면의 최적화가 잘 이뤄졌는지 한 번씩 검토 부탁드립니다.

context에 스토어 객체를 주입하기 위해 createStore를 사용해 스토어 객체를 생성. 해당 스토어는 context를 통해 @repo/ui에서 사용됩니다.
스토어 객체를 주입받아 하위 컴포넌트에게 전달하는 context생성. 이때 useStore를 사용해 context를 사용하는 하위 컴포넌트가 스토어의 값을 구독할 수 있도록 해줍니다.
immer를 사용함으로써 새로운 값을 반환하지 말고 기존의 상태값을 수정하도록 로직이 실행되야하는데, 새로운 값을 반환해서 버그 발생.
기존의 상태을 수정하도록 수정 완료
모노레포 구조에서 단방향을 지키기위해 apps/editor의 드래그 스토어를 context에 주입해 @repo/ui의 컴포넌트(NodeEditorWrapper)가 사용할 수 있도록 구현
Container 노드 타입을 STACK으로 변경
컨텍스트로 주입된 호버된 스택 id를 구독하여 해당하는 스택 노드가 호버될 경우에만 가이드라인 렌더링 되도록 수정
기존에 호버된 스택 노드가 중첩될 경우 언제나 root 스택노드를 찾도록 했었음. 하지만 마우스와 가장 가까운 스택 노드를 찾도록 수정 완료. 실제 UX고려하여 사용자의 마우스와 가장 가까운 스택 노드에 귀속되도록 수정 완료.
처음에는 rnd컴포넌트의 onDragStop핸들러에서 드래그가 종료된 마우스의 지점 기준으로 가장 가까이에 있는 스택 id가 존재하면 즉시 addItemToStack 로직이 실행되며 강제로 포지션의 속성을 relative로 변경하는 로직이 있었음. 하지만 해당 로직의 적용 범위는 *스택 외부의 노드*에 대해서만 적용이 되야 했는데, 스택 하위의 노드에도 적용이 되버려 강제로 position이 relative로 변경되며 이동이 제한되고 있었음. 분기처리 조건은 정확히 외부의 아이템이 스택 내부로 들어오는 경우에만 적용 되도록 수정 완료.
에디터 노드 래퍼의 rnd컴포넌트에서 내부적으로 transform을 통해 스택의 위치를 이동시키고 있었음. 강제로 css클래스를 통해 transform없이 스택노드의 정렬에 따라 정렬되도록 수정 완료
- rnd컴포넌트 특성으로 인해 스택의 정렬 속성에 따라 item 노드들이 정렬되지 않고 transform되던 문제가 있었음. 포지션이 relative고 현재 드래그 중이 아닌 경우에만 transform을 비활성화 하여 정렬되도록 강제함.

- 포지션이 relative인 노드인 경우 드래그를 시작할때 이상한 위치로 튀는 버그가 있었음. 스택의 정렬에 맞게 강제로 고정했던 위치가 드래그가 시작되면서 transform으로 원래의 노드데이터 좌표로 돌아가려고 해서 발생하던게 원인이였음.
드래그가 시작되는 순간에 해당 노드의 포지션이 relative인 경우에만 현재 노드의 위치를 실시간으로 스토어에 초기화 해서 이상한 위치로 튀지 않도록 수정 완료.
@y-minion y-minion merged commit 262fced into develop Feb 20, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant