Skip to content

LMS Next.js + NestJS Monorepo is a microservices-based learning management system featuring an independent authentication service. Built with Next.js, NestJS, PostgreSQL, and Redis, the system offers seamless JWT authentication, social login, and scalable service architecture using Turborepo.

Notifications You must be signed in to change notification settings

flexyzwork/lms-next-nestjs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

37 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸŽ“ LMS Next.js + NestJS 톡합 ν”„λ‘œμ νŠΈ

λͺ¨λ…Έλ ˆν¬ 기반 μ—”ν„°ν”„λΌμ΄μ¦ˆ ν•™μŠ΅ 관리 μ‹œμŠ€ν…œ - Turbo λͺ¨λ…Έλ ˆν¬ μ•„ν‚€ν…μ²˜λ‘œ κ΅¬μΆ•λœ νƒ€μž… μ•ˆμ „ν•˜κ³  μ„±λŠ₯ μ΅œμ ν™”λœ LMS ν”Œλž«νΌ

πŸš€ ν”„λ‘œμ νŠΈ ν˜„ν™©

  • 개발 μ™„λ£Œλ„: μ‹€μ œ μ„œλΉ„μŠ€ 운영 κ°€λŠ₯ μˆ˜μ€€
  • μ„±λŠ₯ μ΅œμ ν™”: N+1 쿼리 ν•΄κ²°, Redis 캐싱, λ²ˆλ“€ μ΅œμ ν™” μ™„λ£Œ
  • μ½”λ“œ ν’ˆμ§ˆ: TypeScript 100%, 체계적 λͺ¨λ“ˆν™” μ™„λ£Œ
  • 운영 μ•ˆμ •μ„±: ν™˜κ²½λ³€μˆ˜ 기반 동적 μ„€μ •, μ„±λŠ₯ λͺ¨λ‹ˆν„°λ§ ꡬ좕

πŸ“Š μ£Όμš” μ„±κ³Ό μ§€ν‘œ

πŸš€ μ„±λŠ₯ κ°œμ„ 
β”œβ”€β”€ N+1 쿼리 β†’ 단일 쿼리 λ³€κ²½: 90% μ„±λŠ₯ κ°œμ„ 
β”œβ”€β”€ Redis 캐싱 적용: DB λΆ€ν•˜ 60% κ°μ†Œ
β”œβ”€β”€ λ²ˆλ“€ μ΅œμ ν™”: 초기 λ‘œλ”© μ‹œκ°„ 단좕
└── μ„±λŠ₯ λͺ¨λ‹ˆν„°λ§ API: μ‹€μ‹œκ°„ 좔적 κ°€λŠ₯

πŸ’Ž μ½”λ“œ ν’ˆμ§ˆ
β”œβ”€β”€ TypeScript 컀버리지: 100%
β”œβ”€β”€ μ½”λ“œ 쀑볡λ₯ : 15% β†’ 5% (67% κ°μ†Œ)
β”œβ”€β”€ λͺ¨λ“ˆν™”: 10개 νŒ¨ν‚€μ§€ + 3개 μ„œλΉ„μŠ€
└── ν™˜κ²½λ³€μˆ˜ μ™ΈλΆ€ν™”: ν•˜λ“œμ½”λ”© μ™„μ „ 제거

πŸ—οΈ μ•„ν‚€ν…μ²˜ ꡬ쑰

lms-next-nestjs/
β”œβ”€β”€ apps/
β”‚   β”œβ”€β”€ auth/          # NestJS 인증 μ„œλΉ„μŠ€ (포트: 4000)
β”‚   β”œβ”€β”€ api/           # NestJS API μ„œλ²„ (포트: 4001)
β”‚   └── web/           # Next.js μ›Ή μ•± (포트: 3000)
β”œβ”€β”€ packages/
β”‚   β”œβ”€β”€ auth/          # 곡톡 인증 μŠ€ν‚€λ§ˆ
β”‚   β”œβ”€β”€ common/        # 곡톡 미듀웨어, μœ ν‹Έλ¦¬ν‹°
β”‚   β”œβ”€β”€ config/        # ν™˜κ²½λ³€μˆ˜ 기반 동적 μ„€μ •
β”‚   β”œβ”€β”€ database/      # Prisma λ°μ΄ν„°λ² μ΄μŠ€ μ„€μ •
β”‚   └── schemas/       # Zod μŠ€ν‚€λ§ˆ 검증
└── docs/              # μ„±λŠ₯ μ΅œμ ν™” 및 νŠΈλŸ¬λΈ”μŠˆνŒ… κ°€μ΄λ“œ

⚑ 핡심 기술적 μ„±κ³Ό

🎯 N+1 쿼리 μ΅œμ ν™”

// 기쑴: N+1개 쿼리
const users = await findUsers();
for (const user of users) {
  const courses = await findCourses(user.id);
}

// μ΅œμ ν™”: 단일 쿼리
const enrolledCourses = await prisma.userCourseProgress.findMany({
  include: {
    course: {
      include: { sections: { include: { chapters: true } } }
    }
  }
});

πŸš€ Redis 캐싱 μ‹œμŠ€ν…œ

@Cacheable('user-courses:{userId}', 300)    // 5λΆ„ μΊμ‹œ
@Cacheable('course-stats:{courseId}', 600)  // 10λΆ„ μΊμ‹œ
@CacheEvict(['user-courses:{userId}'])      // μžλ™ λ¬΄νš¨ν™”

πŸ”§ ν™˜κ²½λ³€μˆ˜ 기반 동적 μ„€μ •

// λ³΄μ•ˆ 정책을 μ½”λ“œ μˆ˜μ • 없이 μ‘°μ • κ°€λŠ₯
maxLoginAttempts: parseInt(process.env.MAX_LOGIN_ATTEMPTS || '5', 10),
lockoutDuration: parseInt(process.env.LOCKOUT_DURATION_MINUTES || '15', 10),

πŸ› οΈ 기술 μŠ€νƒ

λ°±μ—”λ“œ

  • NestJS (λͺ¨λ“ˆν˜• μ•„ν‚€ν…μ²˜)
  • Prisma (νƒ€μž… μ•ˆμ „ν•œ ORM)
  • Redis (캐싱/μ„Έμ…˜ 관리)
  • PostgreSQL (λ°μ΄ν„°λ² μ΄μŠ€)

ν”„λ‘ νŠΈμ—”λ“œ

  • Next.js 15 (App Router)
  • TypeScript (100% νƒ€μž… μ•ˆμ „μ„±)
  • Tailwind CSS (μŠ€νƒ€μΌλ§)
  • Zod (μŠ€ν‚€λ§ˆ 검증)

개발 도ꡬ

  • Turbo (λͺ¨λ…Έλ ˆν¬ λΉŒλ“œ μ΅œμ ν™”)
  • Docker (μ»¨ν…Œμ΄λ„ˆν™”)
  • pnpm (νŒ¨ν‚€μ§€ 관리)

πŸš€ λΉ λ₯Έ μ‹œμž‘

1. ν™˜κ²½ μ„€μ •

# ν”„λ‘œμ νŠΈ 클둠 및 μ˜μ‘΄μ„± μ„€μΉ˜
git clone <repository-url>
cd lms-next-nestjs
pnpm install

# ν™˜κ²½ λ³€μˆ˜ μ„€μ •
cp .envs/.env.example .envs/.env.local
cp packages/database/.env.example packages/database/.env

2. λ°μ΄ν„°λ² μ΄μŠ€ μ΄ˆκΈ°ν™”

# λ°μ΄ν„°λ² μ΄μŠ€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜
pnpm db migrate dev --name init

# μ‹œλ“œ 데이터 생성 (선택사항)
pnpm db:seed

3. 개발 μ„œλ²„ μ‹€ν–‰

# λͺ¨λ“  μ„œλΉ„μŠ€ λ™μ‹œ μ‹€ν–‰
pnpm dev

# κ°œλ³„ μ„œλΉ„μŠ€ μ‹€ν–‰
pnpm dev:auth    # 인증 μ„œλΉ„μŠ€
pnpm dev:api     # API μ„œλ²„
pnpm dev:web     # μ›Ή μ•±

πŸ“‹ 핡심 κΈ°λŠ₯

πŸ” 인증 μ‹œμŠ€ν…œ

  • JWT 기반 Access/Refresh 토큰
  • μ†Œμ…œ 둜그인 (Google, GitHub)
  • 브루트포슀 곡격 λ°©μ§€
  • ν™˜κ²½λ³€μˆ˜ 기반 λ³΄μ•ˆ μ •μ±…

πŸ“š ν•™μŠ΅ 관리

  • κ°•μ˜ 생성/νŽΈμ§‘ μ‹œμŠ€ν…œ
  • μ‹€μ‹œκ°„ 진도 좔적
  • μ„Ήμ…˜/챕터 관리
  • 파일 μ—…λ‘œλ“œ μ΅œμ ν™”

πŸ‘¨β€πŸ« 관리 도ꡬ

  • μ„±λŠ₯ λͺ¨λ‹ˆν„°λ§ λŒ€μ‹œλ³΄λ“œ
  • μ‚¬μš©μž 배치 처리
  • 톡계 데이터 집계
  • μ‹œμŠ€ν…œ ν—¬μŠ€μ²΄ν¬

πŸ“Š μ„±λŠ₯ λͺ¨λ‹ˆν„°λ§

API μ—”λ“œν¬μΈνŠΈ

# μ‹€μ‹œκ°„ μ„±λŠ₯ λ©”νŠΈλ¦­ 확인
GET /api/v1/admin/performance/metrics

# μ‹œμŠ€ν…œ μƒνƒœ 확인
GET /api/v1/admin/performance/health

# 느린 μ—”λ“œν¬μΈνŠΈ 뢄석
GET /api/v1/admin/performance/slow-endpoints

# λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰ 좔이
GET /api/v1/admin/performance/memory-usage

μ‹€μ‹œκ°„ λͺ¨λ‹ˆν„°λ§ κΈ°λŠ₯

  • λͺ¨λ“  HTTP μš”μ²­ μžλ™ 좔적: 응닡 μ‹œκ°„, μƒνƒœμ½”λ“œ, URL
  • 느린 μš”μ²­ μžλ™ 감지: 1초 이상 μš”μ²­ μ‹€μ‹œκ°„ λ‘œκΉ…
  • λ©”λͺ¨λ¦¬ λͺ¨λ‹ˆν„°λ§: 30μ΄ˆλ§ˆλ‹€ μžλ™ 체크, μž„κ³„μΉ˜ 초과 μ‹œ κ²½κ³ 
  • μžλ™ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜: λ©”λͺ¨λ¦¬ μž„κ³„μΉ˜ 초과 μ‹œ μžλ™ μ‹€ν–‰

μ„±λŠ₯ λ‘œκΉ… ν™œμ„±ν™”

# 상세 μ„±λŠ₯ λ‘œκΉ… ν™œμ„±ν™”
LOG_PERFORMANCE=true pnpm dev:api

# λ©”λͺ¨λ¦¬ 디버깅 λ‘œκΉ… ν™œμ„±ν™”
LOG_MEMORY=true pnpm dev:api

πŸ§ͺ ν…ŒμŠ€νŠΈ 및 ν’ˆμ§ˆ 관리

# μ½”λ“œ ν’ˆμ§ˆ 검사
pnpm lint                # ESLint 검사
pnpm check-types         # TypeScript νƒ€μž… 체크
pnpm format              # Prettier ν¬λ§·νŒ…
pnpm test                # ν…ŒμŠ€νŠΈ μ‹€ν–‰

πŸ“¦ 배포

# ν”„λ‘œλ•μ…˜ λΉŒλ“œ
pnpm build

# Docker μ»¨ν…Œμ΄λ„ˆ λΉŒλ“œ
pnpm docker build

# κ°œλ³„ μ„œλΉ„μŠ€ 배포
pnpm --filter @apps/auth build
pnpm --filter @apps/api build
pnpm --filter @apps/web build

πŸ” νŠΈλŸ¬λΈ”μŠˆνŒ…

μ„±λŠ₯ 디버깅

# μ„±λŠ₯ λ‘œκΉ… ν™œμ„±ν™”
LOG_PERFORMANCE=true pnpm dev

# Redis μ—°κ²° 확인
redis-cli ping

# λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰ λͺ¨λ‹ˆν„°λ§
node --inspect apps/api/dist/main.js

개발 ν™˜κ²½ 이슈

  • 포트 좩돌: 각 μ„œλΉ„μŠ€λ³„ 포트 확인 (3000, 4000, 4001)
  • ν™˜κ²½λ³€μˆ˜: .env 파일 μ„€μ • 확인
  • λ°μ΄ν„°λ² μ΄μŠ€: PostgreSQL 및 Redis μ—°κ²° μƒνƒœ 확인

πŸ“ λΌμ΄μ„ΌμŠ€

MIT λΌμ΄μ„ΌμŠ€ ν•˜μ— λ°°ν¬λ©λ‹ˆλ‹€.


μ‹€μ œ 운영 κ°€λŠ₯ν•œ μˆ˜μ€€μ˜ μ—”ν„°ν”„λΌμ΄μ¦ˆκΈ‰ LMS μ‹œμŠ€ν…œ

βœ… νƒ€μž… μ•ˆμ „μ„± 확보 (TypeScript 100%) βœ… μ„±λŠ₯ μ΅œμ ν™” μ™„λ£Œ (N+1 ν•΄κ²°, 캐싱 적용) βœ… 운영 μ•ˆμ •μ„± ꡬ좕 (동적 μ„€μ •, λͺ¨λ‹ˆν„°λ§) βœ… ν™•μž₯ κ°€λŠ₯ν•œ μ•„ν‚€ν…μ²˜ (λͺ¨λ…Έλ ˆν¬, λͺ¨λ“ˆν™”)

About

LMS Next.js + NestJS Monorepo is a microservices-based learning management system featuring an independent authentication service. Built with Next.js, NestJS, PostgreSQL, and Redis, the system offers seamless JWT authentication, social login, and scalable service architecture using Turborepo.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published