Skip to content

redsunjin/LLDC

Repository files navigation

거짓말 연구소, 상상 클럽 (Lie Lab, Dream Club)

License Node TypeScript

"매우 잘 만들어진 거짓말은 종교의 경전과 같다." "A very well-crafted lie is like religious scripture."

AI 시대를 위한 상상의 이야기 아카이브 플랫폼. 생성형 AI로 만든 허구의 이야기들을 모아 공유하고, 그 그럴듯함과 창의성을 평가하는 한영 이중언어 웹 애플리케이션입니다.

✨ 주요 기능

  • 📚 AI 스토리 아카이브: 카테고리별(신화, 과학, 역사, 종교, 사회) 이야기 탐색
  • ✍️ 스토리 생성: 인증된 사용자가 새로운 이야기 작성
  • 3차원 평가 시스템: 그럴듯함, 창의성, 설득력 점수 평가
  • 👤 Replit SSO 인증: Google, Apple, GitHub, X, Email/Password 로그인
  • 🔒 Admin 시스템: 관리자 전용 콘텐츠 큐레이션 기능
  • 🌓 다크/라이트 모드: 사용자 테마 설정
  • 🌐 한영 이중언어: 완전한 다국어 지원

🛠 기술 스택

Frontend

  • React 18 + TypeScript
  • Vite - 빌드 도구
  • Wouter - 경량 라우팅
  • TanStack Query - 서버 상태 관리
  • shadcn/ui + Radix UI - UI 컴포넌트
  • Tailwind CSS - 스타일링

Backend

  • Express.js - REST API 서버
  • Drizzle ORM - 타입 안전 데이터베이스 ORM
  • Neon Database - PostgreSQL (서버리스)
  • Passport.js - Replit OpenID Connect 인증

🚀 시작하기

사전 요구사항

  • Node.js 20.x 이상
  • npm 또는 yarn
  • PostgreSQL (또는 Neon Database 계정)

설치

  1. 저장소 클론

    git clone <repository-url>
    cd LieLabDreamClub
  2. 의존성 설치

    npm install
  3. 환경 변수 설정

    cp .env.example .env

    .env 파일을 열어 다음 항목을 설정:

    # 필수 항목
    DATABASE_URL=postgresql://user:password@host:port/database
    SESSION_SECRET=your-session-secret-min-32-chars
    
    # Replit Auth (프로덕션 배포시 필요)
    REPL_ID=your-repl-id
    ISSUER_URL=https://replit.com/oidc
  4. 데이터베이스 스키마 동기화

    npm run db:push

개발 서버 실행

npm run dev

브라우저에서 http://localhost:5000 접속

📦 스크립트

명령어 설명
npm run dev 개발 서버 실행 (Vite + Express)
npm run build 프로덕션 빌드
npm run start 프로덕션 서버 실행
npm run check TypeScript 타입 체크
npm run db:push 데이터베이스 스키마 동기화

🗂 프로젝트 구조

LieLabDreamClub/
├── client/                 # React 프론트엔드
│   ├── src/
│   │   ├── components/    # UI 컴포넌트
│   │   │   ├── ui/        # shadcn/ui 기본 컴포넌트
│   │   │   ├── navigation.tsx
│   │   │   ├── footer.tsx
│   │   │   └── story-card.tsx
│   │   ├── pages/         # 페이지 컴포넌트
│   │   │   ├── home.tsx
│   │   │   ├── archive.tsx
│   │   │   ├── create-story.tsx
│   │   │   ├── story-detail.tsx
│   │   │   ├── stats.tsx
│   │   │   └── admin-explorer.tsx
│   │   ├── lib/           # 유틸리티 & Context
│   │   │   ├── theme-provider.tsx
│   │   │   ├── language-context.tsx
│   │   │   └── queryClient.ts
│   │   └── main.tsx
│   └── public/
├── server/                # Express 백엔드
│   ├── index.ts          # 서버 엔트리포인트
│   ├── routes.ts         # API 라우트
│   ├── storage.ts        # 데이터 저장소 인터페이스
│   ├── replitAuth.ts     # Replit SSO 인증
│   └── vite.ts           # Vite 개발 미들웨어
├── shared/               # 공유 타입 & 스키마
│   └── schema.ts         # Drizzle 스키마 + Zod 검증
├── design_guidelines.md  # 디자인 가이드라인
├── replit.md            # Replit 프로젝트 문서
└── package.json

🔑 주요 API 엔드포인트

인증

  • GET /api/auth/user - 현재 사용자 정보 조회
  • GET /api/login - Replit SSO 로그인
  • GET /api/logout - 로그아웃

스토리

  • GET /api/stories - 모든 스토리 조회 (공개)
  • GET /api/stories/:id - 단일 스토리 조회 (공개)
  • POST /api/stories - 스토리 생성 (인증 필요)
  • POST /api/stories/:id/rate - 스토리 평가 (인증 필요)

개발 전용

  • POST /api/dev/set-admin/:userId - Admin 권한 설정 (개발 환경만)

🎨 디자인 철학

"Dark Academic Archive meets Sacred Text Library"

  • 학술 아카이브의 권위와 경전의 신성함을 결합
  • Crimson Pro (세리프) + Inter (산세리프) 타이포그래피
  • 다크/라이트 테마로 깊이감 있는 독서 경험
  • 한영 이중언어로 문화적 맥락 존중

자세한 내용은 design_guidelines.md 참조

🗄 데이터베이스 스키마

users 테이블

{
  id: string (UUID)
  email: string | null
  firstName: string | null
  lastName: string | null
  profileImageUrl: string | null
  isAdmin: number (0=일반, 1=관리자)
  createdAt: Date
  updatedAt: Date
}

stories 테이블

{
  id: string (UUID)
  archiveNumber: number
  title: string
  content: string
  category: 'mythology' | 'science' | 'history' | 'religion' | 'society'
  imageUrl: string | null
  userId: string | null
  createdAt: Date
  plausibilityScore: number      // 그럴듯함 누적 점수
  creativityScore: number        // 창의성 누적 점수
  persuasivenessScore: number    // 설득력 누적 점수
  totalRatings: number           // 평가 횟수
}

🔐 로컬 개발시 인증 처리

로컬 환경에서 Replit Auth 없이 개발하려면:

  1. 메모리 스토리지 사용: DATABASE_URL 없이 실행하면 자동으로 in-memory 저장소 사용
  2. Admin 권한 설정:
    • 먼저 로그인 (또는 mock 사용자 생성)
    • POST /api/dev/set-admin/:userId 엔드포인트로 본인을 admin으로 설정

🚢 배포

Replit 배포

  1. Replit에서 프로젝트 import
  2. PostgreSQL addon 추가
  3. Environment secrets 설정 (REPL_ID, SESSION_SECRET)
  4. Deploy 버튼 클릭

기타 플랫폼

  1. npm run build로 빌드
  2. dist/ 폴더 배포
  3. 환경 변수 설정
  4. npm run start로 서버 실행

🤝 기여하기

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

📝 라이선스

MIT License - 자세한 내용은 LICENSE 파일 참조

📚 추가 문서

💡 프로젝트 배경

이 프로젝트는 Replit Agent를 통해 생성되었으며, AI 시대의 진실과 허구의 경계를 탐험하는 실험적 플랫폼입니다. 잘 만들어진 허구가 어떻게 문화적 경전이 될 수 있는지, 그리고 AI가 만든 이야기를 우리가 어떻게 평가하고 보존할 수 있는지를 질문합니다.


Made with ❤️ and 🤖 AI

About

거짓말 연구소, 상상 클럽 (Lie Lab, Dream Club)

Resources

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors