리액트에서 가장 핵심이라고 볼 수 있는 컴포넌트는 생명 주기(=라이프사이클=Life cycle)를 가집니다.
컴포넌트는
라는 과정을 거치는데 각각의 과정마다 특정한 함수(메서드)를 실행하며 이 함수들을 생명주기함수(생명주기 메서드)라고 합니다.
내용에 들어가기에 앞서 생명주기함수는 클래스컴포넌트에서 적용이 가능하고 함수 컴포넌트에서의 생명주기는 훅(hooks)를 이용해 적용이 가능하다.
이번 포스팅에서는 class컴포넌트에서의 생명주기에 대해 알아보겠습니다.
출처 : https://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/
생명주기 함수는 총 9종의 함수가 있으며 위 이미지에서 보는데로 생명주기 함수가 호출됩니다.
그럼 각 단계별로 어떤 함수들이 호출되는지 알아봅시다.
: 컴포넌트의 인스턴스가 생성되어 DOM 상에 삽입될 때에 순서대로 호출된다
render()
class컴포넌트에서 반드시 구현돼야하는 유일한 메서드로 새 화면을 그릴 떄 자동으로 호출되는 함수 입니다.
render()함수가 반환하는 JSX를 화면에 나타내줍니다.
componentDidMount()
render()함수가 JSX를 화면에 나타낸 후 호출되는 함수로 컴포넌트가 화면에 모두 표현된 이후 필요한 작업들은 이 메서드에서 진행합니다.
: props나 state가 변경되면 렌더(업데이트)가 진행되며 아래 순서대로 호출된다.
getDerivedStateFromProps()
shouldComponentUpdate()
render()
getSnapshotBeforeUpdate()
componentDidUpdate()
(생성단계에서 설명한 함수와 중복되는 함수에 대한 설명은 생략하겠습니다.)
shouldComponentUpdate()
: 프로퍼티를 변경하거나 setState()함수를 호출하여 state값을 변경하면 '화면을 새로 출력해야 하는지' 판단하는 함수입니다
이 메서드는 화면을 출력할지 말지 판단해 데이터 변화를 비교하는 작업을 포함하므로 리액트 성능에 영향을 줍니다.
화면 변경을 위한 검증 작업을 해야 하는 경우 이 함수를 사용하면 됩니다.
getSnapshotBeforeUpdate()
: 컴포넌트에서 업데이트 된 내용이 가상 화면에 출력된 이후에 호출되는 함수입니다. 가상 화면에 출력했기 때문에 화면에 실제로 출력되기 전에 호출되는 함수이며, 출력될 요소(element)의 크기나 스크롤 위치 등의 DOM 정보에 접근할 때 사용됩니다.
componentDidUpdate()
: 컴포넌트가 실제 화면에 출력된 후에 호출되는 함수입니다.
이 함수는 부모 컴포넌트에서 전달된 이전 props와 이전 state값, getSnapshotBeforeUpdate()함수에서 반환된 값을 인자로 전달받아 이 인자들을 이용해 스크롤 위치 변경, 커서 이동 등의 DOM 정보 변경 시 사용됩니다.
: 컴포넌트가 DOM에서 제거될 떄 호출된다.
componentWillUnmount()
: 컴포넌트가 소멸되지 직전 이 함수가 호출되며 타이머 제거, componentDidMount()에서 생성된 작업 등을 정리 할 때 사용됩니다.
이 메소드를 사용하여 해제 작업을 하지 않으면 메모리 누수 현상이 발생할 수 있습니다.