개요 라이브러리? React 없이? 탄생 역사 핵심 개념 SPA 생태계 📝 문제풀이
◀ 이전 📋 목차 CH 02 ▶
⚛️ CHAPTER 01 · 입문

리액트는 왜 만들어졌을까?

문법을 외우기 전에, 리액트가 어떤 문제를 풀려고 나왔는지부터 알면 훨씬 쉬워요. 이번 장은 코드보다 큰 그림과 이야기 중심입니다. 편하게 읽어 내려가세요.

🎯 이 장을 끝내면
📖
개요
리액트(React)가 뭔가요?
한 문장으로 먼저 잡고, 천천히 풀어볼게요.

리액트는 "화면(UI)을 만들기 위한 자바스크립트 라이브러리"예요. 페이스북(현 Meta)이 만들었고, 복잡한 화면을 작은 부품(컴포넌트)으로 나눠 조립하듯 만들 수 있게 해줍니다.

🧩 리액트는 "프레임워크"가 아니라 "라이브러리" 리액트는 오직 화면을 그리는 일(UI)에 집중해요. 라우팅·데이터 관리 같은 나머지는 필요하면 다른 도구를 골라 붙이는 방식이에요. 그래서 앵귤러 같은 "다 갖춘 프레임워크"와 달리 가볍고 유연합니다. 지금은 "리액트 = 화면(UI)을 부품으로 조립해 만드는 도구"라는 큰 그림만 챙기면 충분해요.
React Facebook / Meta Jordan Walke 2013 오픈소스 컴포넌트 선언형 가상 DOM 단방향 데이터 SPA
🧭
이번 장의 읽는 법. 억지로 외우지 마세요. "아, 그래서 리액트가 이런 식이구나" 하는 맥락만 잡으면 다음 장부터 나오는 JSX·컴포넌트가 훨씬 쉽게 붙습니다.
🌳 번외편 — 그런데 'DOM'이 대체 뭐예요? 「DOM과 객체」 부록 리액트는 결국 DOM을 바꿔 화면을 그려요. DOM이 뭔지 객체(Object)부터 그림과 함께 차근차근. 새 탭으로 열려요 — 다 보고 탭을 닫으면 이 자리로 돌아옵니다. 새 탭 ↗
🧰
먼저 짚기
'라이브러리'가 대체 뭐예요?
위에서 "리액트는 라이브러리"라고 했죠. 이 말부터 확실히 잡고 가요.

라이브러리를 쉽게 말하면, 누군가가 미리 만들어 놓은 유용한 코드들의 모음집이에요. 예를 들어 계산기를 만들 때 제곱근·난수 같은 걸 직접 구현하지 않고, 자바스크립트가 미리 준 Math 기능을 그냥 가져다 씁니다.

Math.sqrt(25);   // 5  (제곱근을 직접 안 만들어도 됨)
Math.random();   // 0~1 사이 난수

Math도 누군가 미리 만들어 둔 기능이에요. 이런 게 바로 라이브러리랍니다.

🏠 비유 — 집을 짓는다면 직접 다 만들면 벽돌도 굽고, 창문·문도 만들고, 못도 직접 제작해야 해서 엄청 오래 걸려요. 하지만 이미 만들어진 문·창문·계단·지붕을 가져와 조립하면 훨씬 빨라요. 라이브러리를 쓰는 이유가 바로 이거예요 — 이미 만들어진 걸 조립해서 개발 속도를 확 높이는 것.

리액트도 똑같아요. 웹 화면을 만들 때 필요한 기능들을 이미 만들어 놓은 라이브러리예요. 예를 들어 버튼을 눌렀을 때 숫자 증가 → 화면 다시 그리기 → 바뀐 부분만 업데이트하는 귀찮은 일을 리액트가 대신 해줘요. 우리는 이 정도만 쓰면 됩니다.

function Counter() {
  const [count, setCount] = useState(0);
  return (
    <>
      <h1>{count}</h1>
      <button onClick={() => setCount(count + 1)}>증가</button>
    </>
  );
}

나머지 화면 변경 · DOM 조작 · 이벤트 연결은 리액트가 알아서 처리해요. 즉 내 코드 안에서 리액트가 제공하는 기능을 가져다 쓰는 거예요.

🔎
한 줄을 뜯어보면 — const [count, setCount] = useState(0) 에서 const는 자바스크립트 문법, count는 내가 만든 변수, useState()는 리액트가 준 기능이에요. 이렇게 내 코드 + 리액트 코드가 한데 섞여 돌아갑니다.
🔨
헷갈리기 쉬운 것
함수 · 라이브러리 · 프레임워크
"함수도 라이브러리 아냐?" — 자주 나오는 질문이라 확실히 구분해요.

함수(function)하나의 기능이에요. 예를 들어 add(a, b)는 두 수를 더하는 함수 하나죠.

function add(a, b) {
  return a + b;
}

반면 라이브러리(library)함수·클래스·객체 등을 잔뜩 모아 놓은 것이에요. 리액트 안에는 useState(), useEffect(), useMemo(), createContext() 같은 수많은 기능이 들어 있어요.

🧰 비유 — 망치 vs 공구상자 함수 = 망치 한 개 🔨 · 라이브러리 = 공구상자 🧰
공구상자 안에 망치·드라이버·스패너·펜치가 들어 있듯, 라이브러리 안에는 함수·클래스·객체·상수가 들어 있어요. import { useState } from "react" = react라는 공구상자에서 useState라는 도구를 꺼내 쓰는 것.
✏️
정리. ❌ "함수도 라이브러리다"가 아니라 → ✅ "라이브러리에는 함수들이 들어 있다", "라이브러리는 여러 함수·클래스를 모아 놓은 코드 묶음이다"가 정확해요.

그럼 프레임워크(framework)는 뭐가 다를까요? 라이브러리는 내가 필요할 때 불러서 쓰니까 내 코드가 중심이에요. 반대로 프레임워크는 프레임워크가 흐름을 정하고, 내가 그 규칙에 맞춰 코드를 채워 넣죠 — 프레임워크가 중심이에요.

구분누가 부르나중심
라이브러리 (React)"필요하면 내가 부른다"내 코드
프레임워크 (Angular 등)"필요할 때 프레임워크가 내 코드를 부른다"프레임워크
🔄
이 차이를 제어의 역전(IoC, Inversion of Control)이라고 불러요. 누가 주도권(제어)을 쥐느냐가 뒤집힌다는 뜻이에요. 리액트는 라이브러리라서, 주도권은 여전히 내 코드에 있어요.
왜 필요한가
리액트를 안 쓰면 어떻게 될까?
직접 순수 자바스크립트로 만들어 보면 리액트의 고마움이 확 와닿아요.

아까 이 한 줄, 사실 세 가지 일을 동시에 하고 있어요.

const [count, setCount] = useState(0);
// 1. count 라는 상태를 저장한다
// 2. setCount() 로 값을 바꿀 수 있게 한다
// 3. 값이 바뀌면 화면을 자동으로 다시 그린다

리액트를 안 쓰면 이 세 번째(화면 갱신)를 내가 직접 해야 해요. 버튼으로 숫자를 올리는 기능을 순수 자바스크립트로 만들면 이렇게 됩니다.

<h1 id="number">0</h1>
<button id="btn">증가</button>

let count = 0;
const number = document.getElementById("number");
const button = document.getElementById("btn");

button.addEventListener("click", () => {
  count++;
  number.textContent = count;   // ← 화면을 내가 직접 바꿔줘야 함
});

변수도 직접 만들고, 값도 직접 바꾸고, 화면(textContent)까지 내가 직접 갱신해야 해요. 리액트는 바로 이 마지막 작업을 자동으로 해줘요.

const [count, setCount] = useState(0);
return (
  <>
    <h1>{count}</h1>
    <button onClick={() => setCount(count + 1)}>증가</button>
  </>
);

setCount(count + 1) 딱 이것만 하면, 리액트가 "count가 바뀌었네? 그럼 h1도 다시 그려야지" 하고 알아서 화면을 갱신해요. number.textContent = count 같은 코드를 쓸 필요가 없어요.

⚠️ 그럼 useState 없이 일반 변수(let)를 쓰면?🟦 순수 JS let count = 0 으로 만들고 버튼을 누르면 count는 0 → 1 → 2 로 증가는 해요. 하지만 화면은 계속 0만 보여요. 리액트는 일반 변수(let)가 바뀐 사실을 모르기 때문이에요. 그래서 화면과 연결된 상태(state)가 필요한 거예요.
순수 자바스크립트리액트
값 변경count++setCount(count + 1)
화면 갱신number.textContent = count (내가 직접)리액트가 자동으로
💡
그래서 useState를 단순히 "변수를 만드는 함수"로 오해하면 안 돼요. 정확히는 "리액트가 관리하는 특별한 변수(상태)를 만들고, 값이 바뀌면 화면도 함께 업데이트되도록 연결해 주는 기능"이에요. (자세한 건 CH 04에서 깊게 다뤄요.)
🌱
탄생 역사
페이스북의 골칫거리에서 시작
화면이 복잡해질수록 관리가 지옥이 되던 문제를 풀려고 나왔어요.

2000년대 후반, 웹 화면이 점점 복잡해지면서 "어디를 바꾸면 어디가 어떻게 변하는지"를 사람이 일일이 챙기기가 너무 어려워졌어요. 페이스북도 뉴스피드처럼 실시간으로 바뀌는 화면 때문에 골머리를 앓았죠. 그 해결책으로 조던 워크(Jordan Walke)라는 페이스북 엔지니어가 리액트를 만들었어요.

2011
📰 페이스북 뉴스피드에 첫 도입
조던 워크가 만든 초기 버전이 페이스북 뉴스피드에 처음 쓰여요. 화면을 "상태(state)를 그리는 함수"로 보는 발상이 핵심이었어요.
2012
📷 인스타그램에도 적용
페이스북이 인수한 인스타그램에도 쓰이면서, 페이스북 밖에서도 통한다는 게 확인돼요.
2013
🔓 오픈소스로 공개
2013년 JSConf에서 리액트가 오픈소스로 공개돼요. 처음엔 "HTML을 자바스크립트 안에 쓴다니(JSX)" 하고 낯설어했지만, 곧 엄청난 인기를 얻습니다.
2015
📱 React Native 등장
같은 개념으로 모바일 앱도 만드는 React Native가 나와요. 여기서 "Learn Once, Write Anywhere(한 번 배워 어디서든)"라는 말이 유명해졌어요.
2019
🪝 Hooks 도입 (React 16.8)
함수 컴포넌트에서도 상태와 생명주기를 쓸 수 있게 해주는 Hooks(useState·useEffect 등)가 나와요. 이때부터 함수 컴포넌트 + 훅이 표준이 됐어요. (지금 우리가 배우는 방식이에요.)
2022
⚡ React 18
동시성(Concurrent) 기능 등으로 더 매끄러운 렌더링(렌더링 = 코드를 실제 화면으로 그려 내는 것)을 지원해요. 리액트는 지금도 계속 발전 중입니다.
👤
리액트는 페이스북(현 Meta)이 만들고 관리해요. 최초 개발자는 조던 워크(Jordan Walke). "누가 만들었냐"고 하면 페이스북/조던 워크를 가리킵니다.
💡
핵심 개념
리액트를 리액트답게 만드는 4가지
이 넷만 이해하면 앞으로 나올 모든 게 이 위에 얹혀요.
① 컴포넌트 기반 (Component) 화면을 독립적이고 재사용 가능한 부품(컴포넌트)으로 쪼개요. 버튼·카드·헤더가 각각 컴포넌트고, 이들을 레고처럼 조립해 페이지를 만들어요. 한 번 만든 부품은 여러 곳에서 재사용합니다.
② 선언형 (Declarative) "결과가 어떤 모습이어야 하는지"만 적으면, 그걸 만드는 과정은 리액트가 알아서 해요(선언형). 예전 방식(명령형)은 "이 요소를 찾아서, 이 텍스트를 바꾸고, 이 클래스를 붙이고…"를 하나하나 지시했어요. 🍳 비유: 선언형은 "완성된 요리 사진"을 주는 것, 명령형은 "칼을 들고 → 양파를 썰고 → 팬을 켜고…" 단계를 일일이 지시하는 것. 리액트는 사진만 주면 돼요.
③ 가상 DOM (Virtual DOM) 실제 화면(DOM)을 직접 바꾸는 건 느려요. 리액트는 메모리 속에 가상의 DOM을 두고, 바뀌기 전과 후를 비교(diff)해서 진짜 달라진 부분만 실제 화면에 반영해요. 이 비교·반영 과정을 재조정(Reconciliation)이라고 해요.
④ 단방향 데이터 흐름 (One-way) 데이터는 부모 → 자식 한 방향으로만 흘러요(props로 내려줌). 흐름이 한 방향이라 "데이터가 어디서 와서 어디로 가는지" 추적이 쉬워요.

재조정(Reconciliation)
🎛️
state 변경
상태 값이 바뀜
🧮
가상 DOM 비교
이전 ↔ 이후 diff
🩹
달라진 곳만
실제 DOM 최소 갱신
🖥️
화면 갱신
빠르게 반영
용어의미
Reconciliation (재조정)가상 DOM을 비교해서 "무엇이 바뀌었는지" 알아내는 전체 알고리즘/과정
Diffing (diff)재조정 안에서 이전/이후를 비교하는 구체적인 비교 작업
Renderingstate/props 변화로 새 가상 DOM을 "계산"하는 단계 (그림의 1→2 사이)
Commit실제로 DOM에 반영하는 단계 (그림의 3→4)

💡
딱 한 줄 요약. "화면 = 상태를 그리는 함수." 상태가 바뀌면 리액트가 가상 DOM으로 최소한만 다시 그려줘요. 우리는 결과 모습만 선언하면 됩니다.
🪟
SPA
한 페이지에서 다 도는 앱, SPA
리액트가 주로 쓰이는 무대예요.

SPA(Single Page Application, 단일 페이지 애플리케이션)페이지 하나를 불러온 뒤, 화면 전환이 필요할 때 전체를 새로 받지 않고 필요한 부분만 자바스크립트로 바꿔치기하는 방식이에요.

🆚 전통적 방식 vs SPA 전통적(멀티 페이지) — 링크를 누를 때마다 서버에서 새 HTML 페이지를 통째로 받아 화면이 깜빡이며 갈아끼워져요.
SPA — 처음에 한 번만 받고, 이후엔 바뀌는 부분만 갈아끼워 앱처럼 매끄럽게 움직여요. 리액트는 이 SPA에서 "바뀌는 부분(UI)"을 효율적으로 그려주는 역할이에요. 페이지 전환(라우팅)은 뒤(CH 13)에서 다룹니다.
🚀
생태계
리액트는 어디에 쓰이고, 왜 배울까?
지금 프론트엔드에서 가장 널리 쓰이는 도구예요.
주변 도구역할
Vite / CRA리액트 프로젝트를 만들고 개발 서버로 띄워주는 빌드 도구. (실습에서 Vite를 썼죠.)
React RouterSPA에서 페이지 전환(라우팅)을 담당.
상태관리(Zustand·Redux)여러 컴포넌트가 공유하는 전역 상태를 관리.
Next.js리액트 기반의 풀스택 프레임워크(서버 렌더링 등).
🎓 그래서 왜 배우나 1. 수요가 압도적 — 프론트엔드 채용에서 리액트는 사실상 표준이에요.
2. 생태계가 거대 — 자료·라이브러리·커뮤니티가 방대해 막혔을 때 답을 찾기 쉬워요.
3. 개념이 전이돼요 — 컴포넌트·상태 개념을 익히면 Vue·Svelte·React Native로도 수월하게 넘어가요. 정리하면, 리액트는 "취업에 강하고 응용이 넓은" 프론트엔드의 기본기예요. 이 코스로 그 기본기를 차근차근 점검해가요.
🧠 이 장 핵심 요약
📝
문제풀이 · 점검
배운 걸 가볍게 점검해봐요
시험이 아니라 "내가 이해했나" 확인용이에요. 틀려도 바로 해설이 나와요.
🧪
문제를 풀면 즉시 정답과 해설이 나오고, 위쪽 바에 점수가 쌓여요. 네 가지 유형(객관식 · O/X · 빈칸 · 개념결과)을 섞어 두었어요.
CH 02 🏷️ JSX — HTML처럼 생긴 그 문법의 정체를 파헤치기