Skip to content

wanted-projects/wanted-codestates-project-7-10

Β 
Β 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

45 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

검색어 μΆ”μ²œμ΄ μžˆλŠ” 검색창 λ§Œλ“€κΈ°

α„€α…₯ᆷᄉᅒᆨ어 μΆ”μ²œμ΄ μžˆλŠ” 검색창 미리보기

μ‹€ν–‰ 방법

  • 배포 μ‚¬μ΄νŠΈ

Humanscape Deploy🩺

  • 둜컬
  1. git clone https://github.com/Pre-Onboarding-FE-Team07/wanted-codestates-project-7-10.git
  2. yarn
  3. yarn start:dev

ν”„λ‘œμ νŠΈ ꡬ쑰

--πŸ“ src 
  ---πŸ“ assets ➑ μ•„μ΄μ½˜ 곡간
  ---πŸ“ component ➑ ν™”λ©΄ 곡간
  -- πŸ“ hooks ➑ ν‚€λ³΄λ“œμ— λŒ€ν•œ ν•¨μˆ˜ 둜직
  ---πŸ“ redux ➑ 데이터λ₯Ό 뢈러였고 μ €μž₯ν•˜λŠ” 곡간
  ---πŸ“ utilities ➑ API 호좜 μ΅œμ ν™”

νŒ€ 멀버

이름 직책 μ—­ν• 
βš‘οΈλ°•μ§„μš© νŒ€μž₯ κ°œλ°œν™˜κ²½ ꡬ좕 및 배포
βœ¨κΉ€μ •ν›ˆ νŒ€μ› ν‚€λ³΄λ“œλ‘œ μΆ”μ²œ 검색어 이동
πŸŽ¨λ¬Έμ„ κ²½ νŒ€μ› UI μ»΄ν¬λ„ŒνŠΈ κ΅¬ν˜„ 및 λ°˜μ‘ν˜• 적용
πŸš€μ‹¬μ±„μœ€ νŒ€μ› 검색어 μΆ”μ²œ API 호좜 - axios둜 데이터 뢈러였기
βœοΈμ˜ˆνš¨μ€ νŒ€μ› API 호좜 μ΅œμ ν™” - Debounce κ΅¬ν˜„
πŸ”¨μ΄μ˜ˆμ§€ νŒ€μ› 검색어 μΆ”μ²œ API 호좜 - Redux μ‚¬μš©
🚚졜민우 νŒ€μ› API 호좜 μ΅œμ ν™”

λ¬Έμ„ κ²½

UI μ»΄ν¬λ„ŒνŠΈ κ΅¬ν˜„ (κ²€μƒ‰μ˜μ—­ κ΅¬ν˜„)

κ΅¬ν˜„ν•œ 방법

μ»΄ν¬λ„ŒνŠΈ ꡬ성 :

<SearchArea>
  <Title />
  <SearchBar />
  <RecommendArea />
</SearchArea>
  • https://clinicaltrialskorea.com/ 의 검색 μ˜μ—­μ„ 클둠코딩
  • 검색어 μΆ”μ²œ μ˜μ—­μ„ RecommendArea μ»΄ν¬λ„ŒνŠΈλ‘œ κ΅¬ν˜„
  • λ°˜μ‘ν˜• κ΅¬ν˜„
  • 동적인 κΈ°λŠ₯ μΆ”κ°€ μ‹œ μ°Έκ³ ν•  수 μžˆλ„λ‘ 일뢀 μ»΄ν¬λ„ŒνŠΈμ— 주석 첨뢀

μΆ”κ°€ν•œ νŒ¨ν‚€μ§€

  • @svgr/webpack: κ²€μƒ‰μ°½μ˜ 돋보기 μ•„μ΄μ½˜μ„ κ΅¬ν˜„ν•œ svg νŒŒμΌμ„ React Component둜 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ 좔가함.

    • svgλ₯Ό μ‚¬μš©ν•œ μ΄μœ λŠ” μ½”λ“œλ‘œ 이루어져 μžˆμ–΄ λ‹€λ₯Έ 이미지 파일(png, jpg λ“±)보닀 μš©λŸ‰μ΄ 적기 λ•Œλ¬Έ.
    • svgλ₯Ό React Component둜 μ‚¬μš©ν•œ μ΄μœ λŠ”, propsλ₯Ό ν†΅ν•΄μ„œ svg 속성을 λ³€κ²½ν•  수 μžˆμ–΄ μœ μ—°μ„±μ΄ 보μž₯되기 λ•Œλ¬Έ. μ°Έκ³  μ‚¬μ΄νŠΈ
  • react-responsive : html/css만으둜 λ°˜μ‘ν˜• μ›Ή κ΅¬ν˜„μ΄ κ°€λŠ₯ν•œ 경우 미디어쿼리λ₯Ό μ‚¬μš©ν•˜λ©΄ λ˜μ§€λ§Œ, ν™”λ©΄ 크기에 따라 μ»΄ν¬λ„ŒνŠΈ ꡬ쑰도 일뢀 λ³€κ²½λ˜μ–΄μ•Ό ν•΄μ„œ react-responsive νŒ¨ν‚€μ§€ μ‚¬μš©.

μ–΄λ €μ› λ˜ 점 (μ—λŸ¬ 핸듀링)

  1. svg νŒŒμΌμ„ μΈμ‹ν•˜μ§€ λͺ»ν•˜λŠ” 문제

    1. μ›ΉνŒ©μ— file-loader νŒ¨ν‚€μ§€ λ‹€μš΄λ‘œλ“œ 및 webpack.config.js에 rule μΆ”κ°€
    2. { ReactComponent as ~ } 둜 svg 파일 ReactComponent둜 importν•˜κΈ°
    3. μœ„μ™€ 같은 λ°©μ‹μœΌλ‘œ ν•΄κ²°ν•˜λ €κ³  ν–ˆμŒ.
    4. 그런데 default import만 κ°€λŠ₯ν•˜κ³  ReactComponent둜 importν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒν•΄μ„œ, ν•΄λ‹Ή μ‚¬μ΄νŠΈλ₯Ό μ°Έκ³ ν•˜μ—¬ @svgr/webpack νŒ¨ν‚€μ§€λ₯Ό λ‹€μš΄λ‘œλ“œν•˜κ³  webpack.config.js에 rule을 μΆ”κ°€ν•˜λŠ” λ°©μ‹μœΌλ‘œ λ‹€μ‹œ ν•΄κ²°.
  2. webpack.config.js Lint μ—λŸ¬ - require is not defined

    • .eslintignore 파일 μΆ”κ°€ ν›„ webpack.config.js λ¬΄μ‹œν•˜λ„λ‘ μˆ˜μ •ν•˜μ—¬ ν•΄κ²°.
  3. eslint, prettier svg 파일 μ—λŸ¬

    • eslint : svg νŒŒμΌμ— λŒ€ν•΄ λ‹€μŒ μ—λŸ¬ λ°œμƒ 'React' must be in scope when using JSX react/react-in-jsx-scope

    • prettier : [error] No parser could be inferred for file: src/assets/icon_search.svg

      β‡’ .eslintignore, .prettierignore νŒŒμΌμ— src/assets 폴더 (js, jsx λ₯Ό μ œμ™Έν•œ λ¦¬μ†ŒμŠ€ 폴더)λ₯Ό μΆ”κ°€ν•˜μ—¬ 해결함.

μ‹¬μ±„μœ€

검색어 μΆ”μ²œ API 호좜 - axios둜 데이터 뢈러였기

μΆ”κ°€ν•œ νŒ¨ν‚€μ§€

  • yarn add axios
    • axios μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ νŒ¨ν‚€μ§€ 좔가함

κ΅¬ν˜„ κΈ°λŠ₯

  • 검색어 μΆ”μ²œ APIλ₯Ό 호좜(axios둜 데이터 뢈러였기)
  • μΊμ‹œ κΈ°λŠ₯ μ—°κ²°

μ–΄λ €μ› λ˜ 점

  • axiosλ₯Ό 톡해 APIλ₯Ό λΆˆλŸ¬μ™€μ„œ 화면에 λ³΄μ—¬μ£ΌλŠ” μž‘μ—…μ΄ 쉽지 μ•Šμ•„ λ§Žμ€ μ‹œκ°„μ΄ μ†Œμš”λ¨

    • axios GETλ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 검색어 μΆ”μ²œ API μš”μ²­μ„ ν•˜μ—¬ 데이터λ₯Ό 화면에 λ³΄μ—¬μ£Όμ—ˆμŒ
    • λ˜ν•œ, slice ν•¨μˆ˜λ₯Ό 톡해 μ‚¬μš©μžκ°€ μž…λ ₯ μ‹œ 7개의 데이터가 λ‚˜μ˜€κ²Œλ” 함
  • index.jsx νŒŒμΌμ— App.jsx 파일이 였λ₯˜κ°€ μƒκ²ΌμŒ

    • eslintrc.json νŒŒμΌμ— μ•„λž˜μ˜ μ½”λ“œλ₯Ό μΆ”κ°€ν•˜μ—¬ ν•΄κ²° ν•˜μ˜€μŒ
"settings": {
    "import/resolver": {
      "node": {
        "extensions": [".js", ".jsx"]
      }
    }
  }

μ΄μ˜ˆμ§€

검색어 μΆ”μ²œ API 호좜 - Redux둜 λ§Œλ“€κΈ°

κ΅¬ν˜„ν•œ 방법

  • yarn add react-redux redux-thunk redux redux-promise νŒ¨ν‚€μ§€ μ„€μΉ˜

  • redux 파일의 ꡬ쑰λ₯Ό λ‹€μŒκ³Ό 같이 μž‘μ„±ν•΄μ„œ λ‘œμ§μ„ κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

--πŸ“ redux
      -- πŸ“ƒ store.js ➑ stateκ°€ κ΄€λ¦¬λ˜λŠ” 였직 ν•˜λ‚˜μ˜ 곡간
      -- πŸ“ actions
    	-- πŸ“ƒ search.js ➑ μ„ μ–Έν–ˆλ˜ SEARCH_RESULT μ•‘μ…˜μ— λŒ€ν•œ ν•¨μˆ˜ 둜직 곡간
        -- πŸ“ƒ types.js ➑ μƒμˆ˜ ν˜•νƒœλ‘œ μ‚¬μš©ν•΄μ•Ό ν•  μ•‘μ…˜μ˜ 이름듀 μ €μž₯
     -- πŸ“ reducers
    	-- πŸ“ƒ index.js ➑  μ—¬λŸ¬ 개의 reducerλ₯Ό κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ μ €μž₯μ†Œ
        -- πŸ“ƒ search.js ➑ search κ΄€λ ¨λœ reducer  
  • Reduxλ₯Ό μ΄μš©ν•΄ UI에 데이터 κ°€μ Έμ˜€κ³  state에 λ™μž‘ν•˜λŠ” μ½”λ“œ μž‘μ„±
// redux의 action -> state λ³€κ²½ν•˜λŠ” 둜직
const dispatch = useDispatch();
// input에 μžˆλŠ” κ°’ κ°€μ Έμ˜€λŠ” onChange ν•¨μˆ˜
const onchangeValue = (e) => {
  dispatch(searchResult(e.target.value));
};
// 검색 λ²„νŠΌ λˆ„λ₯΄λ©΄ λ™μž‘ν•˜λŠ” eventν•¨μˆ˜
const onSearch = () => {};
...
<input
  type="text"
  placeholder="μ§ˆν™˜λͺ…을 μž…λ ₯ν•΄ μ£Όμ„Έμš”. "
  onChange={onchangeValue}
/>
  • RecommendArea.jsx 검색 λ˜μ–΄μ§€λŠ” 뢀뢄에 λŒ€ν•œ 데이터 κ°’ κ°€μ Έμ˜€κΈ° μž‘μ„±
const result = useSelector((state) => state.search.success);

  if (result && result.length === 0) {
    return (
      <RecommendAreaStyled show={show}>
        <Info>검색어 μ—†μŒ</Info>
      </RecommendAreaStyled>
    );
  }
  if (result && result.length > 0) {
    return (
      <RecommendAreaStyled show={show}>
        <Info>μΆ”μ²œ 검색어</Info>
        {result &&
          result.map((data, idx) => (
            <Recommends key={idx}>
              <Recommend id={data.id} content={data.name} />
            </Recommends>
          ))}
      </RecommendAreaStyled>
    );
  }
  return null;

μ–΄λ €μ› λ˜ 점 (μ—λŸ¬ 핸듀링)

  • ν”„λ‘œμ νŠΈ μ‹œ forkν•˜μ—¬ μƒˆλ‘œμš΄ 브랜치λ₯Ό λ§Œλ“  ν›„ μž‘μ—…μ„ ν•˜λŠ” 뢀뢄이 μƒμ†Œν•΄μ„œ μ–΄λ €μ› μ—ˆμŠ΅λ‹ˆλ‹€. ex) μ•žμ„œ νŒ€μ›μ΄ mergeλ₯Ό ν•˜λ©΄ 기쑴에 μž‘μ„±ν–ˆλ˜ μ½”λ“œλ₯Ό 일일히 λ³΅μ‚¬ν•˜λŠ” 어렀움이 μžˆμ—ˆλ‹€. νŒ€μ› λΆ„μ—κ²Œ μš”μ²­ν•˜μ…¨λ”λ‹ˆ git remote add upstream <원본 원격 μ €μž₯μ†Œ> ν•˜λŠ” 방법을 μ•Œλ €μ£Όμ…”μ„œ ν•΄κ²°ν•˜μ˜€μŠ΅λ‹ˆλ‹€!
  • [React] regeneratorRuntime is not defined μ—λŸ¬ ν•΄κ²° Reactμ—μ„œ ES8 문법인 async/awaitλ₯Ό μ‚¬μš©ν•΄ 비동기 ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜λ©΄ λΈŒλΌμš°μ €μ—μ„œ λ‹€μŒκ³Ό 같은 μ—λŸ¬κ°€ λ°œμƒν•˜μ˜€μŠ΅λ‹ˆλ‹€. 이뢀뢄에 λŒ€ν•œ 였λ₯˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 컴파일될 λ•Œ, regeratorRuntime이 async/await 문법을 λ²ˆμ—­ν•˜λ„λ‘ ν–ˆλŠ”λ° ν•΄λ‹Ή regeneratorλ₯Ό μ œκ³΅ν•˜μ§€ μ•Šμ•„μ„œ λ°œμƒν•œ μ—λŸ¬μž…λ‹ˆλ‹€. 이 뢀뢄에 ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ—¬λŸ¬λ°©λ²•μ„ μ°Ύμ•„λ΄€μ§€λ§Œ, κ²°κ΅­ μ°Ύμ§€ λͺ»ν•˜κ³  νŒ€μ› λΆ„μ—κ²Œ 도움을 λ°›μ•„ @babel/plugin-transform-runtimeνŒ¨ν‚€μ§€λ₯Ό λ‹€μš΄λ‘œλ“œν•˜μ—¬ webpack.config.js에 μ•„λž˜μ™€ 같은 μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
{
  test: /\.jsx?$/,
  exclude: '/node_modules',
  loader: 'babel-loader',
  options: {
    presets: [
      [
        '@babel/preset-env',
        {
          targets: {
            esmodules: true,
          },
        },
      ],
      '@babel/preset-react',
    ],
  },
},
{
  test: /\.svg$/,
  use: ['@svgr/webpack'],
},

κΉ€μ •ν›ˆ

ν‚€λ³΄λ“œλ‘œ μΆ”μ²œ 검색어 이동

λ‹΄λ‹Ήμž : κΉ€μ •ν›ˆ

κ΅¬ν˜„ν•œ 방법

onKeydown μ΄λ²€νŠΈν•Έλ“€λŸ¬λ₯Ό μ΄μš©ν•˜μ—¬ ν•΄λ‹Ή ν‚€(ArrowUp, ArrowDown)κ°€ λˆŒλ Έμ„ 경우 activeIndex 값을 증감 μ‹œμΌœ μ„œλ²„μ™€ ν†΅μ‹ μœΌλ‘œ 받은 데이터와 일치 ν•˜λŠ” 인덱슀 값에 λ°±κ·ΈλΌμš΄λ“œ 컬러λ₯Ό μ£Όμ–΄ κ΅¬ν˜„

μ–΄λ €μ› λ˜ 점

  1. λͺ¨λ“ˆν™”
  • 초기 μ½”λ“œ μž‘μ„±μ‹œ λͺ¨λ“ˆν™”λ₯Ό κ³ λ €ν•˜μ§€ μ•Šκ³  μž‘μ„±ν•˜μ—¬ 같은 μž‘μ—…μ„ λ‘λ²ˆ ν•˜λŠ” κ²½μš°κ°€ λ°œμƒν•˜μ˜€κ³  이후 νŒ€μ›μ˜ 쑰언을 톡해 μž‘μ„±ν•œ μ½”λ“œλ₯Ό λͺ¨λ“ˆν™”ν•˜λŠ” 방법을 μ΄μš©ν•˜μ—¬ ν˜‘μ—…μ„ 진행함.
  1. Git workflow
  • μ—¬λŸ¬μ‚¬λžŒκ³Ό ν˜‘μ—…μ„ μ§„ν–‰ν•˜λŠ” κ³Όμ •μ—μ„œ Git μ‚¬μš©μ΄ λ§€λ„λŸ½μ§€ μ•Šμ•„ upstreamμ—μ„œ Pullν•˜λŠ” κ³Όμ •μ—μ„œ μ—λŸ¬κ°€ λ°œμƒν•¨. νŒ€μ—μ„œ μ •ν•œ Git κ·œμΉ™μ„ μ΄μš©ν•˜μ—¬ 흐름에 따라 μ§„ν–‰ν•˜μ˜€κ³  μ—λŸ¬λ₯Ό 쀄일 수 μžˆμ—ˆμŒ.

λ°•μ§„μš©

μˆ˜ν–‰ν•œ μ—­ν•  및 μž‘μ—…

  • 각자 ν¬λ§ν•˜λŠ” κΈ°λŠ₯ κ΅¬ν˜„μ„ μš°μ„ ν•˜μ—¬ νŒ€μ›μ˜ 역할을 배뢄함.

  • ν”„λ‘œμ νŠΈλ₯Ό 생성 및 μ΄ˆκΈ°ν™”ν•˜κ³  섀정함.

    • CRAλ₯Ό μ‚¬μš©ν•˜κΈ°λ³΄λ‹€ react와 webpack을 μ„€μΉ˜ν•˜μ—¬ 직접 섀정함.
    • Eslint와 prettierλ₯Ό μΆ”κ°€ν•˜μ—¬ ν”„λ‘œμ νŠΈμ˜ μŠ€νƒ€μΌκ³Ό μ»¨λ²€μ…˜μ„ κ°•μ œν•˜μ˜€μœΌλ©°, lint-staged와 husky의 μ‘°ν•©μœΌλ‘œ commit을 ν•˜κΈ° 전에 lint μž‘μ—…μ΄ μˆ˜ν–‰λ  수 μžˆλ„λ‘ μžλ™ν™”ν•¨.
  • ν”„λ‘œμ νŠΈ 진행사항을 νŒŒμ•…ν•˜κ³  νŒ€μ›μ—κ²Œ 이슈 λ°œμƒ μ‹œ ν•¨κ»˜ν•˜λ©° 문제λ₯Ό 해결함.

    • μž‘μ—… 도쀑 ν•΄κ²°λ˜μ§€ μ•ŠλŠ” 문제λ₯Ό 였랜 μ‹œκ°„ 혼자 λŒμ–΄μ•ˆκΈ°λ³΄λ‹€ νŒ€μ›λ“€κ³Ό 문제λ₯Ό κ³΅μœ ν•˜μ—¬ λΉ λ₯Έ 해결을 μš°μ„ ν•  수 μžˆλ„λ‘ μ§€μ‹œν•¨.
  • 자체 μ œμž‘ν•œ Git workflowλ₯Ό μ œκ³΅ν•˜μ—¬ νŒ€μ›λ“€μ΄ Git μž‘μ—…μ„ μˆ˜ν–‰ν•  λ•Œμ˜ 어렀움을 ν•΄μ†Œν•¨.

    • ν•œμ°½ μž‘μ—…μ„ μ§„ν–‰ 쀑인데 upstream μ €μž₯μ†Œμ— μ΅œμ‹  μ½”λ“œκ°€ μ—…λ°μ΄νŠΈλ˜μ—ˆμ„ λ•Œ, μžμ‹ μ΄ μ§„ν–‰ μ€‘μ΄λ˜ μž‘μ—…μ— μ΅œμ‹  μ½”λ“œλ₯Ό 병합해야 ν•˜λŠ” 경우 큰 도움이 됨.
  • νŒ€μ› κ°„ μž‘μ—…μ΄ κΈ΄λ°€ν•˜κ²Œ μ—°κ²°λ˜μ–΄ μžˆλŠ” 경우, μž‘μ—…μ„ λ‹€λ₯Έ νŒ€μ›κ³Ό κ²ΉμΉ˜μ§€ μ•Šλ„λ‘ λͺ¨λ“ˆν™” λ˜λŠ” ν•¨μˆ˜ν™”λ₯Ό 강쑰함.

    • μž‘μ—… κ°„μ˜ μ˜μ‘΄μ„±μ„ μ œκ±°ν•˜μ—¬ 각 μž‘μ—…μ΄ λΉ„λ™κΈ°μ μœΌλ‘œ 진행될 수 μžˆλ„λ‘ 함. λ‹€λ₯Έ μž‘μ—…μ„ κΈ°λ‹€λ¦¬λŠλΌ μžμ‹ μ˜ μž‘μ—…μ„ μ§„ν–‰ν•˜μ§€ λͺ»ν•˜κ³  μžˆλŠ” 경우λ₯Ό μ΅œμ†Œν™”.
    • λ§ˆμ§€λ§‰ 각자 κ΅¬ν˜„ν•œ κΈ°λŠ₯을 ν•˜λ‚˜μ˜ ν”„λ‘œμ νŠΈλ‘œ μ™„μ„±ν•  λ•Œ νŒ€μ›λ“€μ΄ κ΅¬ν˜„ν•œ λ‚΄μš©μ„ μ„œλ‘œ λ¦¬λ·°ν•˜λ„λ‘ ν•˜μ—¬ μžμ‹ μ΄ μ•žμœΌλ‘œ μ–΄λ–€ μž‘μ—…μ„ μˆ˜ν–‰ν•΄μ•Ό ν•  μ§€ 이해λ₯Ό 도움.
  • κ΅¬ν˜„λœ useUserInput hook을 μ—°κ²°ν•˜μ—¬ μΆ”μ²œ 검색어λ₯Ό ν‚€λ³΄λ“œλ‘œ 선택할 수 μžˆλ„λ‘ ν•˜κ³ , 검색 κ²°κ³Όλ₯Ό state에 μ €μž₯ν•˜μ—¬ μ „μ—­μ—μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ κ΅¬ν˜„ν•¨.

  • μž‘μ—…μ„ μ „λΆ€ μ™„λ£Œν•˜κ³  main λΈŒλžœμΉ˜μ— dev 브랜치λ₯Ό λ³‘ν•©ν•œ ν›„, surgeλ₯Ό 톡해 배포 μ™„λ£Œ.

μ–΄λ €μ› λ˜ 점

  • μ΄ˆκΈ°μ— ν”„λ‘œμ νŠΈλ₯Ό μ™„λ²½ν•˜κ²Œ μ„€μ •ν•˜μ§€ λͺ»ν•΄μ„œ νŒ€μ›λ“€μ΄ μž‘μ—…μ„ μ§„ν–‰ν•  λ•Œ webpackμ΄λ‚˜ lint κ΄€λ ¨ν•΄μ„œ 문제λ₯Ό ν•΄κ²°ν•˜λŠ”λ° λ§Žμ€ μ‹œκ°„μ„ ν• μ• ν•΄μ•Ό ν–ˆμŒ.

    • js, jsx 파일이 μ•„λ‹ˆλΌλ©΄ lintκ°€ ν™•μΈν•˜μ§€ μ•Šλ„λ‘ .eslintignore와 .prettierignoreλ₯Ό μΆ”κ°€ν•˜μ—¬ 문제λ₯Ό 해결함.
    • νŒ€μ›μ΄ 어렀움을 κ²ͺ을 λ•Œ λΉ λ₯΄κ²Œ μ°Έμ—¬ν•˜μ—¬ 이 λΆ€λΆ„ κ΄€λ ¨ν•΄μ„œ 였랜 μ‹œκ°„ ν• μ• ν•˜μ§€ μ•Šκ³  κ°œλ°œμ— 집쀑할 수 μžˆλ„λ‘ 함.
  • 각 νŒ€μ› κ°„μ˜ μž‘μ—…μ˜ μ˜μ‘΄μ„±μ„ μ œκ±°ν•˜λŠ”λ° λ§Žμ€ 고민을 ν–ˆμŒ. μ˜μ‘΄μ„± μžˆλŠ” λ‹€λ₯Έ νŒ€μ›μ˜ μ½”λ“œκ°€ ν•„μš”ν•œ 상황일 λ•ŒλŠ” κ°„λ‹¨ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μ œμž‘ν•  수 μžˆλ„λ‘ 함.

  • 사전에 μŠ€νƒ€μΌμ΄λ‚˜ μ»¨λ²€μ…˜μ— λŒ€ν•œ κ·œμΉ™μ„ μ •ν–ˆμ§€λ§Œ, 짧은 μ‹œκ°„ 내에 λΉ λ₯΄κ²Œ κ°œλ°œμ„ ν•΄μ•Όν•˜λ‹ˆ κ·œμΉ™μ„ μ§€ν‚€μ§€ μ•ŠλŠ” κ²½μš°κ°€ λ§Žμ•„μ§.

    • 짧은 μ‹œκ°„ 내에 μ™„λ£Œν•΄μ•Όν•˜λŠ” ν”„λ‘œμ νŠΈμ˜ 경우, κ·œμΉ™μ„ κ°„μ†Œν™”ν•˜κ±°λ‚˜ λ”μš± μ™„λ²½ν•œ κ°€μ΄λ“œλΌμΈ 및 κ°•μ œμ„±μ΄ ν•„μš”ν•¨μ„ κΉ¨λ‹¬μŒ.

μ˜ˆνš¨μ€

API 호좜 μ΅œμ ν™” - Debounce κ΅¬ν˜„

ν‚€λ³΄λ“œ μž…λ ₯은 λ‹¨μ‹œκ°„μ— μ§€μ†μ μœΌλ‘œ μ΄λ²€νŠΈκ°€ λ°œμƒν•˜λ―€λ‘œ ν‚€λ³΄λ“œ μž…λ ₯μ‹œλ§ˆλ‹€ APIλ₯Ό ν˜ΈμΆœν•˜κ²Œλ˜λ©΄ μ„œλ²„ κ³ΌλΆ€ν•˜κ°€ λ°œμƒν•  수 있음. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ API 호좜 횟수λ₯Ό μ€„μ΄λŠ” 방법이 ν•„μš”ν•˜λ©° μ΄λŠ” debounce 기법을 톡해 ν•΄κ²°ν•  수 있음.

Debounce

: μ—¬λŸ¬λ²ˆ λ°œμƒν•˜λŠ” ν•¨μˆ˜μ—μ„œ κ°€μž₯ λ§ˆμ§€λ§‰ ν•¨μˆ˜λ§Œμ„ μ‹€ν–‰ν•˜λŠ” κΈ°λ²•μœΌλ‘œ μΌμ •μ‹œκ°„μ„ λŒ€κΈ°ν•œ ν›„ ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜λ©° κ·Έ μ‹œκ°„ 내에 같은 ν•¨μˆ˜κ°€ 또 호좜될 μ‹œμ—λŠ” 이전 ν•¨μˆ˜λŠ” μ‹€ν–‰λ˜μ§€ μ•ŠμŒ.

κ΅¬ν˜„

debounce κ΅¬ν˜„μ€ lodash 라이브러리λ₯Ό μ‚¬μš©ν•˜λŠ” 방법도 μžˆμœΌλ‚˜ 이번 ν”„λ‘œμ νŠΈμ—μ„œλŠ” setTimeout 을 ν™œμš©ν•œ ν•¨μˆ˜λ₯Ό κ°„λ‹¨ν•˜κ²Œ 직접 κ΅¬ν˜„. κ΅¬ν˜„λœ debounce ν•¨μˆ˜λŠ” onchange μ΄λ²€νŠΈμ— μ μš©ν•˜μ—¬ API ν˜ΈμΆœν•¨μˆ˜κ°€ λ§ˆμ§€λ§‰ μ΄λ²€νŠΈμ—μ„œλ§Œ μ‹€ν–‰λ˜λ„λ‘ ν•¨μœΌλ‘œμ¨ API 호좜 횟수λ₯Ό μ΅œμ ν™”ν•¨.

μ–΄λ €μ› λ˜ 점

debounceλ₯Ό onchange μ΄λ²€νŠΈμ— μΆ”κ°€ν•¨μœΌλ‘œμ¨ 검색 μ€‘μΌλ•ŒλŠ” μ΄λ²€νŠΈκ°€ μ‹€ν–‰λ˜μ§€ μ•Šκ³  κ²€μƒ‰μ˜ λ§ˆμ§€λ§‰ 이벀트만 μ‹€ν–‰λ˜μ–΄ 검색 쀑... ν‘œμ‹œλ₯Ό λ„μš°μ§€ λͺ»ν•œλ‹€λŠ” λ¬Έμ œκ°€ μžˆμ—ˆμŒ. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ κ²€μƒ‰κ²°κ³Όμ™€λŠ” λ³„κ°œλ‘œ κ²€μƒ‰μ€‘μž„μ„ ν™•μΈν•˜λŠ” isSearching stateλ₯Ό μƒˆλ‘œ λ§Œλ“€μ—ˆκ³ , onchange μ΄λ²€νŠΈκ°€ λ°œμƒν•  λ•Œ 이 값을 true둜 λ³€κ²½ν•˜μ—¬ '검색 쀑...' 문ꡬ가 λ‚˜νƒ€λ‚˜λ„λ‘ λ§Œλ“€μ—ˆμŒ.

졜민우

API 호좜 μ΅œμ ν™”

  • 캐싱을 ν†΅ν•˜μ—¬ μ—¬λŸ¬λ²ˆ API μ„œλ²„μ— μ§ˆμ˜ν•  ν•„μš” 없이 이미 μ €μž₯된 값을 ν™œμš©ν•  수 μžˆλ„λ‘ axios 라이브러리λ₯Ό λž˜ν•‘ν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•˜μ˜€λ‹€.

κ΅¬ν˜„

  • 캐싱을 κ΅¬ν˜„ν•˜λŠ” μ—¬λŸ¬ 방법이 μžˆμ§€λ§Œ μƒˆλ‘œκ³ μΉ¨λ“±μ˜ 변화에도 μœ μ§€λ˜λŠ” localStorageλ₯Ό μ΄μš©ν•˜λŠ” 것이 쒋을 것 κ°™λ‹€λŠ” 생각을 ν•˜μ˜€λ‹€.
  • 쿼리λ₯Ό JSON ν˜•νƒœλ‘œ λΉ„κ΅ν•˜μ—¬ λ™μΌν•œ μš”μ²­μ€ μΊμ‹œμ—μ„œ μΈμΆœν•˜μ—¬ μ‚¬μš©ν•˜κ³ , κ·Έλ ‡μ§€ μ•Šμ€ κ²½μš°λŠ” μš”μ²­μ„ 보낸 λ’€ 응닡을 μ €μž₯ν•˜κ³  값을 λŒλ €μ£ΌλŠ” λ°©μ‹μœΌλ‘œ μ‚¬μš©ν•˜μ˜€λ‹€.
  • μ΄λ ‡κ²Œ κ΅¬ν˜„ν•  경우 λ‹€λ₯Έ νŒ€μ›λ“€μ΄ 라이브러리 λ‘œλ“œλ°©μ‹λ§Œ λ³€κ²½ν•˜λ©΄ λ™μΌν•˜κ²Œ μž‘μ„± κ°€λŠ₯ν•˜μ—¬ μ‚¬μš©μ„±μ΄ νŽΈλ¦¬ν•˜λ‹€.

μ–΄λ €μ› λ˜ 점

  • μ΅œμ΄ˆμ—λŠ” λͺ¨λ“  fetch μš”μ²­μ„ κ°€λ‘œμ±„λŠ” λ°©μ‹μœΌλ‘œ μ§„ν–‰ν•˜λ €κ³  ν•˜μ˜€μœΌλ‚˜, 라이브러리의 λ‘œλ“œ μˆœμ„œκ°™μ€ 것을 μ‘°μ •ν•˜λŠ”λ° 어렀움을 κ²ͺμ–΄μ„œ λͺ¨λ“  톡신을 ν†΅μ œν•˜λŠ”λ° 어렀움을 κ²ͺμ—ˆκ³ ,
  • λ‚˜μ€‘μ— νŒ€μ›μ΄ axiosλ₯Ό μ‚¬μš©ν•˜λŠ” 것을 ν™•μΈν•˜μ—¬ ν•΄λ‹Ή 방식에 λ§žκ²Œλ” μ‘°μ •ν•˜λŠ” μž‘μ—…μ΄ μžˆμ—ˆλ‹€.
  • κ²°κ΅­ λž˜νΌν•¨μˆ˜ ν˜•νƒœλ‘œ μž‘μ„±ν•˜λŠ” 것이 μ μ ˆν•  κ²ƒμœΌλ‘œ νŒλ‹¨ν•˜μ—¬ λ°©ν–₯을 μˆ˜μ •ν•˜μ˜€λ‹€.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • JavaScript 96.0%
  • HTML 3.5%
  • Shell 0.5%