수업시간에 검색 관련해서 elastic search를 배웠다. 우선 TypeORM에서는 검색어와 column값이 완벽하게 일치한 값만 반환 할 수 있다. 그렇기 때문에 Id에 가까운 유일한 값으로 'findOne'만 추로 썼던 것 갔다.
elastic search 에서는 단어별로 검색하는 것은 물론 글자 하나 단위까지 일치하는 것으로 검색이 가능 했다.
이것은 배운 것까지 그렇고 실제 elastic 사이트에서 찾아 보면 현재 주변에서 볼 수 있는 기능인 '초성 검색', '오타 검색', '관련 검색어' 등등 여러 기능을 지원한다고 한다. 이것만 담당하는 담당자가 있다고 하니... 수업시간에 배운것은 수박 겉핥기에 불과 할 것이다. 현자 프로젝트에서 적용하는 검색은 회원 email을 찾는 것일 뿐이라, elastic이라는 거창한 기능을 사용하기에는 좀 과한 느낌인 것도 사실이다. 또한 초기에 복습이 목적이기에 겉핥기식에 따라하기에는 뭔가 내실을 채우지 못하는 것이라고 생각했다. 충분히 Mysql로도 검색이 가능하다고 생각하고(듣기도했다) TypeORM Docs를 찾아봤다.
이전에 Mysql에서 'like'를 활용하여 글자 단위도 검색이 가능하다는 것을 확인하였다. 이제 TypeORM에서 어떻게 구현하는지 찾아봤는데, query문을 그대로 사용하는 것이 있었다.
//userResolver.ts
@UseGuards(GqlAuthAccessGuard)
@Query(() => [User])
fetchUserEmail(
@Args('useroreamil') userOremail: string,
) {
return this.userService.findAny({ userOremail });
}
//userService.ts
this.userRepository
.query(
`select * from user
where (userName like '%${userOremail}%' or email like '%${userOremail}%')`)
동작은 잘되는 것 같았다. 다만 좀 의문인것은 이런방법을 널리 쓰지 않는것 같아 의문이 들었다. 개인적으로는 쉬운 방법이 아닌가 라고생각했고, querybuilder와 차이점이 무엇인지 궁금했다. 이 또한 알아봐야 겠구나.
백엔드 기준에서는 충분하다는 기능이 프론트적으로 봤을 때는 요구사항이 필요한 부분이 있었다. 결국 상대의 요구에 부합하는 것까지 담을 코딩이 필요하다고 생각했다. 다시한번 커뮤니케이션의 중요성을 알았고, 스스로 이렇게 결과값을 넘겨 주었을 때 상대방은 어떻게 처리 할까라는 고민을 하게 되었다.