키워드 검색 기능 구현

Jiyoung·2021년 6월 11일
2

검색창에 어떤 단어를 입력했을 때 db데이터의 결과값을 반환하는 검색 기능을 구현하였다. 이 기능을 구현하면서 다음의 조건들을 유의하여 코드를 작성하였다.

1. 키워드(검색할 단어)를 req.body값이 아닌 req.query로 받아서 처리할 것.

const keyword=req.query.q 이런 식으로 키워드를 query string값으로 받아서 이 값을 db에서 찾으면 된다.

2. 일치검색이 아닌 유사검색일 것. 즉 title이 'test'인 게시물을 검색하는 경우, 제목이 정확히 'test'인 게시물만 찾는 것이 아니라, title에 'test'가 들어간 모든 게시물을 찾아야 됨.

SQL문으로 작성해보면 select * from Diaries where title like '%test%'; 이렇게 되어야 한다. 아래는 sequelize ORM을 사용한 코드이다.

const sequelize = require("sequelize");
const { or, and, like } = sequelize.Op;

 const searchDiary = await Diary.findAll({
        where: { [and]: [{ private: false }], [or]: [{ title: { [like]: `%${keyword}%` } }, { content: { [like]: `%${keyword}%` } }] },
    })

3. 키워드와 일치하는 데이터가 없을 경우

이 부분은 금방 할 줄 알았는데 가장 삽질을 많이 했다😭 일치하는 데이터가 없다는 조건을 어떻게 구현해야할지 한참을 헤맨 끝에 마지막으로 시도한 방법이 성공하였다.

    if (searchDiary.length === 0) {
        return res.status(401).json({ message: '검색과 일치하는 내용의 일기가 없습니다.' })
    }

즉 db에서 keyword가 있는 곳을 찾으면 그 결과값이 배열에 담기는데, 빈 배열을 반환하면 결과값이 없다는 것이니, 데이터.length가 0이되는 될 때가 바로 찾는 데이터가 없는 경우인 것이다.

코드를 다 작성한 후 포스트맨으로 검색어('간이역')를 입력하고 GET 요청을 하니,

이렇게 결과값이 잘 나오는 것을 확인할 수 있었다.

유용했던 참고 자료들:
https://ram-t.tistory.com/67
https://myunji.tistory.com/156?category=1154148

profile
경계를 넘는 삶

0개의 댓글