inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지

12.11) Home 페이지 구현하기 2. 기능

함수나 변수 작성(선언?) 위치 선택 기준

해결된 질문

90

keeenco

작성한 질문수 3

0

아래의 코드를 기준으로 했을때, getMonthlyData함수는 Home 컴포넌트의 바깥에서 작성해주고 있고, 그외에 onIncreaseMonth같은 것은 Home 내부에 작성해주고 있는데, 매번 이런 작성 위치가 헷갈리더라고요. 작성 위치를 정하는 명확한 기준이 따로 있을까요??

import { useState, useContext } from "react";
import { DiaryStateContext } from "../App";
import Header from "../components/Header";
import Button from "../components/Button";
import DiaryList from "../components/DiaryList";

const getMonthlyData = (pivotDate, data) => {
  const beginTime = new Date(
    pivotDate.getFullYear(),
    pivotDate.getMonth(),
    1,
    0,
    0,
    0
  ).getTime();
  const endTime = new Date(
    pivotDate.getFullYear(),
    pivotDate.getMonth() + 1,
    0,
    23,
    59,
    59
  ).getTime();

  return data.filter(
    (item) => beginTime <= item.createdDate && item.createdDate <= endTime
  );
};

const Home = () => {
  const data = useContext(DiaryStateContext);
  const [pivotDate, setPivotDate] = useState(new Date());

  const monthlyData = getMonthlyData(pivotDate, data);

  const onIncreaseMonth = () => {
    setPivotDate(new Date(pivotDate.getFullYear(), pivotDate.getMonth() + 1));
  };
  const onDecreaseMonth = () => {
    setPivotDate(new Date(pivotDate.getFullYear(), pivotDate.getMonth() - 1));
  };

  return (
    <div>
      <Header
        title={`${pivotDate.getFullYear()}년 ${pivotDate.getMonth() + 1}월`}
        leftChild={<Button onClick={onDecreaseMonth} text={"<"} />}
        rightChild={<Button onClick={onIncreaseMonth} text={">"} />}
      />
      <DiaryList />
    </div>
  );
};
export default Home;

javascript react

답변 2

1

이정환 Winterlood

안녕하세요 keeenco님 이정환입니다.

AI의 인턴의 답변대로 컴포넌트가 리렌더링 될 때 마다 재생성 할 필요가 없거나, State 등의 컴포넌트 내부에서만 접근할 수 있는 변수를 사용하지 함수나 변수는 컴포넌트 외부에 두는게 성능적으로 유리합니다.

리액트 컴포넌트 역시 함수이므로 리렌더링 될 경우 내부적으로는 다시 호출되는 과정을 겪는데요, 특정 함수가 재 호출되면 해당 함수 내부에 있는 변수나 함수가 모두 재 생성(초기화)되는 과정을 겪기 때문에 이렇다고 이해하시면 되겠습니다.

1

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. keeenco님, 함수나 변수 작성 위치 선택에 대해 궁금하신 부분을 해결해드리겠습니다.

작성 위치 기준

  1. 외부 설정 (컴포넌트 밖):

    • 성능 최적화: 컴포넌트가 리렌더링될 때마다 재생성될 필요가 없는 함수나 변수는 컴포넌트 외부에 선언하는 것이 좋습니다. 이렇게 하면 불필요한 리소스 사용을 줄일 수 있습니다. getMonthlyData 함수가 그 예로, 이 함수는 pivotDatedata라는 인자를 받기 때문에 컴포넌트 외부에 선언하여 재사용될 수 있습니다.
  2. 내부 설정 (컴포넌트 내):

    • 의존성: 컴포넌트의 상태나 props에 직접적으로 의존하는 함수는 컴포넌트 내부에 두는 것이 좋습니다. 이러한 함수를 외부로 빼내면 의도한 대로 동작하지 않을 수 있습니다. onIncreaseMonthonDecreaseMonth 함수는 pivotDate 상태에 의존하기 때문에 해당 컴포넌트 내부에 두어야 합니다.
    • 상태 관리: 컴포넌트의 상태 관리와 관련된 로직은 해당 컴포넌트 안에 두는 것이 좋습니다. 이를 통해 상태 변경 시 자동으로 UI를 갱신하도록 할 수 있습니다.

이 기준에 따라 컴포넌트의 외부와 내부에 함수 및 변수를 적절히 배치하면, 코드의 가독성을 높이고 성능을 최적화할 수 있습니다.

관련 질문 참고

컴포넌트 작성 위치에 대한 추가적인 예시와 설명을 아래 유사한 질문 링크에서 확인하실 수 있습니다:
- “Home page에서 getMonthlyData 함수”에 대한 답변
- “컴포넌트 외부에 선언한 함수에 대하여 질문드립니다.”에 대한 답변

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

에러 질문드립니다

0

13

2

VSCode 설정 문의

0

42

2

PPT 코드 관련 질문

0

35

2

useEffect와 lifecycle문의

0

42

2

프론트엔드 학습 수준 문의

0

61

2

리액트 챕터별 코드에서 eslint 설정파일이 없어요

0

56

2

데이터 로딩중 화면만 계속 나와요!!

0

57

2

퍼블리셔일경우 어느정도 수준까지 강의를 들어야할까요

0

88

2

이후의 커리큘럼 문의

0

107

2

실슬환경 설정에서 save후 console.log 부분이 새로고침이 안되는현상입니다.

0

56

2

최적화 관련 질문있습니다 (useMemo 등)

0

92

3

프로바이더 컴포넌트의 위치는 어떤 기준인가요?

1

88

3

Date 객체에 관련하여 질문드립니다.

0

89

2

리액트 개정판 교재 질문

0

61

2

예제코드가 안나와요!

0

79

2

select a variant 선택에서 javascript와 javascript+react compiler 중 무엇을 선택해야하나요? com

0

114

2

onMouseEnter 관련 문의 드립니다

0

96

3

배열의 렌더링 관련 질문 드립니다.

0

78

2

2:40초 refObj를 콘솔로 출력시 오류가 발생합니다.

0

122

2

TS, 리액트 강의중에 뭘 먼저 수강하는게 좋을까요?

0

143

2

useCallback 적용한 onCreate, onUpdate, onDelete 함수..

0

71

1

vs code 자동완성관련 문의

0

136

2

91강 useEffect내에서 상태변화함수 호출시 발생하는 에러

1

192

2

87강 필터 함수 질문

0

71

2