혼자 고민해보기_ 개발/TIL (Today I Learned)

20230720(목)_ 백오피스 프로젝트

nuri-story 2023. 7. 21. 00:23

 금일 달성 항목

1) 검색 기능 구현, 상세페이지 구현 (음식점, 메뉴 정보 불러오기)


문제 해결 과정 1 - 검색기능 구현

[문제]

프론트에 검색 형태는 만들었지만 어떻게 api 데이터를 가져와서 사용해야하는지 모르는 상황이었습니다.

 

[시도 및 해결]

튜터님에게 여쭤봐서 해결하였습니다.

 

 

1. Include를 통해 Op.like 로 메뉴데이터를 찾아 불러오는 코드를 추가 작성합니다.

 

repositories

getAllRestaurant = async (foodName, category) => {
    // foodName search
    if (foodName) {
      return await Restaurant.findAll({
        include: [
          {
            model: Menu,
            where: {
              name: { [Op.like]: '%' + foodName + '%' },
            },
          },
        ],
        order: [['createdAt', 'DESC']],
      });
    }

    // category search
    if (category) {
      return await Restaurant.findAll({
        where: {
          category: { [Op.like]: '%' + category + '%' },
        },
        order: [['createdAt', 'DESC']],
      });
    }

    return await Restaurant.findAll({
      attributes: [
        'restaurant_id',
        'Owner_id',
        'name',
        'address',
        'phone_num',
        'biz_hours',
        'category',
        'createdAt',
        'updatedAt',
      ],
      order: [['createdAt', 'DESC']],
    });
  };

  // 음식점 조회
  getRestaurant = async ({ restaurant_id }) => {
    return await Restaurant.findAll({
      where: { restaurant_id },
      attributes: [
        'restaurant_id',
        'Owner_id',
        'name',
        'address',
        'phone_num',
        'biz_hours',
        'category',
        'createdAt',
        'updatedAt',
      ],
      include: [
        {
          model: Menu,
        },
      ],
      order: [['createdAt', 'DESC']],
    });
  };

 

 

2. search.ejs 파일에 fetch 문을 통해 해당 데이터를 불러옵니다.

</head>
<body>
  <header>
    <div class="search">
    <form action="/" method="GET">
      <input placeholder="음식, 음식 카테고리를 검색해보세요" id="searchBox" type="text" />
      <i class="fa fa-search searchBtn" aria-hidden="true"></i>
    </form>
    </div>
  </header>

  <script>
  const searchBtn = document.querySelector(".searchBtn");
  const searchBox = document.getElementById("searchBox");
  

  const search = async () => {   
    if (!searchBox.value) return alert("검색어를 입력해 주세요.");


    let foodNameResult = await fetch(`/restaurant?foodName=${searchBox.value}`)
    foodNameResult = await foodNameResult.json()
    console.log({foodNameResult})

    let categoryResult = await fetch(`/restaurant?category=${searchBox.value}`)
    categoryResult = await categoryResult.json()
    console.log({categoryResult})
  };

  searchBtn.addEventListener("click", search);
  searchBox.addEventListener("keypress", (e) => {
    e.preventDefault();
    if (e.key === "Enter") search();
  });
  searchBox.focus();

  
  </script>
</body>

그럼 개발자모드에서 음식 메뉴명과 카테고리 데이터 배열이 나오는 것을 확인할 수 있습니다.

 

[알게된 점]

Op.like가 데이터를 뽑아서 찾아내는 역할을 하는 것을 알았습니다.