개발 slecs

대시보드 파트너 카드에 기능 플래그 필터링 도입으로 불필요한 노출·쿼리 제거

목차

배경

대시보드 파트너 카드에 기능 플래그 기반 필터링을 추가했음. 그동안은 모든 파트너에게 동일한 카드 묶음을 뿌려줬는데, 일부 파트너만 베타 기능 쓰고 있어서 안 쓰는 쪽에는 빈 카드가 보이는 게 거슬렸음. 운영팀에서도 "왜 이게 우리한테 보여요?" 문의가 누적되고 있었고.

접근 방식

기존엔 컨트롤러에서 카드 목록을 통째로 내려보내고 화면에서 표시 여부만 토글했음. 이건 두 가지가 별로였음.

  • 안 쓰는 카드까지 데이터 조회가 일어남 → 불필요한 쿼리
  • 화면 분기 로직이 누적되면서 템플릿이 점점 지저분해짐

그래서 컨트롤러 단에서 파트너의 활성 feature 집합을 먼저 조회한 뒤, 그 집합에 매칭되는 카드만 묶어서 모델에 담는 구조로 바꿨음.

features = featureService.resolve(partnerId)
cards = CARD_REGISTRY.stream()
  .filter(c -> c.requires().isEmpty() || features.containsAll(c.requires()))
  .toList()

카드 자체에 requires() 메타를 들고 있게 하고, 신규 카드 추가할 때마다 컨트롤러 if문 늘릴 필요 없게 만든 게 핵심임.

비교

항목 이전 이후
카드 노출 결정 화면 분기 컨트롤러 필터
미사용 카드 쿼리 발생 없음
신규 카드 추가 비용 분기 추가 메타 1줄
파트너별 차이 처리 어려움 feature 조합

삽질 포인트

처음엔 feature 키를 문자열로 받았다가 오타 한 번에 카드가 통째로 사라지는 사고가 날 뻔했음. 결국 enum으로 바꾸고, requires()가 빈 집합이면 "공통 카드"로 취급하도록 분기 한 줄 더 넣음. 빈 집합 == 모두 노출이 직관과 어긋날 수 있어서 여기 주석 한 줄만 남겼음.

테스트는 feature 조합 4가지 경우(없음/일부/전부/미존재 키) 골라서 카드 개수만 단언하는 식으로 짧게 끊었음. 카드 내용 자체는 다른 테스트가 커버하고 있어서 굳이 중복 안 함.

회수한 것

  • 운영팀 문의 줄어들 거라는 기대(아직 한 주 더 봐야 함)
  • 신규 베타 카드 붙일 때 PR diff 줄어듦
  • 화면 템플릿에서 if 블록 4개 제거

다음

댓글 0

첫 댓글 달아줘.