❓ 웹 페이지 생명주기
웹 페이지의 생명주기는 HTML 문서를 로드하여 DOM 을 생성하고, 리소스(이미지, 스타일 시트 등)를 불러와 화면을 완성한 후, 페이지를 떠날 때까지 이어지는 일련의 과정을 의미한다.
🌱 주요 생명주기 단계
- HTML 로드 시작: 브라우저가 HTML 문서를 다운로드하고 파싱 시작
- DOM 생성: HTML 파싱이 완료되고 DOM(Document Object Model) 트리가 완성됨.
- 리소스 로드: CSS, 이미지, JS 등 외부 리소스가 로드됨.
- 페이지 인터랙션: 페이지가 사용자와 상호작용을 시작함.
- 페이지 언마운트: 사용자가 페이지를 떠나거나 브라우저 탭이 닫히면서 페이지가 언마운트됨.
🔍 생명주기 단계별 주요 이벤트
1️⃣ DOM 생성: DOMContentLoaded
DOMContentLoaded 이벤트는 HTML 문서를 모두 파싱하여 DOM 트리를 완성했을 때 발생한다. 이 시점에는 외부 리소스(이미지, CSS 등)가 모두 로드되지 않았을 수 있다.
사용 사례
- DOM 이 준비된 시점에 실행해야 할 초기화 작업
- 리소스 로드가 필요 없는 작업
코드 예시
document.addEventListener("DOMContentLoaded", () => {
console.log("DOM 생성 완료!");
const button = document.querySelector("#myButton");
button.addEventListener("click", () => alert("클릭했습니다!"));
});
2️⃣ 리소스 로드 완료: load
load 이벤트는 HTML, CSS, JS, 이미지 등 모든 리소스를 로드한 후 발생한다. DOM 뿐만 아니라 리소스까지 모두 준비되었으므로, 리소스 의존적인 작업에 적합하다.
사용 사례
- 이미지 크기 계산
- 모든 리소스를 사용해야 하는 작업
코드 예시
window.onload = () => {
console.log("모든 리소스가 로드되었습니다.");
const img = document.querySelector("#myImage");
console.log(`이미지 크기: ${img.width} x ${img.height}`);
};
3️⃣ 페이지 이탈: beforeunload
beforeunload 이벤트는 사용자가 페이지를 떠나기 직전에 발생한다. 사용자가 페이지를 떠나기 전에 경고를 띄우거나 데이터를 저장할 때 유용하다.
사용 사례
- 중요한 데이터가 저장되지 않았을 때 경고 표시
- 페이지 이탈 시 데이터 백업
코드 예시
window.addEventListener("beforeunload", (event) => {
event.preventDefault();
event.returnValue = ""; // 경고 메시지 표시
});
4️⃣ 페이지 언마운트: unload (❌ 지원 중단)
unload 이벤트는 페이지가 완전히 언마운트되거나 리소스가 해제될 때 발생한다. 페이지가 닫히기 전에 서버와의 연결을 종료하거나 데이터를 전송하는 데 활용된다.
사용 사례
- 세션 종료 처리
- 서버에 로그 전송
코드 예시
window.addEventListener("unload", () => {
console.log("페이지 언마운트!");
navigator.sendBeacon("/log", JSON.stringify({ action: "unload" }));
});
📌 생명주기 이벤트 비교
이벤트 | 발생 시점 | 주요 목적 | 특징 |
DOMContentLoaded | DOM 트리가 완성된 직후 | 초기화 작업 | 리소스는 모두 로드되지 않을 수 있음 |
load | 모든 리소스가 로드된 후 | 리소스 의존 작업 수행 | 실행 시점이 상대적으로 늦음 |
beforeunload | 페이지를 떠나기 직전 | 경고 표시, 데이터 저장 | 브라우저가 표시하는 기본 메시지만 가능 |
unload | 페이지가 완전히 언마운트 된 후 | 서버와의 연결 종료, 리소스 정리 | 비동기 작업이 보장되지 않음 |
🚀 예시
1️⃣ DOM 트리 완성 후 초기화 (DOMContentLoaded)
document.addEventListener("DOMContentLoaded", () => {
// 1. 버튼 초기화
const button = document.querySelector("#myButton");
button.textContent = "클릭하세요!";
button.style.backgroundColor = "lightblue";
// 2. 이벤트 핸들러 등록
button.addEventListener("click", () => {
alert("버튼이 클릭되었습니다!");
});
console.log("DOM 생성 완료! 모든 초기화 작업이 준비되었습니다.");
});
실행 흐름
- HTML 문서를 파싱하여 DOM 트리가 완성되면 이벤트가 실행됨
- 버튼의 텍스트를 설정하고 색상을 변경
- 버튼 클릭 시 실행된 이벤트 핸들러를 등록
2️⃣ 리소스 로드 후 작업 (load)
window.onload = () => {
// 1. 이미지 크기 확인
const img = document.querySelector("#mainImage");
console.log(`이미지 크기: ${img.offsetWidth}px x ${img.offsetHeight}px`);
// 2. 페이지 로드 후 애니메이션 추가
const banner = document.querySelector("#banner");
banner.style.opacity = "1";
banner.style.transition = "opacity 2s ease-in-out";
console.log("모든 리소스가 로드되었습니다.");
};
실행 흐름
- 모든 리소스가 완전히 로드된 후 실행됨
- 이미지의 크기를 계산하여 로그로 출력
- 배너 요소에 애니메이션 효과를 추가
3️⃣ 페이지 이탈 방지 (beforeunload)
window.addEventListener("beforeunload", (event) => {
// 1. 폼 데이터 작성 중 경고 표시
const isFormDirty = document.querySelector("#form").classList.contains("dirty");
if (isFormDirty) {
event.preventDefault();
event.returnValue = ""; // 이 코드는 경고 메시지 표시를 활성화합니다.
console.log("사용자가 페이지를 떠나려고 합니다.");
}
});
실행 흐름
- 사용자가 페이지를 떠날 때 이벤트가 발생
- #form 요소가 변경되었는지 확인
- 폼 데이터가 작성 중이라면 브라우저가 경고 메시지를 표시
4️⃣ 페이지 언마운트 작업 (unload)
window.addEventListener("unload", () => {
// 1. 서버에 로그 전송
const data = { action: "page_unload", timestamp: new Date().toISOString() };
navigator.sendBeacon("/api/log", JSON.stringify(data));
// 2. 세션 종료 메시지
console.log("페이지가 언마운트되었습니다. 서버 로그가 전송되었습니다.");
});
실행 흐름
- 사용자가 페이지를 떠날 때 이벤트 실행
- navigator.sendBeacon 을 사용해 서버로 데이터를 전송
- 비동기 작업을 수행하는 경우 보장이 어려우므로, sendBeacon 사용을 권장
📖 정리
- DOMContentLoaded: DOM 트리가 완성된 직후 실행. 초기화 작업에 적합.
- load: 모든 리소스가 로드된 후 실행. 이미지 크기 계산 등 리소스 의존 작업에 사용.
- beforeunload: 페이지를 떠나기 직전에 실행. 경고 메시지 표시나 데이터 백업에 활용.
- unload: 페이지 언마운트 시 실행. 서버 로그 전송 및 리소스 정리 작업에 사용.
💡 참고 자료
https://developer.mozilla.org/ko/docs/Web/API/Document/DOMContentLoaded_event
Window: DOMContentLoaded 이벤트 - Web API | MDN
DOMContentLoaded 이벤트는 HTML 문서가 완전히 구문 분석되고 모든 지연된 스크립트(<script defer src="…">와 <script type="module">)가 다운로드되고 실행될 때 발생합니다. 이미지, 서브프레임, 비동기 스크
developer.mozilla.org
https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event
Window: load event - Web APIs | MDN
The load event is fired when the whole page has loaded, including all dependent resources such as stylesheets, scripts, iframes, and images, except those that are loaded lazily. This is in contrast to DOMContentLoaded, which is fired as soon as the page DO
developer.mozilla.org
https://developer.mozilla.org/ko/docs/Web/API/Window/beforeunload_event
Window: beforeunload 이벤트 - Web API | MDN
beforeunload 이벤트는 window, 문서(document) 및 해당 리소스가 언로드(unload) 되려고 할 때 시작됩니다. 문서는 계속 보이고 있으며 이벤트는 이 시점에서도 취소할 수 있습니다.
developer.mozilla.org
https://developer.mozilla.org/ko/docs/Web/API/Window/unload_event
Window: unload 이벤트 - Web API | MDN
unload 이벤트는 문서나 하위 리소스가 언로딩 중일 때 발생합니다.
developer.mozilla.org
'JavaScript' 카테고리의 다른 글
[JS] 브라우저 이벤트 다루기 - 키보드 / 마우스 이벤트 (0) | 2024.11.13 |
---|---|
[JS] 브라우저 요소 사이즈 확인하기 (0) | 2024.11.11 |
[JS] DOM 트리와 노드 (0) | 2024.09.18 |