오늘은 2주차 학습 범위인 3장. 컴포넌트 내용을 정리하고,
해당 개념을 바탕으로 과제를 구현해보았습니다.
컴포넌트는 UI를 구성하는 독립적이고 재사용 가능한 단위입니다.
리액트는 이러한 컴포넌트를 조합하여 하나의 애플리케이션을 완성합니다.
예를 들어 하나의 웹 페이지는 다음과 같이 나눌 수 있습니다.
header : 로고, 네비게이션 바nav : 웹사이트 메뉴article : 주요 콘텐츠section : 세부 콘텐츠aside : 광고, 추가 정보footer : 저작권 정보, 연락처추상화(abstraction)
위 사진처럼 웹 페이지를 기능 단위로 나누는 과정을 추상화라고 합니다.
추상화는 복잡한 구조를 단순하게 표현함으로써
전체 시스템을 더 명확하게 이해하고 관리할 수 있도록 해줍니다

Header 컴포넌트
//Header 컴포넌트 : 로고와 내비게이션 바
function Header(){
return(
<header>
<h1>My Website</h1>
<Nav />
</header>
);
}
Navigation 컴포넌트
//Navigation 컴포넌트 : 웹 사이트 메뉴
function Nav(){
return(
<nav>Home | About | Services | Contact</Nav>
);
}
Article 컴포넌트
// Article 컴포넌트: 주요 콘텐츠
function Article(){
return(
<article>
<h2> Main Article</h2)\>
</article>
);
}
Section 컴포넌트
// Section 컴포넌트: 세부 콘텐츠
function Article(){
return(
<section>
<h3>More Details(/h3)
</section>
);
}
Aside 컴포넌트
// Aside 컴포넌트: 광고, 추가 정보
function Aside() ({
return(
<aside>
<h3>Related Links</h3>
</aside>
);
}
Footer 컴포넌트
// Footer 컴포넌트: 저작권 정보, 연락처
function Footer() {
return (
<footer>
<p>©2025 My Website. All rights reserved.</p>
</footer>
);
}
App 컴포넌트
// App 컴포넌트: 모든 컴포넌트를 조합해 전체 페이지 구성
function App() {
return (
<div>
<Header/>
<Article/>
<Aside/>
<Footer/>
</div>
);
}
plus
컴포넌트는'너무 세분화하면 관리가 어렵고, 너무 뭉뚱그리면 재사용성과 유지보수성이 떨어진다' 는 점입니다. 따라서 목적에 맞게 적절한 수준으로 나누는 것이 가장 중요합니다.
여기까지가 컴포넌트에 대한 기초 이론 정리였고
✔ 요구사항
1. 버튼 클릭 로직은 부모 컴포넌트에서 관리 2. 버튼 텍스트와 클릭 이벤트는 props로 전달 3. +1 → count 증가 4. -1 → count 감소 5. Reset → count 0 초기화 6. Alert → 현재 count 값 출력 7. 공통 Button 컴포넌트 생성
해당 과제 해결 과정을 보여드리려 합니다

src
├── components
│ └── Button.tsx
│
├── App.tsx
└── main.tsx
이처럼 파일 구성 했고,
// components/Button.tsx 코드
type ButtonProps = {
text: string
onClick: () => void
}
function Button({ text, onClick }: ButtonProps) {
return <button onClick={onClick}>{text}</button>
}
export default Button
// app.tsx 코드
import { useState } from "react"
import Button from "./components/Button"
function App() {
const [count, setCount] = useState(0)
const handleIncrease = () => setCount(count + 1)
const handleDecrease = () => setCount(count - 1)
const handleReset = () => setCount(0)
const handleAlert = () => alert(count)
return (
<div>
<h1>Count: {count}</h1>
<Button text="+1" onClick={handleIncrease} />
<Button text="-1" onClick={handleDecrease} />
<Button text="Reset" onClick={handleReset} />
<Button text="Alert" onClick={handleAlert} />
</div>
)
}
export default App
코드는 이렇게 완성한 후 실행시켜보니


과제 조건에 전부 만족하는 화면과 기능이 나왔습니다.
이번 과제를 통해 개념을 직접 코드로 구현해볼 수 있었습니다.
컴포넌트는 단순히 화면을 나누는 것이 아니라,
역할을 나누는 설계 방식이라는 점을 이해하게 되었습니다.