210805 - TIL

김예지·2021년 8월 5일
0
post-thumbnail
post-custom-banner

눈 감았다 떴더니 하루가 다 지나가버린 것 같다.
오늘 내 목표는 원래 검색기능이 끝이였는데, 추가기능들이 구현할게 좀 생겨서 정신없이 개발하다보니 벌써 밤 열두시다.

검색 기능

클론 코딩 주차에 연관도에 따른 검색기능을 구현한 적이 있어, 어느정도 쉽게 할 수 있었다. 하지만 몽고디비에서 reg exp를 이용한 검색을 했었는데, mysql에서는 비슷한 기능을 찾지 못해서 띄어쓰기를 무시한 검색을 개발하지 못했다. 이건 추가 개발사항으로 남겨두어야한다.
검색에 대한 코드는 다음과 같았다.


    const options = {
      subQuery: false,
      offset: offset,
      where: {
        [Sequelize.Op.or]: [
          { title: { [Sequelize.Op.like]: `%${keyword}%` } },
          { content: { [Sequelize.Op.llike]: `%${keyword}%` } },
        ],
      },
      limit: Number(pageSize),
      order: [["createdAt", "DESC"]],
      attributes: {
        include: [
          [Sequelize.fn("COUNT", Sequelize.col("comment_id")), "coment_count"],
        ],
      },
      include: [
        {
          model: free_comment,
          attributes: [],
        },
      ],
      group: ["post_id"],
      raw: true,
    };
    if (category !== undefined) options.where.category = category;
    if (country_id !== undefined) options.where.country_id = country_id;

    const result = await free_board.findAll(options);

    if (sort == "relative") {
      for (let i = 0; i < result.length; i++) {
        let rel = 0;
        rel += result[i]["title"].split(keyword).length - 1;
        rel += result[i]["content"].split(keyword).length - 1;
        result[i]["rel"] = rel;
      }
      result.sort((a, b) => b.rel - a.rel); // rel의 값 순으로 내림차순 정렬.sort((a, b) => b.rel - a.rel); // rel의 값 순으로 내림차순 정렬
    }

option을 따로 빼놓고, undefined되지 않은 조건문에 따라 새로 where절을 추가해주는 방식은 신선했다.
sort가 relative 기준일 경우 정렬하는 방식은 클론코딩 주차에서 구현한 것을 똑같이 사용했다.

조회수 기능

포스트로 따로 작성했으므로 생략한다. 좋은 자료가 있어서 생각보다 금방 구현할 수 있었다.

좋아요 기능

프론트님들께서 메인 리스트에서도 내가 좋아요했는지에 대한 여부를 알고싶다 하셔서, 생각보다 비효율적인 (여러번 디비 조회하는) 연산을 짜버렸다. 조금 더 좋은 수가 있는지 궁리해보아야한다.

 for (let i = 0; i < result.length; i++) {
      let is_like = false;
      if (is_user != null) {
        my_like = await free_like.findOne({
          where: {
            user_id: is_user.user_id,
            post_id: result[i].post_id,
          },
        });
        if (my_like) {
          is_like = true;
        }
      }
      all_like = await free_like.findAll({
        where: { post_id: result[i].post_id },
      });
      result[i].like = {
        is_like,
        all_like: all_like.length,
      };
    }
profile
새싹
post-custom-banner

1개의 댓글