해당 프로젝트는 할일목록 앱 프로젝트의 연장선에 있다. 그래서 서버 구조나 서버 설정은 할일목록 앱 프로젝트를 참고하면 된다.
* 모델 구현하기
const mongoose = require('mongoose')
const wordSchema = mongoose.Schema({
r_seq: { type: String, trim: true },
r_word: { type: String, trim: true },
r_link: { type: String, trim: true },
r_chi: { type: String, trim: true },
r_des: { type: String, trim: true },
r_pos: { type: String, trim: true },
})
const Word = mongoose.model('Word', wordSchema, 'kor_dic_coll')
module.exports = Word;
models 폴더 하위에 Word.js 파일을 생성하고 위의 코드를 작성하자! kor_dic_coll 은 Mongo DB 의 실제 컬렉션 이름이다. 모든 필드가 string 이다.
* API 구현하기
const express = require('express')
const router = express.Router()
const todo = require('./todo')
const word = require('./word') // 코드 추가하기
router.use('/todos', todo)
router.use('/words', word) // 코드 추가하기
module.exports = router
routes 폴더 하위 index.js 에 코드를 추가하자! /api 의 하위 URL 로 /words 를 추가하고 관련된 라우트 핸들러 모듈을 가져와서 사용한다. 즉, /api/words 가 엔드포인트가 된다.
const express = require('express')
const WordRouter = express.Router()
const Word = require('../../models/Word')
WordRouter.route('/(:word)?').get( async (req, res) => {
let words = []
const { word } = req.params
if(word !== "undefined" && word !== undefined){ // 검색어가 존재하는 경우
console.log(word)
try{
words = await Word.find({ r_word: word}) // Word 모델의 r_word 필드에서 쿼리와 일치하는 단어 검색
}catch(e){
console.log(e)
}
}else{ // 검색어가 존재하지 않는 경우
console.log(word)
try{
words = await Word.find() // 데이터베이스에서 전체 단어 검색
}catch(e){
console.log(e)
}
}
res.json({status: 200, words})
})
module.exports = WordRouter
routes 폴더 하위에 word 폴더를 생성하고 그 안에 index.js 파일을 생성하자! 그런 다음 위 코드를 입력하자!
WordRouter.route('/(:word)?')
우선 정규표현식을 사용하여 word 라는 파라미터를 옵션으로 설정하였다. 즉, word 라는 파라미터는 있어도 되고 없어도 된다. API URL 은 /api/words/ 또는 /api/words/학원 와 같은 형태가 된다.
let words = []
const { word } = req.params
데이터베이스 조회 결과를 담을 words 변수를 배열로 초기화한다. 사용자로부터 전달받은 URL 파라미터를 저장할 word 를 상수로 선언한다.
if(word !== "undefined" && word !== undefined){ // 검색어가 존재하는 경우
console.log(word)
try{
words = await Word.find({ r_word: word}) // Word 모델의 r_word 필드에서 쿼리와 일치하는 단어 검색
}catch(e){
console.log(e)
}
}
사용자로부터 전달받은 검색어가 존재하는 경우 도큐먼트의 r_word 필드가 검색어와 일치하는 도큐먼트를 추출한다. 데이터베이스 쿼리를 실행하는 동안 기다리기 위하여 async, await 키워드를 사용하였다. async, await 키워드를 사용할때는 일반적으로 try, catch 문을 사용하여 에러 처리를 한다.
else{ // 검색어가 존재하지 않는 경우
console.log(word)
try{
words = await Word.find() // 데이터베이스에서 전체 단어 검색
}catch(e){
console.log(e)
}
}
사용자가 검색어를 입력하지 않은 경우 전체 컬렉션을 조회한다.
res.json({status: 200, words})
데이터베이스 조회 결과를 클라이언트로 전송한다.
* 데이터베이스 조회에 정규표현식 사용하기
words = await Word.find({ r_word: { $regex: `^${word}`}}) // Word 모델의 r_word 필드에서 쿼리로 시작하는 단어 검색
검색어가 존재하는 경우 위와 같이 조회해보자! regex 연산자를 사용하여 r_word 필드에서 검색어로 시작하는 모든 도큐먼트를 조회한다.
words = await Word.find({ r_word: { $regex: `${word}$`}}) // Word 모델의 r_word 필드에서 쿼리로 끝나는 단어 검색
검색어가 존재하는 경우 위와 같이 조회해보자! regex 연산자를 사용하여 r_word 필드에서 검색어로 끝나는 모든 도큐먼트를 조회한다.
words = await Word.find({ r_des: { $regex: `${word}`}}) // Word 모델의 r_des 필드에서 쿼리를 포함하는 단어 검색
검색어가 존재하는 경우 위와 같이 조회해보자! regex 연산자를 사용하여 r_des 필드에서 검색어를 포함하는 모든 도큐먼트를 조회한다.
// Word 모델의 r_word 필드와 r_des 필드에서 쿼리를 포함하는 단어 검색
words = await Word.find({ $or:
[
{r_word: {$regex: `${word}`}},
{r_des: {$regex: `${word}`}}
]
})
검색어가 존재하는 경우 위와 같이 조회해보자! or 연산자와 regex 연산자를 사용하여 r_word 필드가 검색어를 포함하거나 r_des 필드가 검색어를 포함하는 모든 도큐먼트를 조회한다.
// Word 모델의 r_word 필드와 r_des 필드에서 쿼리를 포함하는 단어 검색후 최신순으로 정렬하고 6개만 가져오기
words = await Word.find({ $or: [
{r_word: {$regex: `${word}`}},
{r_des: {$regex: `${word}`}}
]})
.sort({"_id": -1})
.limit(6)
바로 위의 경우에서 나온 결과를 id 값을 이용하여 최신순으로 정렬하고 6개의 도큐먼트만 가져온다.
'프로젝트' 카테고리의 다른 글
사전 검색 서비스 (리액트 버전) (0) | 2021.11.09 |
---|