배경 이미지
728x90
반응형

1. Hooks란 무엇인가?

Hooks는 React 16.8 버전에서 도입된 기능으로, 함수형 컴포넌트에서도 상태와 생명 주기를 쉽게 관리할 수 있게 해준다. 가장 자주 쓰는 두 가지 Hooks를 소개해보자(이 외에도 useMemo, useContext 등이 있다)

  1. useState: 컴포넌트의 상태(state)를 관리할 수 있는 hook . 클래스 컴포넌트에서 this.state 대신 쓰는 기능이다.
const [name, setName] = useState(''); // name이라는 상태를 만들고 초기값을 ''로 설정

 

2. useEffect: 렌더링 후 side effects를 처리할 수 있도록 설계된  hook. 컴포넌트가 처음 나타날 때나 업데이트될 때, 또는 사라질 때 특정 작업을 할 수 있게 해준다. 생명 주기를 대신한다고 생각하면 된다.useEffect는 두 번째 인자로 빈 배열([])을 넣으면 컴포넌트가 처음 나타날 때 한 번만 실행된다. 만약 상태가 변경될 때도 실행하고 싶다면, 그 상태를 배열에 넣으면 된다.

useEffect(() => { // 이 코드는 컴포넌트가 처음 나타날 때 실행된다. }, []);

 

2. React Hooks가 왜 필요한가?

먼저 React는 컴포넌트라는 작은 조각들을 모아서 화면을 만든다. 이 컴포넌트는 크게 두 가지 방식으로 만들 수 있다:

  1. 클래스 컴포넌트: 예전 방식으로 더 복잡하고 길지만, 다양한 기능을 제공한다.
  2. 함수형 컴포넌트: 더 간단하고 코드가 짧지만, 예전에는 기능이 제한적이었다.

React가 처음에는 클래스 컴포넌트만으로 복잡한 기능을 구현했지만, 코드가 길어지고 반복되는 부분이 많았다. 그래서 React 팀은 더 간단한 함수형 컴포넌트에서도 강력한 기능을 쓸 수 있도록 Hooks라는 기능을 만들었다.


3. 클래스 컴포넌트 vs 함수형 컴포넌트

클래스 컴포넌트 예시

import React, { Component } from 'react';
import Axios from 'axios';

export default class Hello extends Component {
  constructor(props) {
    super(props);
    this.state = { name: '' };  // state 초기화
  }

  // 컴포넌트가 처음 마운트될 때 (화면에 나타날 때)
  componentDidMount() {
    Axios.get('/api/user/name')
      .then(response => {
        this.setState({ name: response.data.name }); // API에서 받은 데이터를 state에 저장
      });
  }

  render() {
    return (
      <div>
        My name is {this.state.name}
      </div>
    );
  }
}

함수형 컴포넌트 + Hooks 예시

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

export default function Hello() {
  const [name, setName] = useState(''); // useState로 상태 관리

  // useEffect로 생명 주기와 비슷한 기능 구현
  useEffect(() => {
    Axios.get('/api/user/name')
      .then(response => {
        setName(response.data.name);  // API에서 받은 데이터를 state에 저장
      });
  }, []); // 빈 배열을 넣으면 처음 한 번만 실행

  return (
    <div>
      My name is {name}
    </div>
  );
}

비교

  • 클래스 컴포넌트는 상태를 관리하기 위해 this.state, constructor, componentDidMount, render 와 같은 메서드를 각각 사용한다. 생명 주기 함수라는 개념도 필요하다.
  • 반면, Hooks를 사용하는 함수형 컴포넌트는 useState와 useEffect만 있으면 훨씬 짧고 간단한 코드로 같은 기능을 구현할 수 있다.

+) React 생명 주기란?

React 컴포넌트는 화면에 나타날 때, 업데이트될 때, 사라질 때 특정 작업을 할 수 있다. 이를 생명 주기라고 부른다.

  • Mounting(마운팅): 컴포넌트가 화면에 처음 나타날 때 (componentDidMount).
  • Updating(업데이트): 컴포넌트가 변경되거나 다시 그려질 때 (componentDidUpdate).
  • Unmounting(언마운팅): 컴포넌트가 화면에서 사라질 때 (componentWillUnmount).

이런 생명 주기를 클래스 컴포넌트에서는 각각의 함수로 관리했지만, Hooks를 사용하면 useEffect 하나로 해결할 수 있다.


4. Custom Hook (사용자 정의 훅)이란?

Custom Hook은 반복되는 로직을 하나의 함수로 만들어서, 여러 컴포넌트에서 쉽게 재사용할 수 있게 해주는 기능이다.

Custom Hook 예시: useAuth

import { useState, useEffect } from 'react';
import Axios from 'axios';

function useAuth() {
  const [user, setUser] = useState(null);

  useEffect(() => {
    Axios.get('/api/user')
      .then(response => {
        setUser(response.data);
      });
  }, []);

  return user;
}

// 이 Hook을 여러 컴포넌트에서 사용할 수 있다.
export default function Profile() {
  const user = useAuth();

  if (!user) return <div>Loading...</div>;

  return <div>Welcome, {user.name}!</div>;
}

Custom Hook의 장점

  • 여러 컴포넌트에서 같은 로직을 반복하지 않고 재사용할 수 있다.
  • 코드가 훨씬 깔끔해지고 유지보수가 쉬워진다.

5. 정리

  • React Hooks는 함수형 컴포넌트에서 상태와 생명 주기를 간단하게 관리할 수 있는 도구다.
  • 클래스 컴포넌트보다 코드가 짧고 이해하기 쉽다.
  • useState로 상태를 관리하고, useEffect로 생명 주기 작업을 처리할 수 있다.
  • Custom Hook을 이용하면 여러 컴포넌트에서 반복되는 코드를 재사용할 수 있다.

 

끝😊

728x90
반응형
728x90
반응형

다음 HTML 태그에서 src와 같은 속성을 지정하듯이, 우리가 만든 컴포넌트에 어떻게 속성값을 부여할까?

<img src="image.jpg" width="100" height="100">

 

Props란 ?

Props는 React에서 Properties의 줄임말로, 리액트는 컴포넌트에 속성값을 Props를 통해서 전달한다 .

React 컴포넌트에서는 props를 통해 부모 컴포넌트에서 자식 컴포넌트로 데이터를 전달할 수 있다.

// App.js
import React from 'react';
import Toast from './components/Toast';

function App() {
  return (
    <div className="App">
      <Toast title="Props 스터디" />
    </div>
  );
}

export default App;
// Toast.js
const Toast = (props) => {
  return (
    <div>
      <h1>{props.title}</h1>
    </div>
  );
};

export default Toast;

Toast.js를 import하여 Toast컴포넌트(자식)를 가져오고 props 값으로 title값을 전달.

 

 

Props를 쿠키틀에 비유한다면?

 

Props의 특징

1. 읽기 전용:

 

  • props는 자식 컴포넌트 입장에서 변경이 불가능한 읽기 전용 속성이다. 만약 데이터의 변경이 필요하다면, 부모 컴포넌트에서 변경된 값을 자식에게 전달해야 한다. 자식 컴포넌트는 부모로부터 받은 props를 변경할 수 없으며, 이는 컴포넌트의 예측 가능성을 높이는 중요한 개념이다.

2.부모에서 자식으로 데이터 전달

  • props는 부모 컴포넌트가 자식 컴포넌트로 데이터를 전달하는 방식이다.

 

비구조화 할당 (구조 분해 할당)

ES6에서 도입된 비구조화 할당(구조 분해 할당) 문법을 사용하면, props에서 필요한 값을 더 간편하게 추출할 수 있다.

  • 기존 방식:
const Toast = (props) => {
  return (
    <div>
      <h1>{props.title}</h1>
    </div>
  );
};

 

  • 구조화 할당을 사용한 방식:
const Toast = ({ title }) => {
  return (
    <div>
      <h1>{title}</h1>
    </div>
  );
};

 

이 방식은 props.title처럼 매번 props 객체에서 값을 추출할 필요 없이, title 값을 바로 사용할 수 있어 코드를 더욱 간결하게 만든다.

 

728x90
반응형
728x90
반응형

과거의 리액트 앱 설치 방법

요즘에는 'npx create-react-app <폴더 이름>'  명령어로 리액트를 간단하고 쉽게 시작할 수 있지만, 그전에는 어떻게 리액트를 설치했는지 먼저 알아보고 가자

Create React App이 등장하기 전에는 리액트 앱을 설정하는 과정이 훨씬 복잡했다

개발자가 리액트 프로젝트를 직접 설정해야 했으며, 여기에는 여러 가지 복잡한 도구와 설정이 필요했다.

일반적으로 다음과 같은 단계를 거쳐야 한다

  1. 프로젝트 초기화: 먼저, npm init 명령어로 새 프로젝트를 초기화
  2. 리액트 및 관련 라이브러리 설치: npm install react react-dom 명령어를 사용하여 리액트와 리액트 DOM 라이브러리를 설치.
  3. Webpack 및 Babel 설정: Webpack과 Babel을 사용하여 모듈 번들링 및 코드 변환을 설정. 이는 복잡한 과정으로, 각각의 도구에 대한 설정 파일(예: webpack.config.js, .babelrc)을 수동으로 작성해야 했다.
  4. 개발 환경 설정: 개발 및 프로덕션 환경을 구분하고, 필요한 플러그인과 로더들을 설정
  5. 테스트 도구 설정: Jest나 Mocha와 같은 테스트 도구를 설정하여 코드 테스트를 진행

이 모든 과정은 시간이 많이 걸리고, 특히 초보 개발자에게는 상당한 진입 장벽이었다. 따라서, 리액트를 사용하기 위해서는 상당한 설정 작업이 필요했다.

 

Create React App의 등장

이러한 복잡한 설정 과정을 단순화하기 위해 Facebook에서 Create React App을 출시했다.

이 도구는 리액트 앱을 간단히 설치하고, 개발에 필요한 모든 설정을 자동으로 처리해 준다. Create React App을 사용하면 복잡한 설정 파일을 작성할 필요 없이, 한 줄의 명령어로 바로 리액트 프로젝트를 시작할 수 있다.

 

리액트 앱 설치 방법

리액트 앱을 설치하는 것은 터미널에서 다음 명령어를 실행하는 것만으로 간단하게 가능

npx create-react-app <폴더 이름>

또는 현재 디렉토리에 바로 리액트 프로젝트를 생성하려면 다음과 같이 명령어를 사용할 수도 있다:

npx create-react-app ./

 

내부적으로 어떤 일이 일어나는 가?

Create React App을 사용하면, Webpack과 Babel과 같은 필수 도구들이 자동으로 설정된다. 이 도구들은 현대적인 자바스크립트 개발에 필수적이다:

  • Webpack: 여러 자바스크립트 모듈을 하나의 파일로 번들링하는 모듈 번들러. 이를 통해 코드가 최적화되어 로드 시간이 줄어들고 성능이 향상된다.
  • Babel: 최신 자바스크립트 코드를 구형 브라우저에서도 실행할 수 있도록 변환해주는 자바스크립트 컴파일러. 예를 들어, 화살표 함수(arrow function)를 일반 함수 표현식으로 변환해주어 ES6를 지원하지 않는 환경에서도 코드가 작동하게 다.

 

이제는?

Node.js와 npm이 설치되어 있다는 가정하에

 

1. 리액트 앱을 만들 폴더 생성

2. 터미널 실행

3. 폴더를 새로 생성하려면 npx create-react-app <폴더 이름> 명령어를,

    현재 디렉토리에 설치하려면 npx create-react-app ./ 명령어를 실행

728x90
반응형

'React' 카테고리의 다른 글

[React] State란?  (0) 2024.08.20
[React] Props란?  (0) 2024.08.16
[React] 리액트 폴더 구조 이해  (0) 2024.08.10
[React] 브라우저 랜더링 방식 및 가상돔 사용 이유  (0) 2024.08.06
[React] 리액트란? (리액트 사용 이유)  (0) 2024.08.03

+ Recent posts