실습문제 2. 최적화

최적화 실습문제

  • 아래 실습코드의 주석을 확인하고, 1번, 2번, 3번 지시사항의 코드를 완성하세요.

import React, { useMemo, useCallback, useState, useRef, useEffect } from "react";

const initialUsers = ["심은성", "한종윤", "안정현", "김현주", "서혜림",
  "조아현", "정은비", "조윤식", "고훈", "남건후"];

// 변경금지!!
//  - 호출시마다 1초 이상의 시간이 소요되는 무거운 함수
function heavyFilter(list: string[], keyword: string): string[] {
  console.log("#1. heavyFilter 호출");
  const start = performance.now();
  while (performance.now() - start < 1000) {} // 1초 delay
  return list.filter((user) => user.includes(keyword));
}

function OptimizationPractice() {
  const [users, setUsers] = useState(initialUsers);
  const [keyword, setKeyword] = useState("");
  const inputRef = useRef<HTMLInputElement>(null);
  const [newUser, setNewUser] = useState("");
  
  //  1) 현재 filtered는 검색어(keyword)가 변경될때마다 필터링 연산이 실행된다. 이를 최적화 하여
  //      "검색버튼을 누를 때"만 연산이 실행되도록 최적화 하세요.
  //     단, filtered연산시 heavyFilter는 반드시 수행되어야 한다.
  
  //  2) 현재filtered는 컴포넌트가 렌더링 될때 마다 필터링 연산이 실행된다.
  //    이를 최적화 하여 keyword가 변경되지 않는 한 불필요한 연산이 수행되지 않도록 최적화 하시오.
  const filtered = heavyFilter(users, keyword);
      
  const showCount = () => {    
    alert("검색 결과: "+filtered.length+"명");
  };
 
  const onRegister = () => {
    if (!newUser.trim()) return;
    setUsers([...users, newUser.trim()]);
    setNewUser("");
  };    
  return (
    <div>
      <h2>회원 검색 (최적화 실습)</h2>

      <input
        placeholder="검색어 입력"
        onChange={(e) => setKeyword(e.target.value)}
        value={keyword}
      />
      <p>검색 결과 ({filtered.length}명): {filtered.slice(0, 10).join(", ")}</p>
      <Button showCount={showCount}></Button>
      <hr />

      <h3>신규 사용자 등록</h3>
      <input
        value={newUser}
        onChange={(e) => setNewUser(e.target.value)}
        placeholder="새 사용자 이름"
      />   
      <button onClick={onRegister}>등록</button>
    </div>
  );
}

const heavyWork = () => {
  console.log("#2. 자식 컴포넌트 heavyWork 호출");
  const start = performance.now();
  while (performance.now() - start < 500) {} // 100ms delay
}

const Button = ({ showCount }: { showCount: () => void }) => {
    // 3) 자식 컴포넌트 랜더링 최소화.
    // - 자식 컴포넌트의 불필요한 렌더링을 줄여 heavyWork의 호출을 최소화하세요.
    // - 단, showCount는 반드시 부모 컴포넌트로부터 얻어와야한다.
    heavyWork(); // 삭제 및 변경 금지 !!
    return (
      <>
      <button onClick={showCount}>검색 결과 수 보기</button>
      </>
    );
  };

export default OptimizationPractice;

Last updated