본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 25. 19:57

ADV Agent 구축하기: 3개월간의 주행을 통해 배운 AI 기반 모터사이클 경로 커뮤니티 구축 경험

요약

모터사이클 라이더를 위한 AI 기반 커뮤니티 'ADV Agent' 구축 과정에서 겪은 기술적 도전과 교훈을 다룹니다. GPS 정확도 문제와 개인화 추천이 새로운 발견을 방해하는 '추천의 역설'을 해결하기 위한 전략을 공유합니다.

핵심 포인트

  • 산악 지역의 GPS 정확도 한계와 위치 데이터 처리의 어려움
  • 개인화가 발견을 저해하는 필터 버블 현상 인지
  • 탐색(Exploration) 비중을 30% 주입하여 사용자 참여도 27% 상승
  • 완벽한 데이터보다 투명한 정보 제공이 사용자 신뢰 구축에 중요

ADV Agent 구축하기: 3개월간의 주행을 통해 배운 AI 기반 모터사이클 경로 커뮤니티 구축 경험

솔직히 말해서, 모터사이클 경로 커뮤니티를 만드는 것은 간단할 것이라고 생각했습니다. 결국, 저는 이미 Trip Agent를 만들지 않았나요? 얼마나 다르겠어요?

스포일러: 훨씬 더 어려웠습니다. 그리고 훨씬 더 흥미로웠습니다.

ADV Agent는 어드벤처 모터사이클 라이더들을 위한 AI 기반 커뮤니티를 구축하려는 저의 두 번째 시도입니다. 만약 ADV 라이딩이 생소하시다면, 기본적으로 모터사이클 오프로딩(off-roading)이라고 생각하시면 됩니다. 비포장도로, 산악 고개, 외딴 지역, 숨겨진 트레일을 발견하는 것과 같습니다. 커뮤니티 측면이 매우 중요한데, 라이더들은 자신이 좋아하는 경로를 공유하고, 새로운 경로를 발견하며, 자신들의 모험에 대해 이야기하는 것을 매우 좋아합니다.

저는 AI, 위치 데이터(location data), 모터사이클, 그리고 커뮤니티 구축을 결합하면, _모든 것_이 서류상으로 보이는 것보다 훨씬 더 복잡하다는 것을 고통스러운 경험을 통해 배웠습니다. 제가 예상하지 못했던 숨겨진 복잡성에 대해 말씀드려 보겠습니다.

아무도 말하지 않는 GPS 문제

이제 GPS 정확도는 해결되었을 것이라고 생각하시겠죠? 제 휴대폰에는 GPS가 있고, Google Maps도 잘 작동하는데, 문제가 무엇일까요?

문제는 이겁니다: 산악 지역에서 GPS는 형편없습니다.

단순히

AI 추천의 역설 (The AI Recommendation Paradox)

제가 전혀 예상하지 못했던 사실이 하나 있습니다: 개인화(Personalization)가 발견(Discovery)을 저해할 수 있다는 점입니다.

통념적으로는 "사용자가 좋아하는 것을 기반으로 개인화된 추천을 제공하라"고 말합니다. 이론적으로는 타당합니다. 하지만 어드벤처 라이딩(Adventure riding) 커뮤니티의 핵심은 _한 번도 가보지 못한 새로운 장소를 발견하는 것_에 있습니다. 만약 AI가 사용자가 이미 좋아했던 것과 유사한 경로만 보여준다면, 결국 필터 버블(Filter bubble)에 갇히게 됩니다.

처음에는 전형적인 협업 필터링 (Collaborative filtering) 방식을 사용했습니다. 하지만 라이더들이 자신이 선호하는 지역과 난이도의 경로만 보게 된다는 사실이 금방 명확해졌습니다. 아무도 200마일 떨어진 곳에 있는, 검색조차 하지 않았을 그 장엄한 고개를 발견하지 못하고 있었습니다.

그래서 저는 방식을 뒤집었습니다. 이제 저의 추천 알고리즘은 의도적으로 **30%의 탐색 (Exploration)**을 주입합니다:

def get_recommendations(user_id, num_recommendations=20):
    personalized = ai_model.get_personalized(user_id, int(num_recommendations * 0.7))
    exploration = get_random_exploration(user_id, int(num_recommendations * 0.3))
...

get_random_exploration 함수는 의도적으로 다음과 같은 경로를 선택합니다:

  • 평소의 지리적 영역을 벗어난 경로
  • 평소의 난이도 범위를 벗어난 경로
  • 좋아요(Likes)가 10개 미만인 경로 (숨겨진 보석 같은 곳들이 노출될 수 있도록)

직관에 어긋나는 방식이지만, 이 변경 이후 참여도(Engagement)가 27% 상승했습니다. 사람들은 놀라움을 즐깁니다. 발견 중심의 커뮤니티에서는 때때로 사용자가 직접 검색하지 않았을 무언가가 최고의 추천이 될 수 있습니다.

신뢰는 완벽한 중재가 아니라 투명성에서 옵니다

또 다른 직관에 어긋나는 교훈이 있습니다: 사용자들은 모든 경로가 완벽하기를 기대하지 않는다는 점입니다. 그들이 기대하는 것은 정직함입니다.

초기에는 "저품질" 경로를 표시하기 위해 자동화된 중재 (Moderation) 시스템을 구축하는 데 몇 주를 보냈습니다. 하지만 효과가 없었습니다. 라이더들은 멀쩡한 경로가 차단되는 것을 보았고, 명백히 나쁜 경로들은 통과되는 것을 목격했습니다.

그 후 저는 다른 방법을 시도했습니다. 경로에 시간 경과에 따른 감쇠 (Time decay) 라벨을 추가하는 것이었습니다.

type Route struct {
    ID          string
    CreatedAt   time.Time
...

그게 전부였습니다. 자동 삭제도, 복잡한 점수 산정 방식도 없었습니다. 그저 사용자들에게 경로가 마지막으로 언제 업데이트되었는지만 알려주고, 결정은 사용자들이 직접 내리도록 했습니다.

중재(Moderation) 부하가 80% 감소했고, 잘못된 경로에 대한 사용자 불만도 줄어들었습니다. 사람들은 성인입니다. 나무가 쓰러지고, 산사태가 발생하며, 도로가 폐쇄되는 등 트레일(Trail)의 상태가 변한다는 사실을 이해합니다. 완벽함을 보장하려다 실패하는 것보다, 이러한 상황을 투명하게 공개하는 것이 더 큰 신뢰를 쌓는 길입니다.

기여도(Attribution)의 중요성 — 사람들이 공유하게 만들고 싶다면

모터사이클 커뮤니티에서는 평판이 중요합니다. 라이더들은 누가 그 놀라운 숨겨진 트레일을 찾아냈는지 기억합니다. 만약 당신의 플랫폼이 발견에 대한 기여를 제대로 표시하지 않는다면, 사람들은 정보를 공유하지 않을 것입니다.

당연한 소리처럼 들리겠지만, 저는 처음에 이 부분을 실수했습니다. 초기에는 경로에 단순히 "작성자(created by)" 필드 하나만 두었습니다. 그게 전부였죠.

제가 고려하지 못한 점은 다음과 같습니다: 여러 사람이 시간이 흐름에 따라 하나의 경로를 개선할 수 있다는 사실입니다. 누군가는 경로를 발견하고, 다른 누군가는 사진을 추가하며, 또 다른 누군가는 상태를 업데이트하고, 또 다른 누군가는 주차 정보를 추가합니다. 모두가 기여한 것입니다.

이제 저는 제대로 된 기여 체인(Attribution chain)을 갖추고 있습니다:

type Contribution struct {
    ContributorID string
    Type         ContributionType  // DISCOVERY, EDIT, CONDITION_UPDATE, PHOTO_ADDED
...

그리고 모든 경로는 상세 페이지에서 모든 기여자를 보여줍니다. 단순하지만 엄청난 차이를 만듭니다. 사람들은 자신의 작업에 대해 인정을 받고 싶어 합니다. 만약 인정을 해주지 않는다면, 그들은 인정을 받을 수 있는 페이스북 같은 곳에 대신 경로를 공유할 것입니다.

데이터는 거짓말을 하지 않습니다. 이 기능을 추가한 이후로 주당 공유되는 경로의 수가 40% 증가했습니다.

개인정보 보호는 사용자만을 위한 것이 아닙니다 — 트레일을 위한 것이기도 합니다

제가 미처 고려하지 못했던 개인정보 보호(Privacy) 문제가 하나 있습니다: 인기 있는 트레일은 너무 사랑받은 나머지 망가진다는 점입니다.

수천 명의 라이더에게 놀라운 숨겨진 트레일을 공유하게 되면, 결국 트레일은 침식되고, 지역 토지 소유주들은 화가 나며, 때로는 트레일이 영구적으로 폐쇄되기도 합니다. 이는 모두에게 좋지 않은 결과입니다.

그래서 저는 선택적인 개인정보 보호 기능인 **퍼지 시작 좌표 (fuzzy starting coordinates)**를 추가했습니다.

라이더가 자신의 경로를 공유하고 싶지만, 트레일의 과도한 이용으로부터 보호하고 싶다면 다음과 같은 기능을 수행하는 체크박스를 선택할 수 있습니다:

  • 시작 지점을 무작위 방향으로 0.5~2km 이동시킵니다.
  • 사람들이 위치를 알 수 있도록 일반적인 지역은 여전히 보여줍니다.
  • 일단 로그인을 하고 경로를 따라가기 시작하면 실제 경로 트랙에는 영향을 주지 않습니다.
func (rp *RoutePrivacy) GetPublicCoordinates(originalLat, originalLng float64) (float64, float64) {
    if !rp.FuzzyStart {
        return originalLat, originalLng
...

작은 기능이지만, 현재 라이더의 15%가 이 기능을 사용하고 있습니다. 이는 더 취약한 트레일들이 보호받고 있으며, 토지 소유주들이 더 만족하고 있고, 그 트레일들이 10년 후에도 모두가 즐길 수 있도록 남아있을 것임을 의미합니다.

배터리 수명은 단순한 불편함이 아니라 안전 문제입니다

사람들이 외딴 지역에서 주행하는 동안 사용하는 앱을 만들 때, 배터리 수명은 단순한 UX (사용자 경험) 문제가 아니라 안전 문제입니다.

만약 앱이 배터리를 소모시켜 사용자가 휴대폰 전원이 꺼진 상태로 어딘가에 고립된다면, 그것은 단순히 짜증 나는 일이 아니라 위험한 상황입니다.

저는 제 앱이 배터리를 모두 소모시키는 바람에 하룻밤 동안 고립되었던 한 베타 테스터를 통해 이 교훈을 얻었습니다. 그는 무사했지만, 저는 정말 겁이 났습니다. 그래서 다음과 같은 사항들을 변경했습니다:

  1. 위치 업데이트 일괄 처리 (Batch location updates): 화면이 꺼져 있을 때는 1초마다가 아닌 10초마다 업데이트합니다.
  2. 모든 백그라운드 프로세싱 비활성화: 배터리가 20% 미만일 때 모든 백그라운드 처리를 중단합니다.
  3. 활발히 기록 중일 때만 웨이크 락 (Wake lock) 사용: 그렇지 않을 때는 해제합니다.
  4. 트랙 데이터 압축: 전송 전 데이터를 압축합니다. 데이터 전송량이 적을수록 무선 통신 사용량이 줄어들고, 배터리 소모도 줄어듭니다.
// Android — 기록을 위한 적절한 배터리 처리
if (isRecording) {
    locationManager.requestLocationUpdates(
...

기본적인 내용처럼 들리겠지만, 처음에는 이를 충분히 우선순위에 두지 않았습니다. 사용자가 문명 세계에서 멀리 떨어져 있을 때 배터리 수명이 얼마나 중요한지 절대 과소평가하지 마세요.

장단점: 다시 한다면 할 것인가?

솔직히 말씀드리면, 이것을 구축하는 데 예상보다 훨씬 오래 걸렸습니다. 가감 없이 말씀드리자면 다음과 같습니다:

장점 (Pros)

커뮤니티 측면이 효과적임 — 라이더들이 실제로 경로를 공유하고 서로를 돕고 있습니다.
AI 탐색 주입 (AI exploration injection)이 실제로 발견을 증가시킴 — 사람들이 평소라면 찾지 못했을 새로운 장소들을 발견합니다.
투명한 중재 (Transparent moderation)가 자동화된 중재보다 효과적임 — 업무량은 줄어들고 신뢰도는 높아집니다.
기여도 체인 (Attribution chain)이 공유를 촉진함 — 사람들이 공로를 인정받으며, 모두가 승리하는 구조입니다.
트레일에 대한 프라이버시 보호는 옳은 방향임 — 우리가 사랑하는 장소들을 보호합니다.

단점 (Cons)

GPS는 여전히 문제임 — 모든 필터링을 적용하더라도 여전히 가끔 잘못된 지점이 나타납니다.
AI 추천은 결코 완벽하지 않음 — 여전히 가끔 이상한 제안이 나옵니다.
중재에는 여전히 가끔 사람의 눈이 필요함 — 투명성이 중재를 완전히 없애주지는 않습니다.
배터리 최적화는 끝이 없음 — 항상 개선해야 할 또 다른 미세 조정 사항이 존재합니다.
성장이 느림 — 커뮤니티 구축에는 시간이 걸리며, 서두를 수 없습니다.

그래서 이 서비스는 실제로 누구를 위한 것인가?

ADV Agent는 새로운 트레일을 발견하고 자신만의 경로를 공유하고 싶어 하는 어드벤처 모터사이클 라이더들을 위해 특별히 설계되었습니다. 만약 당신이:

  • 대형 상업용 웹사이트의 똑같은 경로들에 지쳤다면
  • 현지 라이더들이 발견한 숨겨진 보석 같은 장소들을 찾고 싶다면
  • 커뮤니티 기반 서비스 특유의 다듬어지지 않은 면이 있더라도 상관없다면
  • 당신이 사랑하는 트레일을 보호하는 것을 중요하게 생각한다면

이 서비스가 당신에게 맞을 수 있습니다.

만약 출퇴근을 위한 완벽한 턴바이턴 (turn-by-turn) 내비게이션을 찾고 있다면, Google Maps나 Waze를 사용하는 것이 더 나을 것입니다. 이 서비스는 그런 용도가 아닙니다.

마무리하며

ADV Agent를 구축하면서 저는 버티컬 커뮤니티 제품 (vertical community products)이 일반적인 소셜 네트워크보다 훨씬 더 많은 숨겨진 복잡성을 가지고 있다는 것을 배웠습니다. AI, 위치 데이터, 특정 취미, 그리고 커뮤니티 구축을 결합하면, 각 도메인은 일반적인 솔루션으로는 해결할 수 없는 고유한 문제들을 갖게 됩니다.

제가 얻은 가장 큰 교훈은 다음과 같습니다:

  1. 기술의 한계를 수용하세요 — 산악 지형에서 GPS는 결코 완벽할 수 없습니다. GPS와 싸우지 말고, 그것을 활용하는 법을 배우세요.
  2. 개인화(Personalization)가 항상 좋은 것은 아닙 — 때로는 발견의 즐거움을 유지하기 위해 무작위성(randomness)을 주입해야 할 때가 있습니다.
  3. 신뢰 > 완벽함 — 투명성은 언제나 자동화된 중재(automated moderation)보다 강력합니다.
  4. 크레딧(Credit) = 기여(contribution) — 사람들이 기여하기를 원한다면, 그들에게 크레딧을 부여하세요.
  5. 개인정보 보호(Privacy)는 사용자를 넘어 확장됩니다 — 이는 사용자들이 공유하는 장소에까지 확장됩니다.
  6. 배터리 = 안전 — 사람들이 외딴곳에 있을 때, 이는 선택 사항이 아닙니다.

버티컬 커뮤니티(vertical community) 제품을 구축해 본 적이 있으신가요? 도메인 특화 문제(domain-specific problems)가 AI 문제보다 더 어렵게 느껴지는 것과 같은 예상치 못한 복잡성에 직면한 적이 있나요? 댓글로 여러분의 이야기를 들려주세요!

프로젝트를 살펴보고 싶다면 GitHub에서 오픈 소스로 확인하실 수 있습니다: https://github.com/kevinten10/ADV-Agent — GPS 오류 수정을 도와주고 싶다면 PR(Pull Request)을 환영합니다 😅

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0