Dev-FE-2 / toy-project1-team2-intranet-project

🌱 효율적인 수강생 관리와 소통을 위한 가상의 학습 플랫폼 회사 도파밍의 인트라넷 서비스입니다.
0 stars 0 forks source link

[REFACTOR] 이벤트 위임 방식 수정 #86

Closed bbjbc closed 3 days ago

bbjbc commented 3 days ago

✨ Related Issues

📝 Task Details

📂 References

https://github.com/user-attachments/assets/3a28fbd2-c524-4348-94f2-336b21f1ca61

💖 Review Requirements

1️⃣ 시도

2️⃣ 고민 사항

3️⃣ 트러블 슈팅 아닌 슈팅

setTimeout(() => {
  const logoContainer = document.querySelector('.navbar-top');
  logoContainer.addEventListener('click', () => {
    navigate(ADMIN_PATH.HOME);
  });
}, 0);

저번에도 작성했듯이 처음에는 setTimeout을 사용해서 코드를 작성했어요. setTimeout을 통해서 DOM 요소가 등록되기 전에 이벤트리스너가 실행되고자 하는 것을 방지했어요.

하지만 이는 별로 좋지 않은 선택이라는 것을 알게 됐어요. 이는 불필요한 지연이 발생할 수도 있고 DOM 요소가 실제로 준비됐는지 확실히 알기 어렵기 때문이죠. 그래서 찾아본 것이 바로 이벤트 위임(Event Delegation)이에요.

navbar.addEventListener('click', (e) => {
  if (e.target.closest('.navbar-top')) {
    navigate(ADMIN_PATH.HOME);
  }
});

위 코드가 이벤트 위임을 사용한 코드에요. 즉시 이벤트 리스너를 설정해서 더 빠른 반응이 가능하다고 해요. setTimeout은 DOM 요소의 존재를 보장하지 않지만 이벤트 위임은 동적으로 추가되는 요소들도 자동으로 처리해준대요.

이 외에도 이점들이 더 있어요.

1. 메모리 효율성 향상

2. 에러 방지

setTimeout에도 존재하는 이점일지라도 조금 더 나은 방법이라고 해요!

저번에 setTimeout으로 만들었던 코드를 이벤트 위임 방식으로 변경하려고 했는데 상위 컴포넌트로 두 컴포넌트를 거쳐 전달을 해줘야해서 그 부분은 수정하지 않았어요. 좀 많이 복잡해지는 느낌이라서,, 지금으로서는 실용성을 택하도록 하겠어요..

4️⃣ 알게된 점

1. DOM 요소 접근 시점 확인하기

2. 안전하게 DOM 조작하기

const element = document.querySelector('.any-element');
  if (element) {
    element.appendChild(childElement);
  }

3. 이벤트 위임 사용