Heeyaa

기록

의상 추천 로직 리팩토링

2026. 4. 2.

기존 의상 추천 로직의 문제

기존 의상 추천 로직은 한 쿼리문에서 조회, 계산까지 처리를 담당하는 책임이 아주 많았다.

한 쿼리문에서 모든 것을 해결하기 때문에 의상 추천 로직 추가시 복잡도가 갈수록 높아지고, 유지보수성이 매우 낮아지는 문제점이 있었다.

구현한 의상 추천 로직에 대해 간단히 설명하자면

사용자의 온도 민감도, 날씨정보, 옷들의 정보를 조인

체감온도 + 사용자의 온도 민감도 + (강수 유무에 따른 온도 조정) 을 계산하고

총 합 온도에 맞춰서 구역을 나눈 뒤 옷의 두께감, 색상, 계절에 맞는 옷 속성에 따라 점수를 차등 지급하여 점수에 따라 내림차순으로 정렬 후 각 카테고리(상의, 하의, 신발, 원피스, 아우터 등등)를 1개씩 출력해주는 로직입니다.

처음에는 옷의 두께감만 기준으로 잡았기에 쿼리문 하나로 해결했지만, 로직이 늘어남에 따라 유지보수에 어려움을 느꼈고, 쿼리문에서 너무 많은 책임을 지고 있었기에 계산 로직을 서비스 레이어로 분리를 했다.

기존 쿼리 로직

이런식으로 기존 쿼리문은 하드 코딩으로 이루어져 있었기 때문에 로직을 추가하려면 다음과 같이 하드코딩을 했어야 했다.

레이어 분리

그래서 제가 선택한 리팩토링 방향은 비즈니스 로직을 서비스 레이어로 분리하는 것이었다.

패키지 분리

우선 패키지 구조부터 분리했다.

기존에는 RecommendQueryRepository에서 해결했다면,

현재 RecommendQueryRepository에서는 추천을 위한 필요 데이터 조회만 담당했다.

서비스 분리

위 사진같이 ClothesCalculator에서 점수 계산, ClothesSelector에서는 점수 기준으로 옷을 분류하고 카테고리별 최종 선택으로 나누어 책임을 분리했다.

이를 통해 비즈니스 로직이 추가될 때 마다 기존처럼 케이스별로 하나씩 하드코딩할 필요가 없어졌기 때문에 코드 가독성과 유지보수성이 향상됐고, 유연한 대응이 가능해졌다.