Skip to content

Latest commit

Β 

History

History
481 lines (441 loc) Β· 22.4 KB

File metadata and controls

481 lines (441 loc) Β· 22.4 KB

ν”„λ‘œμ νŠΈ ꡬ쑰

이 λ¬Έμ„œμ—μ„œλŠ” Altsis ν”„λ‘œμ νŠΈμ˜ 전체 디렉토리 ꡬ쑰λ₯Ό μƒμ„Ένžˆ μ„€λͺ…ν•©λ‹ˆλ‹€.


λͺ©μ°¨

  1. 전체 디렉토리 트리
  2. λ°±μ—”λ“œ ꡬ쑰 상세
  3. ν”„λ‘ νŠΈμ—”λ“œ ꡬ쑰 상세
  4. μ£Όμš” μ„€μ • 파일

1. 전체 디렉토리 트리

school-information-system/
β”œβ”€β”€ backend/                  # Express.js λ°±μ—”λ“œ μ„œλ²„
β”‚   β”œβ”€β”€ src/                  # μ†ŒμŠ€ μ½”λ“œ
β”‚   β”œβ”€β”€ package.json          # λ°±μ—”λ“œ μ˜μ‘΄μ„±
β”‚   β”œβ”€β”€ jest.config.json      # Jest ν…ŒμŠ€νŠΈ μ„€μ •
β”‚   └── jsdoc.config.json     # JSDoc λ¬Έμ„œ 생성 μ„€μ •
β”‚
β”œβ”€β”€ frontend/                 # React ν”„λ‘ νŠΈμ—”λ“œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜
β”‚   β”œβ”€β”€ src/                  # μ†ŒμŠ€ μ½”λ“œ
β”‚   β”œβ”€β”€ public/               # 정적 파일
β”‚   β”œβ”€β”€ package.json          # ν”„λ‘ νŠΈμ—”λ“œ μ˜μ‘΄μ„±
β”‚   └── tsconfig.json         # TypeScript μ„€μ •
β”‚
β”œβ”€β”€ documentation/            # ν”„λ‘œμ νŠΈ λ¬Έμ„œ
β”‚   β”œβ”€β”€ developer-guide/      # 개발자 κ°€μ΄λ“œ (ν˜„μž¬ λ¬Έμ„œ)
β”‚   β”œβ”€β”€ api-reference/        # API μ°Έμ‘° λ¬Έμ„œ
β”‚   β”œβ”€β”€ architecture/         # μ•„ν‚€ν…μ²˜ λ¬Έμ„œ
β”‚   β”œβ”€β”€ deployment/           # 배포 κ°€μ΄λ“œ
β”‚   β”œβ”€β”€ getting-started/      # μ‹œμž‘ κ°€μ΄λ“œ
β”‚   β”œβ”€β”€ admin-guide/          # κ΄€λ¦¬μž κ°€μ΄λ“œ
β”‚   └── user-guide/           # μ‚¬μš©μž κ°€μ΄λ“œ
β”‚
β”œβ”€β”€ docs/                     # JSDoc λ“± μžλ™ 생성 λ¬Έμ„œ
β”œβ”€β”€ node_modules/             # 루트 μ˜μ‘΄μ„±
β”œβ”€β”€ package.json              # 루트 νŒ¨ν‚€μ§€ μ„€μ •
β”œβ”€β”€ yarn.lock                 # Yarn 락 파일
β”œβ”€β”€ README.md                 # ν”„λ‘œμ νŠΈ μ†Œκ°œ
β”œβ”€β”€ CONTRIBUTING.md           # κΈ°μ—¬ κ°€μ΄λ“œ
β”œβ”€β”€ CODE_OF_CONDUCT.md        # 행동 κ°•λ Ή
β”œβ”€β”€ LICENSE                   # λΌμ΄μ„ μŠ€
└── SECURITY.md               # λ³΄μ•ˆ μ •μ±…

2. λ°±μ—”λ“œ ꡬ쑰 상세

디렉토리 트리

backend/src/
β”œβ”€β”€ index.js                  # μ„œλ²„ μ§„μž…μ 
β”œβ”€β”€ app.js                    # Express μ•± μ„€μ •
β”œβ”€β”€ env.js                    # ν™˜κ²½ λ³€μˆ˜ λ‘œλ”
β”‚
β”œβ”€β”€ controllers/              # μš”μ²­ 처리기 (30개)
β”‚   β”œβ”€β”€ index.js              # 컨트둀러 톡합 내보내기
β”‚   β”œβ”€β”€ academies.js          # 아카데미 CRUD
β”‚   β”œβ”€β”€ ai.js                 # Alter AI API (Skill λΌμš°νŒ…, 점검, κ΄€λ¦¬μž μœ ν‹Έ)
β”‚   β”œβ”€β”€ aiChat.js             # AI μ±„νŒ… μ„Έμ…˜
β”‚   β”œβ”€β”€ altForms.js           # Alt Form CRUD
β”‚   β”œβ”€β”€ altSheetRows.js       # Alt Sheet Row CRUD
β”‚   β”œβ”€β”€ apps.js               # μ™ΈλΆ€ μ•± 연동
β”‚   β”œβ”€β”€ archives.js           # 기둝물 관리
β”‚   β”œβ”€β”€ boardChats.js         # λ³΄λ“œ μ±„νŒ…
β”‚   β”œβ”€β”€ boardFavorites.js     # λ³΄λ“œ 즐겨찾기
β”‚   β”œβ”€β”€ boards.js             # κ²Œμ‹œνŒ 관리
β”‚   β”œβ”€β”€ calendarEvents.js     # μΊ˜λ¦°λ” 이벀트
β”‚   β”œβ”€β”€ chats.js              # μ±„νŒ…
β”‚   β”œβ”€β”€ comments.js           # λŒ“κΈ€
β”‚   β”œβ”€β”€ enrollments.js        # μˆ˜κ°• 등둝
β”‚   β”œβ”€β”€ files.js              # 파일 μ—…λ‘œλ“œ/λ‹€μš΄λ‘œλ“œ
β”‚   β”œβ”€β”€ forms.js              # 양식 관리
β”‚   β”œβ”€β”€ memos.js              # λ©”λͺ¨
β”‚   β”œβ”€β”€ notifications.js      # μ•Œλ¦Ό
β”‚   β”œβ”€β”€ posts.js              # κ²Œμ‹œκΈ€
β”‚   β”œβ”€β”€ registrations.js      # ν•™κΈ° 등둝
β”‚   β”œβ”€β”€ reminders.js          # λ¦¬λ§ˆμΈλ”
β”‚   β”œβ”€β”€ schools.js            # 학ꡐ 관리
β”‚   β”œβ”€β”€ seasons.js            # ν•™κΈ° 관리
β”‚   β”œβ”€β”€ surveyResponses.js    # μ„€λ¬Έ 응닡
β”‚   β”œβ”€β”€ syllabuses.js         # κ°•μ˜κ³„νšμ„œ
β”‚   β”œβ”€β”€ test.js               # ν…ŒμŠ€νŠΈμš©
β”‚   β”œβ”€β”€ themeSettings.js      # ν…Œλ§ˆ μ„€μ •
β”‚   β”œβ”€β”€ userCalendars.js      # μ‚¬μš©μž μΊ˜λ¦°λ”
β”‚   └── users.js              # μ‚¬μš©μž 관리
β”‚
β”œβ”€β”€ routes/                   # API μ—”λ“œν¬μΈνŠΈ (28개)
β”‚   β”œβ”€β”€ index.js              # λΌμš°ν„° 톡합 등둝
β”‚   β”œβ”€β”€ academies.js          # /api/academies
β”‚   β”œβ”€β”€ ai.js                 # /api/ai
β”‚   β”œβ”€β”€ altForms.js           # /api/alt-forms
β”‚   β”œβ”€β”€ altSheetRows.js       # /api/alt-sheet-rows
β”‚   β”œβ”€β”€ apps.js               # /api/apps
β”‚   β”œβ”€β”€ archives.js           # /api/archives
β”‚   β”œβ”€β”€ boardFavorites.js     # /api/board-favorites
β”‚   β”œβ”€β”€ boards.js             # /api/boards
β”‚   β”œβ”€β”€ calendarEvents.js     # /api/calendar-events
β”‚   β”œβ”€β”€ chats.js              # /api/chats
β”‚   β”œβ”€β”€ comments.js           # /api/comments
β”‚   β”œβ”€β”€ enrollments.js        # /api/enrollments
β”‚   β”œβ”€β”€ files.js              # /api/files
β”‚   β”œβ”€β”€ forms.js              # /api/forms
β”‚   β”œβ”€β”€ memos.js              # /api/memos
β”‚   β”œβ”€β”€ notifications.js      # /api/notifications
β”‚   β”œβ”€β”€ posts.js              # /api/posts
β”‚   β”œβ”€β”€ registrations.js      # /api/registrations
β”‚   β”œβ”€β”€ reminders.js          # /api/reminders
β”‚   β”œβ”€β”€ schools.js            # /api/schools
β”‚   β”œβ”€β”€ seasons.js            # /api/seasons
β”‚   β”œβ”€β”€ surveyResponses.js    # /api/survey-responses
β”‚   β”œβ”€β”€ syllabuses.js         # /api/syllabuses
β”‚   β”œβ”€β”€ test.js               # /api/test
β”‚   β”œβ”€β”€ themeSettings.js      # /api/theme-settings
β”‚   β”œβ”€β”€ userCalendars.js      # /api/user-calendars
β”‚   └── users.js              # /api/users
β”‚
β”œβ”€β”€ models/                   # MongoDB μŠ€ν‚€λ§ˆ (33개)
β”‚   β”œβ”€β”€ index.js              # λͺ¨λΈ 톡합 내보내기
β”‚   β”œβ”€β”€ Academy.js            # 아카데미
β”‚   β”œβ”€β”€ AIChatMessage.js      # AI μ±„νŒ… λ©”μ‹œμ§€
β”‚   β”œβ”€β”€ AIChatSession.js      # AI μ±„νŒ… μ„Έμ…˜
β”‚   β”œβ”€β”€ AIUsageLog.js         # AI μ‚¬μš©λŸ‰ 둜그
β”‚   β”œβ”€β”€ AltForm.js            # Alt Form (양식)
β”‚   β”œβ”€β”€ AltSheet.js           # Alt Sheet (μ‹œνŠΈ)
β”‚   β”œβ”€β”€ AltSheetRow.js        # Alt Sheet Row (μ‹œνŠΈ ν–‰)
β”‚   β”œβ”€β”€ Apps.js               # μ™ΈλΆ€ μ•±
β”‚   β”œβ”€β”€ Archive.js            # 기둝물
β”‚   β”œβ”€β”€ Board.js              # κ²Œμ‹œνŒ
β”‚   β”œβ”€β”€ BoardFavorite.js      # λ³΄λ“œ 즐겨찾기
β”‚   β”œβ”€β”€ CalendarEvent.js      # μΊ˜λ¦°λ” 이벀트
β”‚   β”œβ”€β”€ ChatFile.js           # μ±„νŒ… 파일
β”‚   β”œβ”€β”€ ChatMessage.js        # μ±„νŒ… λ©”μ‹œμ§€
β”‚   β”œβ”€β”€ ChatRoom.js           # μ±„νŒ…λ°©
β”‚   β”œβ”€β”€ Comment.js            # λŒ“κΈ€
β”‚   β”œβ”€β”€ Enrollment.js         # μˆ˜κ°• 등둝
β”‚   β”œβ”€β”€ Form.js               # 양식
β”‚   β”œβ”€β”€ Notification.js       # μ•Œλ¦Ό
β”‚   β”œβ”€β”€ NotificationSetting.js # μ•Œλ¦Ό μ„€μ •
β”‚   β”œβ”€β”€ Post.js               # κ²Œμ‹œκΈ€
β”‚   β”œβ”€β”€ Registration.js       # ν•™κΈ° 등둝
β”‚   β”œβ”€β”€ Reminder.js           # λ¦¬λ§ˆμΈλ”
β”‚   β”œβ”€β”€ RequestStat.js        # API μš”μ²­ 톡계
β”‚   β”œβ”€β”€ School.js             # 학ꡐ
β”‚   β”œβ”€β”€ Season.js             # ν•™κΈ°
β”‚   β”œβ”€β”€ SurveyResponse.js     # μ„€λ¬Έ 응닡
β”‚   β”œβ”€β”€ Syllabus.js           # κ°•μ˜κ³„νšμ„œ
β”‚   β”œβ”€β”€ ThemeSetting.js       # ν…Œλ§ˆ μ„€μ •
β”‚   β”œβ”€β”€ TimeBlock.js          # μ‹œκ°„ 블둝
β”‚   β”œβ”€β”€ User.js               # μ‚¬μš©μž
β”‚   └── UserCalendar.js       # μ‚¬μš©μž μΊ˜λ¦°λ”
β”‚
β”œβ”€β”€ services/                 # λΉ„μ¦ˆλ‹ˆμŠ€ 둜직
β”‚   β”œβ”€β”€ aiChat.js             # AI μ±„νŒ… μ„œλΉ„μŠ€
β”‚   β”œβ”€β”€ aiSkills.js           # Alter Skill λΌμš°ν„° (chat, syllabus-review; Navbar Alter 연동)
β”‚   β”œβ”€β”€ aiProvider.js         # AI 제곡자 좔상화 (OpenAI/Anthropic/Gemini)
β”‚   β”œβ”€β”€ aiPromptPolicy.js     # ν”„λ‘¬ν”„νŠΈ ν•œλ„Β·μž‘μ—… ν”„λ‘œν•„Β·JSON νŒŒμ‹±
β”‚   β”œβ”€β”€ aiSafety.js           # AI μž…μΆœλ ₯ κ°œμΈμ •λ³΄ λ§ˆμŠ€ν‚Ή
β”‚   β”œβ”€β”€ aiUsage.js            # AIUsageLog 기둝 헬퍼
β”‚   β”œβ”€β”€ altForms.js           # Alt Form μ„œλΉ„μŠ€
β”‚   β”œβ”€β”€ boardChat.js          # λ³΄λ“œ μ±„νŒ… μ„œλΉ„μŠ€
β”‚   β”œβ”€β”€ boards.js             # κ²Œμ‹œνŒ μ„œλΉ„μŠ€
β”‚   β”œβ”€β”€ notifications.js      # μ•Œλ¦Ό λ°œμ†‘ μ„œλΉ„μŠ€
β”‚   β”œβ”€β”€ registrations.js      # 등둝 κΆŒν•œ/처리 μ„œλΉ„μŠ€
β”‚   β”œβ”€β”€ scheduler.js          # μŠ€μΌ€μ€„λŸ¬ (cron μž‘μ—…)
β”‚   β”œβ”€β”€ schedulerQueue.js     # μŠ€μΌ€μ€„λŸ¬ 큐
β”‚   β”œβ”€β”€ seasons.js            # ν•™κΈ° κ΄€λ ¨ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직
β”‚   β”œβ”€β”€ themeSettings.js      # ν…Œλ§ˆ μ„€μ • μ„œλΉ„μŠ€
β”‚   └── users.js              # μ‚¬μš©μž μ„œλΉ„μŠ€
β”‚
β”œβ”€β”€ middleware/               # 미듀웨어 (2개)
β”‚   β”œβ”€β”€ auth.js               # 인증/κΆŒν•œ 검사 미듀웨어
β”‚   └── chat.js               # μ±„νŒ… 미듀웨어
β”‚
β”œβ”€β”€ _database/                # DB μ—°κ²° μ„€μ •
β”‚   β”œβ”€β”€ index.js              # DB μ—°κ²° 톡합
β”‚   β”œβ”€β”€ mongodb/
β”‚   β”‚   β”œβ”€β”€ index.js          # MongoDB μ—°κ²° (λ©€ν‹° DB)
β”‚   β”‚   └── root.js           # 루트 DB μ—°κ²°
β”‚   └── redis/
β”‚       └── index.js          # Redis μ—°κ²°
β”‚
β”œβ”€β”€ _passport/                # Passport 인증 μ „λž΅
β”‚   β”œβ”€β”€ index.js              # Passport μ„€μ • 톡합
β”‚   β”œβ”€β”€ localStrategy2.js     # 둜컬 둜그인 μ „λž΅ (ID/PW)
β”‚   └── googleStrategy2.js    # Google OAuth μ „λž΅
β”‚
β”œβ”€β”€ _s3/                      # AWS S3 연동 (파일 μ—…λ‘œλ“œ)
β”‚   β”œβ”€β”€ fileBucket.js         # 일반 파일 버킷
β”‚   β”œβ”€β”€ profileBucket.js      # ν”„λ‘œν•„ 이미지 버킷
β”‚   β”œβ”€β”€ archiveMulter.js      # 기둝물 파일 μ—…λ‘œλ“œ
β”‚   β”œβ”€β”€ boardMulter.js        # λ³΄λ“œ 파일 μ—…λ‘œλ“œ
β”‚   β”œβ”€β”€ chatMulter.js         # μ±„νŒ… 파일 μ—…λ‘œλ“œ
β”‚   β”œβ”€β”€ courseMulter.js       # μˆ˜μ—… 파일 μ—…λ‘œλ“œ
β”‚   β”œβ”€β”€ postMulter.js         # κ²Œμ‹œκΈ€ 파일 μ—…λ‘œλ“œ
β”‚   β”œβ”€β”€ profileMulter.js      # ν”„λ‘œν•„ 이미지 μ—…λ‘œλ“œ
β”‚   β”œβ”€β”€ surveyMulter.js       # μ„€λ¬Έ 파일 μ—…λ‘œλ“œ
β”‚   └── aiRefMulter.js        # AI 참고자료 μ—…λ‘œλ“œ
β”‚
β”œβ”€β”€ utils/                    # μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜ (8개)
β”‚   β”œβ”€β”€ date.js               # λ‚ μ§œ 처리
β”‚   β”œβ”€β”€ errorHandler.js       # μ—λŸ¬ ν•Έλ“€λŸ¬
β”‚   β”œβ”€β”€ mergeEngine.js        # λ¨Έμ§€ μ—”μ§„ (Docs ν…œν”Œλ¦Ώ 바인딩)
β”‚   β”œβ”€β”€ password.js           # λΉ„λ°€λ²ˆν˜Έ ν•΄μ‹± (bcrypt)
β”‚   β”œβ”€β”€ payload.js            # νŽ˜μ΄λ‘œλ“œ 검증
β”‚   β”œβ”€β”€ textExtractor.js      # ν…μŠ€νŠΈ μΆ”μΆœ (PDF, DOCX)
β”‚   β”œβ”€β”€ validate.js           # μž…λ ₯κ°’ 검증 (validator)
β”‚   └── webSocket.js          # WebSocket μ΄ˆκΈ°ν™” (Socket.IO)
β”‚
β”œβ”€β”€ messages/                 # API 응닡 λ©”μ‹œμ§€ μƒμˆ˜
β”‚   └── index.js              # μ—λŸ¬/성곡 λ©”μ‹œμ§€ μƒμˆ˜ μ •μ˜
β”‚
└── log/                      # λ‘œκΉ… μ„€μ • (Winston)
    β”œβ”€β”€ logger.js             # 둜거 νŒ©ν† λ¦¬
    β”œβ”€β”€ devLogger.js          # 개발 ν™˜κ²½ 둜거
    └── prodLogger.js         # ν”„λ‘œλ•μ…˜ ν™˜κ²½ 둜거

λ°±μ—”λ“œ 핡심 파일 μ„€λͺ…

index.js - μ„œλ²„ μ§„μž…μ 

μ„œλ²„λ₯Ό μ‹œμž‘ν•˜κ³  WebSocketκ³Ό μŠ€μΌ€μ€„λŸ¬λ₯Ό μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€.

import { app, ready } from "./app.js";
import { initializeWebSocket } from "./utils/webSocket.js";
import { initializeScheduler } from "./services/scheduler.js";

const startServer = async () => {
  await ready();
  server = app.listen(app.get("port"), function () {
    console.log(`Express server listening on port ${server.address().port}`);
  });
  initializeWebSocket(server);
  initializeScheduler();
};

app.js - Express μ•± μ„€μ •

미듀웨어 체인을 μ„€μ •ν•©λ‹ˆλ‹€:

  1. express.json() / express.urlencoded() - μš”μ²­ λ°”λ”” νŒŒμ‹±
  2. cookieParser() - μΏ ν‚€ νŒŒμ‹±
  3. cors() - CORS μ„€μ • (ν”„λ‘ νŠΈμ—”λ“œ URL ν—ˆμš©)
  4. session() - Redis 기반 μ„Έμ…˜ 관리 (TTL: 24μ‹œκ°„)
  5. passport.initialize() / passport.session() - Passport 인증
  6. morgan() - HTTP λ‘œκΉ…
  7. λΌμš°ν„° 등둝 - /api/{resource} νŒ¨ν„΄

env.js - ν™˜κ²½ λ³€μˆ˜ λ‘œλ”

NODE_ENV 값에 따라 μ μ ˆν•œ .env νŒŒμΌμ„ λ‘œλ“œν•©λ‹ˆλ‹€:

  • local β†’ .env.local
  • test β†’ .env.test
  • 기타 β†’ .env (κΈ°λ³Έ)

3. ν”„λ‘ νŠΈμ—”λ“œ ꡬ쑰 상세

디렉토리 트리

frontend/src/
β”œβ”€β”€ index.tsx                 # React μ§„μž…μ  (ReactDOM.render)
β”‚
β”œβ”€β”€ routes/                   # λΌμš°ν„° μ„€μ •
β”‚   β”œβ”€β”€ RouterPage.tsx        # 전체 라우트 μ •μ˜ (React Router v6)
β”‚   └── UrlContextSync.tsx    # URL νŒŒλΌλ―Έν„°μ™€ Context 동기화
β”‚
β”œβ”€β”€ pages/                    # νŽ˜μ΄μ§€ μ»΄ν¬λ„ŒνŠΈ (20개 μ„Ήμ…˜)
β”‚   β”œβ”€β”€ index/                # ν™ˆ νŽ˜μ΄μ§€
β”‚   β”œβ”€β”€ login/                # 둜그인/아카데미 선택
β”‚   β”œβ”€β”€ Register.tsx          # νšŒμ›κ°€μž…
β”‚   β”œβ”€β”€ admin/                # κ΄€λ¦¬μž νŽ˜μ΄μ§€
β”‚   β”‚   β”œβ”€β”€ users/            #   μ‚¬μš©μž 관리
β”‚   β”‚   β”œβ”€β”€ schools/          #   학ꡐ 관리
β”‚   β”‚   β”œβ”€β”€ forms/            #   양식 관리
β”‚   β”‚   └── Backup.tsx        #   λ°±μ—…
β”‚   β”œβ”€β”€ owner/                # μ‹œμŠ€ν…œ μ†Œμœ μž νŽ˜μ΄μ§€
β”‚   β”‚   └── academies/        #   아카데미 관리
β”‚   β”œβ”€β”€ courses/              # μˆ˜μ—… κ΄€λ ¨
β”‚   β”‚   β”œβ”€β”€ Design.tsx        #   μˆ˜μ—… 섀계
β”‚   β”‚   β”œβ”€β”€ Enroll.tsx        #   μˆ˜κ°• μ‹ μ²­
β”‚   β”‚   β”œβ”€β”€ EnrollStatus.tsx  #   μˆ˜κ°• ν˜„ν™©
β”‚   β”‚   β”œβ”€β”€ List.tsx          #   μˆ˜μ—… λͺ©λ‘
β”‚   β”‚   β”œβ”€β”€ tab/              #   μˆ˜μ—… νƒ­ (Created/Enrolled/Mentoring)
β”‚   β”‚   └── view/             #   μˆ˜μ—… 상세 λ·°
β”‚   β”œβ”€β”€ boards/               # κ²Œμ‹œνŒ
β”‚   β”‚   β”œβ”€β”€ altBoard/         #   Alt λ³΄λ“œ (양식/μ‹œνŠΈ 기반 λ³΄λ“œ)
β”‚   β”‚   └── survey/           #   μ„€λ¬Έ 관리
β”‚   β”œβ”€β”€ notifications/        # μ•Œλ¦Ό
β”‚   β”œβ”€β”€ chat/                 # μ±„νŒ…
β”‚   β”œβ”€β”€ archive/              # 기둝물 (κ΅μ‚¬μš©)
β”‚   β”œβ”€β”€ archiveViewer/        # 기둝물 λ·°μ–΄ (ν•™μƒμš©)
β”‚   β”œβ”€β”€ docs/                 # λ¬Έμ„œ
β”‚   β”œβ”€β”€ settings/             # μ„€μ • (ν…Œλ§ˆ λ“±)
β”‚   β”œβ”€β”€ myaccount/            # λ‚΄ 계정
β”‚   β”œβ”€β”€ teacher/              # ꡐ사 νŽ˜μ΄μ§€
β”‚   β”œβ”€β”€ apps/                 # μ™ΈλΆ€ μ•±
β”‚   β”œβ”€β”€ userSearchResult/     # μ‚¬μš©μž 검색 κ²°κ³Ό
β”‚   β”œβ”€β”€ dev/                  # 개발자 도ꡬ
β”‚   └── error/                # μ—λŸ¬ νŽ˜μ΄μ§€ (404)
β”‚
β”œβ”€β”€ components/               # μž¬μ‚¬μš© μ»΄ν¬λ„ŒνŠΈ (28개 μΉ΄ν…Œκ³ λ¦¬)
β”‚   β”œβ”€β”€ button/               # λ²„νŠΌ μ»΄ν¬λ„ŒνŠΈ
β”‚   β”œβ”€β”€ calendarV2/           # μΊ˜λ¦°λ” V2 (μ›”κ°„/μ£Όκ°„/일간 λ·°)
β”‚   β”œβ”€β”€ calender/             # μΊ˜λ¦°λ” (λ ˆκ±°μ‹œ)
β”‚   β”œβ”€β”€ callout/              # μ½œμ•„μ›ƒ/μ•Œλ¦Ό λ°•μŠ€
β”‚   β”œβ”€β”€ canvas/               # μΊ”λ²„μŠ€ (그리기)
β”‚   β”œβ”€β”€ colorPicker/          # 색상 선택기
β”‚   β”œβ”€β”€ divider/              # ꡬ뢄선
β”‚   β”œβ”€β”€ dragAndDrop/          # λ“œλž˜κ·Έ μ•€ λ“œλ‘­
β”‚   β”œβ”€β”€ fileUploader/         # 파일 μ—…λ‘œλ“œ
β”‚   β”œβ”€β”€ input/                # μž…λ ₯ ν•„λ“œ
β”‚   β”œβ”€β”€ list/                 # 리슀트 μ»΄ν¬λ„ŒνŠΈ
β”‚   β”œβ”€β”€ loading/              # λ‘œλ”© μŠ€ν”Όλ„ˆ/μŠ€μΌˆλ ˆν†€
β”‚   β”œβ”€β”€ markdown/             # λ§ˆν¬λ‹€μš΄ λ Œλ”λŸ¬
β”‚   β”œβ”€β”€ navigationLinks/      # λ‚΄λΉ„κ²Œμ΄μ…˜ 링크
β”‚   β”œβ”€β”€ popup/                # νŒμ—…/λͺ¨λ‹¬
β”‚   β”œβ”€β”€ progress/             # ν”„λ‘œκ·Έλ ˆμŠ€ λ°”
β”‚   β”œβ”€β”€ quickSearch/          # λΉ λ₯Έ 검색
β”‚   β”œβ”€β”€ reloadwarning/        # μƒˆλ‘œκ³ μΉ¨ κ²½κ³ 
β”‚   β”œβ”€β”€ schedule/             # μŠ€μΌ€μ€„ λ·°
β”‚   β”œβ”€β”€ select/               # 선택 λ“œλ‘­λ‹€μš΄
β”‚   β”œβ”€β”€ skeleton/             # μŠ€μΌˆλ ˆν†€ λ‘œλ”©
β”‚   β”œβ”€β”€ tab/                  # νƒ­ μ»΄ν¬λ„ŒνŠΈ
β”‚   β”œβ”€β”€ table/                # ν…Œμ΄λΈ” (λ ˆκ±°μ‹œ)
β”‚   β”œβ”€β”€ tableV2/              # ν…Œμ΄λΈ” V2 (ꢌμž₯)
β”‚   β”œβ”€β”€ textarea/             # ν…μŠ€νŠΈμ˜μ—­
β”‚   β”œβ”€β”€ timetable/            # μ‹œκ°„ν‘œ
β”‚   β”œβ”€β”€ toggleSwitch/         # ν† κΈ€ μŠ€μœ„μΉ˜
β”‚   └── tree/                 # 트리 λ·°
β”‚
β”œβ”€β”€ layout/                   # λ ˆμ΄μ•„μ›ƒ μ»΄ν¬λ„ŒνŠΈ
β”‚   β”œβ”€β”€ sidebar/              # μ‚¬μ΄λ“œλ°” (메뉴 λ„€λΉ„κ²Œμ΄μ…˜)
β”‚   β”œβ”€β”€ navbar/               # 상단 λ„€λΉ„κ²Œμ΄μ…˜ λ°”
β”‚   └── footer/               # ν‘Έν„°
β”‚
β”œβ”€β”€ contexts/                 # React Context
β”‚   β”œβ”€β”€ authContext.tsx        # 인증 Context (μ‚¬μš©μž/학ꡐ/ν•™κΈ°)
β”‚   └── themeContext.tsx       # ν…Œλ§ˆ Context (라이트/닀크/μ»€μŠ€ν…€)
β”‚
β”œβ”€β”€ hooks/                    # μ»€μŠ€ν…€ ν›… (13개)
β”‚   β”œβ”€β”€ useAPIv2.ts           # API 호좜 ν›… (λ„€μž„μŠ€νŽ˜μ΄μŠ€λ³„ API ν•¨μˆ˜)
β”‚   β”œβ”€β”€ useApi.ts             # API 호좜 ν›… (λ ˆκ±°μ‹œ)
β”‚   β”œβ”€β”€ useDatabase.ts        # Axios 기반 CRUD 래퍼
β”‚   β”œβ”€β”€ useAppNavigate.ts     # μ•± λ‚΄ λ„€λΉ„κ²Œμ΄μ…˜
β”‚   β”œβ”€β”€ useAppPrefix.ts       # URL 접두사 (academyId/schoolId)
β”‚   β”œβ”€β”€ useFormValidation.ts  # 폼 μœ νš¨μ„± 검사
β”‚   β”œβ”€β”€ useGenerateId.ts      # ID 생성
β”‚   β”œβ”€β”€ useGoogleLogin.tsx    # Google 둜그인
β”‚   β”œβ”€β”€ useInterval.tsx       # μΈν„°λ²Œ ν›…
β”‚   β”œβ”€β”€ useOutsideClick.ts    # μ™ΈλΆ€ 클릭 감지
β”‚   β”œβ”€β”€ useSearch.ts          # 검색 κΈ°λŠ₯
β”‚   β”œβ”€β”€ useSetStateFromOtherComponent.ts # μ»΄ν¬λ„ŒνŠΈ κ°„ μƒνƒœ 전달
β”‚   └── _message.ts           # API μ—λŸ¬ λ©”μ‹œμ§€ λ§€ν•‘
β”‚
β”œβ”€β”€ editor/                   # 양식 에디터
β”‚   β”œβ”€β”€ Editor.tsx            # 에디터 메인 μ»΄ν¬λ„ŒνŠΈ
β”‚   β”œβ”€β”€ EditorParser.tsx      # 에디터 νŒŒμ„œ
β”‚   β”œβ”€β”€ editor.module.scss    # 에디터 μŠ€νƒ€μΌ
β”‚   β”œβ”€β”€ blocks/               # 에디터 블둝 μ»΄ν¬λ„ŒνŠΈ
β”‚   β”œβ”€β”€ functions/            # 에디터 κΈ°λŠ₯ ν•¨μˆ˜
β”‚   β”œβ”€β”€ layout/               # 에디터 λ ˆμ΄μ•„μ›ƒ
β”‚   β”œβ”€β”€ parser/               # 데이터 νŒŒμ‹±
β”‚   β”œβ”€β”€ store/
β”‚   β”‚   └── useEditorStore.ts # Zustand 에디터 μŠ€ν† μ–΄
β”‚   └── types/                # 에디터 νƒ€μž… μ •μ˜
β”‚
β”œβ”€β”€ types/                    # TypeScript νƒ€μž… μ •μ˜ (18개)
β”‚   β”œβ”€β”€ academies.ts          # TAcademy
β”‚   β”œβ”€β”€ aiChat.ts             # TAIChatSession, TAIChatMessage
β”‚   β”œβ”€β”€ altForm.ts            # TAltForm, TAltFormField
β”‚   β”œβ”€β”€ altSheet.ts           # TAltSheet, TAltSheetRow
β”‚   β”œβ”€β”€ auth.ts               # TCurrentUser, TCurrentRegistration, TCurrentSeason
β”‚   β”œβ”€β”€ board.ts              # TBoard
β”‚   β”œβ”€β”€ chat.ts               # TChatRoom, TChatMessage, TChatUser
β”‚   β”œβ”€β”€ comment.ts            # TComment
β”‚   β”œβ”€β”€ enrollments.ts        # TEnrollment
β”‚   β”œβ”€β”€ notification.ts       # TNotification, TNotificationSettings
β”‚   β”œβ”€β”€ post.ts               # TPost, TPostAttachment
β”‚   β”œβ”€β”€ registrations.ts      # TRegistration
β”‚   β”œβ”€β”€ reminder.ts           # TReminder
β”‚   β”œβ”€β”€ schools.ts            # TSchool, TSchoolFormArchive
β”‚   β”œβ”€β”€ seasons.ts            # TSeason, TSeasonWithRegistrations
β”‚   β”œβ”€β”€ survey.ts             # TSurveyQuestion, TSurveyResponse
β”‚   β”œβ”€β”€ syllabuses.ts         # TSyllabus
β”‚   └── users.ts              # TUser
β”‚
β”œβ”€β”€ utils/                    # μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜
β”‚   └── themeGenerator.ts     # μ»€μŠ€ν…€ ν…Œλ§ˆ CSS λ³€μˆ˜ 생성기
β”‚
β”œβ”€β”€ style/                    # μ „μ—­ μŠ€νƒ€μΌ
β”‚   β”œβ”€β”€ global.scss           # μ „μ—­ μŠ€νƒ€μΌ μ΄ˆκΈ°ν™”
β”‚   β”œβ”€β”€ variables.scss        # CSS λ³€μˆ˜ μ •μ˜ (ν…Œλ§ˆ 색상)
β”‚   β”œβ”€β”€ fonts.scss            # 폰트 μ„€μ •
β”‚   └── pages/                # νŽ˜μ΄μ§€λ³„ μ „μ—­ μŠ€νƒ€μΌ
β”‚
β”œβ”€β”€ assets/                   # 정적 μžμ›
β”‚   β”œβ”€β”€ svg/                  # SVG μ•„μ΄μ½˜
β”‚   β”œβ”€β”€ img/                  # 이미지 파일
β”‚   β”œβ”€β”€ fonts/                # 폰트 파일
β”‚   └── audio/                # μ˜€λ””μ˜€ 파일
β”‚
β”œβ”€β”€ functions/                # 곡톡 ν•¨μˆ˜
β”œβ”€β”€ states-dev/               # 개발용 μƒνƒœ 데이터
β”œβ”€β”€ global.d.ts               # μ „μ—­ νƒ€μž… μ„ μ–Έ
└── global2.d.ts              # μΆ”κ°€ μ „μ—­ νƒ€μž… μ„ μ–Έ

ν”„λ‘ νŠΈμ—”λ“œ 핡심 파일 μ„€λͺ…

routes/RouterPage.tsx - λΌμš°ν„° μ„€μ •

React Router v6 기반의 전체 라우트λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. URL κ΅¬μ‘°λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

URL νŒ¨ν„΄ μ„€λͺ…
/login 아카데미 선택 β†’ 둜그인
/:pid/login νŠΉμ • 아카데미 둜그인
/register νšŒμ›κ°€μž…
/owner/... μ‹œμŠ€ν…œ μ†Œμœ μž νŽ˜μ΄μ§€
/:academyId/:schoolId/ 인증된 μ‚¬μš©μž 메인 (UrlContextSync)
/:academyId/:schoolId/admin/... κ΄€λ¦¬μž νŽ˜μ΄μ§€
/:academyId/:schoolId/courses/... μˆ˜μ—… κ΄€λ ¨
/:academyId/:schoolId/boards/... κ²Œμ‹œνŒ
/:academyId/:schoolId/settings μ„€μ •

contexts/authContext.tsx - 인증 Context

λ‘œκ·ΈμΈν•œ μ‚¬μš©μžμ˜ 전체 μ»¨ν…μŠ€νŠΈλ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€:

useAuth(): {
  loading: boolean;
  currentUser: TCurrentUser;        // ν˜„μž¬ 둜그인 μ‚¬μš©μž
  currentSchool: TSchool;           // ν˜„μž¬ μ„ νƒλœ 학ꡐ
  currentRegistration: TCurrentRegistration; // ν˜„μž¬ ν•™κΈ° 등둝 정보
  currentSeason: TCurrentSeason;    // ν˜„μž¬ ν•™κΈ° 정보
  changeSchool: (to: string) => Promise<void>;
  changeRegistration: (rid: string) => void;
}

hooks/useAPIv2.ts - API 호좜 ν›…

λ„€μž„μŠ€νŽ˜μ΄μŠ€λ³„λ‘œ κ΅¬μ‘°ν™”λœ API ν•¨μˆ˜λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€:

const { AcademyAPI, SchoolAPI, SeasonAPI, SyllabusAPI, ... } = useAPIv2();

4. μ£Όμš” μ„€μ • 파일

파일 μœ„μΉ˜ μ„€λͺ…
package.json 루트 루트 μ˜μ‘΄μ„± (곡용 νŒ¨ν‚€μ§€)
package.json backend/ λ°±μ—”λ“œ μ˜μ‘΄μ„± 및 슀크립트
package.json frontend/ ν”„λ‘ νŠΈμ—”λ“œ μ˜μ‘΄μ„± 및 슀크립트
tsconfig.json frontend/ TypeScript 컴파일러 μ„€μ •
jest.config.json backend/ Jest ν…ŒμŠ€νŠΈ μ„€μ •
jsdoc.config.json backend/ JSDoc λ¬Έμ„œ 생성 μ„€μ •
.env / .env.local backend/ λ°±μ—”λ“œ ν™˜κ²½ λ³€μˆ˜
.env frontend/ ν”„λ‘ νŠΈμ—”λ“œ ν™˜κ²½ λ³€μˆ˜

λͺ©μ°¨λ‘œ λŒμ•„κ°€κΈ°