개발/React
React Hooks
ebkim
2024. 4. 11. 18:27
Side Effect 란?
React 컴포넌트가 화면에 1차로 렌더링된 이후에 비동기로 처리되어야 하는 부수적인 효과들
비동기로 처리되어야 하는 이유?
데이터를 가져오려고 외부 API를 호출할 때, 일단 화면에 렌더링할 수 있는 것은 1차로 렌더링하고 실제 데이터는 비동기로 가져오는 것이 권장된다.
이유는 연동된 API가 응답이 늦거나 없을 때 데미지(사용자의 답답함)를 최소화 시켜 사용자 경험 측면에서 유리하기 때문이다.
React Hooks 란?
Hooks는 리액트 v16.8에 새로 도입된 기능이다. 함수형태의 컴포넌트에서 사용되는 몇 가지 기술을 Hook이라고 부른다.
함수형 컴포넌트에서도 상태 관리를 할 수 있는 useState, 그리고 렌더링 직후 작업을 설정하는 useEffect 등의 기능을 제공한다.
잘 사용하고 있던 클래스형 컴포넌트에서 함수형 컴포넌트로 바꾸는 이유?
React를 배우는 데 있어서 클래스는 큰 진입장벽이었다. 코드의 재사용성과 코드 구성을 어렵게 만들고, this의 사용이나 이벤트 핸들러의 등록 등 기본적인 JS문법 사항을 알아야 다룰 수 있기 때문이다. 또한 클래스는 잘 축소되지 않고, reloading이 깨지기 쉽고 신뢰하기 어렵게 만든다. 따라서 react의 최신 기술들이 클래스형 컴포넌트에 효과적으로 적용되지 않았다.
- 클래스 문법이 어렵다.
- 축소가 어렵다.
- reloading의 신뢰성이 떨어진다.
- 최신 기술의 적용이 효과적이지 않다.
이러한 클래스의 단점들을 함수형 컴포넌트로 해결할 수 있다. 하지만 클래스 컴포넌트의 장점인 state 사용이나 life cycle을 직접 다루는 등의 기능을 사용하지 못한다. 이를 해결하기 위해 Hook이 등장하였다. (Hook을 사용하는 이유)
Hooks의 종류
useState()
- 함수형 컴포넌트에서도 가변적인 상태를 지닐 수 있게 해준다.
- 해당 함수의 인자에는 상태의 기본값이 들어간다.
useEffect()
- 컴포넌트가 렌더링될 때마다 특정 작업을 수행하도록 설정할 수 있다.
useReducer()
- useState보다 더 다양한 컴포넌트 상황에 따라 다양한 상태를 다른 값으로 업데이트 해주고 싶을 때 사용한다.
- 현재 상태, 업데이트를 위해 필요한 정보를 담은 액션 값을 전달받아 새로운 상태를 반환하는 함수이다. 반드시 불변성을 지켜줘야 한다.
- 첫 번째 인자로 reducer 함수를 받고, 두 번째 인자로 해당 리듀서의 기본값을 넣어준다.
- 이 Hook은 배열을 리턴하고, 첫 번째 인자가 상태고, 두 번째 인자가 dispatch 함수인 길이가 2인 배열을 리턴한다.
useMemo()
- 함수형 컴포넌트 내부에서 발생하는 연산을 최적화할 수 있다.
- 렌더링하는 과정에서 특정 값이 바뀌었을 때만 연산을 실행하고, 원하는 값이 바뀌지 않았다면 이전에 연산했던 결과를 다시 사용하는 방식이다.
useCallback()
- useMemo와 비슷하다. 주로 렌더링 성능을 최적화해야 하는 상황에 사용한다. 이벤트 핸들러 함수를 필요할 때만 생성할 수 있다.
- 첫 번째 인자에는 생성하고 싶은 함수를, 두 번째 인자에는 배열을 넣는다. 이 배열에는 어떤 값이 바뀌었을 때 함수를 새로 생성해야 하는지 명시해야 한다.
- 함수 내부에서 상태 값에 의존해야 할 때는 그 값을 반드시 두 번째 파라미터 안에 포함시켜 주어야 한다.
useRef()
- 함수형 컴포넌트에서 ref를 쉽게 사용할 수 있도록 한다.
- useRef를 통해 만든 객체 안의 current 값이 실제 엘리먼트를 가리킨다.