What is React
작성일 : 2025.01.03
목차
- React 소개
- React vs Vue.js: 프레임워크 비교 분석
- React의 핵심 개념
- React 컴포넌트 생명주기
- Class Components vs Functional Components
- React 상태 관리
- 성능 최적화 전략
- 보안 고려사항
- 실전 활용 시나리오
1. React 소개
React는 Facebook에서 개발한 사용자 인터페이스를 구축하기 위한 JavaScript 라이브러리입니다. '컴포넌트' 기반의 접근 방식을 통해 재사용 가능한 UI를 만드는 것이 핵심 철학입니다.
1.1 주요 특징
- 컴포넌트 기반: 재사용 가능한 독립적 UI 단위
- Virtual DOM: 효율적인 DOM 업데이트 메커니즘
- 단방향 데이터 흐름: 예측 가능한 상태 관리
- JSX: JavaScript 내 XML 스타일 구문
- 풍부한 생태계: 다양한 라이브러리와 도구 지원
1.2 기술 스택 구성
React 코어
├── React Router (라우팅)
├── Redux/MobX/Zustand (상태 관리)
├── Create React App (개발 도구)
└── React DevTools (디버깅 도구)
2. React vs Vue.js: 프레임워크 비교 분석
2.1 React의 강점
-
큰 생태계
- 방대한 커뮤니티 규모
- 풍부한 서드파티 라이브러리
- 기업용 솔루션 다수 존재
-
유연성
- 자유로운 아키텍처 설계
- 다양한 상태 관리 솔루션
- 서버 사이드 렌더링 (Next.js)
-
타입스크립트 통합
- 우수한 타입스크립트 지원
- 풍부한 타입 정의
- 강력한 IDE 지원
2.2 Vue.js 대비 한계점
-
학습 곡선
- 상대적으로 높은 진입 장벽
- JSX 학습 필요
- 상태 관리 패턴 이해 필요
-
자유도로 인한 복잡성
- 구조화된 가이드라인 부족
- 아키텍처 결정의 어려움
3. React의 핵심 개념
3.1 기본 문법
// 함수형 컴포넌트
function MyComponent({ name }) {
const [count, setCount] = useState(0);
// 파생된 상태
const doubleCount = useMemo(() => count * 2, [count]);
// 부수 효과
useEffect(() => {
console.log(`Count changed to ${count}`);
}, [count]);
return (
<div>
<h1>Hello, {name}!</h1>
<p>Count: {count}</p>
<p>Double: {doubleCount}</p>
<button onClick={() => setCount(count + 1)}>
Increment
</button>
</div>
);
}
3.2 주요 Hooks
// 상태 관리
const [state, setState] = useState(initialState);
// 부수 효과
useEffect(() => {
// 마운트/업데이트 시 실행
return () => {
// 클린업 함수
};
}, [dependencies]);
// 참조 값
const ref = useRef(initialValue);
// 메모이제이션
const memoizedValue = useMemo(() => computeValue(), [deps]);
const memoizedCallback = useCallback(() => {
doSomething();
}, [deps]);
4. React 컴포넌트 생명주기
4.1 Class 컴포넌트 생명주기
-
마운트 단계
- constructor()
- getDerivedStateFromProps()
- render()
- componentDidMount()
-
업데이트 단계
- getDerivedStateFromProps()
- shouldComponentUpdate()
- render()
- getSnapshotBeforeUpdate()
- componentDidUpdate()
-
언마운트 단계
- componentWillUnmount()
4.2 Hooks를 사용한 생명주기 관리
function LifecycleComponent() {
// 마운트
useEffect(() => {
// componentDidMount
return () => {
// componentWillUnmount
};
}, []);
// 업데이트
useEffect(() => {
// componentDidUpdate
}, [dependency]);
// 렌더링
return <div>Component Content</div>;
}
5. Class Components vs Functional Components
5.1 Class Components
class UserProfile extends React.Component {
constructor(props) {
super(props);
this.state = {
userData: null
};
}
async componentDidMount() {
const data = await fetchUserData();
this.setState({ userData: data });
}
render() {
const { userData } = this.state;
return (
<div>
{userData ? (
<UserInfo data={userData} />
) : (
<Loading />
)}
</div>
);
}
}
5.2 Functional Components
function UserProfile() {
const [userData, setUserData] = useState(null);
useEffect(() => {
const fetchData = async () => {
const data = await fetchUserData();
setUserData(data);
};
fetchData();
}, []);
return (
<div>
{userData ? (
<UserInfo data={userData} />
) : (
<Loading />
)}
</div>
);
}
6. React 상태 관리
6.1 Redux 구조
// store/slice.js
import { createSlice } from '@reduxjs/toolkit';
const counterSlice = createSlice({
name: 'counter',
initialState: {
value: 0
},
reducers: {
increment: state => {
state.value += 1;
},
decrement: state => {
state.value -= 1;
}
}
});
export const { increment, decrement } = counterSlice.actions;
export default counterSlice.reducer;
6.2 Context API
// Context 생성
const UserContext = React.createContext();
// Provider 컴포넌트
function UserProvider({ children }) {
const [user, setUser] = useState(null);
return (
<UserContext.Provider value={{ user, setUser }}>
{children}
</UserContext.Provider>
);
}
// Consumer 컴포넌트
function UserProfile() {
const { user } = useContext(UserContext);
return <div>{user.name}</div>;
}