Node.js + MongoDB 공부 - part4

9716 단어 TILnodejsTIL

Node.js + MongoDB를 공부해보자! 위대하신 코딩애플(codingapple.com)님과 함께:)

검색기능 만들기

GET으로 서버에게 데이터 보내는법 : query string

GET, POST, PUT, DELETE를 기억하시죠?
서버에 데이터를 보낼 때는 일반적으로 POST요청을 쓴다고 했었고,
req.body.title처럼 데이터를 꺼내서 쓸 수 있다고 했었는데,

GET 요청으로도 간단한 데이터를 server에게 보낼 수 있습니다!

일반적으로 ? 뒤에 정보들을 입력하면 됩니다. 아래처럼 말이죠!

이런 것을 Query string 또는 Query parameter라고 한다고 합니다 :)

검색기능을 넣은 HTML(혹은 EJS)에는 다음과 같은 script를 작성하면 되는데요,

 <script>
    $("#search").click(function(){
      // 현재 페이지 url 바꾸는 법. 사실상 GET 요청이랑 동일
      window.location.replace('/search?value=' + $("#search-input").val());
    })
  </script>

id가 search인 태그를 클릭하면, 현재 페이지의 url을 /search?value=입력한값 으로 변경!

그리고 서버 JS파일에서는 req.query로 입력된 query string을 꺼내올 수 있습니다.
object 자료형으로 전달이 되기 때문에, req.query.value로 데이터를 바로 출력할 수도 있습니다.

DB에서 검색어 찾기 : indexing

그냥 하던대로 .find({제목 : req.query.value}).toArray() 이렇게 한다면, 정확히 일치하는 제목의 데이터밖에 찾아낼 수 없습니다 😥 그러면 어떻게 할까요?

  1. 미봉책 : 정규식을 사용한다!
db.collection('post').find({제목 : /이런제목찾아용/}) 

이렇게 쓴다면 제목 문자열에 "이런제목찾아용"이 들어간 데이터들을 찾아줍니다! 끝?

  1. 그런데,,,

그냥 게시물을 찾아달라고하면 엄청 엄청 느립니다
원하는 조건에 부합하는 게시물을 찾기 위해서 일일이 하나씩 모든 게시물을 탐색하기 때문이죠!

그래서 Binary Search를 사용해야하는데, 대신에 미리 정렬되어있어야 가능합니다

이 포스팅에서는 Mongodb에 있는 Search Index 기능을 이용해서 한국어 검색 기능을 만들어 봅니다.
collection에서 Search Index를 선택하고, Analyzer를 lucene.korean으로 변경하면 형태소 분석을 통해서 불필요한 조사를 제거하고 인덱스를 만들어줍니다.

그렇게 해서 서버 JS파일에 입력될 코드는

<script>
app.get("/search", (req, res) => {
  // 검색조건 변수 선언
  var searchCondition = [
    {
      $search: {
        index: "titleSearch", // 제작한 search index 이름
        text: {
          query: req.query.value,
          path: "제목", //제목과 날짜 둘다 찾고 싶으면 ['제목', '날짜']
        },
      },
    },
    { $sort: { _id: 1 } }, // _id를 기준으로 오름차순 정렬
    { $limit: 10 }, // 검색결과 10개로 제한
    // { $project: { 제목: 1, _id: 0 } }, // 보여줄 결과를 정하는 부분
  ];
  db.collection("post")
    // 검색조건을 여러개 붙이고 싶을때 사용하는 .aggregate()
    .aggregate(searchCondition)
    .toArray((err, result) => {
      if (err) { return console.log(err) }
      console.log(result);
      res.render("search.ejs", { posts: result });
    });
});
</script>

게시판 기능 만들기

게시판은 일반적으로 글 주인만 해당 글을 수정하거나 삭제할 수 있게 되어있습니다
그런 기능을 구현하려면 어떻게 해야할까요??

아무래도 작성된 게시물에 해당 작성자도 저장되어야하지 않을까요??
insertOne의 대상이 작성자 항목을 가지고 있으면 될 것 같고, 대신에 로그인이 되어있어야 글이 작성 가능하도록 하는게 좋을 것 같군요!

해당 api의 미들웨어에 다음과 같은 loginCheck 함수를 넣으면 될 것 같습니다.

function loginCheck(req, res, next) {
  if (req.user) {
    next();
  } else {
    res.send("<script>alert('로그인이 필요합니다.');location.href='/login';</script>");
  }
}

만약 req.user가 존재한다면 (로그인이 되어있다면), 하던 일 진행하라고 next() 해주고,
아니라면, 로그인이 필요하다는 alert를 보내고 /login으로 이동하게 합니다.

좋은 웹페이지 즐겨찾기