리액트는 컴포넌트 기반의 View를 중심으로 한 라이브러리이다. 그러다보니 각각의 컴포넌트에는 라이프사이클 즉, 컴포넌트의 수명 주기가 존재한다. 컴포넌트의 수명은 보통 페이지에서 렌더링되기 전인 준비 과정에서 시작하여 페이지에서 사라질 때 끝이난다.
라이플사이클 과정:
컴포넌트가 생겼다가 사라진다. 생겼다가 사라지는 동안에 어떤 작업을 할 것인데,
클래스인 경우, constructor -> render -> ref -> componentDidMount -> (setState/props 바뀔때) -> shouldComponentUpdate(true)-> render -> componentDidUpdate -> 부모가 나를 없앴을 때 -> componentWillUnmount -> 소멸
(클래스 설명) : constructor(state, 메서드 등)이 실행되고 처음으로 render가 실행된다. 그 다음 ref를 설정해주는 부분이 실행된다. 그리고 componentDidMount가 실행되고 setState나 Props가 바뀔 때 componentDidUpdate가 실행되고 부모가 나를 없앴을 때 componentWillUnmount가 실행되고 소멸된다.
componentDidMount에서 비동기 요청을 많이 한다. 예를 들어 setInterval이 될 수 있다. 그리고 componentWillUnmount에서는 비동기 요청을 정리한다.
setInterval이 일정 시간마다 반복 작업을 해주는 것임을 우리는 알고 있다. 그러면 렌더링 후에 componentDidMount 실행되어서 일정시간 간격으로 하는(setInterval) 반복 작업을 계속 해준다. 문제는 컴포넌트가 사라져도 setInterval을 취소 해주지 않는다. 그러면 웹사이트를 끌 때 까지 해당 컴포넌트가 사라졌다해도 계속 setInterval은 실행되고 있다.
여기서 더 큰 문제가 발생할 수 있다. 만약 RSP 라는 컴포넌트가 있고 렌더링 되고 setInterval이 1초마다 실행된다. 그리고 RSP컴포넌트가 사라졌다가, 또 어떤 계기로 RSP 컴포넌트가 화면에 붙었다가 사라지면, 기존에 실행되고 있었던 setInterval에다가setInterval 하나 추가 되어서 두개가 같이 돌아가게 된다. 이 작업이 반복되면 setInterval이 계속 중첩이된다. 이러한 비동기 함수들이 메모리를 계속 차지하기 때문에 flooding이 생긴다. 그래서 완료되지 않는 비동기 요청은 componentWillUnmount에서 처리를 해줘야한다.
그래서 취소를 해주어야한다.
이런 식으로 해준다.
render가 처음 실행되고 성공적으로 실행됐다면 componentDidMount가 실행된다. 그 다음 setState로 인해서 리 렌더링이 일어날 때는 componentDidMount가 실행되지 않는다.
그리고 컴포넌트가 제거되기 직전에는 componentWillUnmount 가 실행된다. 부모가 나(컴포넌트)를 없앴을 때 실행된다.
render에서 setState를 사용하면 무한하게 렌더링 되어서 문제가 생긴다. 그러면 render에 setState를 사용해야 하는 상황에는 어디에다 써야할까? componentDidMount에 사용해야한다.
componentDidUpdate는 setState를 하던 Props가 바뀌었다하면 render 부분이 다시 실행되잖아요. 리렌더링 후에는 componentDidUpdate가 실행된다.
'프레임워크 > React' 카테고리의 다른 글
[React] useMemo (0) | 2021.07.29 |
---|---|
[React] useCallback (0) | 2021.07.29 |
[React] useReducer (0) | 2021.07.29 |
[React] contextAPI (0) | 2021.07.29 |
[React] PureComponent와 shouldComponentUpdate (0) | 2021.07.23 |