Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature(#256): 프로그래스바 드래그 기능 구현 #260

Merged

Conversation

Byeonjin
Copy link
Collaborator

@Byeonjin Byeonjin commented Dec 11, 2023

작업 개요

프로그래스바 드래그 기능 구현 close #256

작업 사항

  • 오타 수정 prograssBar -> progressBar
  • 프로그래스바 드래그로 프레임을 탐색할 수 있다.
  • 쓰로틀링 적용으로 성능적, 사용자 경험적 개선

고민한 점들(필수 X)

문제 - MouseMove 이벤트가 너무 많이 발생해 부하 발생 가능성

  • MouseMove 이벤트는 마우스의 좌표가 바뀔 때마다 발생합니다.

  • 단순히 프로그래스 바를 랜더링 하는 수준에서는 감당 가능한 부하겠지만, 프로그래스바의 이동에 따라 다시보기 화면 전체를 랜더링 하는 경우는 부하가 커질 것이라고 판단했습니다. 그리고 추후 다시보기의 내용을 쪼개서 요청을 보내 캔버스를 랜더링 할 경우 요청이 너무 많아 클라이언트 뿐만 앙니라 서버에도 큰 부하가 발생할 수 있을 것이라고 판단했습니다.

문제 해결

해결 - 쓰로틀링 적용

디바운싱 vs. 쓰로틀링(쓰로틀링을 적용한 이유)

  • 이런 잦은 빈도의 이벤트 발생으로 인한 문제의 해결 방법이 크게 디바운싱과 쓰로틀링이 있습니다. 그런데 디바운싱의 경우 이벤트 발생이 끝나고 일정 시간 이후에 제일 마지막 이벤트에 대한 처리를 합니다. 이런 디바운싱의 동작 방식 때문에 프로그래스 바의 드래그 기능에는 적합하지 않다고 생각했습니다. 그래서 일정 시간 주기로 이벤트의 콜백을 처리하도록 쓰로틀링을 적용했습니다.

쓰로틀링을 적용했을 때 예상되는 단점

  • 프로그래스바를 드래그해 화이트보드의 진행 상황이 무드럽게 연결되지는 않을 것입니다.

예상되는 단점에도 이런 성능 개선을 위한 방법을 선택해도 되는 이유

  • 사용자가 프로그래스바를 드래그로 진행도를 조작하는 경우 모든 프레임을 확인하는 목적보다는 해당 시간대에 어떤 장면이 있었는지 빠르게 브리핑되는 화면을 바탕으로 탐색하는 것이 사용자들의 주 목적이라고 생각했습니다. 그래서 적절한 간격으로 화이트보드를 랜더링 해주기만 한다면 사용자 경험에서 문제가 없을 것이라고 생각했습니다.

개선의 결과(성능, 사용자 경험)

  • 성능개선: 스크립팅에 소모되는 시간이 2474ms에서 560ms로 약 77%의 성능적 개선이 가능했습니다.

스크린샷 2023-12-11 오후 10 49 31

스크린샷 2023-12-11 오후 10 50 33

  • 사용자 경험: 프로그래스 바를 드래그 하면서 생겼었던 딜레이를 해결해 사용자의 경험을 증진시킬 수 있었습니다.

관련 노션 게시글

스크린샷(필수 X)

2023-12-11.11.06.34.mov

추가사항

드래그 중 마우스가 프로그래스바를 넘어가면 생기는 문제를 해결했습니다.

- 프로그래스 바 드래그 기능 구현
- 오타 수정 prograssBar -> progressBar
- 프로그래스바 드래그로 프레임을 탐색할 수 있다.
- 쓰로틀링 적용으로 성능적, 사용자 경험적 개선
@Byeonjin Byeonjin added ✨ Feat 기능 개발 FE 프론트엔드 작업 labels Dec 11, 2023
@Byeonjin Byeonjin added this to the 6주차 milestone Dec 11, 2023
Copy link

netlify bot commented Dec 11, 2023

Deploy Preview for boarlog failed.

Name Link
🔨 Latest commit da9586f
🔍 Latest deploy log https://app.netlify.com/sites/boarlog/deploys/6577bcdcd4d21d00087d0b4a

@Byeonjin Byeonjin self-assigned this Dec 11, 2023
Copy link
Collaborator

@Jw705 Jw705 left a comment

Choose a reason for hiding this comment

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

고생 많으셨습니다! 👍👍 성능 개선이 구체적으로 보여서 굉장히 멋지네요 ㅎㅎ

@@ -27,7 +27,7 @@ const Review = () => {
let fabricCanvasRef = useRef<fabric.Canvas>();
let canvasCntRef = useRef<number>(0);

const [prograssBarState, setPrograssBarState] = useState<"disabled" | "playing" | "paused">("disabled");
const [progressBarState, setprogressBarState] = useState<"disabled" | "playing" | "paused">("disabled");
Copy link
Collaborator

Choose a reason for hiding this comment

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

제가 또 오타를 냈군요..

// onFrameIdRef.current = window.requestAnimationFrame(onFrame);
// setprogressBarState("playing");
// }
// --> 프로그래스 바를 드래그 할 때, 마우스 클릭을 유지한 경우 타이머가 멈춰야해서 이 부분을 추후 리뷰에서 승인 후 제거하겠습니다.
Copy link
Collaborator

Choose a reason for hiding this comment

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

더 논의해 보면 좋을 것 같아요!

} else {
clearInterval(timerRef.current);
const handleProgressBarMouseMove = (event: React.MouseEvent) => {
console.log("ff");
Copy link
Collaborator

Choose a reason for hiding this comment

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

이 부분 삭제해도 좋을 것 같습니다!

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

감사합니다! 반영하겠습니다!

Copy link
Collaborator

@LellowMellow LellowMellow left a comment

Choose a reason for hiding this comment

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

성능 개선을 위한 큰 선택지인 디바운싱과 쓰로틀링 중에 현재 발생한 문제와 기능의 핵심적인 목적을 바탕으로 어떤것을 활용하실지 잘 판단하신 것 같습니다. 성능 개선은 매번 신기한 것 같습니다 :) 코드 잘 읽었습니다.

} else {
clearInterval(timerRef.current);
const handleProgressBarMouseMove = (event: React.MouseEvent) => {
console.log("ff");
Copy link
Collaborator

Choose a reason for hiding this comment

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

디버깅을 위한 용도였다면 지워주시면 좋을 것 같습니다.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

ㅎㅎ 반영 완료했습니다!

Comment on lines +77 to +84
if (throttle) return;
else {
setThrottle(true);
setTimeout(() => {
handleProgressBarDrag(event);

setThrottle(false);
}, 250);
Copy link
Collaborator

Choose a reason for hiding this comment

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

쓰로틀링을 이렇게 적용하는거군요! 매번 신기한 것 같습니다. 👏👏

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

감사합니다!

@Byeonjin Byeonjin merged commit 58ded24 into boostcampwm2023:dev Dec 12, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
FE 프론트엔드 작업 ✨ Feat 기능 개발
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Feature: 프로그래스바 드래그 기능 구현
3 participants