2차_4주차_김다연_회고록 - hyeone999/Docs-JS_deepDive_Study GitHub Wiki
- 동기 처리: 코드가 순서대로 실행됨. 앞 작업이 끝나야 다음 작업 진행 (→ 블로킹)
- 비동기 처리: 기다리지 않고 다음 작업 실행. 결과가 준비되면 나중에 처리 (→ 논블로킹)
console.log('1');
setTimeout(() => console.log('2'), 1000);
console.log('3');
// 출력: 1 → 3 → 2
-
함수가 실행되면 실행 컨텍스트가 콜 스택에 쌓임 (push)
-
실행이 끝나면 스택에서 제거됨 (pop)
-
자바스크립트는 싱글 스레드 → 한 번에 하나의 작업만 가능
function sleep(callback, delay) {
const start = Date.now();
while (Date.now() - start < delay) {}
callback();
}
sleep(() => console.log('A'), 3000);
console.log('B'); // 3초 후 출력됨 (동기 → 블로킹)
-
대표 API: setTimeout, fetch, Promise, async/await, 이벤트 핸들러 등
-
비동기 처리는 Web API, 태스크 큐, 이벤트 루프가 협력하여 처리
setTimeout(() => console.log('foo'), 0);
console.log('bar'); // bar → foo 출력 (foo는 큐에 대기)
비동기 작업이 끝난 뒤 실행되는 함수
setTimeout(() => {
console.log('1초 후 실행');
}, 1000);
- 중첩이 많아지면 콜백 지옥 발생 → 가독성 낮음
-
비동기 작업의 성공/실패를 처리하는 객체
-
then, catch, finally 메서드 사용
const fetchData = () => {
return new Promise((resolve, reject) => {
setTimeout(() => resolve('데이터 수신'), 1000);
});
};
fetchData().then((data) => console.log(data));
-
Promise를 더 깔끔하게 사용할 수 있는 문법
-
동기 코드처럼 비동기 흐름 작성 가능
async function getData() {
const result = await fetchData();
console.log(result);
}
- 예외 처리: try-catch 구문 사용
async function safeFetch() {
try {
const data = await fetchData();
console.log(data);
} catch (e) {
console.error('에러 발생', e);
}
}
- DOM은 HTML, XML 문서를 트리 구조로 표현한 객체 모델입니다.
- HTML 문서 내 모든 요소는 **노드(Node)**로 표현됩니다.
- 자바스크립트를 통해 이 노드를 탐색하고 조작할 수 있습니다.
<body>
<h1>Hello</h1>
<p>Welcome!</p>
</body>
어트리뷰트 노드: class="greeting" 같은 속성
텍스트 노드: 태그 내부의 텍스트 (Hello, World! 등)
- DOM 조작을 위해서는 먼저 HTML 요소를 선택해야 합니다.
✅ 선택 메서드 정리
메서드 | 반환값 | 설명 |
---|---|---|
getElementById |
단일 요소 | ID로 선택 |
getElementsByClassName |
HTMLCollection | 클래스 이름으로 선택 |
getElementsByTagName |
HTMLCollection | 태그 이름으로 선택 |
querySelector |
단일 요소 | CSS 선택자로 첫 번째 요소 선택 |
querySelectorAll |
NodeList | CSS 선택자로 모든 요소 선택 |
✅ 예제 코드
const title = document.getElementById("main-title");
const items = document.querySelectorAll(".item");
선택한 요소를 기준으로 DOM 구조를 탐색할 수 있습니다. ✅ 자식, 부모, 형제 노드 탐색
const ul = document.getElementById("fruits");
ul.parentNode // 부모 노드
ul.children // 자식 요소 노드들
ul.firstElementChild // 첫 번째 자식 요소
ul.lastElementChild // 마지막 자식 요소
✅ 형제 노드 탐색
const banana = document.querySelector(".banana");
banana.previousElementSibling // 이전 형제 요소
banana.nextElementSibling // 다음 형제 요소
각 노드는 고유한 정보를 가지고 있습니다.
✅ 주요 프로퍼티
프로퍼티 | 설명 |
---|---|
nodeType |
노드 타입 (1: 요소, 3: 텍스트, 9: 문서 등) |
nodeName |
노드 이름 (예: DIV , #text , #document ) |
const div = document.getElementById("foo");
console.log(div.nodeType); // 1 (요소)
console.log(div.nodeName); // "DIV"
✅ 주요 프로퍼티
프로퍼티 | 대상 | 특징 |
---|---|---|
nodeValue |
텍스트 노드 | 텍스트 전용 |
textContent |
모든 노드 | 자식 포함 전체 텍스트 처리 |
innerText |
요소 노드 | 렌더링된 텍스트 기준 (비추천) |
const title = document.getElementById("foo");
title.textContent = "안녕하세요";
HTML 요소를 동적으로 생성, 추가, 삭제할 수 있습니다.
✅ innerHTML
element.innerHTML = "<p>Hello</p>"; // 전체 교체
✅ insertAdjacentHTML
element.insertAdjacentHTML("beforeend", "<li>New Item</li>");
✅ createElement & appendChild
const newDiv = document.createElement("div");
newDiv.textContent = "새 요소";
document.body.appendChild(newDiv);
✅ remove()
newDiv.remove();
✅ 메서드 정리
작업 | 메서드 |
---|---|
읽기 | getAttribute(name) |
설정 | setAttribute(name, value) |
삭제 | removeAttribute(name) |
확인 | hasAttribute(name) |
const input = document.getElementById("user");
input.setAttribute("value", "ungmo2");
console.log(input.getAttribute("value")); // "ungmo2"
input.removeAttribute("type");
✅ 인라인 스타일
const box = document.querySelector(".box");
box.style.color = "blue";
box.style["background-color"] = "yellow";
✅ classList 조작
box.classList.add("active");
box.classList.remove("active");
box.classList.toggle("active");
✅ 모든 스타일 확인
const styles = getComputedStyle(box);
console.log(styles.backgroundColor); // rgb(255, 255, 255) 등
- 사용자와의 상호작용을 이벤트로 처리할 수 있습니다.
const btn = document.getElementById("toggle-btn");
btn.addEventListener("click", () => {
document.querySelector(".box").classList.toggle("active");
});
자바스크립트 마지막 회차에서는 DOM과 비동기 프로그래밍을 공부했다. DOM은 HTML 구조를 자바스크립트로 조작하는 핵심 개념이지만, 처음 접했을 때는 구조가 낯설고 복잡해서 혼자 공부하는 데 어려움이 있었다. 하지만 다른 사람들의 정리나 예제를 참고하면서 개념을 시각적으로 이해하는 데 많은 도움이 되었고, DOM을 객체로 바라보는 관점이 생긴 것이 큰 수확이었다. 비동기 프로그래밍은 setTimeout, Promise 같은 개념을 통해 자바스크립트가 싱글 스레드에서도 어떻게 효율적으로 동작하는지를 배울 수 있었고, 특히 이벤트 루프의 구조를 이해하면서 자바스크립트가 내부적으로 얼마나 정교하게 설계되어 있는지를 느낄 수 있었다. 하지만 이해가 아쉬운 부분도 있어 더 혼자 공부해야겠다고 생각이 많이 들었다. 1차부터 2차까지 자바스크립트를 배우며 쉽지 않은 개념도 많았지만, 그만큼 확실히 얻어가는 게 많았고, 앞으로도 반복 학습을 통해 더 익숙해지고 싶다는 동기부여가 되었다.