3주차 — React(상세)

2026. 7. 22. 21:55Javascript

목표: 컴포넌트 기반 개발 방식을 이해하고, 상태 관리와 API 연동까지 직접 구현할 수 있다.


7회차 (2시간): React 시작

0:00~0:20 | SPA 개념, 프로젝트 생성

  • SPA(Single Page Application): 페이지 전체를 다시 불러오지 않고 필요한 부분만 갱신
npm create vite@latest my-app -- --template react
cd my-app
npm install
npm run dev

0:20~0:50 | JSX 문법

  • HTML처럼 보이지만 JS 안에서 사용하는 문법. {}로 JS 표현식 삽입
const name = '민수';
function App() {
  return <h1>안녕하세요, {name}님</h1>;
}

0:50~1:20 | 컴포넌트

  • 함수형 컴포넌트: 함수 하나 = 화면의 조각 하나
function UserCard() {
  return <div>사용자 카드</div>;
}

1:20~1:50 | props

function UserCard({ name, age }) {
  return (
    <div className="card">
      <h2>{name}</h2>
      <p>{age}세</p>
    </div>
  );
}

function App() {
  return (
    <div>
      <UserCard name="민수" age={25} />
      <UserCard name="지영" age={30} />
    </div>
  );
}

1:50~2:00 | 실습

  • 정적 컴포넌트 여러 개 만들어서 조합

과제

  • 상품 카드 컴포넌트 만들기 (props로 이름/가격/이미지 전달)

8회차 (2시간): 상태와 이벤트

0:00~0:30 | useState

import { useState } from 'react';

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

0:30~0:50 | 이벤트 핸들링

<input onChange={(e) => console.log(e.target.value)} />
<button onClick={() => alert('클릭됨')}>클릭</button>

0:50~1:10 | 조건부 렌더링

{isLoggedIn && <p>환영합니다</p>}
{isLoggedIn ? <p>환영합니다</p> : <p>로그인 해주세요</p>}

1:10~1:30 | 리스트 렌더링과 key

{todos.map((todo) => (
  <li key={todo.id}>{todo.text}</li>
))}

key는 React가 각 항목을 구분하기 위해 필요 (배열 인덱스보다는 고유 id 권장)

1:30~2:00 | 실습: Todo 앱

function TodoApp() {
  const [todos, setTodos] = useState([]);
  const [input, setInput] = useState('');

  const addTodo = () => {
    if (!input) return;
    setTodos([...todos, { id: Date.now(), text: input, done: false }]);
    setInput('');
  };

  const toggleTodo = (id) => {
    setTodos(todos.map((t) => (t.id === id ? { ...t, done: !t.done } : t)));
  };

  return (
    <div>
      <input value={input} onChange={(e) => setInput(e.target.value)} />
      <button onClick={addTodo}>추가</button>
      <ul>
        {todos.map((todo) => (
          <li
            key={todo.id}
            style={{ textDecoration: todo.done ? 'line-through' : 'none' }}
            onClick={() => toggleTodo(todo.id)}
          >
            {todo.text}
          </li>
        ))}
      </ul>
    </div>
  );
}

과제

  • Todo 앱에 삭제 기능 추가
  • 완료/미완료 개수 표시

9회차 (2시간): useEffect & 실전 패턴

0:00~0:30 | useEffect 기본

useEffect(() => {
  console.log('컴포넌트 렌더링됨');
}, []); // 빈 배열 = 최초 1회만 실행

0:30~1:00 | API 데이터 fetch

import { useState, useEffect } from 'react';

function PostList() {
  const [posts, setPosts] = useState([]);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    async function fetchPosts() {
      const res = await fetch('https://jsonplaceholder.typicode.com/posts?_limit=5');
      const data = await res.json();
      setPosts(data);
      setLoading(false);
    }
    fetchPosts();
  }, []);

  if (loading) return

로딩 중...

;
  return (
    {posts.map((post) =>
  • {post.title}
  • )}
  );
}

1:00~1:20 | 폼 다루기 (controlled input)

const [form, setForm] = useState({ name: '', email: '' });
<input
  value={form.name}
  onChange={(e) => setForm({ ...form, name: e.target.value })}
/>

1:20~1:40 | props drilling, react-router 소개

npm install react-router-dom
import { BrowserRouter, Routes, Route } from 'react-router-dom';

<BrowserRouter>
  <Routes>
    <Route path="/" element={<Home />} />
    <Route path="/about" element={<About />} />
  </Routes>
</BrowserRouter>

1:40~2:00 | 실습

  • API 데이터를 받아와서 리스트로 렌더링하는 화면 만들기

과제

  • 검색 input으로 리스트 필터링 기능 구현
  • (선택) react-router로 페이지 2개 만들어 이동해보기

3주차 마무리 체크리스트

  • [ ] JSX와 HTML의 차이를 설명할 수 있다
  • [ ] useState로 상태를 관리하고 화면을 갱신할 수 있다
  • [ ] map으로 리스트를 렌더링할 때 key가 왜 필요한지 설명할 수 있다
  • [ ] useEffect로 API 데이터를 가져와 화면에 표시할 수 있다

3주차_React.md2.pdf
0.32MB

'Javascript' 카테고리의 다른 글

4주차 — Vue(상세)  (0) 2026.07.22
2주차 — JavaScript 심화(상세)  (0) 2026.07.22
1주차 — JavaScript 기초(상세)  (0) 2026.07.22
4주차 — Vue  (0) 2026.07.20
3주차 — React  (0) 2026.07.20