프로젝트에서 유저 닉네임 또는 게시글 제목 기준으로 게시글 검색 기능을 구현하기로 하였다. 요구사항은 다음과 같았다.
'유저 닉네임'과 '게시글 제목' 검색 필터링 선택란이 없어서 동일한 API를 호출해야 하고, 키워드에 따라 유저 닉네임 또는 게시글 제목을 검색해야 해서 쿼리 빌더의 where와 orWhere를 연결해서 사용하기로 결정했다. 그리고 부분 일치 검색이어서 LIKE 검색을 사용하기로 하였다.
const boards = await queryBuilder //
.leftJoinAndSelect('board.user', 'user')
.orderBy({ 'board.createdAt': 'DESC' })
.where('board.title LIKE :keyword', { keyword: `%${keyword}%` })
.orWhere('user.nickname LIKE :keyword', { keyword: `%${keyword}%` })
.getMany();
게시글 제목 검색을 위해 where 메서드를 사용해 board 테이블의 title 칼럼에 대해 LIKE 검색을 수행하였다. 마찬가지로 유저 닉네임 검색을 위해 orWhere 메서드를 사용해 조인한 user 테이블의 nickname 칼럼에 대해 LIKE 검색을 수행하였다. 앞뒤에 % 와일드카드를 사용하여 keyword를 포함하는 결과를 모두 조회하였다.
LIKE 검색을 사용해 검색 기능을 구현할 수는 있었지만, 구글링 결과 LIKE 검색은 성능이 크게 좋지 못하다고 한다.
일반적으로 LIKE 검색은 일반 검색보다 더 많은 처리 성능이 필요하다.
또한 LIKE 검색에서 와일드카드를 검색어 앞뒤에 모두 사용하면 패턴 매칭이 많아져 검색 시간이 크게 증가한다.
LIKE 검색 성능을 향상시키기 위해 다음과 같은 방법을 사용할 수 있다고 한다.
작은 팀 프로젝트를 진행하다 보니 LIKE 검색 속도가 느리다는 느낌은 받지 못했다. 어느 정도 규모의 데이터베이스가 되어야 LIKE 검색 속도가 느려질지가 궁금하다.