개발 곡뢀/λ°λΈŒμ½”μŠ€ TIL

[ν΄λΌμš°λ”© μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ μ—”μ§€λ‹ˆμ–΄λ§ TIL] 240119 - 고양이 사진 검색 μ‹€μŠ΅ 3

κ°€μš€μ΄ 2024. 1. 20. 14:54

Intro


μ˜€λŠ˜μ€ 고양이 사진 검색 μ‹€μŠ΅μ— λŒ€ν•œ κ°„λ‹¨ν•œ λ¦¬νŒ©ν† λ§μ„ ν•™μŠ΅ν–ˆλ‹€.

λͺ¨μ˜ ν…ŒμŠ€νŠΈλ₯Ό 풀라고 ν–ˆλŠ”λ° κ°•μ˜λ₯Ό λ‹€ λ“€μ–΄μ•Ό ν’€ 수 μžˆμ„ 것 κ°™μ•„μ„œ 계속 미루고 μžˆλŠ” 쀑이닀 γ…Ž,,,

 

 

 

 

였늘 ν•™μŠ΅ν•œ λ‚΄μš©

: api, λͺ¨λ“ˆν™”, 기타 λ¦¬νŒ©ν† λ§


πŸ‘©‍πŸ’» async-await λ„μž…
API fetch μ½”λ“œλ₯Ό async , await λ¬Έμ„ μ΄μš©ν•˜μ—¬ μˆ˜μ •ν•΄μ£Όμ„Έμš”. ν•΄λ‹Ή μ½”λ“œλ“€μ€ μ—λŸ¬κ°€ 났을 경우λ₯Ό λŒ€λΉ„ν•΄μ„œ 적절히 μ²˜λ¦¬κ°€ λ˜μ–΄μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

πŸ‘©‍πŸ’» api μš”μ²­ κ²°κ³Ό 처리
API 의 status code 에 따라 μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό λΆ„λ¦¬ν•˜μ—¬ μž‘μ„±ν•΄μ•Ό ν•©λ‹ˆλ‹€.

async-await

κΈ°μ‘΄ μ½”λ“œμ—μ„  api 호좜 μ‹œμ— μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ fetch-then을 톡해 apiλ₯Ό ν˜ΈμΆœν•˜μ˜€λŠ”λ° fetch-then보닀 가독성이 쒋은 async-await 문법을 μ΄μš©ν•΄ μ½”λ“œλ₯Ό κ°œμ„ ν•˜μ˜€λ‹€.

  • fetch-then
const result = () => {
  return fetch(url).then((res) => res.json());
}
  • async-await
const request = async url => {
  return await fetch(url);
}

 

μΆ”κ°€λ‘œ, try-catch문을 μ‚¬μš©ν•΄ μ—λŸ¬ 핸듀링을 ν•˜μ˜€λ‹€.

const request = async (url) => {
  try {
    const result = await fetch(url);
    if (result.status === 200) {
      return result.json();
    } else throw REQUEST_ERROR[result.status];
  } catch (err) {
    alert(err.msg);
    return { data: null };
  }
};

 

 

 


 

πŸ‘©‍πŸ’» ES6, import, export
ES6 module ν˜•νƒœλ‘œ μ½”λ“œλ₯Ό λ³€κ²½ν•©λ‹ˆλ‹€. webpack , parcel κ³Ό 같은 λ²ˆλ“€λŸ¬λ₯Ό μ‚¬μš©ν•˜μ§€ λ§μ•„μ£Όμ„Έμš”. ν•΄λ‹Ή μ½”λ“œ 싀행을 μœ„ν•΄μ„œλŠ” http-server λͺ¨λ“ˆμ„(둜컬 μ„œλ²„λ₯Ό λ„μš°λŠ” λ‹€λ₯Έ λͺ¨λ“ˆλ„ μ‚¬μš© κ°€λŠ₯) 톡해 index.html μ„ λ„μ›Œμ•Ό ν•©λ‹ˆλ‹€.

 

import/export

<body>	
  <div id="App"></div>
  <script src="src/utils/validator.js"></script>
  <script src="src/api.js"></script>
  <script src="src/ImageInfo.js"></script>
  <script src="src/SearchInput.js"></script>
  <script src="src/DarkModeToggle.js"></script>
  <script src="src/Loading.js"></script>
  <script src="src/KeywordHistory.js"></script>
  <script src="src/SearchResult.js"></script>
  <script src="src/App.js"></script>
  <script src="src/main.js"></script>
</body>

 

import/exportλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  μ½”λ“œλ₯Ό 뢈러였기 μœ„ν•΄μ„  script νƒœκ·Έλ‘œ index.html에 ν˜ΈμΆœν–ˆμ–΄μ•Ό ν–ˆλ‹€.

<div id="App"></div>
<script type="module" src="src/main.js"></script>

 

ES6μ—μ„œ μƒˆλ‘­κ²Œ λ„μž…λœ import/exportλ₯Ό μ‚¬μš©ν•΄ main.jsλ‚˜ App.js에 클래슀 μ»΄ν¬λ„ŒνŠΈλ“€μ„ exportν•˜μ—¬ μ΅œμ’…μ μœΌλ‘œ index.htmlμ—λŠ” main.js만 ν˜ΈμΆœν•  수 μžˆλ„λ‘ κ΅¬ν˜„ν•œλ‹€.

μ€‘μš”ν•œ 건 type="module" 속성을 κΌ­ λ„£μ–΄μ€˜μ•Ό ν•œλ‹€.

  • main.js
import App from './App.js';

new App(document.querySelector('#App'));
  • App.js
import Loading from './Loading.js';
import DarkModeToggle from './DarkModeToggle.js';
import ImageInfo from './ImageInfo.js';
import SearchInput from './SearchInput.js';
import SearchResult from './SearchResult.js';
import api from './api.js';

class App {
  ...
}

export default App

 

 

 

 


기타 λ¦¬νŒ©ν† λ§

졜근 κ²€μƒ‰ν•œ ν‚€μ›Œλ“œλ₯Ό SearchInput μ•„λž˜μ— ν‘œμ‹œλ˜λ„λ‘ λ§Œλ“€κ³ , ν•΄λ‹Ή μ˜μ—­μ— ν‘œμ‹œλœ νŠΉμ • ν‚€μ›Œλ“œλ₯Ό λˆ„λ₯΄λ©΄ κ·Έ ν‚€μ›Œλ“œλ‘œ 검색이 μΌμ–΄λ‚˜λ„λ‘ λ§Œλ“­λ‹ˆλ‹€.
단, κ°€μž₯ μ΅œκ·Όμ— κ²€μƒ‰ν•œ 5개의 ν‚€μ›Œλ“œλ§Œ λ…ΈμΆœλ˜λ„λ‘ ν•©λ‹ˆλ‹€.

 

Set

κ³ μœ ν•œ 값을 μ €μž₯ν•  수 μžˆλŠ” 자료ꡬ쑰인 Set을 μ‚¬μš©ν•˜μ—¬ μ΅œκ·Όμ— κ²€μƒ‰ν•œ 5개의 ν‚€μ›Œλ“œμ—μ„œ μ€‘λ³΅λœ 검색어λ₯Ό μ œκ±°ν•˜λŠ” λ¦¬νŒ©ν† λ§μ„ μ§„ν–‰ν–ˆλ‹€.

Array.from(new Set(list))

 

new Set으둜 Set μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  이λ₯Ό λ°°μ—΄λ‘œ λ³€ν™˜ν•˜λŠ” λ©”μ†Œλ“œμΈ Array.from을 μ‚¬μš©ν•΄ 배열을 λ°˜ν™˜ν•œλ‹€.

 

 

 

 

 

마무리


μ‹€μŠ΅μ„ μ§„ν–‰ν•΄λ³΄λ‹ˆ μ•žμœΌλ‘œ ν”„λ‘œμ νŠΈ ν•  λ•Œ μ–΄λ–»κ²Œ κ°œλ°œν•΄μ•Ό ν• μ§€ λ°©ν–₯이 μ–΄λŠμ •λ„ μž‘νžˆλŠ” 것 κ°™λ‹€.

그리고 κ°•μ˜μ—μ„œ κ°•μ‚¬λ‹˜μ΄ μ•Œλ €μ£Όμ‹  μ½”λ“œ κ΅¬ν˜„ν•˜λŠ” λ°©λ²•λŒ€λ‘œ μ½”λ“œλ₯Ό μ§€ λ•Œ console.logλ₯Ό 찍어보며 데이터가 잘 λ“€μ–΄μ˜€λŠ”μ§€ ν™•μΈν•΄λ³΄λ©΄μ„œ μ½”λ“œλ₯Ό μ§œλ‹ˆ μ–΄λ””μ„œλΆ€ν„° 잘λͺ»λλŠ”μ§€ 였λ₯˜λ₯Ό ν•΄κ²°ν•˜λŠ” 데에 μ‹œκ°„μ„ 단좕할 수 μžˆμ—ˆλ‹€.