← cd /projects
project : Refentra - 협업형 레퍼런스 아카이브
period : 2026.03 - 진행 중
role : Solo Developer (Fullstack)
stack :
React 18TypeScriptViteTailwind CSSGoEchoGORMPostgreSQLRedisDockerPlaywright
// key metrics
- ↗ PRD v1.0 → v1.8 버전 기반 단계별 개발
- ↗ React(SPA) + Go(Echo) 풀스택 솔로 설계
- ↗ Hetzner VPS + Caddy + Docker Compose 프로덕션 배포 스캐폴드 완비
아이디어
팀이나 개인이 유용한 링크를 발견할 때마다 슬랙·노션·즐겨찾기에 흩어진다. 나중에 “그 레퍼런스 어디 있었지?”가 반복된다.
레퍼런스 발견
↓
슬랙/노션/북마크에 분산 저장
↓
검색이 안 되거나 공유가 불편함
↓
결국 다시 구글링
Refentra의 답: 태그 기반 필터·풀텍스트 검색·페이지네이션이 서버 사이드로 동작하는 협업형 레퍼런스 아카이브. 검색 상태는 URL에 저장돼 새로고침하거나 링크를 공유해도 그대로 복원된다.
아키텍처
┌──────────────────────────────────────────────────┐
│ frontend/ (React 18 + Vite + TS) │
│ Landing / Dashboard / Login / Signup │
│ 태그 필터 · 검색 · 페이지네이션 · 모달 저장 │
└─────────────────────┬────────────────────────────┘
│ REST /api/v1/...
▼
┌──────────────────────────────────────────────────┐
│ Go (Echo + GORM) │
│ 인증(JWT httpOnly) │ 레퍼런스 CRUD │
│ 검색/필터/페이지네이션 │ 중복 감지 │
└──────┬───────────────────────────┬───────────────┘
│ │
PostgreSQL 16 Redis 7
(레퍼런스·유저) (Refresh Token)
프로젝트 구조
refentra/
├── frontend/
│ ├── src/
│ │ ├── components/
│ │ ├── pages/
│ │ └── lib/
│ └── e2e/ # Playwright 시나리오
├── internal/
│ ├── auth/ # JWT + Redis 세션
│ ├── handlers/ # Echo 핸들러
│ └── models/ # GORM 모델
├── docker/
├── docs/
│ ├── prd/ # v1.0 ~ v1.8 PRD 문서
│ └── devlog/
└── main.go
핵심 기능
| 기능 | 설명 |
|---|---|
| 레퍼런스 저장·조회 | URL + 제목 + 태그 저장, 서버 사이드 페이지네이션 |
| 풀텍스트 검색 | 제목/설명/URL 기준 실시간 검색 |
| 태그 필터 | 다중 태그 AND 필터 |
| URL 상태 동기화 | /dashboard?search=react&tags=Frontend&page=2 형식 — 새로고침·공유 후 복원 |
| 중복 감지 | 동일 사용자 기준 url + title 중복 서버 거절 |
| 포트폴리오 데모 모드 | ?mode=portfolio — 브라우저 내 샘플 데이터 레이어, 실제 DB와 분리 |
인증 흐름
회원가입 → 자동 로그인
↓
Access Token (httpOnly 쿠키, 15분)
↓ 만료
Refresh Token (Redis, 24시간) → 재발급
↓
로그아웃 → Redis Refresh Token + 브라우저 쿠키 동시 폐기
기술 선택 이유
Go + Echo (백엔드) Go는 단일 바이너리로 배포되고 Docker 이미지가 가볍다. Echo는 미들웨어 조합이 직관적이고, GORM으로 PostgreSQL 스키마 관리를 코드 수준에서 처리한다.
React + Vite (프론트엔드)
SPA로 빠르게 MVP를 만들되, go:embed로 Go 바이너리에 프론트엔드를 통합해 서버를 하나만 운영한다. 배포 토폴로지를 단순하게 유지한다.
Redis (세션 저장소) Refresh Token을 DB에 저장하면 토큰 폐기 쿼리가 느리다. Redis의 TTL 기반 자동 만료와 즉시 삭제로 로그아웃 보안을 확보한다.
Playwright (E2E) 단순 API 테스트로는 URL 상태 복원, 리다이렉트 흐름, 쿠키 동작을 검증하기 어렵다. 실제 브라우저에서 4개 핵심 시나리오를 CI에서 자동 검증한다.
개발 단계
| Phase | 내용 | 상태 |
|---|---|---|
| v1.0 | 제품 기본 PRD — 레퍼런스 저장·조회·삭제 MVP | 완료 |
| v1.1 | 저장/조회 서버 연동 | 완료 |
| v1.2 | 로컬 Docker PostgreSQL 환경 | 완료 |
| v1.3 | Redis 세션 인증 (httpOnly + Refresh) | 완료 |
| v1.4 | Playwright 브라우저 E2E | 완료 |
| v1.5 | 검색/필터/페이지네이션 | 완료 |
| v1.6 | 대시보드 URL 쿼리 동기화 | 완료 |
| v1.8 | 포트폴리오 리디자인 | 완료 |