Criti.AI 백엔드 구조

Category
Criti AI
Status
Published
Tags
아키텍처
backend
express
Description
Published
Slug
  • 뉴스 기사 신뢰도 분석: Google Gemini AI를 통한 실시간 콘텐츠 분석
  • 교육용 챌린지: 매일 자동 생성되는 미디어 리터러시 퀴즈
  • 진도 관리: 사용자별 학습 진행도 및 배지 시스템
  • 플랫폼 지원: Chrome 확장 프로그램 + 웹 애플리케이션
 

아키텍처

┌─────────────────────────────────────────────────────────┐ │ 프론트엔드 │ │ ┌─────────────────┐ ┌─────────────────────────────┐ │ │ │ Chrome Extension│ │ 웹 애플리케이션 │ │ │ └─────────────────┘ └─────────────────────────────┘ │ └─────────────────────────────────────────────────────────┘ │ HTTPS API 요청 │ ┌───────────────────────────────────────────────────────────┐ │ 백엔드 서버 │ │ ┌─────────────────┐ ┌─────────────────────────────┐ │ │ │ Express.js │ │ API 라우터 │ │ │ │ 서버 │ │ /api/analysis, /challenge │ │ │ └─────────────────┘ └─────────────────────────────┘ │ └───────────────────────────────────────────────────────────┘ │ ┌─────────────┼───────────────┐ │ │ │ ┌─────────────┴─┐ ┌────────┴────────┐ ┌─┴─────────────┐ │ Google │ │ 3단계 캐시 │ │ 데이터베이스 │ │ Gemini AI │ │ │ │ (SQLite) │ │ │ │ Redis → DB → │ │ │ │ 콘텐츠 분석 │ │ Memory Cache │ │ 사용자/분석 │ │ & 챌린지생성 │ │ │ │ 결과 저장 │ └───────────────┘ └─────────────────┘ └───────────────┘
 

스택

백엔드

Node.js + Express.js + TypeScript
  • 선택 이유: 빠른 개발 속도와 JavaScript 활용
  • TypeScript: 타입 안전성으로 런타임 에러 방지
  • Express.js: 간단하면서도 강력한 웹 프레임워크
 
Google Gemini AI
  • 선택 이유
    • 더 큰 컨텍스트 윈도우 (1M 토큰 vs GPT-4의 128K)
    • 비용 효율성
    •  
Prisma ORM + SQLite
  • Prisma: 타입 안전한 데이터베이스 쿼리
  • SQLite: 초기 개발 단계에서 간단한 설정, 추후 PostgreSQL로 이전 가능
 
Redis 캐싱
  • 선택 이유: AI API 호출 비용 절약 및 응답 속도 향상
 

개발/배포 도구

Docker 컨테이너화
  • 선택 이유: 어떤 환경에서든 동일한 실행 환경 보장
  • Multi-stage build: 이미지 크기 최적화

프로젝트 구조

backend/ ├── src/ # 소스 코드 │ ├── services/ # 비즈니스 로직 │ │ ├── GeminiService.ts # AI 분석 엔진 │ │ ├── DatabaseService.ts # 데이터베이스 관리 │ │ ├── RedisCacheService.ts # 캐싱 시스템 │ │ └── DailyChallengeService.ts # 챌린지 자동 생성 │ ├── routes/ # API 엔드포인트 │ │ ├── analysis.ts # 분석 API │ │ └── challenge.ts # 챌린지 API │ └── app.ts # 메인 서버 파일 ├── prisma/ # 데이터베이스 스키마 │ └── schema.prisma ├── dist/ # 컴파일된 JavaScript ├── Dockerfile # 개발용 Docker 설정 ├── Dockerfile.prod # 프로덕션용 Docker 설정 └── package.json # 프로젝트 설정 및 의존성
 

 

1. 캐싱 시스템

요청 → Redis 확인 → DB 확인 → 메모리 확인 → AI 호출
  • AI API 비용 절약 및 응답 속도 향상 위해 캐시 시스템 적용
  • 주요 뉴스의 경우 대부분 요청 캐시에서 처리
 

2. 자동화된 일일 챌린지 생성

  • 매일 자정에 AI가 새로운 교육 콘텐츠 생성
  • 실패 시 미리 준비된 백업 콘텐츠 사용
  • 난이도별 (초급/중급/고급) 챌린지 제공
 

3. 메모리 최적화

  • Oracle Cloud Free Tier (1GB RAM) 환경에서 동작
  • 싱글톤 패턴으로 메모리 사용량 최소화
  • Docker 컨테이너 리소스 정밀 제어

 

데이터 플로우

뉴스 분석 요청 플로우

1. 사용자가 뉴스 URL 전송 2. 서버에서 3단계 캐시 확인 3. 캐시 미스 시 Gemini AI 호출 4. 분석 결과를 모든 캐시 레이어에 저장 5. 클라이언트에 결과 반환
 

챌린지 시스템 플로우

1. 사용자가 오늘의 챌린지 요청 2. 서버에서 오늘 날짜 챌린지 확인 3. 없으면 AI로 새 챌린지 생성 4. 데이터베이스에 저장 후 반환

 

API 엔드포인트

분석 API

  • POST /api/analysis/analyze - 뉴스 기사 신뢰도 분석
  • POST /api/analysis/quick-check - 빠른 도메인 기반 평가

챌린지 API

  • GET /api/challenge/daily - 오늘의 챌린지 조회
  • POST /api/challenge/:id/submit - 챌린지 답안 제출
  • GET /api/challenge/progress/:userId - 사용자 진행도 조회

시스템 API

  • GET /health - 서버 상태 확인
  • GET /api/challenge/stats - 시스템 통계
 

성능 최적화

메모리 사용량 최적화

  • Node.js 힙 메모리 제한: -max-old-space-size=384
  • 불필요한 로깅 최소화
  • 가비지 컬렉션 최적화

응답 속도 최적화

  • 압축 미들웨어 사용 (gzip)
  • 정적 자원 캐싱
 

보안 조치

  • Helmet.js: HTTP 헤더 보안 강화
  • CORS: 허용된 도메인만 접근 가능
  • Rate Limiting: 사용자별 요청 횟수 제한

에러 처리

  • Graceful Degradation: Redis 실패 시에도 서비스 유지
  • Fallback System: AI 생성 실패 시 백업 콘텐츠 제공
  • Health Check: 자동화된 시스템 상태 모니터링
 

 

백엔드 개발 개념

  • API 설계: RESTful API 설계 원칙
  • 데이터베이스 설계: 관계형 데이터베이스 모델링
  • 캐싱 전략: 다층 캐싱 아키텍처
  • 마이크로서비스: 서비스 분리 및 독립성
 

클라우드 및 DevOps

  • 컨테이너화: Docker를 통한 애플리케이션 패키징
  • 리소스 최적화: 제한된 환경에서의 성능 튜닝
  • 모니터링: 실시간 시스템 상태 추적
 

AI 통합

  • Prompt Engineering: AI 모델의 일관된 결과를 위한 프롬프트 설계
  • 비용 최적화: API 호출 최소화 전략
  • 에러 처리: AI 응답 파싱 및 예외 상황 대응
 
 

  • Express - Node.js web application framework
  • prismaprismaPrisma Documentation
  • Docker DocumentationDocker DocumentationHome