[React] 라이프사이클

2024. 3. 18. 21:33·개발

컴포넌트 기반의 리액트에서는 각 컴포넌트 마다 수명 주기가 있다. 컴포넌트가 브라우저 상에서 렌더링되고 업데이트되고 사라지는 과정을 말한다. 크게 마운트, 업데이트, 언마운트로 나뉜다.

 

라이프 사이클 메소드를 통해 우리는 컴포넌트가 생성되고 변화하고 없어지는 과정을 통제할 수 있다.

 

마운트(Mount)

컴포넌트가 처음 생성되는 단계. DOM이 생성되고 웹 브라우저 상에 나타난다.

 

다음과 같은 메소드가 호출된다.

constructor

생성자 메소드. 가장 먼저 실행된다. 

constructor(props) {
    super(props);
    this.state = { count: 0 };
}

props과 state에 접근할 수 있고, 초기 state 값을 정할 수 있다.

 

함수형 컴포넌트에서는 useState 훅을 통해 state의 초기값을 설정할 수 있다.

 

getDerivedStateFromProps

props으로 받은 값을 state 값으로 설정하고 싶을 때 사용된다.

static getDerivedStateFromProps(props, state) {
    return {
    	if (조건문) return { // state }
        return null
    }
}

 

최초 마운트 그리고 업데이트될 때, render 메소드를 호출하기 직전에 호출된다. 

메소드 내에서 갱신할 state 값을 리턴하거나, null을 리턴하여 갱신하지 않을 수 있다.

 

render

컴포넌트를 렌더링한다. 클래스 컴포넌트에서 반드시 구현되어야 하는 유일한 메소드이다.

class Example extends React.Component {
  render() {
    return <div>example</div>
  }
}

 

메소드는 같은 input에 대해 output이 나와야 한다(순수함수).

 

componentDidMount

render 내에 모든 부분들이 브라우저에 나타나면 실행된다. 첫 렌더링이 마쳐진 후 한번만 실행된다.

DOM을 직접 조작할 수 있다. DOM에 직접 접근해야 하는 외부 라이브러리를 연동하거나 DOM을 읽거나 변경하는 작업을 할 수 있다.

주로 필요한 데이터를 요청하는 작업을 한다. 

class Example extends Component {
  state = {
    users: [],
  };

  componentDidMount() {
    fetch("https://jsonplaceholder.typicode.com/users")
      .then((response) => response.json())
      .then((users) => this.setState({ users }));
  }

 

함수형 컴포넌트에서는 useEffect를 빈 의존성 배열([])과 함께 사용해서 같은 기능을 구현할 수 있다.

 

업데이트(Update)

다음과 같은 상황에서 업데이트가 발생한다.

  • props가 바뀔 때
  • state가 바뀔 때
  • 부모 컴포넌트가 리렌더링될 때
  • this.forceUpdate로 강제로 렌더링이 trigger될 때

 

getDerivedStateFromProps

마운트 시에도 사용되는, 값이 갱신되었을 때 state 값을 변경할 수 있는 메소드 (위 참조)

 

shouldComponentUpdate

props나 state가 변경되었을 때 리렌더링을 할지 결정하는 메소드이다. boolean 값을 리턴하여, true이면 render 메소드가 호출된다. 함수형 컴포넌트에서 React.memo, useMemo 훅을 사용하듯이, 불필요한 렌더링을 방지하여 성능을 개선할 수 있다.

shouldComponentUpdate(nextProps, nextState) {
    if (조건) return false;
    return true;
}

 

render

렌더링

 

getSnapshotBeforeUpdate

렌더링된 결과가 DOM에 반영되기 전에 호출된다. 변경되기 전 스냅샷(props, state)를 인자로 받아서 사용할 수 있고, 리턴한 값은 componentDidUpdate에서 받아서 사용될 수 있다.

class Example extends React.Component {
    getSnapshotBeforeUpdate(prevProps, prevState) {
    	return { ... }
    }
}

 

componentDidUpdate

리렌더링 완료(DOM 변화 발생) 후 실행된다. 

 

이전 state, props 값과 현재 값을 비교해서 데이터를 새롭게 불러오는 작업 등을 할 수 있다.

componentDidUpdate(prevProps, prevState) {
    if (this.props.userId !== prevProps.userId) {
      this.fetchData(this.props.userId);
    }
}

 

언마운트(Unmount)

DOM에서 컴포넌트가 제거된다.

 

componentWillUnmount

주로 타이머나 이벤트를 제거할 때 사용된다.

 

함수형 컴포넌트에서는 useEffect의 cleanup 함수로 같은 기능을 구현할 수 있다.

 

 

 

 

 

참고

https://velog.io/@remon/React-리액트-라이프-사이클

https://shape-coding.tistory.com/entry/React-React-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EC%9D%98-%EC%83%9D%EB%AA%85-%EC%A3%BC%EA%B8%B0-Life-Cycle

 

반응형
'개발' 카테고리의 다른 글
  • [Javascript] 이벤트 버블링과 캡처링
  • 검색엔진 최적화(SEO, Search Engine Optimization)
  • [React] cypress를 사용한 e2e 테스트 (Typescript)
  • [React] 불변성
xosoy
xosoy
겅부하자!
  • xosoy
    gungboohaza
    xosoy
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 개발
      • CS
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    useEffectEvent
    이벤트 캡처링
    이벤트 버블링
    initialdata
    TanStack Query
    배포
    가상리스트
    mobx
    feature-sliced design
    E2E
    React Server Component
    Github Actions
    리스트가상화
    Pointer Event
    event capturing
    matter.js
    이벤트 루프
    핫 리로딩
    hot-reloading
    liveblocks
    react19
    Font Optimiation
    HydrationBoundary
    react
    시간 포맷팅
    서버 컴포넌트
    event bubbling
    Next.js
    oEmbed
    prefetchInfiniteQuery
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
xosoy
[React] 라이프사이클
상단으로

티스토리툴바