깊고 넓은 삽질

firebase 도입 시 반드시 고려해야 할 것 | AND 쿼리 제약 본문

Programming

firebase 도입 시 반드시 고려해야 할 것 | AND 쿼리 제약

ggsno 2023. 11. 26. 20:26

firebase는 필드 '하나'에서만 범위나 같지 않음 비교 할 수 있습니다.

헬스 보조자 매칭 웹 서비스를 만들고 있다. 우리 팀은 3명 모두가 프론트엔드 개발자다. 백엔드 개발자를 못 구했다. 이가 없으면 잇몸으로, 우리가 직접 백엔드를 구축할 수 있으나 짧은 시간 안에 완성도 있는 프로젝트를 위해 백엔드 구축을 외부 서비스에 위임하기로 협의했다. 여러 서비스 중 firebase를 선택했다. 많이 사용되는 것 같고 우리 서비스에는 복잡한 쿼리가 없다고 생각해 document db도 충분할 것 같았다. AND 쿼리만 지원한다면 소규모 서비스에선 문제없다고 생각했다. 트랜잭션이나 소켓통신도 지원한다고 해서 필요하다면 나중에 더 발전 시킬 생각으로 firebase를 선택했다.

흠 AND 쿼리 지원하는군

 

사용자가 자신의 condition과 파트너에게 바라는 condition을 설정 하면 서로 condition이 맞는 사용자를 보여주는 기능이 필요했다. 여기서 필요한 쿼리는 여러 필드의 범위 비교다. 예를 들어 운동종목1에서 100kg이상 120미만인 조건 and 운동종목2에서 50kg이상 70미만 조건인 사용자를 찾는 쿼리가 필요하다. 

 

firebase는 성능 향상을 위해 색인을 사용하는데, 성능 보장을 위해 AND 쿼리에서 등호가 아닌 부등호 사용 시 복합 색인을 생성해야했다.

 

색인을 생성한 모습

그런데 복합 색인을 생성해도 쿼리에서 에러가 났다. 정확히는 색인을 생성한 gender와 benchPress만을 조건에 넣었을 때는 문제가 없었지만 benchPress와 squat를 넣었을 때 에러가 났다.

이러지 말아다오..

 

다시 자세히 읽어보니 복합 색인은 등호 연산자(=)와 부등호 연산자를 결합할 때만 유효했다. 서로 다른 필드끼리의 부등호와 부등호는 지원을 하지 않았다... 위의 내 상황에서 gender는 등호 연산이었기 때문에 결합이 가능했고 benchPress와 squat는 둘 다 부등호였기 때문에 에러가 났다.  (참고링크)

성능 구려도 좋으니 그냥 사용하게만 해다오..

 

 

firebase가 위의 쿼리를 지원하지 않는 이유는 document db의 구조가 해당 쿼리를 수행하기 적합하지 않아서일 것이다.  우리 프로젝트는 관계형 DB가 적합한 프로젝트지만 백엔드 구축에 힘을 들이지 않기 위해 firebase를 선택했던게 실수였다. 혹시 소규모 프로젝트에서 백엔드 구축에 품을 줄이기 위해 firebase 도입을 고려하고 있다면 위에서 언급한 것을 고려해보는게 좋을 것 같다. 

Comments