Skip to content

Latest commit

Β 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ“˜ LearningLM Frontend

AIλ₯Ό λ‹¨μˆœ μ§ˆλ¬ΈΒ·λ‹΅λ³€ λ„κ΅¬μ—μ„œ μ‹€μ œ μž‘μ—… 흐름을 μ„€κ³„ν•˜λŠ” λ„κ΅¬λ‘œ ν™•μž₯ν•˜λŠ” ν•™μŠ΅ ν”Œλž«νΌ

LearningLM은 μ΄ˆκΈ‰ μ‚¬μš©μžκ°€ μƒμ„±ν˜• AIλ₯Ό λ‹¨μˆœνžˆ β€œμ§ˆλ¬Έν•˜λ©΄ 닡변을 λ°›λŠ” μ±—λ΄‡β€μœΌλ‘œλ§Œ μ‚¬μš©ν•˜λŠ” λ‹¨κ³„μ—μ„œ λ²—μ–΄λ‚˜, μ‹€μ œ μž‘μ—… λͺ©μ μ— λ§žλŠ” AI ν™œμš© 흐름을 μ΄ν•΄ν•˜κ³  직접 μ‘°ν•©ν•΄ λ³Ό 수 μžˆλ„λ‘ λ•λŠ” ν•™μŠ΅ ν”Œλž«νΌμž…λ‹ˆλ‹€.

LearningLM은 μ‹€μ œ AI μžλ™ν™” μ‹€ν–‰ 도ꡬ가 μ•„λ‹ˆλΌ, μ‚¬μš©μžκ°€ AI ν™œμš© 방식을 ν•™μŠ΅ν•˜κ³ , νŠœν† λ¦¬μ–Όμ„ 따라가며, μžμ‹ λ§Œμ˜ μ›Œν¬ν”Œλ‘œμš°λ₯Ό ꡬ성해 λ³΄λŠ” ν”„λ‘ νŠΈμ—”λ“œ μ€‘μ‹¬μ˜ ν•™μŠ΅ μ„œλΉ„μŠ€μž…λ‹ˆλ‹€.


πŸš€ Deployment

ν˜„μž¬ LearningLM ν”„λ‘ νŠΈμ—”λ“œλŠ” Vercel에 λ°°ν¬λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

main λΈŒλžœμΉ˜μ— λ³€κ²½ 사항이 반영되면 Vercelμ—μ„œ ν”„λ‘œλ•μ…˜ 배포λ₯Ό μ§„ν–‰ν•©λ‹ˆλ‹€. Pull Request와 κΈ°λŠ₯ 개발 λΈŒλžœμΉ˜λŠ” Vercel Preview Deploymentλ₯Ό 톡해 병합 전에 μ‹€μ œ 화면을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.


πŸ’‘ Service Vision: "From Prompting to Workflow"

LearningLM은 AI μ‚¬μš© κ²½ν—˜μ΄ λΆ€μ‘±ν•œ μ΄ˆκΈ‰ μ‚¬μš©μžκ°€ ν”„λ‘¬ν”„νŠΈ μž…λ ₯μ—λ§Œ 머무λ₯΄μ§€ μ•Šκ³ , λͺ©μ μ— λ§žλŠ” AI ν™œμš© 흐름을 λ‹¨κ³„μ μœΌλ‘œ μ΄ν•΄ν•˜λ„λ‘ λ•λŠ” 것을 λͺ©ν‘œλ‘œ ν•©λ‹ˆλ‹€.

  • AI ν™œμš© 흐름 ν•™μŠ΅: λ‹¨μˆœ μ§ˆλ¬ΈΒ·λ‹΅λ³€μ„ λ„˜μ–΄ μž‘μ—… λͺ©μ μ— λ§žλŠ” AI μ‚¬μš© 단계λ₯Ό ν•™μŠ΅ν•©λ‹ˆλ‹€.
  • νŠœν† λ¦¬μ–Ό 기반 이해: 곡식 νŠœν† λ¦¬μ–Όμ„ 톡해 AI ν™œμš© 사둀와 ꡬ성 방식을 μ΅νž™λ‹ˆλ‹€.
  • μ›Œν¬ν”Œλ‘œμš° μ‘°ν•© κ²½ν—˜: Studioμ—μ„œ 직접 블둝과 단계λ₯Ό κ΅¬μ„±ν•˜λ©° AI ν™œμš© ꡬ쑰λ₯Ό μ²΄ν—˜ν•©λ‹ˆλ‹€.
  • μ €μž₯κ³Ό 곡유: μ™„μ„±ν•œ μ›Œν¬ν”Œλ‘œμš°λ₯Ό μ €μž₯ν•˜κ³ , λ‹€λ₯Έ μ‚¬μš©μžμ˜ μ˜ˆμ‹œλ₯Ό 탐색할 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ› οΈ Service Structure

LearningLM은 μ‚¬μš©μžκ°€ AI ν™œμš©λ²•μ„ 배우고, 직접 κ΅¬μ„±ν•˜κ³ , μ €μž₯ν•˜κ±°λ‚˜ κ³΅μœ ν•˜λŠ” 흐름을 μ€‘μ‹¬μœΌλ‘œ μ„€κ³„λ©λ‹ˆλ‹€.

1. Home

  • μ„œλΉ„μŠ€μ˜ 핡심 κ°€μΉ˜μ™€ μ£Όμš” κΈ°λŠ₯을 μ†Œκ°œν•©λ‹ˆλ‹€.
  • μ‚¬μš©μžκ°€ Official Tutorials, Studio, Public Library λ“± μ£Όμš” κΈ°λŠ₯으둜 μ§„μž…ν•  수 μžˆλ„λ‘ μ•ˆλ‚΄ν•©λ‹ˆλ‹€.

2. Official Tutorials

  • μ΄ˆκΈ‰ μ‚¬μš©μžλ₯Ό μœ„ν•œ 곡식 AI ν™œμš© νŠœν† λ¦¬μ–Ό λͺ©λ‘μ„ μ œκ³΅ν•©λ‹ˆλ‹€.
  • 검색, λ‚œμ΄λ„, μΉ΄ν…Œκ³ λ¦¬ ν•„ν„°λ₯Ό 톡해 μ›ν•˜λŠ” νŠœν† λ¦¬μ–Όμ„ νƒμƒ‰ν•©λ‹ˆλ‹€.
  • νŠœν† λ¦¬μ–Όμ„ 톡해 AIλ₯Ό ν™œμš©ν•˜λŠ” 흐름과 각 λ‹¨κ³„μ˜ 의미λ₯Ό ν•™μŠ΅ν•©λ‹ˆλ‹€.

3. Tutorial Detail / Tutorial Start

  • μ„ νƒν•œ νŠœν† λ¦¬μ–Όμ˜ λͺ©μ , ꡬ성 단계, μ˜ˆμƒ κ²°κ³Όλ₯Ό ν™•μΈν•©λ‹ˆλ‹€.
  • μ‚¬μš©μžλŠ” μ•ˆλ‚΄μ— 따라 단계별 AI ν™œμš© 흐름을 λ”°λΌκ°ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • νŠœν† λ¦¬μ–Ό μ‹œμž‘ μ‹œ Guided Studio둜 μ΄λ™ν•˜μ—¬ 미리 κ΅¬μ„±λœ 흐름을 ν•™μŠ΅ν•©λ‹ˆλ‹€.

4. Studio

  • μ‚¬μš©μžκ°€ 직접 AI ν™œμš© μ›Œν¬ν”Œλ‘œμš°λ₯Ό κ΅¬μ„±ν•˜λŠ” 핡심 μž‘μ—… κ³΅κ°„μž…λ‹ˆλ‹€.
  • Guided Studio와 Create Studio둜 κ΅¬λΆ„ν•˜μ—¬ μ΄ˆκΈ‰μžμ™€ 자유 μ œμž‘ μ‚¬μš©μžλ₯Ό λͺ¨λ‘ μ§€μ›ν•©λ‹ˆλ‹€.
  • μž…λ ₯, μ»¨ν…μŠ€νŠΈ, ν”„λ‘œμ„ΈμŠ€, κ²€ν† , κ²°κ³Ό λ…Έλ“œλ₯Ό μ‘°ν•©ν•˜μ—¬ ν•˜λ‚˜μ˜ μž‘μ—… 흐름을 λ§Œλ“­λ‹ˆλ‹€.
  • @xyflow/reactλ₯Ό ν™œμš©ν•˜μ—¬ λ…Έλ“œ 배치, μ—°κ²°, 이동이 κ°€λŠ₯ν•œ μ›Œν¬ν”Œλ‘œμš° νŽΈμ§‘ 화면을 κ΅¬μ„±ν•©λ‹ˆλ‹€.

5. Preview / Validation

  • μ‚¬μš©μžκ°€ κ΅¬μ„±ν•œ μ›Œν¬ν”Œλ‘œμš°μ˜ 흐름을 미리 ν™•μΈν•©λ‹ˆλ‹€.
  • ν•„μˆ˜ 블둝과 슬둯이 λͺ¨λ‘ μ±„μ›Œμ‘ŒλŠ”μ§€ κ²€μ¦ν•©λ‹ˆλ‹€.
  • ꡬ성 단계가 λ…Όλ¦¬μ μœΌλ‘œ μ΄μ–΄μ§€λŠ”μ§€ ν™•μΈν•˜κ³  μ˜ˆμ‹œ κ²°κ³Όλ₯Ό μ‚΄νŽ΄λ΄…λ‹ˆλ‹€.
  • 검증 κ²°κ³ΌλŠ” PASS, INSUFFICIENT, PENDING λ“±μ˜ μƒνƒœλ‘œ ν‘œν˜„ν•  수 μžˆλ„λ‘ μ„€κ³„ν•©λ‹ˆλ‹€.

6. My Storage

  • μ‚¬μš©μžκ°€ μ €μž₯ν•œ νŠœν† λ¦¬μ–Όκ³Ό μ›Œν¬ν”Œλ‘œμš°λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€.
  • 이전에 λ§Œλ“  흐름을 λ‹€μ‹œ ν™•μΈν•˜κ±°λ‚˜ μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 직접 λ§Œλ“  흐름과 Public Libraryμ—μ„œ λ³΅μ‚¬ν•œ 흐름을 κ΅¬λΆ„ν•˜μ—¬ κ΄€λ¦¬ν•©λ‹ˆλ‹€.

7. Public Library

  • λ‹€λ₯Έ μ‚¬μš©μžκ°€ κ³΅μœ ν•œ μ›Œν¬ν”Œλ‘œμš°λ₯Ό νƒμƒ‰ν•©λ‹ˆλ‹€.
  • 검색, μΉ΄ν…Œκ³ λ¦¬, λ‚œμ΄λ„ ν•„ν„°λ₯Ό 톡해 λ‹€μ–‘ν•œ ν™œμš© 사둀λ₯Ό ν™•μΈν•©λ‹ˆλ‹€.
  • 곡개 μ›Œν¬ν”Œλ‘œμš°λ₯Ό μžμ‹ μ˜ μ €μž₯μ†Œλ‘œ λ³΅μ‚¬ν•œ λ’€ Studioμ—μ„œ μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

8. Auth

  • Google OAuth 둜그인과 이메일 기반 인증 화면을 μ œκ³΅ν•©λ‹ˆλ‹€.
  • 둜그인, νšŒμ›κ°€μž…, λΉ„λ°€λ²ˆν˜Έ μ°ΎκΈ°, 인증 μ„±κ³΅Β·μ‹€νŒ¨ 화면을 ν¬ν•¨ν•©λ‹ˆλ‹€.
  • μ €μž₯, 곡유, 개인 μ›Œν¬ν”Œλ‘œμš° 관리 κΈ°λŠ₯κ³Ό μ—°κ²°λ©λ‹ˆλ‹€.

✨ Implementation Highlights

LearningLM ν”„λ‘ νŠΈμ—”λ“œλŠ” μ‚¬μš©μžκ°€ AI ν™œμš© 흐름을 μžμ—°μŠ€λŸ½κ²Œ 이해할 수 μžˆλ„λ‘ ν™”λ©΄ 흐름, μƒνƒœ 관리, 단계별 μΈν„°λž™μ…˜μ— μ§‘μ€‘ν•©λ‹ˆλ‹€.

  • Learning Flow 쀑심 섀계: νŠœν† λ¦¬μ–Ό 탐색뢀터 Studio μ œμž‘, Preview, μ €μž₯κΉŒμ§€ μ΄μ–΄μ§€λŠ” ν•™μŠ΅ 흐름을 μ œκ³΅ν•©λ‹ˆλ‹€.
  • State-Driven UI: μ‚¬μš©μžκ°€ μ„ νƒν•œ νŠœν† λ¦¬μ–Ό, 블둝, μ›Œν¬ν”Œλ‘œμš° 단계에 따라 ν™”λ©΄ μƒνƒœκ°€ λ™μ μœΌλ‘œ λ³€κ²½λ©λ‹ˆλ‹€.
  • Node-Based Workflow Editor: @xyflow/reactλ₯Ό μ‚¬μš©ν•˜μ—¬ 블둝과 λ…Έλ“œλ₯Ό μ‹œκ°μ μœΌλ‘œ λ°°μΉ˜ν•˜κ³  μ—°κ²°ν•˜λŠ” Studioλ₯Ό κ΅¬ν˜„ν•©λ‹ˆλ‹€.
  • Workflow Preview: μ‚¬μš©μžκ°€ κ΅¬μ„±ν•œ AI ν™œμš© 흐름을 미리 ν™•μΈν•˜κ³  κ²€ν† ν•  수 μžˆλ„λ‘ μ„€κ³„ν•©λ‹ˆλ‹€.
  • Reusable Components: λ²„νŠΌ, μΉ΄λ“œ, λ°°μ§€, μž…λ ₯ 폼, 선택 μ»΄ν¬λ„ŒνŠΈ λ“± λ°˜λ³΅λ˜λŠ” UIλ₯Ό 곡용 μ»΄ν¬λ„ŒνŠΈλ‘œ λΆ„λ¦¬ν•©λ‹ˆλ‹€.
  • Accessible UI Foundation: Base UI와 곡톡 UI μ»΄ν¬λ„ŒνŠΈλ₯Ό ν™œμš©ν•˜μ—¬ ν‚€λ³΄λ“œ μ‘°μž‘κ³Ό μƒνƒœ ν‘œν˜„μ„ κ³ λ €ν•©λ‹ˆλ‹€.
  • Feature-based Architecture: κΈ°λŠ₯ λ‹¨μœ„λ‘œ 폴더λ₯Ό λΆ„λ¦¬ν•˜μ—¬ μœ μ§€λ³΄μˆ˜μ„±κ³Ό ν˜‘μ—… νš¨μœ¨μ„ λ†’μž…λ‹ˆλ‹€.
  • Utility-based Styling: Tailwind CSS와 CVAλ₯Ό ν™œμš©ν•˜μ—¬ μ»΄ν¬λ„ŒνŠΈμ˜ 크기와 μƒνƒœλ³„ μŠ€νƒ€μΌμ„ κ΄€λ¦¬ν•©λ‹ˆλ‹€.
  • SPA Routing: React Router DOM을 기반으둜 Home, Tutorial, Studio, Storage, Library, Auth 화면을 μ—°κ²°ν•©λ‹ˆλ‹€.

πŸ“” LearningLM의 ν”„λ‘ νŠΈμ—”λ“œ μ €μž₯μ†Œμž…λ‹ˆλ‹€

React, TypeScript, Viteλ₯Ό 기반으둜 ν•˜λ©°, μœ μ§€λ³΄μˆ˜μ„±μ„ μœ„ν•΄ κΈ°λŠ₯ λ‹¨μœ„ Feature-based Architectureλ₯Ό λ”°λ¦…λ‹ˆλ‹€.


πŸ›  Tech Stack

λΆ„λ₯˜ 기술 λΉ„κ³ 
Core React, TypeScript UI ꡬ성 및 정적 νƒ€μž… 검사
Build Vite 개발 μ„œλ²„ 및 ν”„λ‘œλ•μ…˜ λΉŒλ“œ
Routing React Router DOM SPA λΌμš°νŒ… 및 동적 경둜 관리
Workflow Editor @xyflow/react Studio λ…Έλ“œ 배치, μ—°κ²°, 이동
Server State TanStack Query API 데이터 쑰회, 캐싱, 동기화
Client State Zustand Studio와 인증 κ΄€λ ¨ μ „μ—­ μƒνƒœ 관리
Network Axios HTTP 비동기 톡신
Style Tailwind CSS μœ ν‹Έλ¦¬ν‹° 기반 μŠ€νƒ€μΌλ§
UI Foundation Base UI, shadcn 접근성을 κ³ λ €ν•œ UI 기반 μ»΄ν¬λ„ŒνŠΈ
Animation tw-animate-css UI μ „ν™˜ 및 μ• λ‹ˆλ©”μ΄μ…˜ μœ ν‹Έλ¦¬ν‹°
Variant Styling class-variance-authority μ»΄ν¬λ„ŒνŠΈ μƒνƒœμ™€ 크기별 μŠ€νƒ€μΌ 관리
Class Utilities clsx, tailwind-merge 쑰건뢀 클래슀 및 Tailwind 클래슀 병합
Icons lucide-react, react-icons 곡톡 μ•„μ΄μ½˜ 및 λΈŒλžœλ“œ μ•„μ΄μ½˜
Font Geist Variable μ „μ—­ κΈ°λ³Έ 폰트
Package Manager npm νŒ¨ν‚€μ§€ 및 잠금 파일 관리
Quality ESLint, TypeScript μ½”λ“œ ν’ˆμ§ˆ 및 νƒ€μž… 였λ₯˜ 검사
Deploy Vercel ν”„λ‘œλ•μ…˜ 및 Preview Deployment

πŸ“¦ Main Libraries

@xyflow/react

Studio의 λ…Έλ“œ 기반 μ›Œν¬ν”Œλ‘œμš° νŽΈμ§‘ 화면을 κ΅¬μ„±ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•©λ‹ˆλ‹€.

μ£Όμš” μ‚¬μš© λͺ©μ :

  • μ›Œν¬ν”Œλ‘œμš° λ…Έλ“œ λ Œλ”λ§
  • λ…Έλ“œ κ°„ μ—°κ²°μ„  ν‘œν˜„
  • λ…Έλ“œ λ“œλž˜κ·Έ 및 μœ„μΉ˜ λ³€κ²½
  • μΊ”λ²„μŠ€ 이동과 ν™•λŒ€Β·μΆ•μ†Œ
  • μž…λ ₯, μ»¨ν…μŠ€νŠΈ, ν”„λ‘œμ„ΈμŠ€, κ²€ν† , κ²°κ³Ό λ…Έλ“œ μ—°κ²°
  • μ„ νƒν•œ λ…Έλ“œμ™€ Inspector μƒνƒœ 연동
import { ReactFlow } from '@xyflow/react'
import '@xyflow/react/dist/style.css'

TanStack Query

μ„œλ²„μ—μ„œ μ „λ‹¬λ°›λŠ” νŠœν† λ¦¬μ–Ό, μ›Œν¬ν”Œλ‘œμš°, Public Library 데이터λ₯Ό κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•©λ‹ˆλ‹€.

import {
  QueryClient,
  QueryClientProvider,
} from '@tanstack/react-query'

const queryClient = new QueryClient()

μ£Όμš” μ‚¬μš© λŒ€μƒ:

  • νŠœν† λ¦¬μ–Ό λͺ©λ‘ 및 상세 쑰회
  • μ›Œν¬ν”Œλ‘œμš° μ €μž₯ 및 μˆ˜μ •
  • Public Library 쑰회
  • μ‚¬μš©μž μ €μž₯μ†Œ 쑰회
  • μ„œλ²„ 데이터 캐싱과 μž¬μš”μ²­

Zustand

Studio의 λ…Έλ“œ, 블둝, 선택 μƒνƒœ λ“± ν΄λΌμ΄μ–ΈνŠΈ 쀑심 μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•©λ‹ˆλ‹€.

μ£Όμš” 관리 λŒ€μƒ:

  • ν˜„μž¬ μ„ νƒν•œ λ…Έλ“œ
  • Studio λͺ¨λ“œ
  • λ…Έλ“œμ™€ μ—°κ²°μ„  λͺ©λ‘
  • μ›Œν¬ν”Œλ‘œμš° 제λͺ© 및 μ„€λͺ…
  • ν•„μˆ˜ 슬둯 μž…λ ₯ μƒνƒœ
  • 검증 및 μ €μž₯ μƒνƒœ
  • 둜그인 μ‚¬μš©μž μƒνƒœ

Base UI / shadcn

Button, Slider λ“± 곡용 UI의 기반으둜 μ‚¬μš©ν•©λ‹ˆλ‹€.

직접 μž‘μ„±ν•œ LearningLM λ””μžμΈ μ‹œμŠ€ν…œκ³Ό κ²°ν•©ν•˜μ—¬ μž¬μ‚¬μš© κ°€λŠ₯ν•œ 곡용 μ»΄ν¬λ„ŒνŠΈλ₯Ό κ΅¬μ„±ν•©λ‹ˆλ‹€.

class-variance-authority

λ²„νŠΌ, λ°°μ§€, μƒνƒœ μ»΄ν¬λ„ŒνŠΈμ˜ variant와 size μŠ€νƒ€μΌμ„ κ΄€λ¦¬ν•©λ‹ˆλ‹€.

const buttonVariants = cva(
  'inline-flex items-center justify-center',
  {
    variants: {
      variant: {
        default: 'bg-primary text-white',
        secondary: 'bg-secondary',
      },
      size: {
        sm: 'h-8 px-3',
        lg: 'h-11 px-6',
      },
    },
  },
)

Getting Started

이 ν”„λ‘œμ νŠΈλŠ” Node.js v20 LTS 이상 ν™˜κ²½μ„ ꢌμž₯ν•©λ‹ˆλ‹€.

node -v
npm -v

1. ν”„λ‘œμ νŠΈ 클둠

git clone https://github.com/UMCLearningLM/UMCLearningLM_FE.git
cd UMCLearningLM_FE

2. νŒ¨ν‚€μ§€ μ„€μΉ˜

npm install

νŒ€μ›λ“€κ³Ό package-lock.json에 기둝된 λ™μΌν•œ νŒ¨ν‚€μ§€ 버전을 μ„€μΉ˜ν•˜λ €λ©΄ μ•„λž˜ λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

npm ci

일반적으둜 μƒˆ νŒ¨ν‚€μ§€λ₯Ό μΆ”κ°€ν•˜μ§€ μ•Šκ³  ν”„λ‘œμ νŠΈλ₯Ό μ‹€ν–‰ν•˜κ±°λ‚˜ CI ν™˜κ²½μ—μ„œ μ„€μΉ˜ν•  λ•ŒλŠ” npm ci μ‚¬μš©μ„ ꢌμž₯ν•©λ‹ˆλ‹€.

3. ν™˜κ²½ λ³€μˆ˜ μ„€μ •

루트 디렉토리에 .env νŒŒμΌμ„ μƒμ„±ν•˜κ³  ν•„μš”ν•œ ν™˜κ²½ λ³€μˆ˜λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.

VITE_API_BASE_URL=http://localhost:8080/api

Viteμ—μ„œ λΈŒλΌμš°μ € μ½”λ“œμ— λ…ΈμΆœν•  ν™˜κ²½ λ³€μˆ˜λŠ” λ°˜λ“œμ‹œ VITE_ 접두사λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

ν™˜κ²½ λ³€μˆ˜ μ‚¬μš© μ˜ˆμ‹œ:

const apiBaseUrl = import.meta.env.VITE_API_BASE_URL

.env νŒŒμΌμ—λŠ” μ„œλ²„ μ£Όμ†Œλ‚˜ 개인 개발 ν™˜κ²½ 섀정이 포함될 수 μžˆμœΌλ―€λ‘œ Git에 μ»€λ°‹ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

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

npm run dev

λΈŒλΌμš°μ €μ—μ„œ μ•„λž˜ μ£Όμ†Œλ‘œ μ ‘μ†ν•©λ‹ˆλ‹€.

http://localhost:5173

5. ν”„λ‘œλ•μ…˜ λΉŒλ“œ 확인

npm run build

ν˜„μž¬ λΉŒλ“œ λͺ…령은 TypeScript ν”„λ‘œμ νŠΈ 검사와 Vite λΉŒλ“œλ₯Ό ν•¨κ»˜ μ‹€ν–‰ν•©λ‹ˆλ‹€.

{
  "build": "tsc -b && vite build"
}

λΉŒλ“œ κ²°κ³ΌλŠ” dist 디렉토리에 μƒμ„±λ©λ‹ˆλ‹€.

6. ν”„λ‘œλ•μ…˜ λΉŒλ“œ 둜컬 확인

npm run preview

πŸ“‚ Project Structure

LearningLM은 κΈ°λŠ₯ 쀑심 μ•„ν‚€ν…μ²˜λ₯Ό 기반으둜 ν•©λ‹ˆλ‹€. ν™”λ©΄, μ»΄ν¬λ„ŒνŠΈ, ν›…, API λ‘œμ§μ„ κΈ°λŠ₯ λ‹¨μœ„λ‘œ λͺ¨μ•„ κ΄€λ¦¬ν•©λ‹ˆλ‹€.

src/
β”œβ”€β”€ assets/                  # 이미지, μ•„μ΄μ½˜, 폰트 λ“± 정적 λ¦¬μ†ŒμŠ€
β”‚
β”œβ”€β”€ components/              # μ „μ—­ 곡용 UI μ»΄ν¬λ„ŒνŠΈ
β”‚   β”œβ”€β”€ layout/              # Header, Footer, PageContainer, Section
β”‚   └── ui/                  # Button, Input, Select, Card, Badge λ“±
β”‚
β”œβ”€β”€ api/                     # κΈ°λŠ₯별 API μš”μ²­ ν•¨μˆ˜ 및 νƒ€μž…
β”‚   β”œβ”€β”€ auth/                # 둜그인, νšŒμ›κ°€μž… API
β”‚   β”œβ”€β”€ tutorial/            # νŠœν† λ¦¬μ–Ό κ΄€λ ¨ API
β”‚   β”œβ”€β”€ workflow/            # μ›Œν¬ν”Œλ‘œμš° 생성, μ €μž₯, 쑰회 API
β”‚   └── library/             # Public Library κ΄€λ ¨ API
β”‚
β”œβ”€β”€ features/                # 핡심 도메인별 κΈ°λŠ₯ λͺ¨μŒ
β”‚   β”œβ”€β”€ auth/
β”‚   β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”œβ”€β”€ hooks/
β”‚   β”‚   └── utils/
β”‚   β”‚
β”‚   β”œβ”€β”€ home/
β”‚   β”‚   β”œβ”€β”€ components/
β”‚   β”‚   └── hooks/
β”‚   β”‚
β”‚   β”œβ”€β”€ tutorial/
β”‚   β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”œβ”€β”€ data/
β”‚   β”‚   β”œβ”€β”€ hooks/
β”‚   β”‚   └── utils/
β”‚   β”‚
β”‚   β”œβ”€β”€ studio/
β”‚   β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”‚   β”œβ”€β”€ node/        # Studio 곡톡 λ…Έλ“œ UI
β”‚   β”‚   β”‚   β”œβ”€β”€ block/       # λ…Έλ“œλ³„ 블둝 μ„€μ • UI
β”‚   β”‚   β”‚   β”œβ”€β”€ editor/      # Studio νŽΈμ§‘ μ˜μ—­
β”‚   β”‚   β”‚   └── preview/     # Preview κ΄€λ ¨ UI
β”‚   β”‚   β”œβ”€β”€ hooks/
β”‚   β”‚   β”œβ”€β”€ types/
β”‚   β”‚   └── utils/
β”‚   β”‚
β”‚   β”œβ”€β”€ storage/
β”‚   β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”œβ”€β”€ data/
β”‚   β”‚   β”œβ”€β”€ hooks/
β”‚   β”‚   └── utils/
β”‚   β”‚
β”‚   β”œβ”€β”€ library/
β”‚   β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”œβ”€β”€ data/
β”‚   β”‚   β”œβ”€β”€ hooks/
β”‚   β”‚   └── utils/
β”‚   β”‚
β”‚   └── user/
β”‚       β”œβ”€β”€ components/
β”‚       β”œβ”€β”€ hooks/
β”‚       └── utils/
β”‚
β”œβ”€β”€ pages/                   # 라우트 νŽ˜μ΄μ§€, features 쑰립
β”‚   β”œβ”€β”€ auth/
β”‚   β”‚   β”œβ”€β”€ Login.tsx
β”‚   β”‚   β”œβ”€β”€ GoogleLogin.tsx
β”‚   β”‚   β”œβ”€β”€ GoogleLoginSuccess.tsx
β”‚   β”‚   └── GoogleLoginError.tsx
β”‚   β”‚
β”‚   β”œβ”€β”€ home/
β”‚   β”‚   └── HomePage.tsx
β”‚   β”‚
β”‚   β”œβ”€β”€ tutorial/
β”‚   β”‚   β”œβ”€β”€ OfficialTutorialPage.tsx
β”‚   β”‚   └── TutorialDetailPage.tsx
β”‚   β”‚
β”‚   β”œβ”€β”€ studio/
β”‚   β”‚   β”œβ”€β”€ StudioPage.tsx
β”‚   β”‚   β”œβ”€β”€ GuidedStudioPage.tsx
β”‚   β”‚   └── CreateStudioPage.tsx
β”‚   β”‚
β”‚   β”œβ”€β”€ storage/
β”‚   β”‚   β”œβ”€β”€ MyStoragePage.tsx
β”‚   β”‚   └── WorkflowDetailPage.tsx
β”‚   β”‚
β”‚   β”œβ”€β”€ library/
β”‚   β”‚   β”œβ”€β”€ PublicLibraryPage.tsx
β”‚   β”‚   └── LibraryDetailPage.tsx
β”‚   β”‚
β”‚   └── dev/                 # 곡톡 μ»΄ν¬λ„ŒνŠΈ 및 Studio λ…Έλ“œ ν…ŒμŠ€νŠΈ
β”‚
β”œβ”€β”€ routes/
β”‚   └── router.tsx
β”‚
β”œβ”€β”€ services/
β”‚   └── axiosInstance.ts
β”‚
β”œβ”€β”€ store/
β”‚   β”œβ”€β”€ authStore.ts
β”‚   └── workflowStore.ts
β”‚
β”œβ”€β”€ types/
β”‚   β”œβ”€β”€ auth.ts
β”‚   β”œβ”€β”€ tutorial.ts
β”‚   └── workflow.ts
β”‚
β”œβ”€β”€ lib/
β”‚   └── utils.ts             # cn λ“± UI 곡용 μœ ν‹Έλ¦¬ν‹°
β”‚
β”œβ”€β”€ utils/
β”‚
β”œβ”€β”€ App.tsx
β”œβ”€β”€ main.tsx
└── index.css

개발 원칙

  1. Colocation: νŠΉμ • κΈ°λŠ₯μ—μ„œλ§Œ μ“°μ΄λŠ” μ»΄ν¬λ„ŒνŠΈλŠ” features/κΈ°λŠ₯λͺ…/components μ•ˆμ— λ‘‘λ‹ˆλ‹€.
  2. Barrel Exports: index.tsλ₯Ό ν™œμš©ν•˜μ—¬ import 경둜λ₯Ό μ •λ¦¬ν•©λ‹ˆλ‹€.
  3. Absolute Import: ../../ λŒ€μ‹  @/features/user와 같은 μ ˆλŒ€ 경둜λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
  4. Feature First: νŽ˜μ΄μ§€λŠ” κΈ°λŠ₯ μ»΄ν¬λ„ŒνŠΈλ₯Ό μ‘°λ¦½ν•˜κ³ , μ‹€μ œ UI와 λ‘œμ§μ€ features λ‚΄λΆ€μ—μ„œ κ΄€λ¦¬ν•©λ‹ˆλ‹€.
  5. Page Responsibility: pagesλŠ” λΌμš°νŒ… νŒŒλΌλ―Έν„°μ™€ κΈ°λŠ₯ 쑰립을 λ‹΄λ‹Ήν•˜κ³  λ³΅μž‘ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ 직접 ν¬ν•¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  6. Server / Client State Separation: API λ°μ΄ν„°λŠ” TanStack Query, νŽΈμ§‘ 쀑인 UI μƒνƒœλŠ” Zustand λ˜λŠ” μ§€μ—­ μƒνƒœλ‘œ κ΄€λ¦¬ν•©λ‹ˆλ‹€.

🧭 Screen List & Flow

μ£Όμš” ν™”λ©΄ λͺ©λ‘

ꡬ뢄 ν™”λ©΄ μ„€λͺ…
Home Home μ„œλΉ„μŠ€ μ†Œκ°œ 및 μ£Όμš” κΈ°λŠ₯ μ§„μž…
Tutorial Official Tutorials 곡식 νŠœν† λ¦¬μ–Ό λͺ©λ‘
Tutorial Tutorial Detail νŠœν† λ¦¬μ–Ό 상세 정보
Tutorial Tutorial Start νŠœν† λ¦¬μ–Ό 단계별 μ§„ν–‰
Studio Studio μ›Œν¬ν”Œλ‘œμš° μ œμž‘ 메인 ν™”λ©΄
Studio Guided Studio μ•ˆλ‚΄ 기반 μ›Œν¬ν”Œλ‘œμš° μ œμž‘
Studio Create Studio 자유 μ œμž‘ μ›Œν¬ν”Œλ‘œμš° νŽΈμ§‘
Studio Preview μ œμž‘ν•œ 흐름 미리보기
Storage My Storage μ €μž₯ν•œ νŠœν† λ¦¬μ–Ό 및 μ›Œν¬ν”Œλ‘œμš° λͺ©λ‘
Storage Workflow Detail μ €μž₯된 μ›Œν¬ν”Œλ‘œμš° 상세
Library Public Library 곡개 μ›Œν¬ν”Œλ‘œμš° 탐색
Library Library Detail 곡개 μ›Œν¬ν”Œλ‘œμš° 상세
Auth Login 둜그인
Auth Signup νšŒμ›κ°€μž…
Auth Password Find λΉ„λ°€λ²ˆν˜Έ μ°ΎκΈ°
Auth OAuth Result Google 둜그인 성곡 및 μ‹€νŒ¨ 처리

κΈ°λ³Έ μ‚¬μš©μž 흐름

Home
 β”œβ”€β”€ Official Tutorials
 β”‚    └── Tutorial Detail
 β”‚         └── Tutorial Start
 β”‚              └── Guided Studio
 β”‚                   └── Validation / Preview
 β”‚                        └── My Storage
 β”‚
 β”œβ”€β”€ Create Studio
 β”‚    └── Validation / Preview
 β”‚         └── My Storage
 β”‚
 └── Public Library
      └── Library Detail
           └── Copy Workflow
                └── Studio
                     └── My Storage

🌐 Routing

LearningLM은 createBrowserRouter와 RouterProviderλ₯Ό μ‚¬μš©ν•˜μ—¬ SPA λΌμš°νŒ…μ„ κ΅¬μ„±ν•©λ‹ˆλ‹€.

import { RouterProvider } from 'react-router-dom'

import { router } from './routes/router'

function App() {
  return <RouterProvider router={router} />
}

export default App

μ£Όμš” 경둜 μ˜ˆμ‹œ:

/
β”œβ”€β”€ official-tutorials
β”‚   └── :tutorialId
β”œβ”€β”€ studio
β”‚   └── :workflowId/edit
β”œβ”€β”€ my-storage
β”‚   └── workflows/:workflowId
β”œβ”€β”€ public-library
β”‚   └── :libraryId
β”œβ”€β”€ login
β”œβ”€β”€ register
└── pw-find

λͺ¨λ“  μ•± λΌμš°νŒ…μ€ src/routes/router.tsxμ—μ„œ κ΄€λ¦¬ν•©λ‹ˆλ‹€. μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ—μ„œ λ³„λ„μ˜ BrowserRouterλ₯Ό μƒμ„±ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.


🌿 Branch Strategy

기본 브랜치

  • main: 배포 κ°€λŠ₯ν•œ μ•ˆμ • 버전
  • dev: 개발 톡합 브랜치
  • feature/*: κΈ°λŠ₯ 개발 브랜치

브랜치 λͺ…λͺ… κ·œμΉ™

νƒ€μž…/κΈ°λŠ₯λͺ…_μž‘μ„±μž
νƒ€μž… μ„€λͺ… μ˜ˆμ‹œ
feat μƒˆλ‘œμš΄ κΈ°λŠ₯ μΆ”κ°€ feat/login_seongmin
fix 버그 μˆ˜μ • fix/studio-preview_seongmin
design μŠ€νƒ€μΌ 및 UI μˆ˜μ • design/home-layout_seongmin
refactor μ½”λ“œ ꡬ쑰 κ°œμ„  refactor/workflow-store_seongmin
docs λ¬Έμ„œ μˆ˜μ • docs/readme_seongmin

Commit Convention

컀밋 λ©”μ‹œμ§€λŠ” Conventional Commits κ·œμΉ™μ„ λ”°λ¦…λ‹ˆλ‹€.

feat: 둜그인 νŽ˜μ΄μ§€ κ΅¬ν˜„
fix: Studio Preview λ Œλ”λ§ 였λ₯˜ μˆ˜μ •
design: Home CTA λ²„νŠΌ μŠ€νƒ€μΌ μˆ˜μ •
refactor: workflow store ꡬ쑰 뢄리
docs: README 배포 정보 μΆ”κ°€

Code Quality

PR을 올리기 μ „ μ•„λž˜ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜μ—¬ νƒ€μž… 였λ₯˜, λΉŒλ“œ 였λ₯˜, 린트 였λ₯˜λ₯Ό ν™•μΈν•©λ‹ˆλ‹€.

npm run build
npm run lint

ν˜„μž¬ npm run buildμ—λŠ” TypeScript 검사가 ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

tsc -b && vite build

λ”°λΌμ„œ λ³„λ„μ˜ type-check 슀크립트λ₯Ό μΆ”κ°€ν•˜μ§€ μ•Šμ€ μƒνƒœμ—μ„œλŠ” npm run build둜 νƒ€μž… 검사와 λΉŒλ“œλ₯Ό ν•¨κ»˜ ν™•μΈν•©λ‹ˆλ‹€.


β–² Vercel Deployment

Production Deployment

LearningLM은 Vercelμ—μ„œ main 브랜치λ₯Ό κΈ°μ€€μœΌλ‘œ ν”„λ‘œλ•μ…˜ 배포λ₯Ό μ§„ν–‰ν•©λ‹ˆλ‹€.

main push
β†’ Vercel Build
β†’ TypeScript Check
β†’ Vite Production Build
β†’ dist 배포

ν˜„μž¬ ν”„λ‘œλ•μ…˜ μ£Όμ†Œ:

https://umc-learning-lm-fe.vercel.app

Preview Deployment

Pull Request λ˜λŠ” κΈ°λŠ₯ 브랜치λ₯Ό 원격 μ €μž₯μ†Œμ— Pushν•˜λ©΄ Vercel Preview Deploymentλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Preview Deploymentλ₯Ό 톡해 λ‹€μŒ λ‚΄μš©μ„ 병합 전에 ν™•μΈν•©λ‹ˆλ‹€.

  • νŽ˜μ΄μ§€ λΌμš°νŒ…
  • λ°˜μ‘ν˜• λ ˆμ΄μ•„μ›ƒ
  • ν™˜κ²½ λ³€μˆ˜ μ—°κ²°
  • API 호좜 μ£Όμ†Œ
  • Studio μΊ”λ²„μŠ€ λ Œλ”λ§
  • Public Library와 Storage ν™”λ©΄
  • 직접 URL μ ‘κ·Όκ³Ό μƒˆλ‘œκ³ μΉ¨

Vercel ν”„λ‘œμ νŠΈ μ„€μ •

Vercel ν”„λ‘œμ νŠΈμ—μ„œ λ‹€μŒ 값을 μ‚¬μš©ν•©λ‹ˆλ‹€.

ν•­λͺ© κ°’
Framework Preset Vite
Install Command npm ci λ˜λŠ” npm install
Build Command npm run build
Output Directory dist
Node.js Version 20.x
Production Branch main

Vercel ν™˜κ²½ λ³€μˆ˜

Vercel Dashboardμ—μ„œ μ•„λž˜ 경둜둜 μ΄λ™ν•˜μ—¬ ν™˜κ²½ λ³€μˆ˜λ₯Ό λ“±λ‘ν•©λ‹ˆλ‹€.

Project
β†’ Settings
β†’ Environment Variables

μ˜ˆμ‹œ:

VITE_API_BASE_URL=https://api.example.com/api

ν™˜κ²½ λ³€μˆ˜λŠ” ν•„μš”μ— 따라 Production, Preview, Development ν™˜κ²½λ³„λ‘œ κ΅¬λΆ„ν•˜μ—¬ λ“±λ‘ν•©λ‹ˆλ‹€.

ν™˜κ²½ λ³€μˆ˜λ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ μˆ˜μ •ν•œ λ’€μ—λŠ” κΈ°μ‘΄ 배포에 μžλ™μœΌλ‘œ μ μš©λ˜μ§€ μ•Šμ„ 수 μžˆμœΌλ―€λ‘œ Redeployλ₯Ό μ§„ν–‰ν•©λ‹ˆλ‹€.

SPA λΌμš°νŒ… μ„€μ •

LearningLM은 React Router 기반 SPAμ΄λ―€λ‘œ /official-tutorials/1, /public-library/1κ³Ό 같은 κ²½λ‘œμ—μ„œ λΈŒλΌμš°μ € μƒˆλ‘œκ³ μΉ¨μ„ ν–ˆμ„ λ•Œ Vercel이 ν•΄λ‹Ή 경둜의 μ‹€μ œ νŒŒμΌμ„ 찾으렀고 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

직접 경둜 μ ‘κ·Ό μ‹œ 404 였λ₯˜κ°€ λ°œμƒν•œλ‹€λ©΄ ν”„λ‘œμ νŠΈ λ£¨νŠΈμ— vercel.json을 μΆ”κ°€ν•©λ‹ˆλ‹€.

{
  "rewrites": [
    {
      "source": "/(.*)",
      "destination": "/index.html"
    }
  ]
}

이 섀정은 λͺ¨λ“  ν”„λ‘ νŠΈμ—”λ“œ 경둜λ₯Ό index.html둜 μ „λ‹¬ν•˜κ³ , 이후 React Routerκ°€ μ‹€μ œ 화면을 λ Œλ”λ§ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.

배포 μ „ 확인 λͺ…λ Ήμ–΄

npm ci
npm run build
npm run lint

λΉŒλ“œκ°€ μ™„λ£Œλ˜λ©΄ μ•„λž˜ λͺ…λ Ήμ–΄λ‘œ ν”„λ‘œλ•μ…˜ κ²°κ³Όλ₯Ό λ‘œμ»¬μ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

npm run preview

Troubleshooting

Q. npm install μ‹œ μ—λŸ¬κ°€ λ°œμƒν•΄μš”

Node.js와 npm 버전을 ν™•μΈν•©λ‹ˆλ‹€.

node -v
npm -v

Node.js v20 이상 μ‚¬μš©μ„ ꢌμž₯ν•©λ‹ˆλ‹€.

package-lock.jsonκ³Ό λ™μΌν•œ 버전을 μ„€μΉ˜ν•΄μ•Ό ν•œλ‹€λ©΄ λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

npm ci

Q. @/ import κ²½λ‘œκ°€ μΈμ‹λ˜μ§€ μ•Šμ•„μš”

VS Codeμ—μ„œ TypeScript μ„œλ²„λ₯Ό μž¬μ‹œμž‘ν•©λ‹ˆλ‹€.

Ctrl + Shift + P
β†’ TypeScript: Restart TS Server

tsconfig.app.jsonκ³Ό vite.config.ts에 @ aliasκ°€ λͺ¨λ‘ μ„€μ •λ˜μ–΄ μžˆλŠ”μ§€λ„ ν™•μΈν•©λ‹ˆλ‹€.

Q. 개발 μ„œλ²„κ°€ μ‹€ν–‰λ˜μ§€ μ•Šμ•„μš”

νŒ¨ν‚€μ§€ μ„€μΉ˜ 여뢀와 .env 파일이 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

npm install
npm run dev

Q. Vercelμ—μ„œ ν™˜κ²½ λ³€μˆ˜κ°€ μ μš©λ˜μ§€ μ•Šμ•„μš”

ν™˜κ²½ λ³€μˆ˜ 이름이 VITE_둜 μ‹œμž‘ν•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

VITE_API_BASE_URL=https://api.example.com/api

Vercel ν™˜κ²½ λ³€μˆ˜λ₯Ό μˆ˜μ •ν•œ λ’€μ—λŠ” Redeployλ₯Ό μ§„ν–‰ν•©λ‹ˆλ‹€.

Q. Vercelμ—μ„œ ν•˜μœ„ νŽ˜μ΄μ§€λ₯Ό μƒˆλ‘œκ³ μΉ¨ν•˜λ©΄ 404κ°€ λ°œμƒν•΄μš”

React Router의 SPA 경둜λ₯Ό Vercel이 μ‹€μ œ 파일 경둜둜 ν•΄μ„ν•΄μ„œ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν”„λ‘œμ νŠΈ λ£¨νŠΈμ— λ‹€μŒ vercel.json을 μΆ”κ°€ν•©λ‹ˆλ‹€.

{
  "rewrites": [
    {
      "source": "/(.*)",
      "destination": "/index.html"
    }
  ]
}

Q. Studio ν™”λ©΄μ—μ„œ React Flow μŠ€νƒ€μΌμ΄ μ μš©λ˜μ§€ μ•Šμ•„μš”

@xyflow/react κΈ°λ³Έ CSSκ°€ importλ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

import '@xyflow/react/dist/style.css'

μ „μ—­μœΌλ‘œ μ‚¬μš©ν•  경우 main.tsx λ˜λŠ” Studio μ§„μž… νŒŒμΌμ—μ„œ ν•œ 번만 importν•©λ‹ˆλ‹€.

Q. npm run type-check λͺ…λ Ήμ–΄κ°€ λ™μž‘ν•˜μ§€ μ•Šμ•„μš”

ν˜„μž¬ package.jsonμ—λŠ” λ³„λ„μ˜ type-check μŠ€ν¬λ¦½νŠΈκ°€ 없을 수 μžˆμŠ΅λ‹ˆλ‹€.

ν˜„μž¬ λΉŒλ“œ λͺ…령에 TypeScript 검사가 ν¬ν•¨λ˜μ–΄ μžˆμœΌλ―€λ‘œ λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

npm run build

λ³„λ„μ˜ λͺ…λ Ήμ–΄κ°€ ν•„μš”ν•œ 경우 package.json에 μ•„λž˜ 슀크립트λ₯Ό μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

{
  "scripts": {
    "type-check": "tsc -b"
  }
}

문의

λ¬Έμ˜μ‚¬ν•­μ€ νŒ€ Discord λ˜λŠ” Notion에 곡유된 ν”„λ‘ νŠΈμ—”λ“œ 채널을 μ΄μš©ν•΄ μ£Όμ„Έμš”.

About

imsi

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages