← 모든 글

좋아요가 관심 없음으로 바뀌면, 취향 점수는?

반응을 계속 더하는 대신, 현재 유효한 반응과 당시 태그를 함께 관리하기.

사용자가 같은 장소에 ‘좋아요’를 눌렀다가 ‘관심 없음’으로 바꾸면 추천도 달라져야 한다. 숨길의 백엔드와 추천 시스템을 개발하면서, 반응을 모으는 것만큼 중요하게 본 것은 이전 반응이 점수에 남지 않게 하는 것이었다.

행동은 쌓이지만, 현재 취향은 바뀐다

숨길은 여러 사람의 취향을 모아 여행 장소와 일정을 정하는 서비스다. 장소에 태그를 연결하고 좋아요(LIKE), 강한 좋아요(SUPER_LIKE), 관심 없음(NOPE) 반응을 받아 태그별 선호도에 반영한다.

매번 점수를 더하기만 하면 문제가 생긴다. LIKE를 NOPE로 바꿔도 이전의 긍정 점수가 남고, 같은 반응을 반복해서 보낼 때 점수가 계속 움직일 수 있다. 행동의 총합이 현재 취향과 같지는 않았다.

세 가지 기록을 구분했다

기록 답하려는 질문
행동 이력 사용자가 어떤 반응을 남겼는가?
장소별 최신 반응 지금 이 장소에 대한 반응은 무엇인가?
조회용 선호도 다음 추천에서 어떤 점수를 사용할 것인가?

이력은 남기되, 현재 점수에는 최신 반응의 기여만 유효하게 유지하도록 설계했다. 반응이 바뀌면 이전에 반영한 값을 빼고 새 값을 더한다.

반응이 바뀌었을 때 선호도를 갱신하는 순서
  1. 이전 기여 차감당시 반응과 태그 기준
  2. 새 기여 반영현재 반응과 태그 기준
  3. 선호도 계산갱신된 근거로 계산

매번 전체 이력을 다시 계산하는 방식도 가능하다. 여기서는 변경된 반응의 차이를 적용하는 쪽을 선택했다. 대신 무엇을 빼야 하는지 정확히 보관해야 한다는 책임이 생긴다.

사용자가 그대로여도, 장소는 바뀔 수 있다

좋아요를 받은 장소의 태그가 바뀌면 그 좋아요가 기여할 항목도 달라진다. 최신 태그만 알고 있으면 과거에 어떤 점수를 더했는지 되짚기 어렵다.

그래서 반응에 당시 태그 버전을 연결하는 구조를 두었다. 태그가 갱신되면 이전 버전의 기여를 차감하고 새 버전 기준으로 반영한다. 사용자의 행동뿐 아니라 그 행동을 해석한 근거도 관리해야 했다.

무엇을 확인했는가

나는 백엔드와 추천 시스템을 맡아 취향 수집부터 갱신까지의 흐름을 설계하고 개발했다. 이후 포트폴리오 정리 과정에서 별도로 수행된 DB 검증에서는 다음 경로를 확인했다.

입력 변화 확인한 동작
LIKE → SUPER_LIKE 이전 반응을 대체하고 새 반응의 기여 반영
SUPER_LIKE → NOPE 이전 긍정 기여를 제거하고 비선호 반영
NOPE → NOPE 개인 선호도에 같은 기여를 중복해서 더하지 않음
반응은 그대로, 장소 태그 변경 이전 태그의 기여를 빼고 새 태그로 재계산

같은 반응을 다시 보내도 행동 이력 자체는 남는다. 중복 반영을 막는 대상은 개인의 현재 선호도이지, 모든 이벤트 기록이 아니다. 이 차이를 구분해야 이력을 보존하면서도 현재 취향을 맞출 수 있다.

이 검증은 반응 변경이 데이터에 반영되는지를 다룬다. 실제 사용자의 추천 정확도나 여행 만족도가 얼마나 좋아졌는지를 측정한 결과는 아니다.

구현 더 보기

위 링크는 설명의 기준이 된 커밋을 가리킨다.

숨길 저장소에서 서비스와 구현 보기

문제와 선택의 이유를 남깁니다.