2025-08-03

1. 오늘 한 것 (What I Did)

  • React 프로젝트 생성: [Vite] npm create vite@latest my-react-app -- --template react
  • HTML 페이지("꾸준히 씁시다 클럽" OT 페이지)를 React JSX 컴포넌트로 변환
  • 컴포넌트별 데이터 구조화 및 분리 작업 
  • 조건부 렌더링으로 동적 UI 그리기 → type에 따라 다른 화면 보여주는거 
  • Header, TimeTable, ClubIntroduction, MiniWorkshop, Declaration 컴포넌트 완성

2. 새로 이해한 것 (What I Learned)

2-1. React의 동작 원리

2-1-1. public/index.html - 웹 페이지의 기본 골격 제공

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Vite + React</title>
</head>
<body>
  <div id="root"></div>  <!-- React 삽입 지점 -->
  <script type="module" src="/src/main.jsx"></script>
</body>
</html>
  • 브라우저가 이해할 수 있는 표준 HTML 구조 유지
  • SEO, 접근성 등 웹 표준 준수
  • React 없이도 기본 페이지 로딩 가능

2-1-2. src/main.jsx - HTML과 React 컴포넌트를 연결

import ReactDOM from 'react-dom/client'
import App from './App.jsx'

// HTML의 root div를 찾고 → React 컴포넌트를 그 안에 삽입
ReactDOM.createRoot(document.getElementById('root')).render(<App />)
  • DOM에서 id="root"인 요소 탐색
  • 해당 요소를 React 컨테이너로 변환
  • App 컴포넌트를 그 컨테이너에 렌더링

2-1-3. src/App.jsx - 사용자가 보는 실제 UI와 로직

function App() {
  return (
    <div className="App">
      <h1>화면에 나타날 내용</h1>
    </div>
  )
}

 

2-1-4. ⚙️ 연결 과정의 논리적 순서

Phase 1: 초기 로딩

브라우저 요청 → 서버가 index.html 전송 → 브라우저가 파싱
Phase 2: React 시작
<script src="/src/main.jsx"> 실행 → React 라이브러리 로드
 
Phase 3: DOM 연결
document.getElementById('root') → 빈 div 요소 획득
 
Phase 4: 컴포넌트 삽입
ReactDOM.createRoot(rootElement) → React 컨테이너 생성
.render(<App />) → App 컴포넌트를 JSX→HTML 변환 후 삽입
 
Phase 5: 최종 결과
<!-- 브라우저에서 실제로 보이는 DOM -->
<div id="root">
  <div className="App">  <!-- App 컴포넌트가 변환된 HTML -->
    <h1>실제 화면에 나타날 내용</h1>
  </div>
</div>​

2-2. HTML → React 변환의 핵심 원리

  • HTML: class="header" → React: className="header"
  • HTML: 고정된 페이지 → React: 데이터 바뀌면 화면도 바뀜

2-3. React 컴포넌트 이름 규칙

  • 컴포넌트: Header (대문자 시작)
  • 변수: userData (소문자 시작)

2-4. 배열을 화면에 그리기

{items.map((item, index) => (
    <div key={index}>{item.name}</div>
))}
  • key={index} 꼭 써야 함! (성능 때문에)

2-5. 조건부 렌더링

{type === 'image' && <img src="..." />}  // type이 image면 이미지 보여줘
{type === 'code' && <CodeBlock />}       // type이 code면 코드 블록 보여줘
  • && 연산자: JavaScript 단축 평가 활용 (true && JSX → JSX 렌더링)
  • === vs ==: 엄격한 비교 vs 느슨한 비교, React에서는 === 권장
  • 동적 값은 중괄호 {}, 정적 값은 따옴표 ""

2-6. 화살표 함수 return 규칙

// 이렇게 쓰면 return 생략 가능
const Component = () => (
    <div>내용</div>
)

// 이렇게 쓰면 return 꼭 써야 함
const Component = () => {
    return <div>내용</div>
}
  • 소괄호 (): 암시적 반환, return 키워드 불필요
  • 중괄호 {}: 명시적 반환, return 키워드 필수
  • return 없으면 undefined 반환되어 렌더링 안됨

3. 실수했던 부분들 (What I Struggled With)

  • className={'class ${variable}'} → className={`class ${variable}`}  (백틱 사용)
  • 중첩된 map에서 매개변수명 겹침 → 외부(item, index), 내부 (content, contentIndex)로 구분
  • 조건부 렌더링에서 변수명 착각: workshops.type → item.type (현재 반복 요소 사용)
  • 괄호 짝 맞추기: 객체 {}, 배열 [], JSX 표현식 {} 

4. 여전히 잘 모르겠는 부분 

  1. DOM이 뭔지 감이 안 옴
    • 뼈대나 구조 같은 건 알겠는데 정확한 정체를 모르겠음
    • React 더 써보면서 자연스럽게 이해될 것 같음
  2. 문법이 아직 헷갈림
    • 백틱, 중괄호, 괄호 짝 맞추기 등
    • === vs ==, className vs class 같은 것들
    • 패턴은 익숙해졌지만 여전히 실수함
  3. React 라이브러리 기능을 잘 모름
    • useState, useEffect 같은 Hook들

 

'TIL' 카테고리의 다른 글

2025-08-09 NestJS + TypeORM DB 연동  (4) 2025.08.10
2025-08-06  (6) 2025.08.10
2025-07-31  (5) 2025.07.31
2025-07-30  (4) 2025.07.31
2025-07-21  (3) 2025.07.23