NEMOKOALA
서비스 모음ImageGenTossMeNemoDrop/ClipBoard/Terminal Shortcut Buttons
서비스 모음으로 돌아가기

Developer Brief

ImageGen

AI 이미지 생성·공유

Next.js와 여러 이미지 모델을 사용한 AI 이미지 생성 웹 애플리케이션입니다. API·로컬 모델로 이미지를 만들고 공유하며, 좋아요·댓글·프로필까지 지원합니다.

서비스 열기GitHub 보기

핵심 정보

  • DALL·E 3, Google Imagen, Nano Banana 등 API 모델
  • Stable Diffusion XL, Z Image Turbo 등 로컬 모델
  • 생성 이미지 공유, 좋아요·댓글
  • 프로필 조회·수정

기술 스택

Next.js 16React 19TypeScriptTailwind CSSshadcn/uiMySQLPrismaTanStack QueryZustand

아키텍처

클라우드 비용 절감과 고성능 AI 모델 서빙을 위해 Home Lab(온프레미스) 환경을 직접 구축했습니다. RTX 5090 데스크톱을 AI 추론 워크스테이션으로, 미니 PC(WSL2)를 웹 서버로 분리해 운영합니다.

ImageGen 인프라 아키텍처 (Home Lab)
ImageGen 인프라 아키텍처 (Home Lab)

Application

  • Next.js App Router 기반 SSR로 피드·갤러리·상세 페이지 렌더링
  • Prisma ORM으로 MySQL 연동, 사용자·이미지·좋아요·댓글·알림 스키마 관리
  • 공통 요청/응답 타입과 '크레딧 → 파일 저장 → DB' 파이프라인을 공유하고, 모델 호출은 모델별로 분기
  • 로컬 생성 시 Ollama로 한글 프롬프트를 영어로 번역, Z-Image는 ComfyUI 워크플로우를 런타임에 동적 구성
  • 서버 상태는 TanStack Query, 전역 UI 상태는 Zustand로 관리

Why Self-Hosted

  • 비용 효율성: GPU가 필요한 이미지 생성 모델을 AWS g5 등 클라우드로 구동할 때의 비용을 로컬 RTX 5090 데스크톱으로 절감
  • 데이터 주권: 생성된 이미지와 프롬프트 데이터를 로컬 MySQL에 직접 저장·관리

Network & Security

  • WSL2 미러링 모드로 윈도우 호스트–WSL 간 네트워크 장벽을 제거, 복잡한 포트포워딩 없이 localhost 통신 환경 최적화
  • Nginx 리버스 프록시로 SSL(HTTPS) 적용 및 내부 포트(3000·3306 등) 외부 노출 차단
  • 공유기에서 80·443 포트만 개방해 외부 공격 표면 최소화

CI/CD Pipeline

  • GitHub Actions Self-hosted Runner가 Job을 폴링(pull)하는 방식이라, 외부에서 로컬 서버로의 직접 SSH 접속 없이 배포 보안 강화
  • Push → Build → PM2 Reload 과정을 자동화해 무중단 배포 구현

문제 · 해결

문제

모델마다 응답 형식(URL·base64·inlineData·ComfyUI 폴링)과 지연이 제각각이라 후처리가 복잡

해결

응답을 공통 GenerateImageResponse로 정규화하고 '크레딧 → 파일 저장 → DB' 파이프라인을 공통화, 모델 호출만 모델별로 분기

문제

로컬 GPU 서버(ComfyUI·SDXL)에 동시 요청이 몰리면 VRAM 부족·처리 속도 저하 등 병목 발생

해결

인메모리 작업 큐로 로컬 모델 요청을 순차 처리(기본 동시성 1)하고 대기 순번을 실시간 안내, 대기열이 가득 차면 429로 백프레셔. GPU가 실질 병목이라 수평 확장의 이득이 없다고 판단해 단일 인스턴스를 전제로 의도적으로 단순화했고, 멀티 GPU·다중 인스턴스가 필요해지면 Redis 등 분산 큐로 전환할 수 있는 한계를 명시적으로 인지하고 내린 결정

문제

DALL·E·Imagen·Nano Banana 등 유료 API 모델은 무분별하게 호출되면 그대로 비용으로 이어짐

해결

서버 전역 요청 카운터로 유료 API 모델 호출 횟수를 제한(로컬 모델은 제외). 정식 계정 인증을 붙이기 전, 런칭 초기의 비용 보호용 임시 가드로 도입

문제

프롬프트 번역·카테고리 추천에 쓰는 로컬 LLM(Ollama Gemma 3 4B)은 AI 데스크톱이 켜져 있을 때만 동작하는데, 데스크톱을 24시간 켜두지 않아 꺼진 동안에는 기능이 멈춤

해결

LLM 호출을 provider 계층(llmService)으로 추상화하고, 어드민 페이지에서 Ollama ↔ Gemini 2.5 Flash Lite provider·모델·기능별(번역/분류) on·off를 런타임에 전환하도록 구성. 데스크톱을 끄는 동안에는 코드 수정·재배포 없이 어드민에서 Gemini로 전환해 운영

스크린샷

메인 피드
메인 피드
이미지 생성
이미지 생성
갤러리
갤러리
이미지 상세
이미지 상세
프로필
프로필
작성 댓글
작성 댓글
알림
알림

다른 서비스

TossMe토스로 바로 송금NemoDrop가입 없이 파일·메모 공유Terminal Shortcut Buttons커서·VS Code 터미널 버튼ClipBoard클립보드 히스토리 매니저