πŸŽ„ μ„±μž₯일지 4.0

μ±… ν–‰λ³΅ν•œ 이기주의자(웨인 닀이어)의 λ‚΄μš©μ— μžκ·Ήλ°›μ•„ μ‹œμž‘ν•˜λŠ” μ†Œλ°•ν•œ μ„±μž₯기둝

μ‚΄μ•„μžˆλŠ” 꽃과 죽은 꽃은 μ–΄λ–»κ²Œ κ΅¬λ³„ν•˜λŠ”κ°€?
μ„±μž₯ν•˜κ³  μžˆλŠ” 것이 μ‚΄μ•„ μžˆλŠ” 것이닀.
생λͺ…μ˜ μœ μΌν•œ μ¦κ±°λŠ” μ„±μž₯이닀!

🌳 (1.0)ν‚€μ›Œλ“œ
μ΅œλŒ€ν•œ κ°„λ‹¨ν•˜κ²Œ 정리, 좔후에 λ³΄λ©΄μ„œ 슀슀둜 μ„€λͺ…
πŸ‰ (2.0)κ²½ν—˜ μœ„μ£Όλ‘œ
λ‹¨μˆœ 정보λ₯Ό μ „λ‹¬ν•˜κΈ°λ³΄λ‹€ 무엇을 λ°°μ› κ³  μ–΄λ–»κ²Œ ν•΄κ²°ν–ˆλŠ”μ§€ 짧고 κ°„λ‹¨ν•˜κ²Œ μž‘μ„±
❄️ (3.0)정해진 ν…œν”Œλ¦Ώμ— λ§žμΆ°μ„œ
ν‚€μ›Œλ“œ, κ²½ν—˜ λͺ¨λ‘ μ’‹λ‹€. λ‹€λ§Œ 맀일 μž‘μ„±ν•˜κΈ°λ‘œ 마음 λ¨Ήμ€λ§ŒνΌ ν•΅μ‹¬λ§Œ κ°„κ²°ν•˜κ²Œ 정리할 수 있게 ν…œν”Œλ¦Ώμ„ μž‘μ„±
(3.1)230102λΆ€ν„° μ‹œμž‘λ˜λŠ” ν•™μŠ΅μ— κ΄€ν•œ λ‚΄μš© μΆ”κ°€
(3.2)230313λΆ€ν„° 쒀더 κ²½ν—˜, 감정 μœ„μ£Όμ˜ λ‚΄μš©λ„ λ‹΄κΈ°!
🌾 (4.0)ν•™μŠ΅ ν‚€μ›Œλ“œμ—μ„œ μ΅œλŒ€ν•œ κ°„λ‹¨ν•œ 정보 제곡, κ³ λ―Όμ—μ„œ λ‚΄ κ²½ν—˜μ„ μžμ„Ένžˆ 적자!

πŸ”‘ 였늘의 ν•™μŠ΅ ν‚€μ›Œλ“œ

Node.js, express μ„œλ²„ λ¦¬νŒ©ν† λ§

import * as express from 'express';
import * as bodyParser from 'body-parser'; // μš”μ²­μ— λŒ€ν•œ bodyλ₯Ό νŒŒμ‹±ν•˜λŠ” μ—­ν• 
import * as dotenv from 'dotenv'; // .env νŒŒμΌμ„ 톡해 λ³΄μ•ˆμƒ κ°€λ €μ•Όν•  데이터λ₯Ό λ”°λ‘œ λ‘”λ‹€.
import * as cors from 'cors'; // CORS μ—λŸ¬λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•¨
import * as mongoDb from 'mongodb'; // mongodb와 μ—°κ²°!

dotenv.config(); // 이제 μ•„λž˜μ—μ„œ process.env둜 μ–΄λ–€ 값듀을 κ°€μ Έμ˜¬ 수 μžˆλ‹€.(숨길 수 μžˆλ‹€.)

async function main() {
  const MongoClient = mongoDb.MongoClient;
  const client = new MongoClient(
      `mongodb+srv://${process.env.MONGO_USER_NAME}:${process.env.MONGO_PASSWORD}@${process.env.MONGO_CLUSTER_NAME}.jy2zpck.mongodb.net/?retryWrites=true&w=majority`,
  );
  await client.connect();
  const db = client.db('data-base-name');

  const app = express();
  app.use(bodyParser.urlencoded({ extended: true }));
  app.use(cors());

  app.listen(process.env.PORT, () => {
    console.log('listening on 1116');
  });

  app.get('/top10', (req, res) => {
    res.json('ν…ŒμŠ€νŠΈ λ¬Έμžμ—΄');
  });

  app.get('/search', async (req, res) => {
    const query = req.query.q; // μš”μ²­μ˜ query string에 λ‹΄κ²¨μžˆλŠ” 값을 λ°›μ•„μ˜¨λ‹€.
    const collection = db.collection('product');
    const result = await collection
        .find({ keywords: { $regex: `${query}`, $options: 'i' } })
        .toArray();
    if (result.length === 0) {
      res.json([{ keywords: 'ν•΄λ‹Ήν•˜λŠ” μƒν’ˆμ΄ μ—†μŠ΅λ‹ˆλ‹€.' }]);
    } else {
      res.json(result);
    }
  });
}

main();

μœ„μ™€ 같은 흐름이 더 mongoDBμ™€μ˜ μ—°κ²° 및 expressλ₯Ό ν†΅ν•œ μ„œλ²„λ₯Ό λ„μš°κΈ°μ˜ 흐름이 λ³΄μ΄λŠ” 것 κ°™μ•„ μˆ˜μ •ν•˜μ˜€λ‹€.

  • MongoClient와 mongoDB url을 톡해 client 객체λ₯Ό λ§Œλ“€μ–΄ μ€€λ‹€.
  • client 객체의 connect() λ©”μ„œλ“œλ‘œ μ—°κ²°ν•΄μ€€λ‹€.
  • client의 db λ©”μ„œλ“œλ₯Ό 톡해 λ§Œλ“€μ–΄λ†“μ€ database 이름을 λ¬Έμžμ—΄λ‘œ μ „λ‹¬ν•œλ‹€.
  • 이제 이 db κ°μ²΄μ—μ„œ ν•„μš”ν•  λ•Œλ§ˆλ‹€ collection으둜 μ ‘κ·Όν•˜μ—¬ μ„œλ²„ api 둜직과 ν•¨κ»˜ μ‚¬μš©ν•˜λ©΄ λœλ‹€.
    • 이 λ•Œ, mongoDBμ—μ„œ collection은 SQL의 ν…Œμ΄λΈ” ν•˜λ‚˜μ™€ κ°™λ‹€κ³  μƒκ°ν•˜λ©΄ λœλ‹€.

λ””λ°”μš΄μŠ€(Debounce)

  • 이벀트λ₯Ό 그룹으둜 λ¬Άκ³  νŠΉμ •μ‹œκ°„μ΄ μ§€λ‚œ ν›„, λ§ˆμ§€λ§‰ ν•˜λ‚˜μ˜ 이벀트만 λ°œμƒν•˜λ„λ‘ ν•˜λŠ” 방법
  • setTimeoutκ³Ό clearTimeout으둜 κ΅¬ν˜„ν•΄λ³Ό 수 μžˆλ‹€.
export const debounce = (callback: (e: Event) => void, delay: number) => {
  let timerId: ReturnType<typeof setTimeout>;
  return (event: Event) => {
    if (timerId) clearTimeout(timerId);
    timerId = setTimeout(callback, delay, event);
  };
};

// ν™œμš© μ˜ˆμ‹œ
this.setEventListener(
    'click',
    debounce(() => {
      this.searchListComponent.deleteAllChild();
      if (this.searchListComponent.element.style.display !== 'flex') {
        this.searchListComponent.show();
        dimLayer.on();
      }

      fetch('http://localhost:1116/search?q=')
          .then((res) => res.json())
          .then((data) =>
              data.slice(0, 10).forEach((d: ProductData) => {
                this.searchListComponent.addChildHtml(`<li>${d.keywords}</li>`);
              }),
          );
    }, 300),
);
  • debounceλ₯Ό μ΄μš©ν•˜μ—¬ 계속 λ˜λŠ” click μ΄λ²€νŠΈμ— λ”°λ₯Έ fetch λ°œμƒμ„ λ§ˆμ§€λ§‰ 1번만 λ°œμƒν•˜κ²Œ ν•΄μ£Όμ—ˆλ‹€.

πŸ€ 였늘의 κ³ λ―Ό ν‚€μ›Œλ“œ

api 둜직

μ„œλ²„ κ°œλ°œμžλŠ” μ•„λ‹ˆμ§€λ§Œ, 쒀더 λ³΅μž‘ν•œ api λ‘œμ§μ€ λ§Œλ“€κ³  μ²˜λ¦¬ν•˜λŠ”μ§€ κΆκΈˆν•˜λ‹€. λ‚΄κ°€ λ§Œλ“  api처럼 μ €λ ‡κ²Œ κ°„λ‹¨ν•˜μ§€λŠ” μ•Šμ„ κ±° 같은데..!

πŸ“ μš”μ•½ 및 ν•˜λ£¨ 간단 회고

μ–΄μ œκΉŒμ§€λ§Œ 해도 괜히 μ„œλ²„ λ„μš°λŠ” 것도 해보겠닀고 λ¬΄λ¦¬ν–ˆλ‚˜ μ‹Άμ—ˆμ§€λ§Œ, μ΄λ ‡κ²Œ 직접 μ„œλ²„λ₯Ό λ„μš°κ³  apiλ₯Ό λ§Œλ“€μ–΄μ„œ μš”μ²­μ— λŒ€ν•œ 응닡을 μ²˜λ¦¬ν•΄λ³΄λ‹ˆ λ„ˆλ¬΄ 재미있고 전체적인 흐름을 μ΄ν•΄ν•˜λŠ”λ° 도움이 된 것 κ°™λ‹€. 아직 UIμͺ½ κ΅¬ν˜„μ΄ λ―Έν‘ν•˜κ³  λ°›μ•„μ˜¨ 응닡 데이터λ₯Ό μ–΄λ–»κ²Œ 쒀더 잘 가곡할지가 κ³ λ―Όμ΄κΈ΄ν•˜μ§€λ§Œ..!

였늘의 μž˜ν•œ 점

  • κ°„λ‹¨ν•œ apiλ₯Ό λ§Œλ“€κ³  μ›ν•˜λŠ” responseλ₯Ό μ „λ‹¬ν•œ 것
  • λ””λ°”μš΄μŠ€λ₯Ό 톡해 κ³„μ†λ˜λŠ” 이벀트λ₯Ό 막고 μ„œλ²„μ— λΆ€ν•˜κ°€ 걸리지 μ•Šκ²Œ μ²˜λ¦¬ν•œμ 

였늘의 μ•„μ‰¬μš΄ 점

  • 개발 속도가 λΉ λ₯΄μ§€ λͺ»ν•œ 것 κ°™λ‹€.
  • μ•žμœΌλ‘œ μ½”λ“œλ₯Ό 지 λ•ŒλŠ” 머릿속에 λͺ…ν™•ν•œ 섀계λ₯Ό κ°–κ³  μž„ν•΄μ•Όκ² λ‹€λŠ” 생각이 λ“ λ‹€.

μ°Έκ³