채팅 앱을 위한 간단한 링크 프리뷰 API가 필요해서 직접 만들었습니다

발행: (2025년 12월 15일 오전 04:39 GMT+9)
9 min read
원문: Dev.to

Source: Dev.to

Lessons learned from building a minimal, predictable URL preview API

우리는 반려동물 부모와 반려동물 케어 서비스 제공자를 연결하는 플랫폼을 만들고 있습니다. 사용자들 간의 실시간 양방향 채팅 시스템은 플랫폼에서 가장 활발히 사용되는 부분 중 하나이며, 매일 수천 개의 메시지가 전송됩니다. 사용자가 링크를 붙여넣으면 Facebook Messenger나 WhatsApp처럼 깔끔한 미리보기(제목, 설명, 이미지, 파비콘)로 확장되어야 합니다.

이것은 간단할 것이라고 생각했어요— URL 미리보기 API는 많이 있잖아요, 그렇죠? 하지만… 그렇지는 않았습니다.

What I Found When Researching URL Preview APIs

1. Hourly limits that didn’t match our usage

채팅 트래픽은 파동처럼 오갑니다. 우리 사용자들(주로 미국 서부)에게는 활동이 오전 10시–오후 2시 MST에 급증하고 오후 6시 이후에 급감합니다. 몇몇 API는 사용량을 시간 단위로 과금하거나 버스트 제한을 두었는데, 이는 이러한 패턴과 맞지 않았습니다. 이론적으로 월 사용량은 합리적이었더라도, 단기 한도에 걸리면 바쁜 시간대에 미리보기가 깨질 수 있었습니다.

2. Features we didn’t need

많은 API가 스크린샷, AI 기반 파싱, 매우 큰 JSON 응답 등을 제공했습니다. 이러한 도구들은 인상적이지만, 우리가 필요로 하는 간단한 미리보기 카드에는 과도했으며, 가격도 그 복잡성을 반영했습니다.

3. Expensive to get started

제가 찾은 가장 저렴한 상업 플랜은 $25 / month 정도였습니다. 진입 가격은 비슷했지만, 할당량은 달랐습니다. 인디 개발자와 소규모 부트스트랩 기업에게는 이 추가적인 정기 비용이 장벽이 될 수 있습니다.

Why I Decided to Build My Own Solution

동기부여는 “내가 더 잘 할 수 있다”가 아니라 “간단하고, 신뢰할 수 있으며, 저렴한 것이 필요하다”였습니다. 기존 서비스는 시간 제한, 불필요한 복잡성, 그리고 우리 사용 사례에 맞지 않는 가격 구조를 가지고 있었습니다. 내부 도구로 시작했지만 결국 URLPreview 라는 작은 독립 서비스로 발전했습니다.

Rules Followed

  1. Simplicity in the API – 하나의 엔드포인트, 간단한 인증, 그리고 표준 링크 카드에 필요한 필드만 포함한 간결한 JSON 응답.
  2. Simplicity in quotas – 시간 제한 없음. 사용자가 원하는 때에 사용할 수 있는 월간 할당량; 버스트는 안정성을 위협할 경우에만 일시적으로 제한됩니다.
  3. Granular pricing – 작은 사용자들이 대규모 플랜에 강제로 끌려 들어가서는 안 됩니다. URLPreview는 $9 / month for 50 k requests 로 시작하며, 이는 다른 서비스가 비슷한 할당량에 대해 $25 / month 를 청구하는 것과 비교됩니다.
  4. Reliable metadata extraction – 저렴하다고 해서 신뢰성이 떨어져서는 안 됩니다. 깨진 사이트와 엣지 케이스는 지속적으로 모니터링되고, 종종 사용자 피드백을 기반으로 수정됩니다.
  5. Equal features across tiers – 플랜 간 차이는 요청 수뿐이며, 사용량에 비례하지 않는 기능은 모두에게 제공됩니다.

Features Intentionally Avoided

  1. Screenshots and extras – 대부분의 미리보기 사용 사례에 필요하지 않으며 추가 인프라와 스토리지를 요구합니다.
  2. AI‑based extraction – 비결정적 응답과 GPU 기반 인프라 필요성 때문에 비용이 크게 상승합니다.
  3. Hourly limits – 채팅 애플리케이션의 버스트 트래픽 패턴을 벌칙화합니다.

이 기능들이 “나쁜” 것은 아니며, 특정 시나리오에서는 유용합니다. 하지만 제가 목표로 한 대부분의 미리보기 사용 사례에는 불필요했으며, 이를 배제함으로써 가격을 저렴하게 유지할 수 있었습니다.

Early Launch & User Response

Reddit 댓글에서 프로젝트를 가볍게 언급한 지 며칠 만에 첫 번째 유료 사용자를 확보했으며, 이는 문제를 검증하는 데 충분했습니다. 이후 Product HuntUneed 에서 출시하면서 수십 명의 가입자를 얻었습니다. 현재 대부분의 트래픽은 최소한의 마케팅 노력으로 Google에서 자연스럽게 유입됩니다. 서비스는 운영 비용을 충분히 커버하고, 투자한 시간에 대한 수익을 제공합니다.

How It Works

API 응답은 의도적으로 최소화되었습니다:

GET https://api.urlpreview.com/v1/preview?url=youtube.com&key=YOUR_KEY
{
  "access": "public",
  "title": "YouTube",
  "description": "Enjoy the videos and music you love, upload original content, and share it all with friends, family, and the world on YouTube.",
  "image": "https://www.youtube.com/img/desktop/yt_1200.png",
  "icon": "https://www.youtube.com/s/desktop/31c2c151/img/favicon.ico",
  "url": "https://youtube.com"
}

이는 대부분의 앱이 링크 카드에 실제로 필요로 하는 정보를 모두 포함합니다.

Lessons Learned

  • Simplicity wins – 대부분의 사용 사례는 스크린샷이나 AI를 필요로 하지 않으며, 최소화된 설계가 API 유지보수를 쉽게 하고 비용을 낮춥니다.
  • Predictable pricing matters – 버스트 제한은 개발자를 좌절시킵니다; 고정 월간 할당량이 실제 사용에 더 적합합니다.
  • Free tiers help adoption – 개인 프로젝트와 테스트를 마찰 없이 허용하면 실험과 피드백을 장려합니다.
  • Focus on reliability – 저렴한 서비스라도 신뢰성이 중요합니다; 모니터링과 알림에 투자할 가치가 있습니다.
  • Small gaps can become opportunities – 실제 고통을 해결하는 집중된 도구를 만들면 다른 사람들에게도 가치를 제공할 수 있습니다.

Why I’m Sharing This

많은 개발자들이 채팅 앱, 대시보드, 북마크 도구, 브라우저 확장 프로그램, 자동화 등에서 링크 미리보기가 필요합니다. 기존 서비스의 한계, 가격 모델, API 제한 등에 부딪힌 경우를 대비해, 제가 작은, 최소한의 URL 미리보기 API를 만들면서 얻은 교훈을 공유하고 싶었습니다. 여러분이 이 문제를 다른 방식으로 해결했거나, 구현에 대한 피드백이 있다면 알려 주세요. 경험을 공유하면 모두가 더 나은 솔루션을 찾을 수 있습니다.

Back to Blog

관련 글

더 보기 »

9일 차: 야망 있는 사람을 만났다

Streak Situation Day 9이고, 인정해야 할 것이 LeetCode 연속 기록이 끊겼다. GitHub 연속 기록도 끊겼다. 친척이 너무 많아서 일정이 완전히 뒤엎혔다.