우선 자신의 PC 또는 서버에서 돌아가는 React 버전을 확인해보자

이유는 React 버전에 따라 Deprecate 된 함수가 있기 때문이다. 

 

- React 프로젝트에서 확인 : {React.version} 

- 터미널에서 확인 :   yarn info react    ( 단, yarn 이 설치되어 있어야 한다. )

  * 터미널에서 yarn 확인 시 훨씬 (압도적으로) 많은 정보가 나온다.   

 

터미널에서 react 버전 확인

 

가장 좋은것은 React 홈페이지의 공식 문서를 보는것이다. 

기술적인 문서는 상당수가 영문만 지원되는 경우가 많지만, React 는 한글도 아주 풍부하게 제공하고 있다. 

 

'React 공식 한글 문서 링크'

 

위 문서 링크에 있는 내용 중 일부를 발췌 하겠다. 

 

(주의: React17 부터는 componentWillMount, componentWillUpdate, componentWillReceiveProps 라이프 사이클이

          deprecate 된다. )

 

Mount

컴포넌트가 처음 실행될 때 그것을 Mount라고 표현합니다. 컴포넌트가 시작되면 우선 context, defaultProps와 state를 저장합니다. 그 후에 componentWillMount 메소드를 호출합니다. 그리고 render로 컴포넌트를 DOM에 부착한 후 Mount가 완료된 후 componentDidMount가 호출됩니다.

주의할 점은, componentWillMount에서는 props나 state를 바꾸면 안 됩니다. Mount 중이기 때문이죠. 그리고 아직 DOM에 render하지 않았기 때문에 DOM에도 접근할 수 없습니다.

componentDidMount에서는 DOM에 접근할 수 있습니다. 그래서 여기에서는 주로 AJAX 요청을 하거나, setTimeout, setInterval같은 행동을 합니다.

정리하면 다음 순서로 실행됩니다.

  1. state, context, defaultProps 저장
  2. componentWillMount
  3. render
  4. componentDidMount

Props Update

props가 업데이트될 때의 과정입니다. 업데이트되기 전에 업데이트가 발생하였음을 감지하고, componentWillReceiveProps 메소드가 호출됩니다. 그 후 shouldComponentUpdate, componentWillUpdate가 차례대로 호출된 후, 업데이트가 완료(render)되면 componentDidUpdate가 됩니다. 이 메소드들은 첫 번째 인자로 바뀔 props에 대한 정보를 가지고 있습니다. componentDidUpdate만 이미 업데이트되었기 때문에 바뀌기 이전의 props에 대한 정보를 가지고 있습니다.

shouldcomponentUpdate에서는 아직 render하기 전이기 때문에 return false를 하면 render을 취소할 수 있습니다. 주로 여기서 성능 최적화를 합니다. 쓸데없는 update가 일어나면 여기서 걸러내는 거죠.

주의사항이 있는데, componentWillUpdate에서는 state를 바꿔서는 안 됩니다. 아직 props도 업데이트하지 않았으므로 state를 바꾸면 또 shouldComponentUpdate가 발생합니다. componentDidUpdate에서는 render이 완료되었기 때문에 DOM에 접근할 수 있습니다.

  1. componentWillReceiveProps
  2. shouldComponentUpdate
  3. componentWillUpdate
  4. render
  5. componentDidUpdate

State Update

setState 호출을 통해 state가 업데이트될 때의 과정입니다. props update와 과정이 같지만, componentWillReceiveProps 메소드는 호출되지 않습니다. 그리고 메소드의 두 번째 인자로는 바뀔 state에 대한 정보를 가지고 있습니다. componentDidUpdate는 두 번째 인자로 바뀌기 이전의 state에 대한 정보를 가지고 있습니다.

  1. shouldComponentUpdate
  2. componentWillUpdate
  3. render
  4. componentDidUpdate

Unmount

컴포넌트가 제거되는 것은 Unmount라고 표현합니다. 더는 컴포넌트를 사용하지 않을 때 발생하는 이벤트가 있습니다. componentWillUnmount가 그것입니다. componentDidUnmount는 없습니다. 이미 제거된 컴포넌트에서 이벤트를 발생시킬 수는 없겠죠? componentWillMount에서 주로 연결했던 이벤트 리스너를 제거하는 등의 여러 가지 정리 활동을 합니다.

  1. componentWillUnmount

다행히도 용도에 맞지 않는 메소드를 사용하면 React에서 자체적으로 에러 메시지를 띄워 줍니다. componentDidMount나 render에 setState를 사용한 경우도 에러 메시지를 띄웁니다. 그래도 혹시나 모를 상황에 대비하여 용도를 항상 알고 있는 게 좋겠습니다. 다음 시간에는 React-router에 대해 알아봅시다.

Error

에러 발생 시를 위한 componentDidCatch도 있습니다. 리액트 16에서 추가되었습니다.

componentDidCatch(error, info) {
  console.error(error, info);
}

위와 같이 사용하고, 최상위 컴포넌트에 한 번만 넣어주면 됩니다. 에러 발생 시 어떻게 대처할 것인지를 정의할 수 있습니다. 최소한 에러를 로깅하는 것만으로도 사용 가치가 있습니다.

 

아래는 공식 사이트에서 발췌된 내용중 일부이다.

 

마운트 (Mount)

아래 메서드들은 컴포넌트의 인스턴스가 생성되어 DOM 상에 삽입될 때에 순서대로 호출됩니다.

 

( Mount란 컴포넌트를 특정 영역에 삽입하는 행위이다. 

  예로 ReactDOM.render 함수를 통해서 DOM의 특정 영역에 React 컴포넌트를 삽입할 수 있고

  이러한 과정을 마운트(Mount) 한다고 얘기한다. )

 

* Deprecate 함수 설명 및 대체 함수 

componentWillMount()

componentWillMount()는 마운트가 발생하기 전에 호출된다.
render() 가 실행되기 전에 호출되므로, 이 메서드 내에서 setState()를 동기적으로 호출하더라도
추가적인 렌더링이 발생되지 않는다. 

공식 문서에서 권장하는것은 componentDidMount() 를 대신 사용하라고 한다. 
* componentDidMount() 는 서버 렌더링에서 호출되는 유일한 생명주기 메서드 이다. 

 

 

 

업데이트

props 또는 state가 변경되면 갱신이 발생합니다. 아래 메서드들은 컴포넌트가 다시 렌더링될 때 순서대로 호출됩니다.

 

* Deprecate 함수 설명 및 대체 함수/방법

componentWillReceiveProps()

componentWillReceiveProps() 는 마운트된 컴포넌트가 새로운 props를 전달받기 전에 호출된다. 
그러나 이 메서드를 사용하면 버그를 만들거나 일관성을 해칠 수 있다. 

- props 변화에 대응한 효과를 발생시켜야 한다면 (Ex: 데이터를 가져오기 또는 에니메이션 등...) 
  componentDidUpdate() 생명주기를 사용하기를 권한다. 

- props가 변화할 때 일부 state를 재설정하기 위해서는
   완전 제어 컴포넌트 또는 Key를 사용하는 완전 비제어 컴포넌트를 만들어서 사용하라고 
  공식 문서는 권한다. 

 

componentWillUpdate()

componentWillUpdate() 는 새로운 props 또는 state가 전달되어서 렌더링이 이루어지기 전에 호출된다. 
이 메서드는 초기 렌더링에서는 호출 되지 않는다. 

또한 이 메서드 내에서는 this.setState() 를 호출 할 수 없다. 또한 React 컴포넌트가 
갱신되도록 만드는 그 어떤 작업eh componentWillUpdate() 가 결과값을 반환하기 전에 
이루어 져서는 안된다. 

componentWillUpdate() 는 shouldComponentUpdate() 메서드가 false 를 반환한다면 호출되지 않는다.  

componentWillUpdate()componentDidUpdate() 로 대체할 수 있다. 
만약 메서드내에서 DOM 에 대한 정보 획득 (Ex: 스크롤 위치 저장 등..) 을 하려 한다면
getSnapshotBeforeUpdate() 를 사용하는것이 가능하다.

 

위 내용들은 아래 링크인 React 공식 홈페이지에서 발췌해 왔다.

아래 링크를 통해 공식 문서를 천천히 살펴보기를 강력하게 권한다. 

 

 

 

React.Component – React

A JavaScript library for building user interfaces

ko.reactjs.org

 

 

 

마지막으로 React LifeCycle 에 대한 이미지로 마무리 하겠다. 

 

[ 일반적인 React LifeCycle ]

일반적인 React LifeCycle

 

[ 덜 일반적인 React Life Cycle ]

약간 일반적이지 않는 Life cycle

 

 

+ Recent posts