전체 글 6

[유저 추천 기능 version 3.0] Elasticsearch를 사용한 유저 추천 기능 (2024.08.25)

Elasticsearch를 사용한 검색 기능을 통해 Elasticsearch의 사용법을 익히게 되었으므로 유저 추천 기능을 Elasticsearch로 구현해보겠다. 기존 방법에서 바꾸는 이유는 신규 유저를 추천할 때 너무 오랜시간이 걸렸기 때문이다. 구현 후 성능테스트 결과는 후술하겠다.   개발 목적 최종 목적은 유저 추천을 계산을 통해 진행하는 것이 아니라, Elasticsearch의 검색 기능을 통해 가장 나와 유사한 유저를 추천하는 것이다.   로직 구현 유저의 16가지 성향을 16차원 벡터로 변형하여 Elasticsearch에 저장한 후, hnsw 알고리즘을 사용한 검색 쿼리로 빠르게 나와 유사한 여행 성향을 검색한다. 이전 로직에선 캐시해둔 뒤 캐시조회를 사용하였지만 이 로직에선 매 요청마다 ..

카테고리 없음 2024.10.06

[매칭기능] 유저의 일정에 맞는 여행동행과 매칭해주는 기능 개발 (2024.07.30)

나와 비슷한 여행성향을 가진 사람을 추천해주는 로직을 구현하고 사용하다보니 한가지 특이점이 발견되었다. 바로 유사한 사람을 찾아주는 서비스이기 때문에 비건, 이슬람과 같은 특징을 가진 사람들은 추천이 후순위로 밀려 거의 추천되지 않는다는 점이었다. 그리고 기존 유저추천서비스는 접속한지 오래된 유저들도 추천되어 실질적 도움이 되지 않는 추천도 있었다. 그래서 현재 여행을 갈 생각이 있어 게시물을 올린 사람들과 매칭해주므로 조금 더 도움이 될 것이라 생각이 들었다.  그래서 단순히 유저를 추천해주는 로직 뿐만 아니라 유저와 여행게시물을 매칭시켜주는 서비스를 제공해야겠다는 생각을 하게되었다.  매칭 알고리즘 매칭과 추천은 AI가 깊게 관여할 것 같다는 기존의 선입견과 다르게 매칭알고리즘은 약 60년 전부터 다..

생각할거리들 2024.08.07

[ElasticSearch] 게시물 검색 로직 (2024.07.19)

유저추천을 할 때 항상 고민됐던 부분이 두 가지 있었다. 하나는 캐싱되는 양이 너무나도 많다는 점이었고, 나머지 하나는 유저성향이 추가되거나 삭제되면 많은 양의 재캐싱 로직이 필요하다는 점이었다. 두 가지 모두 캐시의 근본적 목적에 반하는 행위들이기 때문에 어떻게 하면 이것을 타개할 수 있을지 고민하고 있었다.  그러다 어느날 ElasticSearch를 사용하면 특정 필드에 가중치를 두어 계산할 수 있다는 사실을 알게 되었다. 물론 나중에 가서야 이 서비스의 로직과 가중치를 두어 계산하는 기능은 크게 상관없다는 것을 알게 되었지만, 그래도 ElasticSearch의 벡터기반검색을 통해 코사인유사도를 빠르게 구할 수 있게 되었다.  하지만 ElasticSearch를 유저추천 서비스로 바로 사용하기엔 이해도..

개발 2024.08.05

[유저 추천 기능 version 2.2] 리팩토링 : pub/sub to Feign client (2024.07.05)

기존에 존재하던 유저추천로직을 리팩토링 해보려고 한다. 먼저 게시물매칭은 pubsub방식에서 feign client 방식으로 변경하였는데, 그 이유와 과정은 다음과 같다. 이전엔 pubsub을 사용한 이유가 실패해도 side effect가 없기 때문이었는데 선택하였으나 개발하다 보니 여러 문제점이 발견되었다.신뢰성 보장이 안됨이 점 때문에 매칭서버가 실행되고있지 않으면 계속 기다리게 된다. Feign client를 사용하면 즉시 에러를 발생시킬 수 있다.비동기 처리의 의문어짜피 사용자는 기다려야 하는데, 애플리케이션 서버단에서 동기로 하던 비동기로 하던 큰 차이가 없을 것으로 생각했다. 그리고 요청은 추천계산요청만 보내기 때문에 비동기의 시간적 이점도 크게 기대할 수 없다.  구현과정먼저 buile.gr..

개발 2024.08.04

[유저 추천 기능 version 2.1] 리팩토링 : 수행시간 최적화 / 캐시 효율성 극대화 (2024.06.30)

로직을 작성하면서 항상 걱정하던 부분이 있었다. 먼저, 유저를 추가하거나 삭제할 때 시간복잡도가 너무 크다는 점이 있었고, 모든 유저의 선호도 배열을 Redis에 캐싱하면 유저가 N명일 때 공간복잡도가 O(N^2)이 필요해서 유저가 증가하면 점점 감당하기 힘들다는 점도 있었다. 유저 유사도 구하는 로직 변경과정 처음엔 가장 단순한 방법으로 유저가 1명 추가되면 새로운 유저에 대한 선호도 배열을 만들고, 나머지 모든 유저에 기존 선호도 배열에 새로운 유저를 추가하고 정렬한 뒤 레디스에 전부 캐싱하는 방식을 사용하였다. 이 방법의 경우 유저수 N에 대해 공간복잡도 O(N^2)과 다음과 같은 시간복잡도를 가진다. (이하 방법 1) 방법1시간복잡도설명조회O(NlogN) or O(1)갱신된적이 있다면 O(Nlog..

개발 2024.07.23

[유저 추천 기능 version 2.0] 캐시를 사용한 유저 추천 기능 (2024.06.16)

여행성향이 비슷한 사람과 여행을 가야 즐거운 여행이 된다는 것은 모두가 공감하는 사실일 것이다. 그래서 여행 동행구인 서비스에 나와 여행성향이 비슷한 유저를 추천해 주는 로직을 추가하여 사용자에게 더 다양한 경험들을 제공하고자 하였다.  우선 어떠한 방식을 사용해야 나와 비슷한 유저를 찾을 수 있을까 찾아보다 코사인 유사도를 사용하면 두 유저 사이의 여행성향 유사도를 수학적으로 측정할 수 있다는 것을 알게 되었다. 코사인유사도는 두 벡터 사이의 각도를 구해 그 각도의 코사인값을 통해 얼마나 유사한지를 알 수 있도록 만든 방법이다.  그렇다면 이제 코사인 유사도를 구하기 위해 벡터를 만들어야 하는데, 이는 여행성향을 수치로 나타낸 것과 같다. 여행수치란 어떠한 여행성향에 대해 자신을 1~5사이의 숫자로 표..

개발 2024.07.19