[TypeORM] 쿼리 빌더의 where와 orWhere를 사용해 검색 기능 구현하기(LIKE 검색)

cabbage·2023년 4월 26일
0

ORM

목록 보기
5/7
post-thumbnail
post-custom-banner

프로젝트에서 유저 닉네임 또는 게시글 제목 기준으로 게시글 검색 기능을 구현하기로 하였다. 요구사항은 다음과 같았다.

  • '유저 닉네임' 또는 '게시글 제목' 검색 필터링 선택란을 주지 않는다.
  • 검색창에 입력한 키워드가 유저 닉네임인 경우 해당 키워드를 포함하는 닉네임을 갖는 유저가 작성한 모든 게시글을 조회한다.(부분 일치)
  • 검색창에 입력한 키워드가 게시글 제목인 경우 해당 키워드를 포함하는 제목을 갖는 모든 게시글을 조회한다.(부분 일치)

'유저 닉네임'과 '게시글 제목' 검색 필터링 선택란이 없어서 동일한 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 검색 성능을 향상시키기 위해 다음과 같은 방법을 사용할 수 있다고 한다.

  • 인덱싱
  • 검색어 길이 제한
  • 전체 텍스트 검색 엔진(Full-Text Search Engine) 사용
  • 검색어 사전 처리
  • 캐싱

작은 팀 프로젝트를 진행하다 보니 LIKE 검색 속도가 느리다는 느낌은 받지 못했다. 어느 정도 규모의 데이터베이스가 되어야 LIKE 검색 속도가 느려질지가 궁금하다.

profile
캐비지 개발 블로그입니다. :)
post-custom-banner

0개의 댓글