μ΄ λ¬Έμμμλ Altsis νλ‘μ νΈμ μ 체 λλ ν 리 ꡬ쑰λ₯Ό μμΈν μ€λͺ ν©λλ€.
- μ 체 λλ ν 리 νΈλ¦¬
- λ°±μλ ꡬ쑰 μμΈ
- νλ‘ νΈμλ ꡬ쑰 μμΈ
- μ£Όμ μ€μ νμΌ
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 # 보μ μ μ±
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 # νλ‘λμ
νκ²½ λ‘κ±°
μλ²λ₯Ό μμνκ³ 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();
};λ―Έλ€μ¨μ΄ 체μΈμ μ€μ ν©λλ€:
express.json()/express.urlencoded()- μμ² λ°λ νμ±cookieParser()- μΏ ν€ νμ±cors()- CORS μ€μ (νλ‘ νΈμλ URL νμ©)session()- Redis κΈ°λ° μΈμ κ΄λ¦¬ (TTL: 24μκ°)passport.initialize()/passport.session()- Passport μΈμ¦morgan()- HTTP λ‘κΉ- λΌμ°ν° λ±λ‘ -
/api/{resource}ν¨ν΄
NODE_ENV κ°μ λ°λΌ μ μ ν .env νμΌμ λ‘λν©λλ€:
localβ.env.localtestβ.env.test- κΈ°ν β
.env(κΈ°λ³Έ)
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 # μΆκ° μ μ νμ
μ μΈ
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 |
μ€μ |
λ‘κ·ΈμΈν μ¬μ©μμ μ 체 컨ν μ€νΈλ₯Ό κ΄λ¦¬ν©λλ€:
useAuth(): {
loading: boolean;
currentUser: TCurrentUser; // νμ¬ λ‘κ·ΈμΈ μ¬μ©μ
currentSchool: TSchool; // νμ¬ μ νλ νκ΅
currentRegistration: TCurrentRegistration; // νμ¬ νκΈ° λ±λ‘ μ 보
currentSeason: TCurrentSeason; // νμ¬ νκΈ° μ 보
changeSchool: (to: string) => Promise<void>;
changeRegistration: (rid: string) => void;
}λ€μμ€νμ΄μ€λ³λ‘ ꡬ쑰νλ API ν¨μλ₯Ό μ 곡ν©λλ€:
const { AcademyAPI, SchoolAPI, SeasonAPI, SyllabusAPI, ... } = useAPIv2();| νμΌ | μμΉ | μ€λͺ |
|---|---|---|
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/ |
νλ‘ νΈμλ νκ²½ λ³μ |