November 08, 2021
모든 리액트 컴포넌트에는 라이프사이클
이 존재한다. 컴포넌트의 수명은 페이지에 렌더링되기 전인 준비 과정에서 시작하여 페이지에서 사라질 때 끝난다.
리액트 프로젝트를 진행하다 보면 컴포넌트를 처음으로 렌더링할 때 어떤 작업을 처리해야 하거나 컴포넌트를 업데이트하기 전후로 어떤 작업을 처리해야 할 수도 있고, 불필요한 업데이트를 방지해야 할 때가 있다.
이때 컴포넌트의 라이프사이클 메서드를 사용한다. 라이프사이클 메서드는 클래스형 컴포넌트에서만 사용 가능하다. 함수형 컴포넌트에서는 useEffect Hook
을 사용하여 비슷한 기능을 처리할 수 있다. useEffect는 다른 페이지에서 자세하게 다루겠다.
대신 이 글에서는 생명주기 메서드를 설명하며 생명주기 메서드 각각이 Hook에 어떻게 대응하는지에 대해서 간략하게나마 알아보겠다.
출처: React Lifecycle Methods diagram tweeted by Dan Abramov
라이프사이클 메서드에는 9가지(위 그림엔 없는 componentDidCatch까지 포함하여)가 있다. 총 세 가지, 마운트
, 업데이트
, 언마운트
카테고리로 나누어 구분한다.
DOM이 생성되고 웹 브라우저상에 나타나는 것이 마운트이다. 컴포넌트가 처음 실행될 때에 해당한다.
이때 호출하는 메서드는 다음과 같다.
컴포넌트를 새로 만들 때마다 호출되는 클래스 생성자 메서드이다. 초기 state를 정할 수 있다.
➡ 함수 컴포넌트에서는 constructor가 필요하지 않다. useState 호출에서 state를 초기화할 수 있다.
props에 있는 값을 state에 넣을 때 사용하는 메서드이다.
➡ getDerivedStateFromProps를 어떻게 구현합니까? 참조
우리가 준비한 UI를 렌더링하는 메서드이다.
⚠️ 이 메서드 안에서는 이벤트 설정이 아닌 곳에서 setState를 사용하면 안 되며, 브라우저의 DOM에 접근해서도 안 된다. DOM 정보를 가져오거나 state에 변화를 줄 때는 componentDidMount에서 처리해야 한다.
➡ 함수 컴포넌트는 본체 자체가 render이다.
컴포넌트가 웹 브라우저상에 나타난 후(첫 렌더링을 다 마친 후) 호출하는 메서드이다. 이 안에서 다른 자바스크립트 라이브러리 또는 프레임워크 함수를 호출하거나 이벤트 등록, setTimeout, setInterval, 네트워크 요청 같은 비동기 작업을 처리하면 된다.
➡ useEffect Hook으로 구현 가능하다.
컴포넌트는 총 네 가지 경우에 업데이트된다.
컴포넌트를 업데이트할 때 호출하는 메서드는 다음과 같다.
마운트 과정에서도 호출되는 메서드로, 업데이트가 시작하기 전에도 호출된다. props가 변함에 따라 state 값에도 변화를 주고 싶을 때 사용한다.
컴포넌트가 리렌더링을 해야 할지 말아야 할지를 결정하는 메서드이다. 이 메서드에는 true 혹은 false 값을 반환(이 메서드를 따로 생성하지 않으면 기본적으로는 언제나 true 값을 반환) 해야 하며, true를 반환하면 다음 라이프사이클 메서드를 계속 실행하고, false를 반환하면 작업을 중지한다. 즉, 컴포넌트가 리렌더링되지 않는다 만약 특정 함수에서 this.forceUpdate() 함수를 호출한다면 이 과정을 생략하고 바로 render 함수를 호출한다.
렌더링 성능 최적화를 위해 사용하는 메서드이다.
➡ React.memo와 관련 있다. shouldComponentUpdate는 어떻게 구현합니까? 참조
이 역시 마운트 과정에서도 호출되는 메서드로, 컴포넌트를 리렌더링한다.
컴포넌트 변화를 DOM에 반영하기 바로 직전에 호출하는 메서드이다. 이 메서드에서 반환하는 값은 componentDidUpdate의 파라미터로 전달된다. 스크롤바 위치 유지와 같이 업데이트 직전의 값을 참고할 일이 있을 때 활용된다.
➡ 해당하는 Hook이 아직 없다.
컴포넌트의 업데이트 작업이 끝난 후(리렌더링을 완료한 후) 호출하는 메서드이다.
업데이트가 끝난 직후이므로 DOM 관련 처리를 해도 무방하다.
➡ useEffect Hook으로 구현 가능하다.
마운트의 반대 과정, 즉 컴포넌트를 DOM에서 제거하는 것을 언마운트라고 한다.
이때 호출하는 메서드는 하나밖에 없다.
컴포넌트가 웹 브라우저상에서 사라지기 전에(DOM에서 제거할 때) 호출하는 메서드이다.
⚠️ componentDidMount에서 등록한 이벤트, 타이머, 직접 생성한 DOM이 있다면 여기서 제거 작업을 해야 한다.
➡ useEffect Hook으로 구현 가능하다.
위 세 가지 카테고리에는 속하지 않는 다른 라이프사이클 메서드가 있다.
componentDidCatch는 컴포넌트 렌더링 도중 에러가 발생했을 때 애플리케이션이 먹통이 되지 않고 오류 UI를 보여줄 수 있게 해준다.
그러나 컴포넌트 자신에게 발생하는 에러를 잡아내는 것이 아니라 자신의 this.props.children으로 전달되는 컴포넌트에서 발생하는 에러만 잡아낼 수 있다는 것을 명심해야 한다.
➡ 해당하는 Hook이 아직 없다.