useEffect 실행을 방지하여 성능 최적화기존 로직에서는 Math.abs(scrollPosition - sectionTop)을 사용하여 가장 가까운 섹션을 찾는 방식을 적용했음.
하지만, **긴 섹션(ex. reservation)**의 경우 사용자가 해당 섹션에 있음에도 불구하고, 다음 섹션(options)으로 넘어간 것으로 인식되는 문제가 발생.
결과적으로 Tab이 올바르게 활성화되지 않고 갑자기 다른 섹션으로 변경되는 UX 문제 발생.
IntersectionObserver를 활용하여 특정 섹션이 화면에 일정 비율 이상 나타날 때 감지하려 했으나, 아래와 같은 문제가 발생함:

scrollPosition - sectionTop 방식이 아닌, 스크롤 위치가 특정 섹션의 시작과 끝 사이에 있는지를 확인하도록 수정scrollPosition이 특정 섹션의 sectionTop과 sectionBottom 사이에 있을 때만 setActiveSection 실행const handleScroll = useCallback(() => {
const scrollPosition = window.pageYOffset;
const rootFontSize = parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;
const offset = rootFontSize * 5.5;
Object.entries(sectionRefs.current).forEach(([key, ref]) => {
if (ref) {
const sectionTop = ref.offsetTop - offset;
const sectionBottom = sectionTop + ref.offsetHeight;
// ✅ 특정 섹션 내에 있을 때만 실행
if (scrollPosition >= sectionTop && scrollPosition < sectionBottom) {
setActiveSection((prev) => (prev !== key ? key : prev));
}
}
});
}, []);
// ✅ scroll 이벤트 등록 (최적화)
useEffect(() => {
const onScroll = () => {
handleScroll()
};
window.addEventListener("scroll", onScroll);
return () => {
window.removeEventListener("scroll", onScroll);
};
}, [handleScroll]);
useCallback을 활용하여 성능 최적화 및 불필요한 함수 재생성 방지