리액트 강좌: 카운터앱 예제 만들기

리액트(React)는 현대 웹 개발에서 가장 인기 있는 JavaScript 라이브러리 중 하나입니다. 이 강좌에서는 리액트를 사용하여 카운터앱을 만드는 방법을 배웁니다. 카운터앱은 매우 간단한 프로젝트이지만, 리액트의 기본 개념을 이해하고 활용하는 데 큰 도움이 됩니다. 본 강좌의 목표는 다음과 같습니다:

  • 리액트의 기본 개념 이해하기
  • 리액트 컴포넌트 생성 및 관리하기
  • 상태(state)와 속성(props) 이해하기
  • 이벤트 처리 및 상태 업데이트 구현하기
  • 리액트를 통해 애플리케이션 개발하기

1. 프로젝트 준비하기

본 카운터앱 프로젝트를 시작하기 전에, 필요한 준비물을 정리해 보겠습니다. 개발에 필요한 기본적인 환경을 마련해야 합니다.

1.1. 개발 환경 설정

리액트를 사용하기 위해서는 먼저 Node.js와 npm(Node Package Manager)를 설치해야 합니다. Node.js는 JavaScript 실행 환경을 제공하고, npm은 패키지 관리를 위한 도구입니다.

  1. Node.js 다운로드: Node.js 공식 웹사이트에서 설치 프로그램을 다운로드하여 설치합니다.
  2. npm 확인: 설치가 완료된 후, 다음 명령어를 통해 설치된 Node.js와 npm의 버전을 확인합니다.
  3. node -v
    npm -v

1.2. 새로운 리액트 프로젝트 생성

리액트 프로젝트를 생성하기 위해, Create React App라는 도구를 사용합니다. 이는 리액트 앱의 초기 설정을 자동으로 구성해줍니다. 다음 명령어를 사용하여 새로운 리액트 프로젝트를 생성합니다:

npx create-react-app counter-app

위 명령어를 입력하면 counter-app이라는 이름의 폴더가 생성되며, 리액트 애플리케이션의 기본 템플릿이 설정됩니다. 완료 후 해당 폴더로 이동합니다:

cd counter-app

1.3. 개발 서버 실행

프로젝트 폴더로 이동한 후, 다음 명령어로 개발 서버를 실행할 수 있습니다:

npm start

이 명령어를 입력하면 기본 웹 브라우저에서 `http://localhost:3000` 주소로 리액트 앱이 열립니다. 초기 화면을 통해 리액트가 정상적으로 설치되었는지 확인합니다.

2. 카운터앱 설계

이제 카운터앱의 기능과 UI에 대해 간단히 설계해 보겠습니다. 기본적으로 이 앱은 사용자가 버튼을 클릭하여 카운트를 증가시키거나 감소시킬 수 있는 기능을 제공합니다.

2.1. 주요 기능

  • 카운트를 증가시키는 버튼
  • 카운트를 감소시키는 버튼
  • 현재 카운트를 표시하는 텍스트
  • 초기 카운트 값을 설정할 수 있는 기능

2.2. UI 설계

카운터앱의 UI는 간단합니다. 기본적으로 버튼 2개와 상태를 표시할 텍스트가 포함됩니다. 기본적인 HTML 구조를 통해 컴포넌트를 설계합니다.

3. 카운터앱 구현

이제 실제로 카운터앱을 구현해 보겠습니다. src 폴더 내에 Counter.js 파일을 생성하고 컴포넌트를 작성합니다.

3.1. Counter 컴포넌트 생성

import React, { useState } from 'react';

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

    const increment = () => {
        setCount(count + 1);
    };

    const decrement = () => {
        setCount(count - 1);
    };

    return (
        

현재 카운트: {count}

); }; export default Counter;

위의 코드는 간단한 카운터 기능을 포함한 리액트 컴포넌트입니다. useState 훅을 사용하여 카운트 상태를 관리합니다.

3.2. App.js에 Counter 컴포넌트 추가

이제 App.js 파일을 열어 Counter 컴포넌트를 추가합니다. 해당 파일을 다음과 같이 수정합니다:

import React from 'react';
import Counter from './Counter';

function App() {
    return (
        
); } export default App;

4. 스타일링 추가하기

카운터앱에 일부 스타일을 추가하여 더 보기 좋게 만들어 보겠습니다. 미리 정의된 CSS 파일을 사용하거나 스타일을 인라인으로 적용할 수 있습니다. 여기서는 CSS 파일을 사용하여 스타일링하겠습니다.

4.1. styles.css 파일 생성

body {
    font-family: Arial, sans-serif;
    text-align: center;
}

button {
    margin: 10px;
    padding: 10px 15px;
    font-size: 16px;
}

4.2. 스타일 적용하기

이제 스타일을 App.js에 불러와서 적용할 수 있습니다:

import React from 'react';
import './styles.css'; // 새로운 CSS 파일을 import
import Counter from './Counter';

function App() {
    return (
        
); } export default App;

5. 추가 기능 구현

이제 기본 카운터 앱이 완성되었습니다. 다음으로는 사용자가 초기 카운트 값을 설정할 수 있는 기능을 추가해 보겠습니다.

5.1. 초기 카운트 설정 기능

const Counter = () => {
    const [count, setCount] = useState(0);
    const [inputValue, setInputValue] = useState('');

    const increment = () => {
        setCount(count + 1);
    };

    const decrement = () => {
        setCount(count - 1);
    };

    const setInitialCount = (e) => {
        e.preventDefault();
        setCount(Number(inputValue));
        setInputValue('');
    };

    return (
        

현재 카운트: {count}

setInputValue(e.target.value)} />
); };

위의 코드에서 inputValue 상태를 추가하여 사용자가 숫자를 입력할 수 있도록 했습니다. 초기 값을 설정하는 버튼을 추가했고, 클릭 시 해당 값을 카운트에 적용합니다.

6. 마무리 및 배포

카운터앱의 구현을 마쳤습니다. 이제 애플리케이션을 배포할 준비를 합니다. 기본적인 방법은 두 가지가 있습니다: GitHub Pages 및 Vercel.

6.1. GitHub Pages 배포

  1. 프로젝트를 GitHub에 푸시합니다.
  2. 다음 명령어를 통해 프로젝트를 빌드합니다:
  3. npm run build
  4. 생성된 build 폴더를 GitHub Pages에 호스팅합니다.

6.2. Vercel 배포

  1. Vercel에 가입한 후, GitHub 레포지토리를 연결합니다.
  2. Vercel이 자동적으로 프로젝트를 배포합니다.

결론

이 강좌를 통해 리액트의 기본 개념과 카운터앱을 구현해 보았습니다. 이 과정을 통해 리액트의 상태 관리, 컴포넌트 생성 및 이벤트 처리 방법을 이해하는 데 도움이 되었기를 바랍니다. 이후 더 복잡한 프로젝트에 도전하며 리액트 실력을 키워보세요!

이 글이 유용하셨다면, 블로그를 구독하고 다른 강좌도 확인해보세요!

리액트 강좌: 컴포넌트

리액트는 현대적인 사용자 인터페이스를 구축하기 위해 사용되는 가장 인기 있는 JavaScript 라이브러리 중 하나입니다. 리액트는 재사용 가능한 UI 컴포넌트를 만들도록 설계되어 있어, 대규모 애플리케이션에서 복잡한 구조를 관리하고 유지하는 데 매우 유용합니다. 이 글에서는 리액트 컴포넌트에 대한 심층적인 이해를 돕기 위해 컴포넌트의 개념, 종류, 생성 방법 및 실전 예제에 대해 상세히 설명하겠습니다.

1. 컴포넌트란 무엇인가?

컴포넌트는 UI의 구성 요소로, 독립적으로 재사용 가능한 코드 조각입니다. 각 컴포넌트는 독립적인 상태와 생명 주기를 가질 수 있으며, 다른 컴포넌트와 조합하여 복잡한 UI를 구성할 수 있습니다. 컴포넌트를 사용하면 코드의 가독성을 높이고, 재사용성을 극대화할 수 있습니다.

1.1 컴포넌트의 장점

  • 재사용성: 이미 작성된 컴포넌트를 다른 프로젝트 또는 동일한 프로젝트 내에서 손쉽게 재사용할 수 있습니다.
  • 모듈화: 각각의 컴포넌트는 독립적으로 기능하므로, 코드의 유지보수가 쉬워집니다.
  • 테스트 용이성: 각 컴포넌트가 독립적으로 동작하기 때문에, 개별적으로 테스트하기도 용이합니다.

2. 컴포넌트의 종류

리액트에서 컴포넌트는 주로 두 가지 유형으로 나눌 수 있습니다: 클래스형 컴포넌트와 함수형 컴포넌트입니다.

2.1 클래스형 컴포넌트

클래스형 컴포넌트는 ES6 class 구문을 사용하여 정의됩니다. 이들은 상태(state)를 가질 수 있으며, 라이프사이클 메서드를 활용하여 컴포넌트의 생명 주기를 제어할 수 있습니다.

import React, { Component } from 'react';

class MyClassComponent extends Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
  }

  increment = () => {
    this.setState({ count: this.state.count + 1 });
  }

  render() {
    return (
      <div>
        <p>Count: {this.state.count}</p>
        <button onClick={this.increment}>Increment</button>
      </div>
    );
  }
}

export default MyClassComponent;

2.2 함수형 컴포넌트

함수형 컴포넌트는 간단한 JavaScript 함수로 정의됩니다. 리액트 Hooks가 도입된 후, 함수형 컴포넌트에서도 상태를 관리할 수 있게 되었습니다.

import React, { useState } from 'react';

const MyFunctionalComponent = () => {
  const [count, setCount] = useState(0);

  const increment = () => {
    setCount(count + 1);
  };

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

export default MyFunctionalComponent;

3. 컴포넌트 생성하기

리액트 컴포넌트를 생성하는 방법은 어려운 과정이 아닙니다. 아래에서는 클래스형 및 함수형 컴포넌트의 기본적인 예제를 통해 컴포넌트를 만드는 과정을 살펴보겠습니다.

3.1 클래스형 컴포넌트 만들기

우리는 ‘Counter’라는 이름의 카운터 컴포넌트를 만들 것입니다.

import React, { Component } from 'react';

class Counter extends Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
  }

  increment = () => {
    this.setState({ count: this.state.count + 1 });
  }

  decrement = () => {
    this.setState({ count: this.state.count - 1 });
  }

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

export default Counter;

3.2 함수형 컴포넌트 만들기

아래는 같은 기능을 가진 ‘Counter’라는 함수형 컴포넌트입니다.

import React, { useState } from 'react';

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

  const increment = () => {
    setCount(count + 1);
  };

  const decrement = () => {
    setCount(count - 1);
  };

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

export default Counter;

4. Props와 State

컴포넌트는 비슷해 보일 수 있으나, 각 컴포넌트는 데이터를 다루는 방식에서 많은 차이를 보입니다. 이 섹션에서는 props와 state에 대해 자세히 설명하겠습니다.

4.1 Props(속성)

Props는 부모 컴포넌트가 자식 컴포넌트에 데이터를 전달하는 방법입니다. Props는 읽기 전용이므로 컴포넌트 내부에서 직접 수정할 수 없습니다. 부모 컴포넌트에서 전달된 데이터를 바탕으로 컴포넌트의 렌더링 결과가 변하게 됩니다.

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

const App = () => {
  return (
    <div>
      <Welcome name="Alice" />
      <Welcome name="Bob" />
    </div>
  );
};

4.2 State(상태)

State는 컴포넌트 내에서 관리되는 데이터로, 사용자가 입력한 값이나 API 호출의 결과와 같은 동적인 데이터를 표현합니다. State가 업데이트되면 리액트는 해당 컴포넌트를 다시 렌더링하여 UI를 갱신합니다.

import React, { useState } from 'react';

const Toggle = () => {
  const [isOn, setIsOn] = useState(false);

  const toggleSwitch = () => {
    setIsOn(!isOn);
  };

  return (
    <div>
      <p>Switch is {isOn ? 'On' : 'Off'}</p>
      <button onClick={toggleSwitch}>Toggle</button>
    </div>
  );
};

5. 컴포넌트 생명주기

리액트 컴포넌트의 생명주기는 마운트, 업데이트 및 언마운트의 세 가지 주요 단계로 나뉩니다. 각 단계에서 호출되는 특정 라이프사이클 메서드가 있습니다.

5.1 마운트(Mounting)

컴포넌트가 DOM에 추가될 때 호출되는 메서드입니다. 대표적으로 constructor, componentDidMount가 있습니다.

class MyComponent extends Component {
  constructor(props) {
    super(props);
    this.state = { data: null };
  }

  componentDidMount() {
    // API 호출 등 초기 작업
  }

  render() {
    return <div>My Component</div>;
  }
}

5.2 업데이트(Updating)

컴포넌트의 props나 state가 변할 때 호출되는 메서드입니다. componentDidUpdate가 대표적입니다.

componentDidUpdate(prevProps, prevState) {
  if (this.state.data !== prevState.data) {
    // 데이터 변경 시 처리
  }
}

5.3 언마운트(Unmounting)

컴포넌트가 DOM에서 제거될 때 호출되는 componentWillUnmount 메서드입니다. 주로 청소 작업을 수행하는 데 사용됩니다.

componentWillUnmount() {
  // 타이머 정리 등
}

6. 고급 컴포넌트 패턴

리액트에서는 고급 컴포넌트 패턴을 통해 복잡한 UI의 구조를 더욱 간단하게 만들 수 있습니다. 다음은 일부 고급 컴포넌트 패턴입니다.

6.1 Higher-Order Components (HOC)

HOC는 컴포넌트를 인자로 받아 다른 컴포넌트를 반환하는 컴포넌트입니다. 이를 통해 코드의 중복을 줄이고 재사용성을 높일 수 있습니다.

const withLogging = (WrappedComponent) => {
  return class extends Component {
    componentDidMount() {
      console.log('Component mounted');
    }

    render() {
      return <WrappedComponent {...this.props} />;
    }
  };
};

6.2 Render Props

Render Props 패턴은 컴포넌트에서 함수를 props로 전달하여 렌더링할 내용을 결정하는 패턴입니다. 이를 통해 데이터를 처리하는 로직과 UI를 분리할 수 있습니다.

class DataProvider extends Component {
  render() {
    return this.props.render(data);
  }
}

7. 결론

리액트 컴포넌트는 현대 웹 개발의 핵심 구성 요소로서, 재사용성과 유지보수를 용이하게 만들어 주는 강력한 도구입니다. 이번 강좌를 통해 컴포넌트의 기본 개념, 다양한 종류, 생성 방법 및 고급 패턴에 대해 알아보았습니다. 이러한 지식을 바탕으로 여러분의 리액트 애플리케이션이 한층 더 발전할 수 있기를 바랍니다.

리액트의 컴포넌트에 대한 추가적인 정보를 원하신다면 공식 문서를 참고하시기 바랍니다. 감사합니다!

리액트 강좌: 카운터앱 예제 만들기

리액트(React)는 UI를 만들기 위해 가장 많이 사용되는 JavaScript 라이브러리 중 하나입니다. 이 강좌에서는 리액트를 사용하여 간단한 카운터 앱을 만드는 방법을 알아보겠습니다. 이 앱은 기본적인 상태(state) 관리, 이벤트 처리 및 리액트의 컴포넌트 기반 아키텍처를 활용하여 구성됩니다.

1. 프로젝트 설정

먼저, 리액트 프로젝트를 시작하기 위해 create-react-app을 사용해 보겠습니다. 이 도구는 리액트 앱을 쉽게 설정할 수 있도록 도와줍니다. 아래 명령어를 실행하여 리액트 프로젝트를 생성합니다.

        npx create-react-app counter-app
    

프로젝트가 생성되면 생성된 디렉토리로 이동합니다.

        cd counter-app
    

2. 카운터 컴포넌트 생성하기

이제 카운터 컴포넌트를 만들어 보겠습니다. src 폴더 내에 Counter.js라는 파일을 생성하고 다음 코드를 작성합니다.

        import React, { useState } from 'react';

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

    const increment = () => {
        setCount(count + 1);
    };

    const decrement = () => {
        setCount(count - 1);
    };

    return (
        

카운트: {count}

); }; export default Counter;

3. 카운터 컴포넌트 추가하기

이제 메인 App.js 파일에 이 카운터 컴포넌트를 추가해 보겠습니다. src/App.js 파일을 열고 아래와 같이 수정합니다.

        import React from 'react';
import Counter from './Counter';

function App() {
    return (
        

리액트 카운터 앱

); } export default App;

4. 앱 실행하기

모든 코드 변경이 완료되었으므로, 다음 명령어로 앱을 실행합니다.

        npm start
    

웹 브라우저에서 http://localhost:3000를 열면 기본적인 카운터 앱을 볼 수 있습니다.

5. 기능 추가하기

이제 카운터 앱에 몇 가지 추가 기능을 구현해 보겠습니다. 예를 들어, 카운트를 리셋하는 버튼과 최대값 및 최소값을 설정하는 기능을 추가할 수 있습니다.

5.1. 리셋 버튼 추가하기

카운터 컴포넌트에 리셋 버튼을 추가해 보겠습니다. 아래와 같이 코드를 수정합니다.

        const reset = () => {
        setCount(0);
    };

    return (
        

카운트: {count}

);

5.2. 최대 및 최소값 제한하기

이제 카운트가 최대값과 최소값을 초과하지 않도록 제한해 보겠습니다. 아래와 같이 코드를 수정합니다.

        const MAX_COUNT = 10;
const MIN_COUNT = 0;

const increment = () => {
    if (count < MAX_COUNT) {
        setCount(count + 1);
    }
};

const decrement = () => {
    if (count > MIN_COUNT) {
        setCount(count - 1);
    }
};
    

6. 상태 관리의 효율성

리액트에서 상태 관리 방법은 여러 가지가 있습니다. 이 앱처럼 간단한 경우에는 useState 훅이 적합하지만, 애플리케이션이 커지거나 상태 관리가 복잡해지면 Context APIRedux와 같은 외부 상태 관리 라이브러리를 고려해 볼 수 있습니다.

7. 결론

이번 강좌에서는 리액트를 사용하여 간단한 카운터 앱을 만들어 보았습니다. 기본적인 상태 관리, 이벤트 처리, 그리고 컴포넌트 기반 아키텍처에 대해 알아보았습니다. 이와 같은 기초를 바탕으로, 더 복잡한 애플리케이션을 개발할 수 있는 기반이 마련되었습니다.

8. 다음 단계

더 많은 기능을 구현하거나 디자인을 개선하여 나만의 카운터 앱을 확장해 보세요. 리액트의 다양한 기능을 활용하면 훨씬 더 복잡하고 매력적인 애플리케이션을 개발할 수 있습니다. 다음 강좌에서는 리액트 라우터를 사용하여 다중 페이지 애플리케이션을 만드는 방법에 대해 알아보겠습니다.

이 강좌가 도움이 되길 바라며, 질문이나 피드백이 있으시면 댓글로 남겨주세요!

리액트 강좌: 최적화와 메모이제이션

리액트(React)는 UI를 구축하기 위한 매우 인기 있는 JavaScript 라이브러리입니다. 리액트를 사용하면서 복잡한 애플리케이션을 관리하는 것은 쉽지 않은 작업입니다. 이 과정에서 성능 최적화 및 메모이제이션이 중요한 역할을 합니다. 본 강좌에서는 리액트 애플리케이션의 성능을 향상시키기 위한 다양한 기법 및 개념을 설명하겠습니다.

1. 리액트의 기본 개념

리액트는 컴포넌트 기반의 구조를 가지고 있으며, 각 컴포넌트는 독립적으로 상태를 관리하고 UI를 렌더링합니다. 리액트는 Virtual DOM을 통해 실제 DOM 변경을 최소화하여 성능을 향상시키는데 중점을 둡니다. 그러나 모든 컴포넌트가 무조건 효율적으로 동작하는 것은 아니며, 최적화가 필요합니다.

2. 성능 최적화의 필요성

복잡한 애플리케이션에서는 불필요한 렌더링이나 데이터를 처리하는 데 많은 시간이 소요될 수 있습니다. 이러한 문제는 사용자 경험을 저하시킬 수 있으며, 최적화가 이루어지지 않으면 애플리케이션이 느리게 동작하게 됩니다. 따라서 성능 최적화는 애플리케이션 개발에서 필수적인 부분이 됩니다.

2.1. 최적화의 목표

  • 렌더링 속도 향상
  • 상태 관리의 효율성 증가
  • 불필요한 계산 최소화

3. 리액트에서의 메모이제이션

메모이제이션(Memoization)은 함수의 결과를 저장하여, 동일한 입력 값에 대해 반복적으로 계산을 수행하지 않는 최적화 기법입니다. 리액트에서 메모이제이션을 활용하면, 렌더링 성능을 향상시킬 수 있습니다. 리액트에서는 주로 React.memo, useMemo, useCallback 훅을 사용하여 메모이제이션을 구현합니다.

3.1. React.memo

React.memo는 컴포넌트를 메모이제이션하여, 동일한 props가 전달될 경우 렌더링을 방지합니다. 예를 들어, 자식 컴포넌트가 부모 컴포넌트의 state에 의존하지 않을 때, React.memo를 사용하면 불필요한 렌더링을 줄일 수 있습니다.

const MyComponent = React.memo(({ value }) => {
    console.log("렌더링: ", value);
    return <div>{value}</div>;
});

3.2. useMemo

useMemo 훅은 컴포넌트 내에서 계산 결과를 메모이제이션하여, 의존성 배열에 지정된 값이 변경되지 않는 한 계산을 반복하지 않습니다. 이를 통해 복잡한 계산을 최적화할 수 있습니다.

const memoizedValue = useMemo(() => {
    return computeExpensiveValue(a, b);
}, [a, b]);

3.3. useCallback

useCallback은 함수를 메모이제이션하여, 의존성 배열에 지정된 값이 변경되지 않으면 이전에 생성된 함수를 재사용합니다. 이를 통해 자식 컴포넌트에 불필요한 렌더링이 발생하지 않도록 할 수 있습니다.

const memoizedCallback = useCallback(() => {
    doSomething(a, b);
}, [a, b]);

4. 리액트 최적화를 위한 추가 팁

  • 적절한 상태 관리: 프로젝트의 규모에 따라 Context API 또는 Recoil, Redux 같은 상태 관리 라이브러리를 사용하는 것이 좋습니다.
  • 불변성 유지: state의 불변성을 유지함으로써 리액트의 최적화 기능을 최대한 활용할 수 있습니다.
  • Lazy Loading: 컴포넌트나 리소스를 필요할 때만 로드하여 초기 렌더링 시간을 단축할 수 있습니다.

5. 실습: 메모이제이션 적용하기

최적화 기법을 이해한 후, 리액트 애플리케이션에 메모이제이션을 적용해보겠습니다. 다음은 메모이제이션을 활용하여 성능을 개선한 예제입니다.

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

const ExpensiveComponent = ({ calculate }) => {
    const result = useMemo(() => {
        return calculate();
    }, [calculate]);

    return <div>결과: {result}</div>;
};

const App = () => {
    const [count, setCount] = useState(0);

    const calculate = () => {
        let total = 0;
        for (let i = 0; i < 1e6; i++) {
            total += i;
        }
        return total + count;
    }

    return (
        <div>
            <button onClick={() => setCount(count + 1)}>카운트 증가</button>
            <ExpensiveComponent calculate={calculate} />
        </div>
    );
};

export default App;

6. 결론

리액트 애플리케이션의 최적화와 메모이제이션은 효율적인 성능을 제공하는 데 중요한 요소입니다. React.memo, useMemo, useCallback을 활용하여 불필요한 렌더링 및 계산을 줄임으로써, 사용자 경험을 향상시킬 수 있습니다. 본 강좌를 통해 배운 내용을 적용하여 여러분의 프로젝트에서도 성능 최적화를 이루어보세요.

리액트 강좌: 카운터 앱 예제 만들기

현대 웹 개발에서 리액트는 가장 인기 있는 라이브러리 중 하나입니다. 리액트를 사용하면 사용자 인터페이스를 구축하는 것이 쉬워지고, 컴포넌트 기반 구조 덕분에 코드의 재사용성과 관리가 용이해집니다. 이번 강좌에서는 기본적인 카운터 앱을 만들어 보면서 리액트의 기본 개념과 실제 UI 구현 방법을 살펴보겠습니다.

1. 리액트 소개

리액트는 Facebook에 의해 개발된 오픈 소스 JavaScript 라이브러리로, UI를 구성하는 컴포넌트를 만들고 관리하는 데 최적화되어 있습니다. 리액트를 사용하면 각 컴포넌트를 독립적으로 개발하고, 상태(state) 변화를 통해 동적으로 UI를 업데이트할 수 있습니다. 이를 통해 복잡한 SPA(Single Page Application)에서도 효율적으로 작업할 수 있습니다.

2. 카운터 앱 개요

카운터 앱은 가장 간단한 형태의 애플리케이션 중 하나로, 사용자가 버튼을 클릭하여 숫자를 증가시키거나 감소시키는 기능을 제공합니다. 이 예제를 통해 리액트의 기본적인 개념인 컴포넌트, 상태, 이벤트 핸들링 등을 배우게 될 것입니다.

3. 개발 환경 설정

리액트 개발을 시작하기 위해 여러분의 PC에 Node.js와 npm이 설치되어 있어야 합니다. Node.js는 JavaScript 런타임 환경이며, npm은 JavaScript 패키지 관리자입니다.

  • Node.js 설치: Node.js 공식 사이트에서 LTS 버전을 다운로드하여 설치합니다.
  • create-react-app 설치: create-react-app은 리액트 애플리케이션을 쉽게 생성할 수 있는 도구입니다. 명령어 창에서 다음 명령어를 입력하여 설치합니다.
npm install -g create-react-app

4. 새로운 리액트 프로젝트 만들기

이제 create-react-app을 사용하여 새로운 프로젝트를 생성하겠습니다. 아래의 명령어를 입력하여 ‘counter-app’이라는 이름의 프로젝트를 생성합니다:

npx create-react-app counter-app

프로젝트가 성공적으로 생성되면 디렉토리로 이동하여 앱을 실행해보겠습니다.

cd counter-app
npm start

브라우저에서 http://localhost:3000에 접속하면 기본 리액트 앱 화면을 확인할 수 있습니다.

5. 카운터 컴포넌트 구현하기

이제 카운터 기능을 구현할 컴포넌트를 만들어 보겠습니다. src 폴더 내에 Counter.js라는 파일을 생성하고, 아래와 같이 코드를 작성합니다.

import React, { useState } from 'react';

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

    const increment = () => {
        setCount(count + 1);
    };

    const decrement = () => {
        setCount(count - 1);
    };

    return (
        

카운터: {count}

); }; export default Counter;

6. App.js에 카운터 컴포넌트 추가하기

이제 방금 만든 Counter 컴포넌트를 src/App.js 파일에 추가하여 화면에 표시하겠습니다. 코드는 다음과 같습니다:

import React from 'react';
import './App.css';
import Counter from './Counter';

function App() {
    return (
        
); } export default App;

7. 스타일 적용하기

카운터 앱의 UI를 더 보기 좋게 만들기 위해 CSS를 추가해 보겠습니다. src/App.css 파일에 아래와 같은 스타일을 추가합니다:

.App {
    text-align: center;
}

.App-header {
    background-color: #282c34;
    min-height: 100vh;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    font-size: calc(10px + 2vmin);
    color: white;
}

button {
    margin: 10px;
    padding: 10px 20px;
    font-size: 16px;
    cursor: pointer;
}

8. 카운터 앱 실행하기

모든 것이 준비되었으니, 다시 npm start 명령어를 실행하여 앱을 실행합니다. 브라우저에서 카운터가 증가하고 감소하는 모습을 확인할 수 있을 것입니다.

9. 추가 기능 구현하기

카운터 앱에 더 많은 기능을 추가하여 리액트를 더 깊이 이해해 보겠습니다.

  • 리셋 기능: 카운터를 0으로 초기화하는 버튼을 추가합니다.
  • 짝수/홀수 구분: 카운터의 값을 짝수 혹은 홀수일 때 배경색을 변경합니다.

리셋 기능 추가하기

리셋 버튼을 추가해 보겠습니다. Counter.js 파일을 다음과 같이 수정합니다:

const reset = () => {
    setCount(0);
};

그리고 리셋 버튼을 아래에 추가합니다.

<button onClick={reset}>리셋</button>

짝수/홀수 구분

카운터의 값을 짝수와 홀수에 따라 배경 색상이 변경되도록 구현해 보겠습니다. 아래와 같이 Counter.js 파일을 수정합니다:

const backgroundColor = count % 2 === 0 ? 'lightblue' : 'lightcoral';

return (
    <div style={{ backgroundColor }}>
        <h1>카운터: {count}</h1>
        <button onClick={increment}>증가</button>
        <button onClick={decrement}>감소</button>
        <button onClick={reset}>리셋</button>
    </div>
);

10. 종료하며

이번 강좌를 통해 리액트의 기본적인 개념과 카운터 앱을 구현하면서 실습해 보았습니다. 리액트는 이러한 기본 컴포넌트를 바탕으로 더 복잡한 애플리케이션을 구축하는 데 도움이 되는 훌륭한 도구입니다. 이 강좌가 여러분에게 유익한 학습이 되었기를 바랍니다. 앞으로도 리액트를 활용하여 다양한 프로젝트를 만들어 보시길 추천합니다.

11. 참고 자료

이 글은 리액트 강좌의 일환으로 작성되었습니다.