[NODE] Query 문을 이용한 통합 검색 구현

서수·2022년 12월 11일
1
post-thumbnail

GitHub 참고 링크

통합 검색 구현 소개

mySQL에서 Query 문을 통하여 통합검색을 구현하는 연습을 하였습니다.
SQL의 모든 컬럼을 돌면서 검색하려는 keyword가 있는지 확인하고, 만약 띄어쓰기가 들어간 여러 조건에 맞는 검색을 할 때는 keyword의 조건을 충족해야 검색이 뜨게끔 구현하였습니다. 조건에 완벽하게 부합하지 않으면 아예 검색 결과가 나오지 않기 때문에 완벽한 통합검색은 아니지만, 띄어쓰기를 하면 그에 맞는 조건을 검색하기 때문에 구현 해보았습니다.

구현 방법 설명

파일 디렉토리 구조는 DB를 연결해 주는 config.js와 mySQL을 연결해주고 TABLE을 설정하는 migration과 models 그리고 보안을 위한 dotenv와 서버를 구현해주는 app.js로 되어있습니다.

그 전에 필요한 모듈들을 설치를 해줍니다.

$npm install express
$npm install mysql2
$npm install sequelize
$npm install sequelize-cli
$npm install dotenv

그리고 app.js로 넘어가서 필요한 모듈 및 라이브러리들을 불러와 줍니다.

const express = require("express");
const app = express();
const { Posts } = require("./models")
const mysql2 = require("mysql2");
require("dotenv").config();

그리고 DB를 연결해 주는 로직을 불러와줍니다.

const db = mysql2.createConnection({
    host: process.env.DB_HOST,
    user: process.env.DB_USERNAME,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_MYDATABASE,
});
db.connect();

위 사항들은 유출 될 시 보안의 문제가 발생할 수 있으므로 .env 파일에 잘 넣어 쓰기 바랍니다.

dbQueryAsync = async (sql) => {
    return new Promise((resolve, reject) => {
      db.query(sql, (error, result) => {
        if (error) {
          reject(error);
        }
        resolve(result);
      });
    });
  };

SQL 로직이 함수로 실행되면,DB에 QUERY가 실행되는 함수로직도 하나 만들어줍니다. 로직이 정상적으로 돌아갔을 때 resolve 가 돌아가고 아니라면 error처리로 reject가 실행됩니다.

일단 mySQL에 게시글 하나를 넣어주었습니다.

그리고 다음과 같이 로직을 짜 줍니다.

app.get("/posts/:keywords", async(req, res)=>{
    // keywords를 params로 받음
    const { keywords } = req.params
    // 띄어쓰기가 들어간 keywords 들을 띄워쓰기로 나눔
    let AllKeywords = keywords.split(' ')
    // 최대 2번의 띄워쓰기로 3개의 키워드로 검색하게 만듬. 3개의 변수로 각각 할당해줌.
    let [keyword, keyword2, keyword3] = AllKeywords
   
    // 모든 컬럼을 돌면서 그 keyword 가 들어가 있는지 검색.
        // keyword가 1개 입력됐을때
    if (AllKeywords.length === 1){
        const sql = `SELECT * FROM Posts where title like '%${keyword}%' OR content like '%${keyword}%' OR location like '%${keyword}%' OR spotName like '%${keyword}%' OR sports like '%${keyword}%' OR comforts like '%${keyword}%'`
        const data = await dbQueryAsync(sql)
        res.status(200).json({result : data})
        //키워드가 2개 입력됐을 때
    } else if (AllKeywords.length === 2){
        const sql2 = `SELECT * FROM Posts where (title like '%${keyword}%' OR content like '%${keyword}%' OR location like '%${keyword}%' OR spotName like '%${keyword}%' OR sports like '%${keyword}%' OR comforts like '%${keyword}%') AND (title like '%${keyword2}%' OR content like '%${keyword2}%' OR location like '%${keyword2}%' OR spotName like '%${keyword2}%' OR sports like '%${keyword2}%' OR comforts like '%${keyword2}%')`
        const data2 = await dbQueryAsync(sql2)
        res.status(200).json({result : data2})
        //키워드가 3개 입력됐을 때
    } else if (AllKeywords.length === 3){
        const sql3 = `SELECT * FROM Posts where (title like '%${keyword}%' OR content like '%${keyword}%' OR location like '%${keyword}%' OR spotName like '%${keyword}%' OR sports like '%${keyword}%' OR comforts like '%${keyword}%') AND (title like '%${keyword2}%' OR content like '%${keyword2}%' OR location like '%${keyword2}%' OR spotName like '%${keyword2}%' OR sports like '%${keyword2}%' OR comforts like '%${keyword2}%') AND (title like '%${keyword3}%' OR content like '%${keyword3}%' OR location like '%${keyword3}%' OR spotName like '%${keyword3}%' OR sports like '%${keyword3}%' OR comforts like '%${keyword3}%')`
        const data3 = await dbQueryAsync(sql3)
        res.status(200).json({result : data3})
    }
})

GET 방식을 통해서 Keywords 를 params로 받고, 이 params에 띄어쓰기가 있다면 띄워쓰기를split으로 나눠 준 뒤 모든 칼럼에 그 값들이 있는지 확인을 하고 모든 키워드가 존재한다면 반환하게끔 만들어 주었습니다.

그리고 나서 Thunder Client 를 사용해서 GET을 요청했을 때 모습입니다.

서울 테니스 화장실을 검색했을 때, params로 서울, 테니스, 화장실이 넘어오게 되고, 셋 다 조건에 맞는다면 결과값이 뜹니다.

만약에 서울이 아니라 경기를 검색한다면

아무것도 뜨지 않게 된다.

이상으로 검색어에 띄어쓰기가 들어가고 여러개의 조건을 충족하는 검색을 하기 위한 방법을 알아보았습니다.

profile
패션디자인과 출신 비전공자가 개발자로 성장하려 만든 노트

0개의 댓글