본문으로 건너뛰기
웹 프로젝트 기초집LESSON 10

DOM 조작: 프로젝트 카드를 데이터로 생성하고 갱신하기

난이도초급
예상 시간45분
선수지식9강 JavaScript와 이벤트

10강. DOM 조작: 프로젝트 카드를 데이터로 생성하고 갱신하기

1. 이번 강의에서 해결할 문제​

HTML 카드를 복사해 늘리면 같은 정보가 모달과 필터에도 중복됩니다. 프로젝트 데이터를 한곳에 두고 카드 UI를 생성합니다.

2. 학습 목표​

3. 핵심 개념​

데이터는 제목, 종류, 기술, 설명, 이미지, 링크를 보관하고 렌더 함수는 이를 DOM 요소로 바꿉니다. textContent는 문자열을 HTML로 해석하지 않아 안전합니다. 카드가 바뀔 때 문서 전체를 다시 검색하지 않고 전용 컨테이너만 교체합니다.

4. 단계별 실습​

HTML · 프로젝트 섹션 내부 카드들을 교체

game-dev-portfolio/index.html
<div id="projectGrid" class="project-grid" aria-live="polite"></div>

JavaScript · 파일 경로: js/app.js에 추가

game-dev-portfolio/js/app.js
const projects = [
{id: 'parcel-rush', type: 'unity', title: 'Parcel Rush', tech: ['Unity', 'C#'], description: '2D 택배 분류 게임', image: './assets/images/parcel-rush.webp', url: 'https://example.com/parcel-rush'},
{id: 'last-arena', type: 'unreal', title: 'Last Arena', tech: ['Unreal', 'C++'], description: '탑다운 생존 게임', image: './assets/images/last-arena.webp', url: 'https://example.com/last-arena'},
{id: 'ai-patrol', type: 'unreal', title: 'AI Patrol Lab', tech: ['Unreal', 'AI'], description: '행동 트리 실험', image: './assets/images/ai-patrol.webp', url: 'https://example.com/ai-patrol'},
];

const projectGrid = document.querySelector('#projectGrid');

function createProjectCard(project) {
const article = document.createElement('article');
article.className = 'project-card';
article.dataset.projectId = project.id;

const title = document.createElement('h3');
title.textContent = project.title;
const description = document.createElement('p');
description.textContent = project.description;
const tech = document.createElement('p');
tech.textContent = project.tech.join(' · ');
const button = document.createElement('button');
button.type = 'button';
button.dataset.action = 'open-project';
button.textContent = `${project.title} 상세 보기`;
article.append(title, description, tech, button);
return article;
}

function renderProjects(items) {
const fragment = document.createDocumentFragment();
items.forEach((project) => fragment.append(createProjectCard(project)));
projectGrid.replaceChildren(fragment);
}

renderProjects(projects);

개발자 도구 확인: Elements에서 카드가 세 개 생성되고 각 data-project-id가 다른지 확인합니다. Console에서 projects.length와 카드 수가 모두 3인지 비교합니다.

5. 코드가 동작하는 이유​

배열은 프로젝트의 단일 원본이고 map 대신 이 예제의 forEach가 각 DOM 카드를 Fragment에 넣습니다. replaceChildren은 프로젝트 그리드만 교체하므로 문서 전체를 다시 만들지 않습니다.

6. 자주 하는 실수와 해결법​

7. 직접 실습​

8. 이해 점검 질문 3개​

9. 핵심 요약​

MINI QUIZ

DOM 조작: 프로젝트 카드를 데이터로 생성하고 갱신하기 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“DOM 조작: 프로젝트 카드를 데이터로 생성하고 갱신하기” 구현을 설계할 때 책임과 구조를 올바르게 나눈 선택은 무엇인가요?
  2. 문제 2‘링크를 검증 없이 새 창으로 엶’ 실수를 판단할 때 “DOM 조작: 프로젝트 카드를 데이터로 생성하고 갱신하기” 강의가 제시한 기준은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

10강. DOM 조작: 프로젝트 카드를 데이터로 생성하고 갱신하기 미완료 상태