Skip to content

✨ Feat: 스티커 선택박스로 드래그 이동, 리사이즈 - #56

Open
euoonw wants to merge 13 commits into
developfrom
feat/sticker-drag-resize
Open

✨ Feat: 스티커 선택박스로 드래그 이동, 리사이즈#56
euoonw wants to merge 13 commits into
developfrom
feat/sticker-drag-resize

Conversation

@euoonw

@euoonw euoonw commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

🔍 PR 요약

보드 편집 모드에서 스티커를 선택하면 선택박스가 뜨고, 드래그로 이동하거나 모서리를 드래그해 크기를 조절할 수 있게 함. 선택한 스티커는 항상 다른 스티커보다 위로 보이도록 zIndex를 올림.

🧾 관련 이슈

🧠 의도 및 배경

원래 이슈에는 핀치 제스처로 크기와 회전을 동시에 조정하는 걸로 돼 있었는데, 실제로 만들면서 한 제스처 안에서 리사이즈인지 회전인지 구분하는 로직이 꽤 복잡해질 것 같아서 범위를 나눴습니다. 이번 PR은 모서리 드래그로 리사이즈하는 것까지만 포함하고, 회전은 별도 이슈로 분리해서 이어서 진행할 예정입니다.

🛠️ 주요 변경 사항

  • 보드 툴바 모드 토글(그리기/텍스트/선택) 연결 — 그리기랑 텍스트는 토글 상태만 있고 실제 기능은 이번 스코프에 없음
  • 스티커 선택 시 선택박스 노출, 빈 공간을 탭하면 선택 해제
  • 선택된 스티커를 드래그로 이동, 결과는 서버에 저장
  • 선택된 스티커의 모서리를 드래그해 크기 조절 (회전은 미포함)
  • 스티커를 선택하면 zIndex를 항상 맨 위로 올려서 다른 스티커에 가려지지 않게 함
  • 리사이즈 중 제목뱃지가 스티커를 따라오도록 뱃지 offset을 scale에 맞춰 같이 조정
  • TEXT 타입 스티커 지원 제거, 스티커 렌더 크기를 최대변 160px로 정규화

리뷰어가 특히 봐줬으면 하는 부분 / 애매하거나 확인이 필요한 지점

  • 제목뱃지 크기는 스티커를 리사이즈해도 같이 커지지 않음

    • 뱃지 위치는 스티커 scale에 비례해서 따라오게 했지만, 뱃지 자체 크기는 고정으로 뒀습니다. 피그마상으로는 뱃지가 고정 크기로 유지되는 것처럼 보여서 일단 이렇게 갔는데, 기획 쪽에 확인 질문을 남겨두고 답변 대기 중입니다. 답변에 따라 수정 필요할 수도 있습니다.!
  • 제목뱃지가 다른 스티커의 사진보다 항상 위에 뜨는 문제가 있습니다

    • image
    • react-konva-utilsHtml이 zIndex 값과 무관하게 항상 canvas보다 위에 그려지는 라이브러리 구조 때문입니😭 뱃지-뱃지 간, 뱃지-선택박스 간 순서는 zIndex로 맞췄는데, 뱃지-다른스티커의 사진 순서는 나중에 뱃지를 Konva 도형(Rect+Text)으로 바꿔야 완전히 해결되는데, 이건 별도 작업으로 분리할 예정입니다.

    • @cchaeyoung 채영님이 작업 중인 퀵메뉴(제목변경) 기능이 StickerBadge/Sticker/SelectBox를 건드리는지 질문 들비니다. 건드린다면 뱃지 Konva 전환 작업과 충돌할 수 있어서, 그 경우엔 채영님 작업이 끝난 뒤에 제가 일괄 반영하는 쪽으로 조율하려고 합니다!

  • 리사이즈 최소/최대 크기 제한이 아직 없습니다(기획 미정).

    • 모서리를 스티커 중심까지 드래그하면 scale이 0에 가까워질 수 있는데, 정확히 0이 되면 지금 드래그 중인 핸들 자신이 화면에서 사라지는 상황이라 Konva가 이상하게 동작할 가능성이 있습니다. 최소 크기 정책이 정해지면 같이 고칠 예정입니다. (근데 시도해봤는데 이론상 가능은 하지만 0이 되게 줄이는게 쉽지않긴함)

🚨 트러블슈팅

  • StickerSelectBox가 같은 스티커의 이미지를 각자 따로 불러오고 있었는데, (SelectBox가 테두리를 스티커 사진 크기랑 똑같이 맞추는 데에 사용함) Sticker가 이미 불러온 이미지를 콜백으로 부모에 알려주고 SelectBox가 그걸 재사용하도록 바꿔서 중복 로드를 없앰

📸 스크린샷

2026-08-07.2.45.02.mov

@euoonw euoonw self-assigned this Aug 7, 2026
@vercel

vercel Bot commented Aug 7, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
ppotto-client-web Ready Ready Preview Aug 7, 2026 6:02pm

@cchaeyoung cchaeyoung left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

퀵메뉴의 이름 변경하기 부분이 Html이냐 Konva냐에 따라 구현이 달라질 것 같아서 뱃지가 Konva로 바뀐 뒤에 그 위에서 편집 UI를 구현하는 게 이후 또 수정 안 해도 돼서 나을 것 같아요..!

뱃지 Konva 전환을 먼저 진행해주시면, 그 이후에 제가 편집 기능을 만들게요!

이 부분 고려해서 다른 기능(퀵메뉴) 먼저 구현하고 있겠습니다.

scale 0 관련해서는,
스티커가 scale 0이 될 때까지 줄어들어서 아예 안 보이게 되는 것보다는 최소 크기 정책이 꼭 있어야 할 것 같아요.
이후 테스트해보면서 적당한 크기까지만 줄어들도록 수정하는 방향도 좋아 보여요! 😊

수고하셨습니다~!

Comment on lines +47 to +49
const isEditMode = mode === 'move';
// 편집 모드를 벗어나면 선택도 같이 해제된 것으로 취급
const selectedId = isEditMode ? selectedStickerId : null;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

스티커 선택한 채로 편집 모드로 나갔다가 다시 편집 모드로 돌아오면, 클릭 안 했는데 이전에 선택했던 스티커가 다시 선택된 상태로 보일 수 있을 것 같아요!
모드 벗어날 때 setSelectedStickerId(null)도 같이 호출해서 선택 해제되게 하는 건 어떨까요?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이부분 반영하겠습니다!

@kimyounghee425 kimyounghee425 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다!
동작이 좀 복잡해서 정책만 잘 세우면 코드는 금방 짤 것 같아요.
이 기능이 깔끔하게 동작하려면 어떤 것들이 필요할지 생각해보면 좋을 것 같습니다!

레이어 정책 / 뱃지 동작? (스티커와 독립인지 별개인지) / 저장 정책 등등.. 결정하면 좋을 것 같습니다.
일단 보드 편집 메뉴에 손가락 아이콘이 있는데 저는 이걸 눌러야 이제 드래그랑 크기조절이 가능했으면 좋겠어요. 해당 메뉴를 온오프 토글처럼 사용하는 느낌. 이러면 저장 시점도 명확해 질 것 같고요! 복구도 매우 쉬울 것 같습니다

여기서는 지금 범위인 리사이즈랑 레이어만 잘 잡고가는것이 좋아보이는데 어떠세요?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

서버 응답 전에 캐시 먼저 갱신하는데 실패했을 때 대응이 빠져있어요.
보드 쿼리 staletime이 55분이라 복구가 힘들 것 같단 점도 유의해야합니다.
실패 시 보드쿼리 무효화정도 넣어주면 좋을 것 같아요

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵 반영하겠습니다!

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

단순히 zindex 를 최대로 하는건 좀 빈약해 보입니다!
정책을 잘 잡아야 할 것 같은데 더 좋은 방법들이 있을 것 같아요.
선택한 스티커의 zindex 를 제일 크게 하는것을 유지한다면 스티커 개수만큼의 인덱스만 활용하되 가장 마지막에 터치한것을 제일 큰 인덱스로 교체하고, 나머지는 한칸씩 앞으로 당기는 방식 정도가 있을 것 같아요.
구현한다면 스티커 배열 자체를 인덱스 오더대로 짜는 느낌??

아무튼 깔끔한 정책이 필요해보입니다!

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

말씀하신 방식 저도 구현 전에 검토했던 방식인데 지금 방식(최대+1)으로 간거는 아래 이유였습니다. 저도 고민돼서 클로드랑 대화했었거든요. 😂

  • 선택한 스티커 하나만 갱신하면 돼서 쓰기 범위가 작고, 여러 스티커를 한꺼번에 재정렬하는 로직이 없어 동시 편집 시 레이스 컨디션 위험이 적음
  • zIndex는 정렬 키로만 쓰여서 값이 촘촘할 필요가 없음. 계속 커져도실질적으로 문제가 안 되고, JS 숫자 범위상 오버플로 걱정도 없음

빈약해 보인다는 포인트가 값이 계속 커지는 것 자체라면, 정책이 없었다기보다는 쓰기 범위 최소화를 선택했다고 할 수 있습니닷..

바꾸는건 어렵지않을것같아서 그래도 바꾸는게 나을것같으면 바꿀게요!

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

리사이즈와 회전을 나누어 취급할 필요가 있을까요? 어렵다면 그냥 합치는것도 나쁘지 않다 생각합니다!

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

사실 제 구현방향이었던.... 코너 핸들 하나로 이 드래그가 리사이즈인지 회전인지 구분하려면 각도 추적·임계값·모드 전환 로직이 붙어서 꽤 복잡해질 것 같아 분리했었어요. (약간 굿노드 도형 회전 느낌)

근데 방금받은 스티커 동작 프로토타입보니까, 리사이즈/회전을 구분할 필요가 없어져서 말씀하신 방향대로 자연스럽게 합쳐질듯합니다.
이 pr에서 작업할지 뒤에 따로 작업할지 고민중.... 버리는 코드가 꽤 생겨가지고여

@euoonw

euoonw commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator Author

고생하셨습니다! 동작이 좀 복잡해서 정책만 잘 세우면 코드는 금방 짤 것 같아요. 이 기능이 깔끔하게 동작하려면 어떤 것들이 필요할지 생각해보면 좋을 것 같습니다!

레이어 정책 / 뱃지 동작? (스티커와 독립인지 별개인지) / 저장 정책 등등.. 결정하면 좋을 것 같습니다. 일단 보드 편집 메뉴에 손가락 아이콘이 있는데 저는 이걸 눌러야 이제 드래그랑 크기조절이 가능했으면 좋겠어요. 해당 메뉴를 온오프 토글처럼 사용하는 느낌. 이러면 저장 시점도 명확해 질 것 같고요! 복구도 매우 쉬울 것 같습니다

여기서는 지금 범위인 리사이즈랑 레이어만 잘 잡고가는것이 좋아보이는데 어떠세요?

말씀하손가락 아이콘을 온오프 토글로 해서 그 모드에서만 드래그·리사이즈 가능한 구조는 이미 이렇게 되어 있어요! 틀바에서 손가락아이콘 모드일 때만 스티커가 draggable + 선택박스가 뜨고, 그 모드가 아니면 스티커를 탭해도 드래그 대신 Recap 화면으로 넘어갑니다.

저장 시점은 그 모드 안에서 드래그/리사이즈가 끝나는 시점에 일어나는데, 모드를 나갈 때 한 번에 몰아서 저장하면 사용자가 모드 안나가고 앱 나가거나 이탈할때 아무것도 저장 안될 것 같아서 그 모드 안에서 일어나는건 다 행위 끝나면 바로 저장요청가게 해놨어요. 그런 점에서 복구 용이성도 지금 방식이 더 좋은 것 같다고 생각은 하는데 요청을 너무 많이 보낼 수는 있을 것 같긴해요. 문제 있는것같으면 바꿔도 됩니다!

@kimyounghee425

Copy link
Copy Markdown
Collaborator

고생하셨습니다! 동작이 좀 복잡해서 정책만 잘 세우면 코드는 금방 짤 것 같아요. 이 기능이 깔끔하게 동작하려면 어떤 것들이 필요할지 생각해보면 좋을 것 같습니다!
레이어 정책 / 뱃지 동작? (스티커와 독립인지 별개인지) / 저장 정책 등등.. 결정하면 좋을 것 같습니다. 일단 보드 편집 메뉴에 손가락 아이콘이 있는데 저는 이걸 눌러야 이제 드래그랑 크기조절이 가능했으면 좋겠어요. 해당 메뉴를 온오프 토글처럼 사용하는 느낌. 이러면 저장 시점도 명확해 질 것 같고요! 복구도 매우 쉬울 것 같습니다
여기서는 지금 범위인 리사이즈랑 레이어만 잘 잡고가는것이 좋아보이는데 어떠세요?

말씀하손가락 아이콘을 온오프 토글로 해서 그 모드에서만 드래그·리사이즈 가능한 구조는 이미 이렇게 되어 있어요! 틀바에서 손가락아이콘 모드일 때만 스티커가 draggable + 선택박스가 뜨고, 그 모드가 아니면 스티커를 탭해도 드래그 대신 Recap 화면으로 넘어갑니다.

저장 시점은 그 모드 안에서 드래그/리사이즈가 끝나는 시점에 일어나는데, 모드를 나갈 때 한 번에 몰아서 저장하면 사용자가 모드 안나가고 앱 나가거나 이탈할때 아무것도 저장 안될 것 같아서 그 모드 안에서 일어나는건 다 행위 끝나면 바로 저장요청가게 해놨어요. 그런 점에서 복구 용이성도 지금 방식이 더 좋은 것 같다고 생각은 하는데 요청을 너무 많이 보낼 수는 있을 것 같긴해요. 문제 있는것같으면 바꿔도 됩니다!

좋습니다~ 하면서 개선해봐요

…resize

# Conflicts:
#	apps/web/src/pages/board/BoardPage.tsx
@euoonw

euoonw commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator Author

이 pr 우선 머지 잠시 미루겠습니다.!!

지금까지 다 konva로 만들었고 뱃지까지 konva 전환할 생각이었는데,
인터렉션 프로토타입 보면서 구현 방향 고민하다 보니까 지금처럼 보드에 스티커 몇개있는 규모에서는 konva 말고 순수DOM 리액트 컴포넌트로 가는게 더 나을 수도 있겠다...는 고민이 되더라구요
지금 규모 정도에서 konva 성능 이점이 애매하고, 안그래도 라이브러리 들이면서 공수도 늘어났는데 보통 konva 텍스트가 화질이 일반 DOM 보다 떨어지기도 해서....흠..
그래서 검증을 좀 해보고싶어서 이 브랜치에서 새 브랜치 파서 DOM 버전 만들어보고있어요 🥹 아마 지금 이 브랜치랑 변경사항 비교하는 pr 올릴 것 같아요
오늘 자기전까지는 마무리해보겠습니다!

혹시 급하게 머지 필요한 부분 있거나, 문제 있어 보이면 알려주세요!

참고로 나중에 붙일 드로잉 기능은 이 결정이랑 상관없이 캔버스를 유지하든 말든 어차피 별도의 캔버스 레이어로 가야 해서 문제 없습니다

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.

✨ Feat: 스티커 드래그·핀치 리사이즈 및 배치 저장

3 participants