인프런 커뮤니티 질문&답변

sean k님의 프로필 이미지
sean k

작성한 질문수

처음 만난 리액트(React)

(실습) state 사용하기

LifeCycle 문의

해결된 질문

작성

·

398

·

수정됨

0

안녕하세요 강의 감사히 잘 듣고 있습니다.

다름이 아니라 chapter06에서 코드는 같은데

Notification의 componentDidUpdate() 한번씩 더 호출되는데 이유를 모르겠습니다.

import React from "react";

const styles = {
    wrapper: {
        margin: 8,
        padding: 8,
        display: "flex",
        flexDirection: "row",
        border: "1px solid grey",
        borderRadius: 16,
    },
    messageText: {
        color: "black",
        fontSize: 16,
    },
};

class Notification extends React.Component {
    constructor(props) {
        super(props);

        this.state = {};
    }

    componentDidMount() {
        console.log(`${this.props.id} componentDidMount() called.`);
    }

    

componentDidUpdate() {
        console.log(`${this.props.id} componentDidUpdate() called.`);
    }

    componentWillUnmount() {
        console.log(`${this.props.id} componentWillUnmount() called.`);
    }

    render() {
        return (
            <div style={styles.wrapper}>
                <span style={styles.messageText}>{this.props.message}</span>
            </div>
        );
    }
}

export default Notification;
import React from "react";
import Notification from "./Notification";

const reservedNotifications = [
    {
        id: 1,
        message: "안녕하세요, 오늘 일정을 알려드립니다.",
    },
    {
        id: 2,
        message: "점심식사 시간입니다.",
    },
    {
        id: 3,
        message: "이제 곧 미팅이 시작됩니다.",
    },
];

var timer;

class NotificationList extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            notifications: [],
        };
    }

    componentDidMount() {
        const { notifications } = this.state;
        timer = setInterval(() => {
            if (notifications.length < reservedNotifications.length) {
                const index = notifications.length;
                notifications.push(reservedNotifications[index]);
                this.setState({
                    notifications: notifications,
                });
            } else {
                this.setState({
                    notifications: [],
                });
                clearInterval(timer);
            }
        }, 1000);
    }

    componentDidUpdate() {
        console.log(` parent componentDidUpdate() called.`);
    }
    
    componentWillUnmount() {
        if (timer) {
            clearInterval(timer);
        }
    }

    render() {
        return (
            <div>
                {this.state.notifications.map((notification) => {
                    return (
                        <Notification
                            key={notification.id}
                            id={notification.id}
                            message={notification.message}
                        />
                    );
                })}
            </div>
        );
    }
}

export default NotificationList;

추가로 NotificationList의 componentDidUpdate()가 계속 호출되는데 이유가 있을까요?

답변 2

0

Inje Lee (소플)님의 프로필 이미지
Inje Lee (소플)
지식공유자

안녕하세요, 소플입니다.

 

해당 부분은 AI가 답변해준 것처럼 StrictMode때문에 발생하는 것입니다.

아래 링크의 답변을 참고하시면 도움이 될 것입니다!

https://www.inflearn.com/questions/619705/notificationlist-jsx-%EC%B1%95%ED%84%B0-6%EC%9E%A5-%EC%8B%A4%EC%8A%B5-%EB%82%B4%EC%9A%A9-%EC%A7%88%EB%AC%B8-%EB%8F%99%EC%8B%9C%EC%97%90-2%EA%B0%9C%EC%94%A9-%EB%82%98%EC%98%B4

 

추가로 정확한 동작 확인을 위해서 componentWillUnmount()에서도 로그를 출력해보세요~

 

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다.

sean k님의 질문은 React의 생명주기 메서드와 연관된 componentDidUpdate()가 예상과 다르게 동작하는 상황에 대한 것으로 이해됩니다. sean k님처럼 React의 componentDidUpdate() 메서드가 원하는 방식으로 동작하지 않는 상황은 주로 컴포넌트의 state가 예상치 못한 시점에 변경되어 발생할 수 있습니다.

React 18에서 도입된 Strict Mode에서는 컴포넌트의 componentDidMount() 및 기타 생명주기 메서드들이 예상보다 더 자주 호출될 수 있습니다. 이 모드는 개발 중에만 활성화되며, 특정 부작용을 이중으로 체크하기 위해 도입되었습니다.

NotificationListcomponentDidUpdate()가 계속 호출되는 현상은, 컴포넌트의 state가 set될 때마다 발생합니다. sean k님의 코드에서는 setInterval 내에서 주기적으로 state를 업데이트 하고 있기 때문에, 이로 인해 componentDidUpdate()가 반복해서 호출될 수 있습니다. 특히, setState 호출 후에는 컴포넌트가 리렌더링 되고, 이로 인해 componentDidUpdate()가 실행됩니다.

sean k님의 경우엔, setInterval을 통해 주기적으로 notifications 상태가 업데이트 되므로 componentDidUpdate()가 호출됩니다. 만약, notifications 상태가 빈 배열로 초기화되는 것과 같은 상태 업데이트가 주기적으로 발생하게 될 때에도 마찬가지로 componentDidUpdate()가 호출됩니다.

질문 내용과 유사한 상황에 올바른 대응 방법을 찾는 데 도움이 될 기존 답변을 찾아볼 때, 리액트 버전 18에서 Strict Mode의 동작 변경이나, 생명주기 메서드의 호출 패턴 변경에 대해 설명한 NotificationList.jsx 챕터 6장 실습 내용 질문 - 동시에 2개씩 나옴 답변을 참고하시면 도움이 될 수 있습니다. 이 답변에서는 여러번의 랜더링을 일으키는 Strict Mode의 동작에 대하여 소개하고 있습니다.

- [NotificationList.jsx 챕터 6장 실습 내용 질문 - 동시에 2개씩 나옴](https://www.inflearn.com/questions/619705)

이때, Strict Mode는 리액트 개발 모드에서만 활성화되어 있으며, 개발자가 잠재적인 문제를 찾을 수 있도록 도와주는 도구입니다. 프로덕션 빌드에서는 이러한 추가적인 호출이 발생하지 않습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

sean k님의 프로필 이미지
sean k

작성한 질문수

질문하기