리액트 기초 가이드


리액트 기초 가이드


리액트(React)는 페이스북에서 개발한 자바스크립트 라이브러리로, 현대적인 웹 애플리케이션을 구축하는 데 매우 유용합니다. 리액트는 컴포넌트 기반의 구조와 가상 DOM(Virtual DOM)을 통해 성능을 최적화하고 유지 보수를 용이하게 합니다. 이 가이드는 리액트를 처음 시작하는 개발자들이 기본 개념을 이해하고 설치 방법을 익히는 데 도움을 주기 위해 작성되었습니다.


리액트란 무엇인가?


리액트는 사용자 인터페이스를 구축하기 위한 자바스크립트 라이브러리입니다. 주로 단일 페이지 애플리케이션(SPA) 개발에 사용되며, 다양한 이유로 많은 개발자들 사이에서 인기를 끌고 있습니다.


리액트의 주요 특징

  • 컴포넌트 기반 구조: UI를 독립적이고 재사용 가능한 컴포넌트 단위로 나누어 관리할 수 있습니다.
  • 가상 DOM: 실제 DOM과 비교하여 변경된 부분만 업데이트하여 성능을 최적화합니다.
  • 단방향 데이터 흐름: 데이터가 한 방향으로 흐르기 때문에 애플리케이션의 상태를 예측 가능하게 관리할 수 있습니다.

리액트 설치하기


리액트를 설치하는 방법은 여러 가지가 있지만, 가장 간단하고 빠른 방법은 Create React App을 사용하는 것입니다. Create React App은 리액트 애플리케이션의 초기 설정을 자동으로 처리해주는 툴입니다.


Create React App 설치


  1. Node.js 설치: 먼저, Node.js가 설치되어 있어야 합니다. Node.js 다운로드 링크
  2. Create React App 설치 및 프로젝트 생성: 터미널에서 다음 명령어를 실행하여 Create React App을 설치하고, 새로운 리액트 프로젝트를 생성합니다.

npx create-react-app my-app
cd my-app
npm start

위 명령어를 실행하면 my-app이라는 이름의 새로운 리액트 프로젝트가 생성되고, 로컬 서버가 시작되어 기본 리액트 애플리케이션을 확인할 수 있습니다.


첫 번째 리액트 컴포넌트 만들기


리액트 컴포넌트는 재사용 가능한 UI 요소를 정의하는 기본 단위입니다. 리액트 컴포넌트는 함수형 컴포넌트와 클래스형 컴포넌트로 나눌 수 있습니다. 여기서는 함수형 컴포넌트를 사용하여 간단한 예제를 만들어보겠습니다.


import React from 'react';

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

export default Welcome;

위 코드에서 Welcome이라는 함수형 컴포넌트를 정의하고, props를 통해 전달받은 name을 출력합니다. 이 컴포넌트를 사용하려면 다음과 같이 작성할 수 있습니다.


import React from 'react';
import ReactDOM from 'react-dom';
import Welcome from './Welcome';

ReactDOM.render(<Welcome name="React" />, document.getElementById('root'));

이 코드는 Welcome 컴포넌트를 root DOM 요소에 렌더링합니다.


JSX의 이해와 활용


JSX는 자바스크립트 내에서 HTML과 유사한 구문을 사용할 수 있게 해주는 리액트의 문법 확장입니다. JSX는 가독성을 높이고, 코드의 구조를 직관적으로 이해할 수 있게 도와줍니다.


import React from 'react';

function App() {
  return (
    <div>
      <h1>JSX를 사용한 리액트 컴포넌트</h1>
      <p>JSX는 자바스크립트 코드 내에서 HTML을 작성할 수 있게 해줍니다.</p>
    </div>
  );
}

export default App;

위 코드에서 <div>, <h1>, <p> 요소는 모두 JSX 문법을 사용한 예입니다.


JSX의 장점

  • 가독성 향상: HTML과 유사한 구문을 사용하여 코드의 가독성이 높아집니다.
  • 컴파일 시점 오류 검출: 컴파일 시점에 문법 오류를 발견할 수 있어 디버깅이 용이합니다.
  • 자바스크립트와의 결합: JSX는 자바스크립트의 모든 기능을 사용할 수 있어 동적 렌더링이 가능합니다.

리액트의 상태 관리: useState


리액트의 useState 훅은 컴포넌트에서 상태를 관리할 수 있게 해줍니다. useState를 사용하면 컴포넌트 내부에서 동적인 데이터를 처리할 수 있습니다.


import React, { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
}

export default Counter;

위 예제에서 useState 훅을 사용하여 count 상태를 관리하고, 버튼을 클릭할 때마다 count를 증가시킵니다.


useState 훅의 사용법

  • 초기값 설정: useState 훅은 초기 상태값을 인자로 받습니다.
  • 상태값과 상태 변경 함수 반환: useState는 상태값과 그 값을 갱신하는 함수를 반환합니다.
  • 상태 변경: 상태 변경 함수에 새로운 값을 전달하여 상태를 변경할 수 있습니다.

리액트의 효과 관리: useEffect


리액트의 useEffect 훅은 컴포넌트가 렌더링될 때마다 특정 작업을 수행할 수 있게 해줍니다. 예를 들어, API 호출, 구독 설정, 수동 DOM 조작 등을 할 수 있습니다.


import React, { useState, useEffect } from 'react';

function DataFetcher() {
  const [data, setData] = useState(null);

  useEffect(() => {
    fetch('https://api.example.com/data')
      .then(response => response.json())
      .then(data => setData(data));
  }, []);

  return (
    <div>
      {data ? <p>{data}</p> : <p>Loading...</p>}
    </div>
  );
}

export default DataFetcher;

위 예제에서 useEffect 훅을 사용하여 컴포넌트가 처음 마운트될 때 데이터를 가져오고, 상태를 업데이트합니다.


useEffect 훅의 사용법

  • 의존성 배열: useEffect 훅은 두 번째 인자로 의존성 배열을 받습니다. 배열 내의 값이 변경될 때마다 효과가 다시 실행됩니다.
  • 클린업 함수: 반환값으로 클린업 함수를 지정하여 컴포넌트가 언마운트될 때 실행할 작업을 정의할 수 있습니다.

리액트 라우터로 SPA 구축하기


리액트 라우터(React Router)는 리액트 애플리케이션에 라우팅 기능을 추가하는 데 사용되는 라이브러리입니다. SPA(싱글 페이지 애플리케이션)에서는 URL 경로에 따라 다른 컴포넌트를 렌더링해야 할 때가 많습니다. 리액트 라우터를 사용하면 이러한 작업을 쉽게 수행할 수 있습니다.


리액트 라우터 설치 및 설정


리액트 라우터를 설치하려면 다음 명령어를 사용합니다:


npm install react-router-dom

설치 후, 다음과 같이 기본적인 라우터 설정을 할 수 있습니다:


import React from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import Home from './Home';
import About from './About';

function App() {
  return (
    <Router>
      <Switch>
        <Route exact path="/" component={Home} />
        <Route path="/about" component={About} />
      </Switch>
    </Router>
  );
}

export default App;

위 코드에서 BrowserRouter를 사용하여 라우터를 설정하고, Route 컴포넌트를 사용하여 경로와 해당 경로에 렌더링될 컴포넌트를 지정합니다.


리액트 라우터의 주요 컴포넌트

  • Router: 라우팅 기능을 제공하는 최상위 컴포넌트입니다.
  • Route: 특정 경로와 해당 경로에 렌더링될 컴포넌트를 지정하는 컴포넌트입니다.
  • Switch: 첫 번째로 일치하는 Route를 렌더링하도록 하는 컴포넌트입니다.
  • Link: 페이지 간 내비게이션을 제공하는 컴포넌트입니다.

리액트와 타입스크립트 통합하기


타입스크립트(TypeScript)는 자바스크립트의 슈퍼셋으로, 정적 타입 검사 기능을 제공합니다. 리액트와 타입스크립트를 통합하면 코드의 가독성과 유지보수성을 높일 수 있습니다.


타입스크립트 설치 및 설정


새로운 리액트 프로젝트를 타입스크립트로 시작하려면 다음 명령어를 사용합니다:


npx create-react-app my-app --template typescript
cd my-app
npm start

기존 프로젝트에 타입스크립트를 추가하려면 다음 명령어를 사용합니다:


npm install --save typescript @types/node @types/react @types/react-dom @types/jest

타입스크립트로 리액트 컴포넌트 작성하기


타입스크립트를 사용하여 리액트 컴포넌트를 작성하는 예제입니다:


import React from 'react';

interface WelcomeProps {
  name: string;
}

const Welcome: React.FC<WelcomeProps> = ({ name }) => {
  return <h1>Hello, {name}</h1>;
}

export default Welcome;

위 코드에서 WelcomeProps 인터페이스를 사용하여 name prop의 타입을 정의하고, React.FC 제네릭을 사용하여 함수형 컴포넌트를 작성합니다.


타입스크립트의 주요 장점

  • 정적 타입 검사: 코드 작성 시 타입 오류를 검출하여 디버깅 시간을 단축시킵니다.
  • 가독성 향상: 명시적인 타입 선언을 통해 코드의 가독성을 높이고, 협업 시 코드 이해를 돕습니다.
  • 유지보수성 향상: 코드의 변경이 발생할 때 타입 검사 덕분에 예상치 못한 오류를 방지할 수 있습니다.

리덕스로 상태 관리하기


리덕스(Redux)는 애플리케이션의 상태를 예측 가능하게 관리할 수 있는 상태 관리 라이브러리입니다. 리액트와 함께 사용하면 컴포넌트 간 상태 공유를 쉽게 할 수 있습니다.


리덕스 설치 및 설정


리덕스를 설치하려면 다음 명령어를 사용합니다:


npm install redux react-redux

리덕스 설정 예제입니다:


import { createStore } from 'redux';
import { Provider } from 'react-redux';
import rootReducer from './reducers';
import App from './App';

const store = createStore(rootReducer);

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
);

리덕스 액션과 리듀서 작성하기


리덕스 액션과 리듀서를 작성하는 예제입니다:


// actions.js
export const increment = () => {
  return {
    type: 'INCREMENT'
  };
};

export const decrement = () => {
  return {
    type: 'DECREMENT'
  };
};

// reducers.js
const initialState = {
  count: 0
};

const counter = (state = initialState, action) => {
  switch (action.type) {
    case 'INCREMENT':
      return {
        ...state,
        count: state.count + 1
      };
    case 'DECREMENT':
      return {
        ...state,
        count: state.count - 1
      };
    default:
      return state;
  }
};

export default counter;

리액트 컴포넌트에서 리덕스 사용하기


리액트 컴포넌트에서 리덕스를 사용하는 예제입니다:


import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { increment, decrement } from './actions';

function Counter() {
  const count = useSelector(state => state.count);
  const dispatch = useDispatch();

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => dispatch(increment())}>Increment</button>
      <button onClick={() => dispatch(decrement())}>Decrement</button>
    </div>
  );
}

export default Counter;

위 코드에서 useSelector 훅을 사용하여 상태를 가져오고, useDispatch 훅을 사용하여 액션을 디스패치합니다.


리덕스의 주요 구성 요소

  • 스토어(Store): 애플리케이션의 상태를 보관하는 객체입니다.
  • 액션(Action): 상태 변화를 일으키는 지시사항을 담은 객체입니다.
  • 리듀서(Reducer): 액션을 처리하여 새로운 상태를 반환하는 함수입니다.
  • 디스패치(Dispatch): 액션을 스토어에 전달하는 함수입니다.

주요 포인트 요약 및 추가 학습 자료


이 포스팅에서는 리액트의 기본 개념과 설치 방법, 첫 번째 컴포넌트 작성, JSX 이해, 상태 관리 및 효과 관리, 라우터 설정, 타입스크립트 통합, 리덕스를 사용한 상태 관리에 대해 알아보았습니다. 리액트는 강력하고 유연한 라이브러리로, 다양한 프로젝트에서 활용될 수 있습니다. 추가로 학습할 자료는 다음 링크를 참고하시기 바랍니다:


다음 이전