반응형

Redux가 왜 필요한가. 상태관리 문제상황 알아보기

React 상태 관리의 기본 문제

React만 사용할 때는 보통 이렇게 상태를 관리를 한다.

  • 컴포넌트 내부 useState
  • 부모 → 자식으로 props 전달
  • 필요하면 context 사용

하지만 페이지 곳곳에서 같은 데이터를 써야 한다면 react만 사용할 때의 상태관리가 복잡해진다.
예: 로그인한 사용자 정보, 장바구니, 알림 개수 등

컴포넌트 깊이가 깊어질수록
A → B → C → D → E 에 props로 상태를 계속 넘겨야 하는 'props drilling' 현상이 생긴다.

비동기 로직(API 요청, 로딩, 에러)과 상태가 섞이면서 값이 도대체 어디서 바뀌는 것인지 헷갈리게 된다.

Redux는 한마디로
'앱 전체에 하나의 중앙 창고(store)를 두고, 상태 변경 규칙을 아주 명확하게 강제하는 도구' 라고 할 수 있다.


Redux 핵심 개념: store / action / reducer / dispatch / 단방향 흐름

Redux는 5개 단어만 정확히 이해하면 절반은 이해한 것이다.

  • Store
  • State
  • Action
  • Reducer
  • Dispatch

큰 그림 (데이터 흐름)

텍스트로 그리면 대략 이런 흐름이다.

사용자 클릭
→ dispatch(action)
→ reducer가 현재 state와 action으로 새로운 state 계산
→ store가 상태를 바꾸고
→ 구독 중인 컴포넌트들이 새 상태로 리렌더링

[사용자 이벤트]
       ↓ (dispatch)
   [ Action ]
       ↓
   [ Reducer ] + [현재 State]
       ↓
   [ 새 State in Store ]
       ↓
[구독한 UI가 다시 렌더링]

개념 하나씩 알아보기

1) Store

전역 상태가 저장되는 중앙 창고

앱 전체에서 단 하나만 존재하는 경우가 일반적

// 개념적으로는 이런 느낌

const store = {  
state: { count: 0, user: null },  
getState() {},  
dispatch(action) {},  
subscribe(listener) {}  
};

2) State

store 안에 들어 있는 현재 상태 값

객체 한 덩어리라고 생각하면 됨:

{ count: 0, user: null, todos: \[\] } 이런 식

3) Action

무슨 일이 일어났는지를 설명하는 객체

꼭 type 필드를 가져야 함

{ type: 'counter/increment' }
{ type: 'counter/decrement' }
{ type: 'user/set', payload: { name: 'Jiyoung' } }

4) Reducer

(현재 state, action) => 새로운 state

  • 순수 함수여야 함
  • 인자로 받은 state를 직접 변경 X
  • 항상 새로운 객체를 만들어서 반환 O

같은 입력 → 항상 같은 출력

function counterReducer(state = { value: 0 }, action) {  
switch (action.type) {  
case 'counter/increment':  
return { ...state, value: state.value + 1 };  
case 'counter/decrement':  
return { ...state, value: state.value - 1 };  
default:  
return state;  
}  
}

5) Dispatch

이 action을 store에 보내서 상태를 바꿔달라고 알리는 함수

store.dispatch({ type: 'counter/increment' });

바닐라 JS로 '카운터 상태관리' 예제

이 단계에서는 React 없이 순수 JS로 Redux 패턴을 흉내 내보면서 흐름을 몸에 익히는 연습이다.

아주 단순한 ‘가짜 Redux’ 구현

아래 코드는 '진짜 Redux 라이브러리'는 아니고,
개념을 이해하기 위한 아주 단순한 store 구현 예제예요.

// 1. reducer 정의
function counterReducer(state = { value: 0 }, action) {
  switch (action.type) {
    case 'counter/increment':
      return { ...state, value: state.value + 1 };
    case 'counter/decrement':
      return { ...state, value: state.value - 1 };
    default:
      return state;
  }
}

// 2. createStore 함수 (미니 버전)
function createStore(reducer) {
  let state = reducer(undefined, { type: '__INIT__' });
  let listeners = [];

  return {
    getState() {
      return state;
    },
    dispatch(action) {
      state = reducer(state, action);
      listeners.forEach((listener) => listener());
    },
    subscribe(listener) {
      listeners.push(listener);
      return () => {
        listeners = listeners.filter((l) => l !== listener);
      };
    },
  };
}

// 3. store 생성
const store = createStore(counterReducer);

// 4. 상태 변경되면 콘솔에 출력
store.subscribe(() => {
  console.log('현재 상태:', store.getState());
});

// 5. action 보내보기
store.dispatch({ type: 'counter/increment' }); // value: 1
store.dispatch({ type: 'counter/increment' }); // value: 2
store.dispatch({ type: 'counter/decrement' }); // value: 1

여기서 한 번 체크해볼 포인트

  1. createStore 안에서:
  • state는 어디서만 변경되는지?
  • dispatch가 하는 역할은 정확히 뭔지?
  1. subscribe는 어떤 상황에서 유용할지?
  • React라면 '상태 바뀔 때 컴포넌트 다시 그리기'에 해당

이 정도까지 이해되면:
Redux는 결국 ‘상태 + reducer 규칙 + 구독 시스템’을
깔끔하게 만들어놓은 라이브러리 정도 감이 옵니다.


React + Redux Toolkit 기본 패턴 맛보기

개념 정리 + 스스로 점검 질문

반응형
반응형

최근 React로 개인 프로젝트를 진행하면서 30장이 넘는 상품 이미지와 상품명 등 데이터를 하나씩 목업으로 작성하면서 렌더링 이슈가 생겼다. 오늘은 프로젝트에 적용할 수 있는 오픈 데이터API를 연결하는 과정으로 (회원가입, 인증키를 발급/등록, 이용/활용) 연습을 해보고자 한다!


Hyper foucus를 위해 'Foucus Flight'를 키고 시작해보자.


API는 무엇일까?

API (Application Programming Interface / 응용 프로그래밍 인터페이스)

API는 서로 다른 두 소프트웨어(컴퓨터 프로그램)가 상호 작용하고 정보를 교환할 수 있도록 규정한 규칙 또는 통로이다.

이를 비유하자면,

식당에 밥을 먹으러 가서 주문하고 종업원이 주문서를 주방에 전달하며 주방에서 만든 음식을 받아서 나에게 전달해 주는 중개자 역할인 샘이다.

프로그래밍 관점에서 보면,

클라이언트가 정해진 형식과 규칙(API 규격)에 맞춰 오픈 데이터의 서버에 특정 기능의 실행 또는 데이터를 요청
서버는 요청을 받고, 요청 내용을 분석하여 내부적으로 작업 처리
서버는 처리 결과를 다시 정해진 형식(대부분 JSON 또는 XML 형식의 데이터)으로 포장하여 요청한 클라이언트에게 응답으로 돌려주는 것이다.

즉, 시스템의 복잡한 내부 동작을 숨기고, 사용자가 필요로 하는 특정 기능이나 데이터에만 접근할 수 있도록 도와주는 역할이다.


공공 데이터란?

일반적으로 공기업 또는 공공기관에서 제공하는 데이터을 말한한다.

오픈 데이터란?

일반 포털사이트에서 제공하는 데이터를 말한다. 통용되는 표현으로 많이 쓴다.


알아야할 핵심적인 웹 기술 개념

1. JSON과 XML (데이터 형식)

API가 데이터를 주고받을 때 사용하는 표준 형식

  • JSON (JavaScript Object Notation):
    • 개념: 자바스크립트 객체 표기법을 기반으로 하는 가장 널리 사용되는 데이터 형식이다.
    • 특징: 사람이 읽고 쓰기 쉽고, 데이터를 주고받는 용량이 가볍다는 특징이 있다. Key-Value 쌍으로 데이터를 구조화하는 방식이다.
    • 예시: {"이름": "홍길동", "나이": 30}
  • XML (Extensible Markup Language):
    • 개념: HTML과 유사하게 태그를 사용하여 데이터를 구조화하는 형식이다.
    • 특징: 구조가 복잡할 수 있지만, 데이터의 구조와 의미를 정의하는 데 유연하다.
    • 예시: <person><name>홍길동</name><age>30</age></person>

2. AJAX (비동기 통신 기술)

웹 페이지를 새로고침하지 않고 서버와 데이터를 주고받는 기술

  • AJAX (Asynchronous JavaScript and XML):
    • 개념: Asynchronous (비동기), JavaScript and XML의 약자로, 페이지 전체를 로드하지 않고 필요한 데이터만 비동기적으로 서버에서 받아오는 기술이다.
    • 역할: API 요청 시, 사용자는 페이지를 계속 이용하고 있는 동안 백그라운드에서 데이터를 가져올 수 있게 해준다.
    • 핵심: API 요청을 보내고 응답을 받을 때까지 기다리지 않고 다음 작업을 진행할 수 있는 특징이 있다.

3. JavaScript / jQuery (프로그래밍 언어 및 라이브러리)

실제로 API 요청을 보내고 받은 데이터를 처리하는 역할을 한다.

  • JavaScript (JS):
    • 개념: 웹 브라우저가 이해하는 동작 언어이다. HTML은 구조를, CSS는 스타일을 담당한다면, JS는 웹 페이지의 상호작용동적인 기능을 담당
    • 역할: API 요청을 보내고(AJAX 역할 수행), 서버에서 받은 JSON/XML 데이터를 분석하여 웹 페이지에 표시하도록 명령하는 역할
  • jQuery:
    • 개념: 자바스크립트 라이브러리로, 복잡한 자바스크립트 코드를 간결하게 작성할 수 있도록 돕는다.
    • 역할: 특히 AJAX 통신을 매우 쉽게 처리할 수 있게 해주며, DOM 조작을 단순화하여 개발 효율을 높인다. (최근에는 순수 JS나 fetch API도 많이 사용된다.)

4. DOM (웹 페이지의 구조)

받아온 데이터를 웹 페이지의 특정 위치에 삽입하고 수정하는 대상

  • DOM (Document Object Model):
    • 개념: 웹 페이지(HTML 문서)의 내용을 객체 형태로 구조화하여, 자바스크립트가 접근하고 수정할 수 있도록 만든 모델이다.
    • 역할: API를 통해 데이터를 받아왔을 때, JS/jQuery를 사용하여 이 DOM의 특정 부분을 찾아(예: <div id="data-area">) 새로운 데이터(API 결과)를 삽입하거나 기존 내용을 변경한다.
    • 예시: API로 받아온 날씨 데이터를 <p> 태그 안에 넣어 화면에 표시

반응형
반응형

Node.js 코딩 테스트 문제를 풀다 보면 꼭 나오는 코드가 있다.
`fs.readFileSync(0)`그냥 외워서 써보기도 했지만, 
'왜 0일까?', '왜 split("\n")을 꼭 써야 하지?'가 반복적으로 문제를 풀면서 궁금해졌다. 

이 코드가 실제로 어디서 입력을 읽는지, 어떤 형태로 들어오는지(Buffer),
그리고 split("\n")을 왜 붙여야 줄 단위 입력이 제대로 되는지 파봤다.

 

요약

stdin = Standard Input (표준 입력)
프로그램이 '입력'을 받을 때 사용하는 기본 통로이다. 
Node.js에서는 fs.readFileSync(0)이 바로 이 표준 입력을 읽는 것이다. 
즉, `fs.readFileSync(0)`은 파일 디스크립터(File Descriptor) 0번(stdin)을 읽는 코드이다. 

🔍 한 문장 정리
Node.js에서 `fs.readFileSync(0)`은 표준 입력 전체를 버퍼로 읽고, `.toString()`으로 문자열화한 뒤, `.split("\n")`을 통해 줄 단위로 구분해야 여러 줄 입력을 올바르게 다룰 수 있게 한다. 

1. 파일 디스크립터(File Descriptor)와 stdin(Standard Input)의 관계

운영체제는 입출력을 ‘파일’처럼 다루기 때문에 각 통로에는 고유 번호(FD, File Descriptor)가 부여하여 파일 대신 '표준 입력' 통로를 읽도록 하는 것이다. 

fs.readFileSync(0)의 번호 의미
0 stdin (표준 입력, Keyboard 등)
1 stdout (표준 출력, console.log 등)
2 stderr (표준 에러)

 


 

2. Buffer 형태로 입력이 들어온다

Node.js는 I/O를 빠르게 처리하기 위해, 모든 입력 데이터를 2진(binary) 형태로 일단 메모리에 저장한다. 그것이 바로 Buffer(버퍼) 이다. 

예를 들어 아래처럼 입력을 받았다고 가정 해본다. 

C
89.84336
234.5678

이 입력을 `fs.readFileSync(0)`으로 읽으면 실제 내부엔 이렇게 저장된다. 

<Buffer 43 0a 38 39 2e 38 34 33 33 36 0a 32 33 34 2e 35 36 37 38>

여기서

  • 43은 'C'
  • 0a는 줄바꿈(\n)

38은 '8'
… 이런 식으로 아스키코드 값이 들어있다. 


3. `.toString()` : 버퍼 → 문자열

버퍼를 문자열로 바꾸면 이렇게 된다. 

"C\n89.84336\n234.5678"

겉보기엔 줄이 바뀐 것 같지만, 실제로는 \n이 포함된 하나의 긴 문자열이다. 


4. `.trim()` : 앞뒤 공백 제거

`.trim()`은 문자열 양 끝의 공백·줄바꿈을 제거한다. 그리고 중간의 \n은 그대로 남는다. 

"C\n89.84336\n234.5678"

 

5. `.split("\n")` : 줄 단위로 나누기

`.split("\n")`은 문자열을 줄바꿈(\n) 기준으로 자르게 된다. 즉, 사용자가 친 엔터 기준으로 배열이 만들어지는 것이다. 

"C\n89.84336\n234.5678".split("\n")
→ ["C", "89.84336", "234.5678"]

 


6.  `.split("\n")`이 없을 때는?

`.split("\n")`을 빼면 이렇게 된다. 

"C\n89.84336\n234.5678"

이건 하나의 문자열이 되어,

input[0]은 "C",
input[1]은 "\n",
input[2]는 "8" 처럼 문자 단위로만 접근이 가능하게 된다. 

즉, '줄'의 개념이 사라지는 것이다. 

 


7. 실제 입출력 순서 요약

const fs = require("fs");
let n = fs.readFileSync(0).toString().trim().split("\n");

let c = n[0];              // 문자
let a = Number(n[1]);      // 문자열 → 숫자
let b = Number(n[2]);      // 문자열 → 숫자

console.log(c);
console.log(a.toFixed(2)); // 소수 둘째 자리까지 반올림
console.log(b.toFixed(2));

입력이 다음과 같다면:

C
89.84336
234.5678

실행 과정은 아래와 같은 흐름을 보이게 된다. 

단계 처리 내용 결과
`fs.readFileSync(0)` 표준 입력 전체를 Buffer로 읽음 <Buffer ...>
`.toString()` Buffer → 문자열 "C\n89.84336\n234.5678"
`.trim()` 앞뒤 공백 제거 "C\n89.84336\n234.5678"
`.split("\n")` 줄 단위 분리 ["C", "89.84336", "234.5678"]
`Number()`, t`oFixed()` 각 줄 데이터 변환 및 출력 "C", 89.84, 234.57

 


비교 요약

구분 `split("\n")` 있음 vs. `split("\n")` 없음

데이터 형태 배열 (각 줄이 요소) 하나의 문자열
예시 값 ["C", "89.84336", "234.5678"] "C\n89.84336\n234.5678"
접근 방식 `n[0]` → 첫 줄, `n[1]` → 둘째 줄 `n[0]` → 문자 'C', `n[1]` → '\n'
사용 목적 여러 줄 입력 한 줄 입력
장점 줄 단위로 쉽게 접근 가능 문자 단위 처리 가능 (특수 경우)

 


결론

`fs.readFileSync(0)`은 표준 입력(stdin, 0번 파일 디스크립터)을 버퍼 형태로 읽어오는 코드이다. 

Node.js는 줄바꿈을 `\n` 문자로 포함한 하나의 문자열로 반환하므로, 줄 단위 입력을 처리하려면 반드시 `.split("\n")`이 필요한 것이다. 

즉, '사용자가 엔터로 구분한 입력'을 '프로그램이 배열로 구분해 다루게 만드는' 핵심 단계가 바로 `.split("\n")` 이라는 점이다!

 


참고자료

https://nodejs.org/api/fs.html#fsreadfilesyncpath-options

 

File system | Node.js v25.0.0 Documentation

File system# Source Code: lib/fs.js The node:fs module enables interacting with the file system in a way modeled on standard POSIX functions. To use the promise-based APIs: import * as fs from 'node:fs/promises';const fs = require('node:fs/promises');copy

nodejs.org

https://nodejs.org/api/process.html#processstdin

 

Process | Node.js v25.0.0 Documentation

Process# Source Code: lib/process.js The process object provides information about, and control over, the current Node.js process. import process from 'node:process';const process = require('node:process');copy Process events# The process object is an inst

nodejs.org

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split

 

String.prototype.split() - JavaScript | MDN

If separator is a string, an Array of strings is returned, split at each point where the separator occurs in the given string. If separator is a regex, the returned Array also contains the captured groups for each separator match; see below for details. Th

developer.mozilla.org

https://nodejs.org/api/buffer.html

 

Buffer | Node.js v25.0.0 Documentation

Buffer# Source Code: lib/buffer.js Buffer objects are used to represent a fixed-length sequence of bytes. Many Node.js APIs support Buffers. The Buffer class is a subclass of JavaScript's class and extends it with methods that cover additional use cases. N

nodejs.org

 

반응형
반응형

2025년 웹접근성 주요 변경 사항 개요

2025년 1월부터 웹 콘텐츠 접근성 인증 기준이 기존 22개 항목에서 33개 항목으로 크게 확대되다. 이는 약 8년 만의 대폭 개정으로, 시대 변화와 기술 발전을 반영하여 강화된 규정들이다. 특히 음성 인식 지원, 터치 제스처 대체 수단 제공, 드래그 앤 드롭 대체 방식 등이 새롭게 의무화되었다.


1. 버튼 크기 및 인터랙션 변화

과거 웹접근성 지침에서 버튼의 최소 크기는 주로 44×44픽셀 정도였으나, 2025년 지침에서는 모바일 및 터치 환경에 맞춰 최소 48×48픽셀로 확대 권고되고 있다. 사용자가 손가락으로 정확히 누를 수 있도록 더 큰 크기가 요구되며, 버튼과 인터랙션 요소 사이에 충분한 여백도 강조된다. 

또한 스와이프, 핀치 줌 등 터치 제스처 중심인 모바일 환경에서 제스처 대체 수단도 반드시 제공해야 하며, 손목이나 손가락 움직임이 불편한 사용자를 위한 다양한 조작 방법이 포함되어야 합니다.

2. 음성 인식 및 대체 수단 강화

2024년 이전 지침에서는 음성 인식 기능 지원이 명시적 의무사항은 아니었으나, 2025년부터는 웹사이트 내 음성 명령 지원이 필수적으로 권고된다. ‘헤이 구글’, ‘시리야’와 같은 음성 명령이 웹 인터페이스와 자연스럽게 연동되어야 하며, 보조기기 사용자가 음성으로 웹 콘텐츠와 상호작용할 수 있도록 해야 한다. 

이와 함께 끌어다 놓기(드래그 앤 드롭) 기능은 대체 수단, 즉 클릭 등의 방법으로도 동일한 작업이 가능해야 하며, 단일 상호작용에만 의존하면 안 된다. ​

3. 명도 대비 및 텍스트 크기

기존에는 명도 대비 비율이 4.5:1 이상으로 권고되었으나, 2025년 업데이트에서는 중요 콘텐츠에 대해 7:1 이상의 높은 명도 대비 유지가 권장되어 시각장애 사용자의 가독성을 높여야 한다. 텍스트 크기 역시 반응형 환경 최적화를 위해 최소 16px에서 스케일 조정이 필수가 되었고, 모바일에서는 12~14px로 유동적으로 변경하는 것을 인정하지만 가독성 손실이 없도록 해야 한다. ​

4. KWCAG 2.2 및 한국형 웹 콘텐츠 접근성 지침

2025년부터는 국제 WCAG 2.2를 기반으로 한 한국형 웹 콘텐츠 접근성 지침(KWCAG 2.2)이 공식 적용된다. 이 지침은 한국어 환경에 맞춘 맞춤형 규정들로, 맞춤법, 발음, 조사 등 언어 특성을 고려한 접근성 요소가 포함되어 있으며, 공공기관과 민간기업 모두 필수 준수 대상이다.


정리:  과거와 현재 비교

항목2024년 이전 기준2025년 변경 기준
심사 항목 수 22개 33개로 확대
버튼 최소 크기 44×44 픽셀 48×48 픽셀 이상 권고
터치 제스처 대체 수단 권고 수준 필수 제공
음성 인식 지원 권고 수준 필수 연동 권장
드래그 앤 드롭 단일 방식 지원 가능 대체 수단 반드시 제공
명도 대비 비율 4.5:1 이상 권고 중요한 콘텐츠 7:1 이상 권장
텍스트 크기 고정 크기 또는 제한적 반응형 지원 최소 16px 이상, 모바일 유동적 조정 허용
 
 

웹 표준과 웹접근성은 단순 기술 기준이 아닌 모두에게 공평한 정보 접근권 보장을 위한 필수 요소이다. 2025년 변경 사항을 반영해 더욱 다양하고 편리한 사용자 경험을 설계, 개발해보자! ​

  1. https://www.witheni.com/kor/index.php?pCode=MN0000003&pg=4&mode=view&idx=6256
  2. https://pure-f.tistory.com/62
  3. http://kwacc.or.kr/Board/Notice/5082/Detail?page=1
  4. https://blog.naver.com/oncodenews/223919190305?fromRss=true&trackingCode=rss
  5. https://moo-you.tistory.com/1204
  6. https://jinbytes.com/entry/KWCAG-2025-%EC%9B%B9-%EC%A0%91%EA%B7%BC%EC%84%B1-%EC%B5%9C%EC%8B%A0-%EA%B8%B0%EC%A4%80-%EC%A0%95%EB%A6%AC
  7. https://www.wa.or.kr/board/view.asp?BoardID=0001&sn=32749
  8. https://comblindness.tistory.com/entry/%E2%9C%A8-2025%EB%85%84-%EC%B5%9C%EC%8B%A0-%EA%B5%AD%EB%82%B4%EC%99%B8-%EC%A0%91%EA%B7%BC%EC%84%B1-%EB%B2%95%EA%B7%9C-%EB%B0%8F-%EC%A0%95%EC%B1%85-%EB%B3%80%ED%99%94-%ED%95%B5%EC%8B%AC%EB%A7%8C-%EC%8F%99%EC%8F%99-feat-%EC%A0%9C%EB%AF%B8%EB%82%98%EC%9D%B4-%F0%9F%A4%96
  9. https://www.wa.or.kr/board/view.asp?sn=32036&page=1&search=&SearchString=&BoardID=0001&cate=
  10. https://blog.naver.com/agapeuni/223852360075?fromRss=true&trackingCode=rss
  11. https://uiweb.tistory.com/230
  12. https://www.w3.org/WAI/standards-guidelines/ko
  13. https://www.kioskui.or.kr/index.do?menu_id=00001200
  14. https://hcdl.mohw.go.kr/notice/detail/567/1
  15. https://m.nuli.navercorp.com/community/article/1133264
  16. https://time.ly/ko/blog/%EC%A0%91%EA%B7%BC%EC%84%B1-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EA%B0%80%EC%9D%B4%EB%93%9C-%ED%8F%AC%EC%9A%A9%EC%A0%81%EC%9D%B8-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EA%B8%B0%ED%9A%8D/
  17. http://www.webwatch.or.kr/WA/010301.html?MenuCD=130
  18. https://developer.chrome.com/blog/new-in-web-ui-io-2025-recap?hl=ko
  19. https://itpe.jackerlab.com/entry/%EC%9B%B9-%EC%A0%91%EA%B7%BC%EC%84%B1-%EA%B0%80%EC%9D%B4%EB%93%9C%EB%9D%BC%EC%9D%B8Web-Accessibility-Guideline
  20. https://www.seo.incheon.kr/open_content/main/guidance/webpolicy.jsp

 

반응형
반응형

childNodes vs children의 핵심 차이

기본 개념

// HTML 구조 예시
const div = document.createElement('div');
div.innerHTML = `
    첫 번째 텍스트
    <p>단락 1</p>
    <!-- 주석입니다 -->
    <span>스팬 요소</span>
    마지막 텍스트
`;

// childNodes: 모든 종류의 자식 노드 (NodeList)
console.log(div.childNodes);
// NodeList(9) [
//   text (줄바꿈과 공백),
//   text ("첫 번째 텍스트"),
//   text (줄바꿈과 공백),
//   p,
//   text (줄바꿈과 공백),
//   comment ("주석입니다"),
//   text (줄바꿈과 공백),
//   span,
//   text ("마지막 텍스트")
// ]

// children: HTML 요소만 (HTMLCollection)
console.log(div.children);
// HTMLCollection(2) [p, span]

핵심 정리:

  • childNodes: 모든 것 (텍스트, 주석, 요소) → 정밀한 DOM 조작
  • children: HTML 요소만 → 일반적인 웹 개발
  • 대부분의 경우 children이 더 편리하고 직관적
  • DOM의 정확한 구조가 중요할 때만 childNodes 사용
반응형

'JS_개념' 카테고리의 다른 글

childNodes vs children  (0) 2025.09.19
2-1-5. Node와 Element의 차이에 대해 설명해주세요  (0) 2025.09.19
textContent  (0) 2025.09.19

+ Recent posts