본문으로 건너뛰기

What is React

작성일 : 2025.01.03

목차​

  1. React 소개
  2. React vs Vue.js: 프레임워크 비교 분석
  3. React의 핵심 개념
  4. React 컴포넌트 생명주기
  5. Class Components vs Functional Components
  6. React 상태 관리
  7. 성능 최적화 전략
  8. 보안 고려사항
  9. 실전 활용 시나리오

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의 강점​

  1. 큰 생태계

    • 방대한 커뮤니티 규모
    • 풍부한 서드파티 라이브러리
    • 기업용 솔루션 다수 존재
  2. 유연성

    • 자유로운 아키텍처 설계
    • 다양한 상태 관리 솔루션
    • 서버 사이드 렌더링 (Next.js)
  3. 타입스크립트 통합

    • 우수한 타입스크립트 지원
    • 풍부한 타입 정의
    • 강력한 IDE 지원

2.2 Vue.js 대비 한계점​

  1. 학습 곡선

    • 상대적으로 높은 진입 장벽
    • JSX 학습 필요
    • 상태 관리 패턴 이해 필요
  2. 자유도로 인한 복잡성

    • 구조화된 가이드라인 부족
    • 아키텍처 결정의 어려움

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 컴포넌트 생명주기​

  1. 마운트 단계

    • constructor()
    • getDerivedStateFromProps()
    • render()
    • componentDidMount()
  2. 업데이트 단계

    • getDerivedStateFromProps()
    • shouldComponentUpdate()
    • render()
    • getSnapshotBeforeUpdate()
    • componentDidUpdate()
  3. 언마운트 단계

    • 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>;
}

7. 성능 최적화 전략​

7.1 컴포넌트 최적화​

  1. 메모이제이션
// 컴포넌트 메모이제이션
const MemoizedComponent = React.memo(MyComponent);

// 값 메모이제이션
const memoizedValue = useMemo(() => 
  expensiveComputation(props.data),
  [props.data]
);

// 콜백 메모이제이션
const memoizedCallback = useCallback(
  () => handleClick(props.id),
  [props.id]
);
  1. 코드 분할
const LazyComponent = React.lazy(() => 
  import('./LazyComponent')
);

function App() {
  return (
    <Suspense fallback={<Loading />}>
      <LazyComponent />
    </Suspense>
  );
}

7.2 렌더링 최적화​

  1. 조건부 렌더링
{isVisible && <ExpensiveComponent />}
  1. 키 최적화
<div>
  {items.map(item => (
    <ListItem
      key={item.id}
      data={item}
    />
  ))}
</div>

8. 보안 고려사항​

8.1 XSS 방어​

// 안전한 방식
<div>{userInput}</div>

// 위험한 방식 (필요한 경우에만 사용)
<div dangerouslySetInnerHTML={{ __html: userInput }} />

8.2 프로퍼티 검증​

import PropTypes from 'prop-types';

function UserCard({ user }) {
  return <div>{user.name}</div>;
}

UserCard.propTypes = {
  user: PropTypes.shape({
    id: PropTypes.number.isRequired,
    name: PropTypes.string.isRequired,
    email: PropTypes.string.isRequired
  }).isRequired
};

9. 실전 활용 시나리오​

9.1 적합한 사용 케이스​

  1. 대규모 웹 애플리케이션

    • 소셜 미디어 플랫폼
    • 기업용 대시보드
    • SaaS 솔루션
  2. 실시간 애플리케이션

    • 채팅 애플리케이션
    • 실시간 분석 도구
    • 협업 플랫폼
  3. 단일 페이지 애플리케이션 (SPA)

    • 웹 메일 클라이언트
    • 온라인 에디터
    • 미디어 스트리밍 서비스

9.2 실제 구현 예시​

// 실용적인 프로젝트 구조
src/
├── components/
│ ├── common/
│ │ ├── Button/
│ │ ├── Input/
│ │ └── Modal/
│ └── features/
│ ├── UserProfile/
│ └── Settings/
├── pages/
│ ├── Home/
│ └── Dashboard/
├── hooks/
│ ├── useAuth.js
│ └── useForm.js
├── store/
│ ├── slices/
│ │ ├── userSlice.js
│ │ └── settingsSlice.js
│ └── index.js
└── utils/
├── api.js
└── helpers.js

결론​

React는 현대 웹 개발의 중심축으로 자리 잡은 강력한 라이브러리입니다. 풍부한 생태계, 강력한 커뮤니티 지원, 그리고 유연한 아키텍처를 제공하여 다양한 규모의 프로젝트에 적합합니다. 지속적인 혁신과 성능 개선을 통해 웹 개발의 미래를 선도하고 있으며, 앞으로도 프론트엔드 개발의 핵심 도구로 자리매김할 것으로 기대됩니다.