2022-02-11 TIL

Fact

  • 퀴즈를 검색할 때 객체 안에 _id, email을 입력해도 해당 데이터가 불러와지는 문제를 해결했다.
  • 퀴즈 리스트 컴포넌트와 퀴즈 컴포넌트가 검색 리스트, 검색 컴포넌트 중복되는 문제를 리팩토링했다.
  • 검색 결과가 validation을 추가하고 검색 결과가 없을 경우 Empty 컴포넌트를 불러오도록 구현했다.
  • 유저 정보를 출력해 주는 Info 컴포넌트를 만들었다. 로그인 시 유저정보를 전역 상태로 관리하고 해당 데이터를 불러온다.

Feelings

  • 확실하게 리팩토링을 하면 혼자 기분이 좋다. 코드가 줄어서 그런걸까..?

Findings

  • 데이터베이스에 퀴즈를 추가할 때 algolia index에도 똑같이 넣어주도록 구현했는데, 몽고디비 populate로 해당 퀴즈 Json 데이터 안에 있는 user 배열 ObjectId로 해당 유저 데이터를 가져와서 algolia index에 넣어주었다. 하지만 문제는 아래와 같이 데이터가 저장된다. 아래와 같이 데이터가 저장되면 user 객체 안에 _id, email 을 검색창에 입력하면 똑같은 검색 결과가 나온다.
{
    _id: ObjectId("6206fc7b5b51764b1afcd710")
    category: 1
    quizText: "자바스크립트 문제"
    user: [{
        _id: ObjectId("6206fc7b5b51764b1afcd710")
        name: 이영규
        email: fsdfafas@naver.com
    }]
    answerText: "답입니다"
}

나는 user객체 안에있는 _id와 email을 지우고싶었다. 그래서 스프레드 연산자로 user객체를 user: name으로 변경했다.

const searchQuiz = await Quiz.find({ _id: quiz._id }).populate('user')
await index.saveObjects(
  [
    {
      ...searchQuiz[0]._doc,
      user: searchQuiz[0].user[0].name,
    },
  ],
  {
    autoGenerateObjectIDIfNotExist: true,
  }
)
  • 알고리아 Searchable attributes를 사용하면 원하는 데이터만 검색되도록 설정할 수 있다.

Future Action

  • 문제가 있으면 바로바로 고치도록 하자