📜문제상황
오늘은 제가 진행중인 '단잠'서비스에서 메이트 프로필 필터링에 대한 고민이 있어, 이를 정리하고자 합니다.
기존에 모놀로틱으로 구현을 할 때에는 단순히 테이블을 조인해서 필터링을 진행하면 되었습니다. 물론 필터링 항목들이 많아 성능상에 문제가 생겼었지만 인덱싱, 쿼리최적화, 캐싱을 통해 해결하였습니다.
문제는 모놀로틱에서 MSA로 마이그레이션 하던 도중 발생했습니다.
DB와 서비스가 분리됨에 따라 Mate-Service에서 필터링 가능한 항목과 User-Service에서 필터링 가능한 항목이 나뉘어졌습니다. 그렇기에 먼저, FeignClient를 사용하여 동기적인 호출을 통해 이러한 문제를 해결하였습니다.
Mate-Service에서 1차적으로 필터링을 한 뒤, User-service에게 필터링된 정보를 넘겨서 다시한번 User-service에서 2차 필터링을 진행한뒤 Mate-service에게 응답해주고, Mate-Service는 받은 응답과 Mate-service에 데이터를 결합하여 클라이언트한제 응답하였습니다. 그림으로 보면 다음과 같습니다.
바로 여기서 문제가 나타납니다.
1. Mate-Service가 User-service에게 의존적이다.
MSA는 서비스간 의존성을 최소화 하기 위함이지만 현재 구조로는 User-Service에 문제가 생기면 Mate-Service 또한 문제가 발생하는 상황이 발생했습니다.
2. 페이징 처리등을 적용 불가
Mate-Service에서 필터링을 진행하고 필터링된 데이터를 다시한번 User-service에 보내줘야했습니다. 이때 너무나 많은 데이터를 전달하면 문제가 발생할 것입니다. 하지만 단순히 페이징 처리를 하는등 일부의 데이터만을 보냈을 때는 자칫 필터링 된 데이터가 아무것도 없는 불상사가 생길 수 있습니다. (실제로는 필터링되어 응답할 데이터가 있음에도 불구하고)
3. 성능이슈
사실 가장 문제인 부분은 성능 부분입니다. 이렇게 동적으로 구현을 할시에는 대규모 트래픽을 감당하지 못하고 서비스가 죽어버릴 것입니다. 적은 필터링 개수도 아니고, 필터링을 2번이나 해주고 다시 돌려받는다면 Mate-Service에게 부담이 될것입니다.
이러한 복합적인 이유로 해결책을 생각해보았습니다.
🤔해결책 고안
1. 별도의 Filter-service를 생성하여 요청을 관리한다.
별도의 Filter-service를 두어 Filter-service가 mate-service와 user-service에 요청을 보내는 방식입니다. 도식화된 그림은 다음과 같습니다.
자칫 문제가 해결된거 아닌가라는 착각이 생길 수 있지만 여전이 Filter-service는 Mate-service와 User-service에 의존적입니다. 하나의 서비스라도 문제가 생긴다면 Filter-service또한 제대로 동작하지 않기 때문입니다.
그렇다면 방법은 주기적으로 Mate-Serivce의 필요한 데이터와 User-service에 필요한 데이터를 복사하여 Filter-service의 DB에 저장하는 것입니다. (스냅샷을 뜬다고 생각하시면됩니다)
이렇게 할 경우 실시간성을 보장된 데이터를 받지는 못하더라도 service간 의존성은 낮출 수 있는 방법입니다.
하지만, 이렇게 구현했을 때에도 여전히 문제는 발생합니다. 바로 성능 이슈입니다. 저희 서비스에 룸메이트프로필에 대한 필터링 개수를 예로들면 12개의 필터가 존재합니다. 또한 더 추가 될 수도 있는 확장성을 고려해야합니다.
대규모 트래픽을 처리하기 위해서는 데이터를 가지고 있더라도 성능상에 이슈가 발생합니다.
이를 해결 하기위한 방법은 바로 검색엔진을 활용하는 것입니다.
2. 검색엔진을 활용하여 필터링을 구현
ElasticSearch(ES)와 같은 검색엔진을 활용하여 필터링을 구현하는 것입니다. RDBMS에 일정 주기로 데이터를 복사하여 NoSQL DB에 저장하고 해당 DB와 검색엔진을 활용하여 구현하는 것입니다. 이렇게 되면 별도의 성능상의 이슈를 많이 개선하여 filter-service를 구현할 수 있습니다.
난이도는 높지만 필터링이 더 추가된더라하더라도 성능상에 이슈를 많이 해결할 수 있습니다.
정리
이번글은 아직은 공부하고 고민하는 단계로서 여러 방법에 대한 고민을 정리하였습니다. 다음 글에서는 제가 어떠한 방식을 선택하게 되었고, 그 이유와 기술에 대해 보다 자세히 설명해보겠습니다. 감사합니다!

'IT 서비스 > 단잠' 카테고리의 다른 글
[ 단잠 ] MSA에 Common 모듈 도입 (0) | 2025.04.01 |
---|---|
[ 메이트 프로필 ] - JPQL을 QueryDSL로 전환한 이유 (0) | 2025.03.04 |
Jenkins pipeline 실행 중 Docker not found 에러 (0) | 2025.02.11 |
미리 알았다면 좋았을 것을..프로젝트를 진행 하면서 후회했던 것들 (0) | 2025.02.04 |
[단잠] MSA로 마이그레이션 하다 - 2편 (2) | 2024.12.22 |
댓글