위 글에서 설명한 문제 중 두 번째 문제를 해결한 과정을 적어보려 한다.
우선 스낵바가 열리고 3초 후에 닫히는 로직은 다음과 같다.
스낵바 동작 순서
1. openSnackbar('로그인 되었습니다.') 호출
2. 전역 상태 변경 ▶ isSnackbarOpen = true, message = '로그인 되었습니다.'
3. useEffect에서 isSnackbarOpen = true가 된 걸 감지하고 setTimeout 함수 실행
useEffect(() => {
if (!isSnackbarOpen) return;
const timerId = setTimeout(() => {
dispatch(closeSnackbarAction());
}, 3000);
return () => clearTimeout(timerId);
}, [isSnackbarOpen]);
4. 3000ms 후 dispatch를 통해 전역 상태 변경 ▶ isSnackbarOpen = false, message = ' '
문제 해결법 1
먼저 내가 생각한 문제의 원인은 다음과 같다.
스낵바 컴포넌트는 열리는 순간 3000ms 동안 위로 올라갔다가 내려가는 animation이 적용되어있다. 만약 setTimeout이 3000ms 후에 dispatch 함수를 바로 실행시킨다면, 3000ms 동안 스낵바가 보이고 바로 isSnackbarOpen = false로 바뀔 것이다.
그러나 setTimeout은 비동기로 동작하기 때문에 정확히 3000ms 후에 콜백 함수가 실행된다는 보장이 없다. 따라서 내 생각에는 3000ms 이상의 시간이 흐른 후에 콜백 함수가 실행되어서, 3000ms 동안 스낵바 컴포넌트는 위로 올라갔다가 아래로 다 내려갔는데 여전히 isSnackbarOpen = true 여서 처음 모습을 다시 보여준다는 생각이 들었다.
그래서 setTimeout의 timer 시간을 줄여서 2500ms를 걸고, 스낵바가 내려가는 도중에 isSnackbarOpen = false가 되도록 코드를 수정했다. 완벽한 해결법은 아니라고 생각했다. 왜냐하면 브라우저가 지금보다 더 많은 일을 하고 있거나, 네트워크 상태가 안 좋으면 2500ms를 걸었음에도 이전처럼 3000ms 이상의 시간 후에 setTimeout의 콜백 함수가 실행될 수 있기 때문이다.
그래도 일단 깜빡이는 모습이 없어지긴 해서 조금 불편함 마음으로 노트북을 덮었다...
문제 해결법 2
이번에 면접을 보다가 여태까지 겪어본 기술적 어려움에 대해 설명해달라는 질문을 받았고 아직 해결하지 못했지만 이 스낵바가 계속 머리에 맴돌아서 이 문제에 대해서 말씀드렸다.
그랬더니,,,,,면접관님이 즉석에서 문제를 해결해주셨다,,,,,,리스펙,,,,
면접관님께서는 스낵바 컴포넌트의 style에 다음과 같은 속성을 추가하면 될 것 같다고 하셨다.
animation-fill-mode: forwards;
이 속성을 적용하면 스낵바 컴포넌트의 애니메이션이 끝난 이후에 스낵바 스타일이 다시 초기 상태로 돌아가지 않고 애니메이션이 끝났을 때 상태를 계속 유지한다고 한다.
즉, 3000ms 이후에도 isSnackbarOpen = true여서 DOM에 존재하지만 애니메이션이 끝난 상태가 유지되면서(스낵바가 밑으로 내려가서 안보임) 사용자의 눈에는 안 보이는 것이다! 그래서 적용했더니,,,,아주,,, 잘된다,,,,
앗 하나 주의할 점은 amination-fill-mode를 animation 선언 후에 적용해야 한다.
그렇게 위의 스낵바 문제 중 두 번째 문제였던
2. 스낵바가 열리고 닫힐 때, 간헐적으로 깜박이며 다시 모습을 나타낸다.
이 문제를 해결했다!!!!!!!!!
사실 이 문제를 보고 CSS 적으로 접근할 생각은 아예 못했다. 어떻게든 Javascript로 해결해야 한다고 생각했는데... 문제의 해결법은 여러 방면으로 시도해봐야겠다!
감사합니다.... 면접관님....ㅎㅎ....
'Development' 카테고리의 다른 글
스낵바 성능 개선하기 - 문제 인식 (0) | 2021.10.22 |
---|---|
Next.js + React를 AWS EC2로 배포하기(2) - 어플리케이션 무중단 배포 (1) | 2021.10.04 |
Next.js + React를 AWS EC2로 배포하기(1) - EC2 인스턴스 생성 (0) | 2021.10.04 |
React에 Next.js 도입하기 (0) | 2021.10.02 |
웹에서 렌더링은 어떻게 발전하고 있을까? (2) | 2021.10.02 |