๐Ÿ”Ž ๊ฒ€์ƒ‰ ํ•„ํ„ฐ ๋งŒ๋“ค์–ด๋ณด๊ธฐ

Kim Jasonยท2023๋…„ 3์›” 20์ผ
0
post-thumbnail

๐Ÿงช ์˜ˆ์ œ ์†Œ๊ฐœ

๋ฆฌ์•กํŠธ์™€ Express๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ„๋‹จํ•œ ๊ฒ€์ƒ‰ ํ•„ํ„ฐ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.
์ฟผ๋ฆฌ์ŠคํŠธ๋ง์„ ์‚ฌ์šฉํ•ด ๊ฒ€์ƒ‰์–ด์™€ ๊ด€๋ จ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์—์„œ ๋ถˆ๋Ÿฌ์˜ค๋ ค๊ณ  ํ•œ๋‹ค.

์ฐธ๊ณ ๋กœ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

type User = {
  id: number;
  first_name: string;
  last_name: string;
  email: string;
  gender: string;
}

const data: User[] = [...];

์ „์ฒด์ ์ธ ์‹ค์Šต ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • (useEffect ์ฒซ ์‹คํ–‰) ๋ชจ๋“  ์œ ์ € ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด์— render > ๊ฒ€์ƒ‰์–ด ์ž…๋ ฅ > state(query) ๊ฐ’ ๋ณ€๊ฒฝ > useEffect ์‹คํ–‰ > state(query)๋ฅผ ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์— ์ž‘์„ฑํ•˜๊ณ  ์„œ๋ฒ„๋กœ ์ „์†ก > ์„œ๋ฒ„์—์„œ query ๊ฐ’์ด ํฌํ•จ๋œ ๊ฒฐ๊ณผ๋ฅผ ์‘๋‹ต > ํ•„ํ„ฐ๋ง ๊ฒฐ๊ณผ๋ฅผ ํ™”๋ฉด์— render

๐Ÿ™‹๐Ÿป ๊ณ ๋ฏผํ•œ ์ 

๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•„ํ„ฐ๋งํ• ์ง€ ๊ณ ๋ฏผํ–ˆ๋‹ค.
์ž…๋ ฅํ•œ ๊ฒ€์ƒ‰์–ด๊ฐ€ 'first_name', 'last_name', 'email' ํ•„๋“œ ์ค‘ ์ตœ์†Œ ํ•œ ๊ณณ์—๋ผ๋„ ํฌํ•จ๋œ๋‹ค๋ฉด ํ•ด๋‹น ์œ ์ € ๋ฐ์ดํ„ฐ๋ฅผ ์‘๋‹ตํ•˜๋ ค ํ–ˆ๋‹ค.

data.filter(
  user =>
    user.first_name.toLowerCase().includes(query) ||
    user.first_name.toLowerCase().includes(query) ||
    user.first_name.toLowerCase().includes(query)
)

๊ฐ€์žฅ ๋จผ์ € ๋– ์˜ค๋ฅธ ๋ฐฉ์‹์€ ์œ„์™€ ๊ฐ™์€๋ฐ ๋‚˜๋ฆ„์˜ ๋ฌธ์ œ์ ์ด ๋ณด์˜€๋‹ค.
์šฐ์„  ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์กŒ๊ณ , ํ•„ํ„ฐ๋ง ์กฐ๊ฑด์ด ๋Š˜์–ด๋‚œ๋‹ค๋ฉด ์ฝ”๋“œ์˜ ๊ธธ์ด๋Š” ๋Š˜์–ด๋‚  ์ˆ˜ ๋ฐ–์— ์—†์—ˆ๋‹ค.
๋ณด๋‹ค ๋” ๊ฐœ์„ ๋œ ํ•„ํ„ฐ๋ง ๋กœ์ง์ด ํ•„์š”ํ–ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ• ์ง€ ๊ณ ๋ฏผํ•˜๋˜ ์ค‘ some ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ๊ฐ€ ๋– ์˜ฌ๋ž๋‹ค
'first_name', 'last_name', 'email' ๋ฌธ์ž์—ด์„ ๋ฐฐ์—ด์— ์ €์žฅํ•˜๊ณ  some ๋ฉ”์„œ๋“œ๋ฅผ ์ ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

๐Ÿ’ป ์ „์ฒด ์ฝ”๋“œ

ํด๋ผ์ด์–ธํŠธ

// โœ… App.js (ํด๋ผ์ด์–ธํŠธ)

import { useEffect, useState } from "react";
import axios from "axios";
import "./App.css";
import Table from "./Table";

function App() {
  const [query, setQuery] = useState("");
  const [data, setData] = useState([]);

  useEffect(() => {
    const fetchUsers = async () => {
      const res = await axios.get(`http://localhost:3333?q=${query}`);
      setData(res.data);
    };
    if (query.length === 0 || query.length >= 2) fetchUsers();
  }, [query]);

  return (
    <div className="app">
      <input
        type="text"
        placeholder="Search..."
        value={query}
        onChange={e => setQuery(e.target.value)}
        className="search"
      />
      <Table data={data} />
    </div>
  );
}

export default App;

์„œ๋ฒ„

์„œ๋ฒ„ ์ชฝ ์ฝ”๋“œ์— ํ•„ํ„ฐ๋ง ๋กœ์ง์„ ์ ์šฉํ•ด ํ•„ํ„ฐ๋ง ๋œ ์œ ์ € ๋ฐ์ดํ„ฐ๋ฅผ ์‘๋‹ตํ•œ๋‹ค.

// โœ… index.js (์„œ๋ฒ„)

import express from "express";
import cors from "cors";
import { Users } from "./users.js";

const app = express();
app.use(cors());

app.get("/", (req, res) => {
  const { q } = req.query;
  const keys = ["first_name", "last_name", "email"];
  const search = data =>
    data.filter(item => keys.some(key => item[key].toLowerCase().includes(q)));
  res.json(search(Users));
});
app.listen(3333, () => console.log("API is working!!"));

๐Ÿ’ก ๊ฒฐ๊ณผ


์ž…๋ ฅ๋œ ๊ฒ€์ƒ‰์–ด๊ฐ€ ํฌํ•จ๋œ ์œ ์ € ๋ฐ์ดํ„ฐ๋งŒ ์„ฑ๊ณต์ ์œผ๋กœ ๋ Œ๋”๋ง ๋œ๋‹ค.
๋ณด๋‹ค ๋” ์ตœ์ ํ™” ๋œ ํ•„ํ„ฐ๋ง ๋กœ์ง์— ๋Œ€ํ•ด์„œ๋Š” ์ฐจ์ฐจ ๊ณต๋ถ€ํ•ด๋ณด์ž...โœ๐Ÿป

profile
์„ฑ์žฅ์ง€ํ–ฅํ˜• ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€