← 포트폴리오

Almaeng

Offline

성분 투명성과 가격 비교를 함께 다루는 AI 영양제 분석 및 가격 인텔리전스 서비스입니다.

개인 프로젝트 · 2025.12

Role 제품 설계, 백엔드 아키텍처, 구현
Team 개인 프로젝트
Period 2025.12
Links 케이스 스터디만 공개 · GitHub 비공개
Django NinjaHTMXAlpine.jsPostgreSQLpgvectorGemini FlashPydantic AICoolify

현재 live 배포는 내려간 상태이며, 이 페이지는 제품과 아키텍처 기록용입니다.

포지셔닝

Almaeng은 영양제를 브랜드나 광고 문구가 아니라, 실제 성분과 가격 효율 기준으로 다시 보게 만드는 제품입니다. 라벨 해석, 성분 비교, 가격 인텔리전스를 한 흐름으로 묶어 한국 사용자에게 더 실용적인 구매 판단을 제공하는 데 초점을 맞췄습니다.

문제

영양제 구매는 브랜드 인지도, 패키지, 광고 문구에 크게 좌우되지만, 실제로는 성분 함량과 가격 효율을 함께 봐야 합니다. 단순한 판매가 비교만으로는 진짜 가성비를 판단하기 어렵고, 여러 제품을 함께 복용할 경우 성분 중복이나 과다 섭취 위험도 커집니다.

  • → 제품 단위가 아니라 성분 단위 비교가 필요했습니다
  • → 1통 가격만으로는 1정당 비용과 성분당 비용을 판단하기 어렵습니다
  • → 복수 영양제 복용 시 성분 중복과 과다 섭취 위험이 존재합니다
  • → 공공 제품 정보와 판매 정보가 흩어져 있어 한 번에 보기 어렵습니다

구현 내용

Almaeng은 영양제 정보를 제품명 중심이 아니라 성분 중심으로 구조화합니다. 판매 데이터와 제품 정보를 정리한 뒤, 사용자가 실제 가치 판단을 할 수 있도록 비교 가능한 화면과 분석 흐름으로 연결했습니다.

  • → 판매 데이터와 제품 정보를 결합한 검색 및 비교 흐름
  • → 브랜드보다 성분 함량을 중심으로 보는 제품 분석 구조
  • → 1회 섭취량과 주요 성분 기준으로 다시 계산하는 가격 비교
  • → 여러 제품 간 중복 성분을 확인하는 overlap alert 방향
  • → 라벨 이해를 돕는 AI 기반 보조 해석 레이어

내가 한 일

  • → 성분 중심 평가라는 제품 방향과 비교 기준을 정의했습니다
  • → 영양제, 성분, 가격 스냅샷 중심의 데이터 모델을 설계했습니다
  • → 검색과 비교 흐름을 백엔드 중심 구조로 직접 구현했습니다
  • → Coolify와 Hetzner 기반 self-managed 배포 경로를 구성했습니다

아키텍처

Django + HTMX 서버 렌더링 구조. 검색, 비교, 분석 로직이 모두 서버 권한형으로 동작합니다. Gemini Flash + Pydantic AI가 영양제 라벨을 구조화된 안전한 출력으로 변환합니다.

시스템 흐름

사용자
브라우저
↓ HTTP 요청
Django + HTMX
DAEMON-ONE · 검색, 비교, 분석 뷰 · SSR
↓ 쿼리
PostgreSQL
supplements · ingredients · price_snapshots · pgvector

AI 라벨 분석

영양제 라벨
원본 텍스트 입력
Gemini Flash
성분 · 함량 · 단위 · 위험 플래그 추출
↓ 구조화 출력
Pydantic AI
스키마 검증 · 저장 안전 확인
PostgreSQL
정규화된 성분 데이터

인프라

  • → Hetzner 기반 self-hosted 배포와 Coolify 운영
  • → Docker 중심 배포 흐름으로 운영 제어권 확보
  • → Cloudflare 기반 DNS, TLS, edge 처리
  • → 개인 개발 속도와 낮은 운영 부담에 맞춘 구조

기술 노트

시스템 메모

  • Django Ninja, HTMX, Alpine.js 조합으로 서버 권한형 인터랙션을 단순하게 유지했습니다.
  • PostgreSQL은 제품, 성분, 비교 데이터를 구조화해 저장하고, pgvector는 향후 의미 기반 탐색 확장을 대비합니다.
  • Gemini Flash와 Pydantic AI는 라벨 해석과 구조화된 AI 출력 처리에 사용합니다.

데이터 모델 스냅샷

supplements
- id
- brand
- product_name
- serving_size

ingredients
- id
- name
- daily_value_ref

supplement_ingredients
- supplement_id
- ingredient_id
- amount
- unit

price_snapshots
- supplement_id
- retailer
- price
- captured_at