Closed bbjbc closed 3 days ago
users
posts
NoticeDetailItem
querySelector
.admin-notice-detail-button-group
appendChild
이벤트 위임
https://github.com/user-attachments/assets/3a28fbd2-c524-4348-94f2-336b21f1ca61
firebase
홈
setTimeout(() => { const logoContainer = document.querySelector('.navbar-top'); logoContainer.addEventListener('click', () => { navigate(ADMIN_PATH.HOME); }); }, 0);
저번에도 작성했듯이 처음에는 setTimeout을 사용해서 코드를 작성했어요. setTimeout을 통해서 DOM 요소가 등록되기 전에 이벤트리스너가 실행되고자 하는 것을 방지했어요.
setTimeout
하지만 이는 별로 좋지 않은 선택이라는 것을 알게 됐어요. 이는 불필요한 지연이 발생할 수도 있고 DOM 요소가 실제로 준비됐는지 확실히 알기 어렵기 때문이죠. 그래서 찾아본 것이 바로 이벤트 위임(Event Delegation)이에요.
이벤트 위임(Event Delegation)
navbar.addEventListener('click', (e) => { if (e.target.closest('.navbar-top')) { navigate(ADMIN_PATH.HOME); } });
위 코드가 이벤트 위임을 사용한 코드에요. 즉시 이벤트 리스너를 설정해서 더 빠른 반응이 가능하다고 해요. setTimeout은 DOM 요소의 존재를 보장하지 않지만 이벤트 위임은 동적으로 추가되는 요소들도 자동으로 처리해준대요.
이 외에도 이점들이 더 있어요.
1. 메모리 효율성 향상
2. 에러 방지
null
setTimeout에도 존재하는 이점일지라도 조금 더 나은 방법이라고 해요!
저번에 setTimeout으로 만들었던 코드를 이벤트 위임 방식으로 변경하려고 했는데 상위 컴포넌트로 두 컴포넌트를 거쳐 전달을 해줘야해서 그 부분은 수정하지 않았어요. 좀 많이 복잡해지는 느낌이라서,, 지금으로서는 실용성을 택하도록 하겠어요..
1. DOM 요소 접근 시점 확인하기
2. 안전하게 DOM 조작하기
const element = document.querySelector('.any-element'); if (element) { element.appendChild(childElement); }
3. 이벤트 위임 사용
✨ Related Issues
📝 Task Details
users
와posts
더미 데이터에 더미 이미지를 삽입했어요. (최대한 용량 압축을 했어요.)NoticeDetailItem
에서 콘솔창에서 에러가 발생하는 것을 확인했어요. 이것도 DOM 요소를 찾지 못해 발생하는 오류였어요.querySelector
로 찾으려는.admin-notice-detail-button-group
요소가 아직 DOM에 추가되기 전에 접근하려 했기 때문에appendChild
문제가 발생했던 것 같아요. 그래서 이것도이벤트 위임
방식으로 해결했어요.📂 References
https://github.com/user-attachments/assets/3a28fbd2-c524-4348-94f2-336b21f1ca61
💖 Review Requirements
1️⃣ 시도
firebase
연동하면 데이터베이스에 이미지를 삽입하니 버벅임은 조금 줄지 않을까 싶습니다! 일단 너무 밋밋해서 삽입을 했어요.2️⃣ 고민 사항
홈
버튼이 있음에도 불구하고 로고를 클릭 시에도홈
버튼 클릭 시 메인 페이지로 이동하도록 설정했어요.3️⃣ 트러블 슈팅 아닌 슈팅
저번에도 작성했듯이 처음에는
setTimeout
을 사용해서 코드를 작성했어요.setTimeout
을 통해서 DOM 요소가 등록되기 전에 이벤트리스너가 실행되고자 하는 것을 방지했어요.하지만 이는 별로 좋지 않은 선택이라는 것을 알게 됐어요. 이는 불필요한 지연이 발생할 수도 있고 DOM 요소가 실제로 준비됐는지 확실히 알기 어렵기 때문이죠. 그래서 찾아본 것이 바로
이벤트 위임(Event Delegation)
이에요.위 코드가 이벤트 위임을 사용한 코드에요. 즉시 이벤트 리스너를 설정해서 더 빠른 반응이 가능하다고 해요.
setTimeout
은 DOM 요소의 존재를 보장하지 않지만이벤트 위임
은 동적으로 추가되는 요소들도 자동으로 처리해준대요.이 외에도 이점들이 더 있어요.
1. 메모리 효율성 향상
2. 에러 방지
null
참조 에러를 방지해요.setTimeout
에도 존재하는 이점일지라도 조금 더 나은 방법이라고 해요!저번에
setTimeout
으로 만들었던 코드를 이벤트 위임 방식으로 변경하려고 했는데 상위 컴포넌트로 두 컴포넌트를 거쳐 전달을 해줘야해서 그 부분은 수정하지 않았어요. 좀 많이 복잡해지는 느낌이라서,, 지금으로서는 실용성을 택하도록 하겠어요..4️⃣ 알게된 점
1. DOM 요소 접근 시점 확인하기
querySelector
를 사용했었는데 DOM에 요소가 추가되기 전인지 확인하는 것이 중요한 것 같아요.null
을 반환할 수 있어 존재 여부를 체크하는 습관이 필요할 것 같아요.2. 안전하게 DOM 조작하기
querySelector
로 찾은 요소가 있을 때만appendChild
와 같은 메서드를 사용하도록 해야 해요.3. 이벤트 위임 사용
이벤트 위임
으로 에러 가능성을 막을 수 있어요.