Dev tools 허브 API
Source: Dev.to
내가 만든 것
Xano AI‑Powered Backend Challenge 제출물: Production‑Ready Public API
제목: DevTools Resource Hub API
사용 가능: True
DevTools API
- Xano Hub API
- Xano Assisted Production API
소프트웨어 백엔드 아키텍처

백엔드는 MVP에 적합한 계층형·모듈식 설계를 따릅니다. API 엔드포인트는 REST 인터페이스를 제공하며 인증, 속도 제한, 검증으로 보호됩니다. 핵심 비즈니스 로직은 검색, 추천, 스코어링과 같은 서비스로 분리됩니다. 데이터 접근 계층은 PostgreSQL에 대한 쿼리, 캐싱, 트랜잭션을 담당합니다. 이벤트 처리와 백그라운드 작업을 통해 확장 가능한 비동기 통합을 구현합니다.



캐싱 전략 개요

데이터베이스 스키마
tools
| Column | Type | Constraints / Description |
|---|---|---|
| id | SERIAL | Primary Key |
| name | VARCHAR(255) | Unique, Not Null |
| slug | VARCHAR(255) | Unique, URL‑safe |
| category_id | INTEGER | FK → categories.id |
| description | TEXT | Tool description |
| tagline | VARCHAR(500) | Short marketing line |
| website_url | VARCHAR(500) | Official website |
| logo_url | VARCHAR(500) | Logo image URL |
| founded_date | DATE | Company founding date |
| company_name | VARCHAR(255) | Company behind the tool |
| is_active | BOOLEAN | Default: true |
| query_count | INTEGER | Default: 0 (trending score) |
| last_queried_at | TIMESTAMP | Last API query time |
| created_at | TIMESTAMP | Default: now() |
| updated_at | TIMESTAMP | Default: now() |
Indexes
category_idslugis_active(query_count, last_queried_at)
categories
| Column | Type | Constraints / Description |
|---|---|---|
| id | SERIAL | Primary Key |
| name | VARCHAR(255) | Unique, Not Null |
| slug | VARCHAR(255) | Unique |
| parent_id | INTEGER | Self FK → categories.id |
| description | TEXT | Category description |
| icon | VARCHAR(100) | Icon identifier |
| display_order | INTEGER | Default: 0 |
| created_at | TIMESTAMP | Created timestamp |
Indexes
parent_idslug
pricing_tiers
| Column | Type | Constraints / Description |
|---|---|---|
| id | SERIAL | Primary Key |
| tool_id | INTEGER | FK → tools.id (CASCADE) |
| tier_name | VARCHAR(100) | Free, Starter, Pro |
| monthly_price | DECIMAL(10,2) | Nullable |
| annual_price | DECIMAL(10,2) | Nullable |
| currency | VARCHAR(3) | Default: USD |
| billing_cycle | ENUM | monthly, annual, one-time |
| features_json | JSONB | Flexible features list |
| limits_json | JSONB | API limits, users, storage |
| is_current | BOOLEAN | Default: true |
| effective_from | TIMESTAMP | Pricing start |
| effective_to | TIMESTAMP | Nullable |
| created_at | TIMESTAMP | Created timestamp |
Indexes
(tool_id, is_current)(effective_from, effective_to)
alternatives
| Column | Type | Constraints / Description |
|---|---|---|
| id | SERIAL | Primary Key |
| tool_id | INTEGER | FK → tools.id |
| alternative_id | INTEGER | FK → tools.id |
| similarity_score | DECIMAL(5,2) | Range: 0–100 |
| match_basis | ENUM | features, pricing, category |
| comparison_notes | TEXT | Comparison details |
| upvotes | INTEGER | Default: 0 |
| created_at | TIMESTAMP | Created timestamp |
| updated_at | TIMESTAMP | Updated timestamp |
Constraints
UNIQUE(tool_id, alternative_id)tool_id <> alternative_id
Indexes
tool_idsimilarity_score DESC
reviews_aggregate
| Column | Type | Constraints / Description |
|---|---|---|
| id | SERIAL | Primary Key |
| tool_id | INTEGER | FK → tools.id |
| source | VARCHAR(50) | g2, capterra, producthunt |
| avg_rating | DECIMAL(3,2) | Range: 0–5 |
| total_reviews | INTEGER | Review count |
| rating_breakdown | JSONB | e.g. {5:120,4:45,...} |
| source_url | VARCHAR(500) | Review page URL |
| last_scraped_at | TIMESTAMP | Scraping time |
| created_at | TIMESTAMP | Created timestamp |
Indexes
(tool_id, source)avg_rating DESC
features
| Column | Type | Constraints / Description |
|---|---|---|
| id | SERIAL | Primary Key |
| tool_id | INTEGER | FK → tools.id |
| feature_name | VARCHAR(255) | Feature title |
| feature_category | VARCHAR(100) | Auth, API, Database |
| is_available | BOOLEAN | Default: true |
| tier_availability | VARCHAR(50) | free, pro, all |
| description | TEXT | Feature details |
| created_at | TIMESTAMP | Created timestamp |
Indexes
tool_idfeature_categoryis_available
changelog
| Column | Type | Constraints / Description |
|---|---|---|
| id | SERIAL | Primary Key |
| tool_id | INTEGER | FK → tools.id |
| change_type | ENUM | pricing, feature, update |
| change_summary | VARCHAR(500) | Short summary |
| change_details | TEXT | Detailed change |
| old_value | JSONB | Previous value |
| new_value | JSONB | Updated value |
| changed_at | TIMESTAMP | When change occurred |
| created_at | TIMESTAMP | Created timestamp |
Indexes
(tool_id, changed_at DESC)change_type
integrations
| Column | Type | Constraints / Description |
|---|---|---|
| id | SERIAL | Primary Key |
| tool_id | INTEGER | FK → tools.id |
| integrates_with | INTEGER | FK → tools.id |
| integration_type | ENUM | native, api, webhook, zapier |
| ease_of_setup | ENUM | easy, medium, complex |
| documentation_url | VARCHAR(500) | Docs link |
| is_official | BOOLEAN | Default: false |
| created_at | TIMESTAMP | Created timestamp |
Indexes
tool_idintegrates_with
API 문서
Tools API
1️⃣ 모든 도구 조회
Endpoint
GET /tools/
Query Parameters
| Parameter | Type | Description |
|---|---|---|
category | string (optional) | 카테고리별 필터 |
price_min | number (optional) | 최소 가격 |
price_max | number (optional) | 최대 가격 |
features | array of strings (optional) | 필수 기능 |
sort | string (default: “name”) | 정렬 필드 |
page | number (default: 1) | 페이지 번호 |
size | number (default: 10) | 페이지 크기 |
Response Example
{
"items": [
{
"id": 1,
"name": "VS Code",
"slug": "vs-code",
"category_id": 3,
"description": "Free source‑code editor",
"website_url": "https://code.visualstudio.com/",
"logo_url": "https://example.com/logo.png",
"is_active": true,
"query_count": 124,
"last_queried_at": "2025-11-01T12:34:56Z"
}
// …more tools
],
"page": 1,
"size": 10,
"total_items": 342,
"total_pages": 35
}
2️⃣ 도구 상세 조회
Endpoint
GET /tools/{id}/
Path Parameter
id– 도구의 정수형 ID.
Response Example
{
"id": 1,
"name": "VS Code",
"slug": "vs-code",
"category": {
"id": 3,
"name": "IDE"
},
"description": "Free source‑code editor",
"website_url": "https://code.visualstudio.com/",
"logo_url": "https://example.com/logo.png",
"features": [
{ "name": "IntelliSense", "available": true },
{ "name": "Debugging", "available": true }
],
"pricing_tiers": [
{ "tier_name": "Free", "monthly_price": null, "annual_price": null }
],
"reviews": {
"avg_rating": 4.7,
"total_reviews": 215
}
}
3️⃣ 도구 검색
Endpoint
GET /tools/search/
Query Parameters
| Parameter | Type | Description |
|---|---|---|
q | string | 검색어 (이름, 태그라인 등) |
page | number | 페이지 번호 (default 1) |
size | number | 페이지 크기 (default 10) |
Response – 모든 도구 조회와 동일한 구조이지만 검색어에 따라 필터링됩니다.
Categories API
Endpoint
GET /categories/
카테고리 목록과 계층 구조를 반환합니다.
Pricing Tiers API
Endpoint
GET /tools/{id}/pricing/
특정 도구에 대한 현재 및 과거 가격 정보를 제공합니다.
Alternatives API
Endpoint
GET /tools/{id}/alternatives/
유사도 점수에 따라 순위가 매겨진 대체 도구 목록을 반환합니다.
Reviews Aggregate API
Endpoint
GET /tools/{id}/reviews/
외부 소스(G2, Capterra, Product Hunt)에서 수집된 평점을 집계합니다.
Features API
Endpoint
GET /tools/{id}/features/
도구의 모든 기능을 카테고리와 티어별 가용성으로 그룹화하여 나열합니다.
Changelog API
Endpoint
GET /tools/{id}/changelog/
가격, 기능, 업데이트 등 변경 사항을 연대순으로 제공합니다.
Integrations API
Endpoint
GET /tools/{id}/integrations/
도구의 네이티브 및 서드파티 통합 정보를 보여줍니다.