Skip to content

Latest commit

ย 

History

History
420 lines (320 loc) ยท 11.8 KB

File metadata and controls

420 lines (320 loc) ยท 11.8 KB

API ๊ฐœ์š”

Altsis ํ•™๊ต ์ •๋ณด ์‹œ์Šคํ…œ์˜ ๋ฐฑ์—”๋“œ API ์„ค๊ณ„ ์›์น™๊ณผ ๊ณตํ†ต ์‚ฌํ•ญ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.


RESTful API ์„ค๊ณ„ ์›์น™

Altsis API๋Š” REST ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ์„ ๋”ฐ๋ฅด๋ฉฐ, ๋‹ค์Œ ์›์น™์„ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค:

  • ๋ฆฌ์†Œ์Šค ์ค‘์‹ฌ URL: URL์€ ๋ฆฌ์†Œ์Šค(๋ช…์‚ฌ)๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, HTTP ๋ฉ”์„œ๋“œ๋กœ ํ–‰์œ„๋ฅผ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  • ํ‘œ์ค€ HTTP ๋ฉ”์„œ๋“œ: GET(์กฐํšŒ), POST(์ƒ์„ฑ), PUT(์ˆ˜์ •), DELETE(์‚ญ์ œ)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๊ด€๋œ ์‘๋‹ต ํ˜•์‹: ๋ชจ๋“  ์‘๋‹ต์€ JSON ํ˜•์‹์ž…๋‹ˆ๋‹ค.
  • ์ƒํƒœ ์ฝ”๋“œ ํ™œ์šฉ: HTTP ์ƒํƒœ ์ฝ”๋“œ๋กœ ์š”์ฒญ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ URL ๊ตฌ์กฐ

/api/{๋ฆฌ์†Œ์Šค๋ช…}
/api/{๋ฆฌ์†Œ์Šค๋ช…}/{๋ฆฌ์†Œ์ŠคID}
/api/{๋ฆฌ์†Œ์Šค๋ช…}/{๋ฆฌ์†Œ์ŠคID}/{ํ•˜์œ„๋ฆฌ์†Œ์Šค ๋˜๋Š” ์•ก์…˜}

๋“ฑ๋ก๋œ API ๋ฆฌ์†Œ์Šค

๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ ์„ค๋ช…
/api/academies ์•„์นด๋ฐ๋ฏธ ๊ด€๋ฆฌ
/api/users ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ
/api/schools ํ•™๊ต ๊ด€๋ฆฌ
/api/seasons ํ•™๊ธฐ ๊ด€๋ฆฌ
/api/registrations ํ•™๊ธฐ ๋“ฑ๋ก
/api/syllabuses ๊ฐ•์˜๊ณ„ํš์„œ
/api/enrollments ์ˆ˜๊ฐ• ๊ด€๋ฆฌ
/api/boards ๋ณด๋“œ (Alt Board)
/api/posts ๊ฒŒ์‹œ๊ธ€
/api/comments ๋Œ“๊ธ€
/api/notifications ์•Œ๋ฆผ
/api/reminders ๋ฆฌ๋งˆ์ธ๋” โ†’ reminders.md
/api/goals ๋ชฉํ‘œ/์ง„ํ–‰ ์š”์•ฝ โ†’ goals.md
/api/calendar-events ์บ˜๋ฆฐ๋” ์ผ์ •
/api/user-calendars ์‚ฌ์šฉ์ž ์บ˜๋ฆฐ๋”
/api/chats ์ฑ„ํŒ… (DM, ๊ทธ๋ฃน, ๋ณด๋“œ์ฑ„ํŒ…)
/api/forms ์–‘์‹
/api/archives ๊ธฐ๋ก
/api/files ํŒŒ์ผ ์—…๋กœ๋“œ/๋‹ค์šด๋กœ๋“œ
/api/ai AI / Alter โ†’ ai.md
/api/theme-settings ํ…Œ๋งˆ ์„ค์ • โ†’ theme-settings.md
/api/memos ๋“ฑ๋ก ์‹œ๊ฐ„ํ‘œ ๋ฉ”๋ชจ โ†’ calendar.md
/api/alt-forms Alt Form (์–‘์‹ ๋นŒ๋”)
/api/alt-sheet-rows Alt Sheet Row (์‹œํŠธ ํ–‰ ๋ฐ์ดํ„ฐ)
/api/board-favorites ๋ณด๋“œ ์ฆ๊ฒจ์ฐพ๊ธฐ
/api/survey-responses ์„ค๋ฌธ ์‘๋‹ต

์ธ์ฆ (Authentication)

์„ธ์…˜ ๊ธฐ๋ฐ˜ ์ธ์ฆ

Altsis API๋Š” **์„ธ์…˜ ๊ธฐ๋ฐ˜ ์ธ์ฆ(์ฟ ํ‚ค)**์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Passport.js๋ฅผ ํ†ตํ•ด ์ธ์ฆ์ด ์ฒ˜๋ฆฌ๋˜๋ฉฐ, ์„ธ์…˜ ์ •๋ณด๋Š” Redis์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

์ธ์ฆ ํ๋ฆ„

1. ํด๋ผ์ด์–ธํŠธ --> POST /api/users/login/local (์•„์นด๋ฐ๋ฏธID, ์‚ฌ์šฉ์žID, ๋น„๋ฐ€๋ฒˆํ˜ธ)
2. ์„œ๋ฒ„: ์‚ฌ์šฉ์ž ๊ฒ€์ฆ --> ์„ธ์…˜ ์ƒ์„ฑ --> ์„ธ์…˜ ์ฟ ํ‚ค ๋ฐœ๊ธ‰
3. ํด๋ผ์ด์–ธํŠธ: ์ดํ›„ ๋ชจ๋“  ์š”์ฒญ์— ์ฟ ํ‚ค ์ž๋™ ํฌํ•จ
4. ์„œ๋ฒ„: ๋ฏธ๋“ค์›จ์–ด์—์„œ ์„ธ์…˜ ์ฟ ํ‚ค ๊ฒ€์ฆ

๋กœ๊ทธ์ธ ์˜ˆ์‹œ

POST /api/users/login/local
Content-Type: application/json

{
  "academyId": "my-academy",
  "userId": "user01",
  "password": "mypassword"
}

์‘๋‹ต (200):

{
  "user": {
    "_id": "507f1f77bcf86cd799439011",
    "userId": "user01",
    "userName": "ํ™๊ธธ๋™",
    "auth": "member",
    "academyId": "my-academy",
    "academyName": "ํ…Œ์ŠคํŠธ ์•„์นด๋ฐ๋ฏธ",
    "schools": [
      {
        "school": "507f1f77bcf86cd799439012",
        "schoolId": "school01",
        "schoolName": "ํ…Œ์ŠคํŠธ ํ•™๊ต"
      }
    ]
  }
}

์ธ์ฆ ๋ฏธ๋“ค์›จ์–ด

๋ชจ๋“  API ์—”๋“œํฌ์ธํŠธ๋Š” ์ธ์ฆ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

๋ฏธ๋“ค์›จ์–ด ์š”๊ตฌ ๊ถŒํ•œ ์„ค๋ช…
isLoggedIn ๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž ์ธ์ฆ ์—ฌ๋ถ€๋งŒ ํ™•์ธ
isOwner owner ์ตœ๊ณ  ๊ด€๋ฆฌ์ž๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
isAdmin admin ์•„์นด๋ฐ๋ฏธ ๊ด€๋ฆฌ์ž๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
isOwAdmin owner ๋˜๋Š” admin ์ตœ๊ณ  ๊ด€๋ฆฌ์ž ๋˜๋Š” ์•„์นด๋ฐ๋ฏธ ๊ด€๋ฆฌ์ž
isAdManager admin ๋˜๋Š” manager ๊ด€๋ฆฌ์ž ๋˜๋Š” ์šด์˜์ž
isOwAdManager owner, admin ๋˜๋Š” manager ์ตœ๊ณ  ๊ด€๋ฆฌ์ž, ๊ด€๋ฆฌ์ž ๋˜๋Š” ์šด์˜์ž
forceNotLoggedIn ๋น„์ธ์ฆ ๋กœ๊ทธ์ธ ์ƒํƒœ๋ฉด ๊ฐ•์ œ ๋กœ๊ทธ์•„์›ƒ ํ›„ ์ง„ํ–‰

๊ถŒํ•œ ๋“ฑ๊ธ‰ ์ฒด๊ณ„

owner (์ตœ๊ณ  ๊ด€๋ฆฌ์ž)
  |
  +-- admin (์•„์นด๋ฐ๋ฏธ ๊ด€๋ฆฌ์ž)
        |
        +-- manager (์šด์˜์ž)
              |
              +-- member (์ผ๋ฐ˜ ์‚ฌ์šฉ์ž)
๋“ฑ๊ธ‰ ์ฝ”๋“œ ์„ค๋ช…
์ตœ๊ณ  ๊ด€๋ฆฌ์ž owner ์‹œ์Šคํ…œ ์ „์ฒด๋ฅผ ๊ด€๋ฆฌ. ์•„์นด๋ฐ๋ฏธ ์ƒ์„ฑ/์‚ญ์ œ ๊ฐ€๋Šฅ
์•„์นด๋ฐ๋ฏธ ๊ด€๋ฆฌ์ž admin ํŠน์ • ์•„์นด๋ฐ๋ฏธ ๋‚ด ์‚ฌ์šฉ์ž/ํ•™๊ต ๊ด€๋ฆฌ
์šด์˜์ž manager ํ•™๊ธฐ/์ˆ˜์—… ๊ด€๋ฆฌ, ๊ฒŒ์‹œํŒ ์šด์˜
์ผ๋ฐ˜ ์‚ฌ์šฉ์ž member ์ˆ˜์—… ์ฐธ์—ฌ, ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ ๋“ฑ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ

์š”์ฒญ/์‘๋‹ต ํ˜•์‹

์š”์ฒญ ํ˜•์‹

๋ชจ๋“  ์š”์ฒญ ๋ณธ๋ฌธ(body)์€ JSON ํ˜•์‹์ž…๋‹ˆ๋‹ค.

Content-Type: application/json

์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ

๋ชฉ๋ก ์กฐํšŒ ์‹œ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค:

GET /api/registrations?season=507f1f77bcf86cd799439011&role=student

๊ฒฝ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ

๋‹จ์ผ ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ ์‹œ ๊ฒฝ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

GET /api/users/507f1f77bcf86cd799439011
GET /api/seasons/507f1f77bcf86cd799439011

์ผ๋ถ€ API๋Š” ๊ฒฝ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ ์—†์ด ํ˜ธ์ถœํ•˜๋ฉด ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ํฌํ•จํ•˜๋ฉด ๋‹จ์ผ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค:

GET /api/schools          --> { schools: [...] }   (๋ชฉ๋ก)
GET /api/schools/:_id     --> { school: {...} }    (๋‹จ์ผ)

์‘๋‹ต ํ˜•์‹

๋ชจ๋“  ์‘๋‹ต์€ JSON ํ˜•์‹์ด๋ฉฐ, ๋ฆฌ์†Œ์Šค๋ช…์„ ํ‚ค๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ผ ๋ฆฌ์†Œ์Šค ์‘๋‹ต:

{
  "academy": {
    "_id": "...",
    "academyId": "my-academy",
    "academyName": "ํ…Œ์ŠคํŠธ ์•„์นด๋ฐ๋ฏธ"
  }
}

๋ชฉ๋ก ์‘๋‹ต:

{
  "academies": [
    { "_id": "...", "academyId": "academy1", "academyName": "์•„์นด๋ฐ๋ฏธ 1" },
    { "_id": "...", "academyId": "academy2", "academyName": "์•„์นด๋ฐ๋ฏธ 2" }
  ]
}

์—๋Ÿฌ ์‘๋‹ต:

{
  "message": "FIELD_REQUIRED(academyId)"
}

์—๋Ÿฌ ์ฒ˜๋ฆฌ

HTTP ์ƒํƒœ ์ฝ”๋“œ

์ƒํƒœ ์ฝ”๋“œ ์˜๋ฏธ ์„ค๋ช…
200 ์„ฑ๊ณต ์š”์ฒญ์ด ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋จ
400 ์ž˜๋ชป๋œ ์š”์ฒญ ํ•„์ˆ˜ ํ•„๋“œ ๋ˆ„๋ฝ, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์‹คํŒจ
401 ์ธ์ฆ ํ•„์š” ๋กœ๊ทธ์ธ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์ธ์ฆ์ด ํ•„์š”ํ•œ API ํ˜ธ์ถœ
403 ๊ถŒํ•œ ์—†์Œ ํ•ด๋‹น API์— ๋Œ€ํ•œ ๊ถŒํ•œ์ด ๋ถ€์กฑํ•จ
404 ๋ฆฌ์†Œ์Šค ์—†์Œ ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Œ
409 ์ถฉ๋Œ ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ (์˜ˆ: ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ธ ID)
500 ์„œ๋ฒ„ ์˜ค๋ฅ˜ ์„œ๋ฒ„ ๋‚ด๋ถ€ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ํ˜•์‹

๋ชจ๋“  ์—๋Ÿฌ ์‘๋‹ต์€ message ํ•„๋“œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค:

{
  "message": "PERMISSION_DENIED"
}

์ฃผ์š” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€

๋ฉ”์‹œ์ง€ ์„ค๋ช…
PERMISSION_DENIED ๊ถŒํ•œ์ด ๊ฑฐ๋ถ€๋จ
FIELD_REQUIRED({ํ•„๋“œ๋ช…}) ํ•„์ˆ˜ ํ•„๋“œ๊ฐ€ ๋ˆ„๋ฝ๋จ
FIELD_INVALID({ํ•„๋“œ๋ช…}) ํ•„๋“œ ๊ฐ’์ด ์œ ํšจํ•˜์ง€ ์•Š์Œ
FIELD_IN_USE({ํ•„๋“œ๋ช…}) ํ•ด๋‹น ๊ฐ’์ด ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘
{๋ฆฌ์†Œ์Šค}_NOT_FOUND ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Œ

์œ ํšจ์„ฑ ๊ฒ€์‚ฌ

์„œ๋ฒ„๋Š” validate ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ํ†ตํ•ด ์ž…๋ ฅ๊ฐ’์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์š” ๊ฒ€์ฆ ๋Œ€์ƒ:

ํ•„๋“œ ๊ฒ€์ฆ ๊ทœ์น™
academyId ์˜๋ฌธ, ์ˆซ์ž, ํ•˜์ดํ”ˆ ์กฐํ•ฉ
userId ์˜๋ฌธ, ์ˆซ์ž ์กฐํ•ฉ
userName ํ•œ๊ธ€, ์˜๋ฌธ
password ์ตœ์†Œ ๊ธธ์ด ์š”๊ตฌ
email ์ด๋ฉ”์ผ ํ˜•์‹
tel ์ „ํ™”๋ฒˆํ˜ธ ํ˜•์‹
schoolId ์˜๋ฌธ, ์ˆซ์ž ์กฐํ•ฉ
schoolName ํ•œ๊ธ€, ์˜๋ฌธ

useAPIv2 ํ”„๋ก ํŠธ์—”๋“œ ์—ฐ๋™

ํ”„๋ก ํŠธ์—”๋“œ์—์„œ๋Š” useAPIv2 ์ปค์Šคํ…€ ํ›…์„ ํ†ตํ•ด API๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด ํ›…์€ axios ๊ธฐ๋ฐ˜์˜ useDatabase ํ›…์„ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋ชจ๋“  API ํ•จ์ˆ˜๋ฅผ CRUD ์ ‘๋‘์‚ฌ ๋ช…๋ช… ๊ทœ์น™์— ๋”ฐ๋ผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

import useAPIv2 from "hooks/useAPIv2";

function MyComponent() {
  const {
    CAcademy,    // ์•„์นด๋ฐ๋ฏธ ์ƒ์„ฑ
    RAcademies,  // ์•„์นด๋ฐ๋ฏธ ๋ชฉ๋ก ์กฐํšŒ
    UAcademy,    // ์•„์นด๋ฐ๋ฏธ ์ˆ˜์ •
    DAcademy,    // ์•„์นด๋ฐ๋ฏธ ์‚ญ์ œ
  } = useAPIv2();

  // API ํ˜ธ์ถœ ์˜ˆ์‹œ
  const handleCreate = async () => {
    const { academy, admin } = await CAcademy({
      data: {
        academyId: "new-academy",
        academyName: "์ƒˆ ์•„์นด๋ฐ๋ฏธ",
        adminId: "admin01",
        adminName: "๊ด€๋ฆฌ์ž",
      },
    });
  };
}

๋ช…๋ช… ๊ทœ์น™

์ ‘๋‘์‚ฌ HTTP ๋ฉ”์„œ๋“œ ์˜๋ฏธ ์˜ˆ์‹œ
C POST Create (์ƒ์„ฑ) CAcademy, CUser, CSyllabus
R GET Read (์กฐํšŒ) RAcademies, RUser, RMySelf
U PUT Update (์ˆ˜์ •) UActivateAcademy, UPassword
D DELETE Delete (์‚ญ์ œ) DAcademy, DUser, DEnrollment

๋‚ด๋ถ€ ๊ตฌํ˜„ ํŒจํ„ด

useAPIv2๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ useDatabase ํ›…์˜ C, R, U, D ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค:

// useDatabase ํ›… ๋ฉ”์„œ๋“œ
database.C({ location, data })      // POST   /api/{location}
database.R({ location, params })    // GET    /api/{location}?{params}
database.U({ location, data })      // PUT    /api/{location}
database.D({ location, params })    // DELETE /api/{location}?{params}

์—๋Ÿฌ ์ฒ˜๋ฆฌ

ํ”„๋ก ํŠธ์—”๋“œ์—์„œ๋Š” ALERT_ERROR ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ API ์—๋Ÿฌ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค:

import { ALERT_ERROR } from "hooks/useAPIv2";

try {
  await CAcademy({ data: { ... } });
} catch (err) {
  ALERT_ERROR(err);
  // ์„œ๋ฒ„์˜ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ํ•œ๊ตญ์–ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ alert() ํ‘œ์‹œ
}

์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๋งคํ•‘์€ _message.ts ํŒŒ์ผ์—์„œ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ์˜๋ฌธ ์—๋Ÿฌ ์ฝ”๋“œ๊ฐ€ ํ•œ๊ตญ์–ด ๋ฉ”์‹œ์ง€๋กœ ๋ณ€ํ™˜๋˜์–ด ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ ๋นŒ๋”

useAPIv2 ๋‚ด๋ถ€์—์„œ๋Š” QUERY_BUILDER ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค:

// ์ž…๋ ฅ
QUERY_BUILDER({ season: "abc123", role: "student" })

// ์ถœ๋ ฅ
"?season=abc123&role=student&"

API ๋ฌธ์„œ ์ž๋™ ์ƒ์„ฑ

๋ฐฑ์—”๋“œ ์†Œ์Šค ์ฝ”๋“œ์—๋Š” JSDoc ํ˜•์‹์˜ ์ฃผ์„์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ API ๋ฌธ์„œ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JSDoc ์‹คํ–‰

cd backend
npm run jsdoc

JSDoc ์ฃผ์„ ์˜ˆ์‹œ

/**
 * @memberof APIs.AcademyAPI
 * @function CAcademy API
 * @description ์•„์นด๋ฐ๋ฏธ ์ƒ์„ฑ API
 * @version 2.0.0
 *
 * @param {Object} req
 * @param {"POST"} req.method
 * @param {"/academies"} req.url
 *
 * @param {Object} req.body
 * @param {string} req.body.academyId
 * @param {string} req.body.academyName
 *
 * @param {Object} res
 * @param {TAcademy} res.academy - ์ƒ์„ฑ๋œ ์•„์นด๋ฐ๋ฏธ
 *
 * @throws {}
 * | status | message          | description               |
 * | :----- | :--------------- | :------------------------ |
 * | 409    | ACADEMYID_IN_USE | academyId๊ฐ€ ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘  |
 */

๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ตฌ์กฐ

JSDoc ๋ฌธ์„œ๋Š” ๋‹ค์Œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค:

  • Models.*: ๋ฐ์ดํ„ฐ ๋ชจ๋ธ (์˜ˆ: Models.Academy, Models.User)
  • APIs.*: API ์ปจํŠธ๋กค๋Ÿฌ (์˜ˆ: APIs.AcademyAPI, APIs.UserAPI)

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ

Altsis๋Š” ๋ฉ€ํ‹ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฃจํŠธ DB

์•„์นด๋ฐ๋ฏธ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ์ตœ์ƒ์œ„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ž…๋‹ˆ๋‹ค.

  • Academy ์ปฌ๋ ‰์…˜๋งŒ ํฌํ•จ

์•„์นด๋ฐ๋ฏธ DB

๊ฐ ์•„์นด๋ฐ๋ฏธ๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„์€ {academyId}-db ํ˜•์‹์ž…๋‹ˆ๋‹ค.

  • User, School, Season, Registration, Syllabus, Enrollment ๋“ฑ ๋ชจ๋“  ๋„๋ฉ”์ธ ์ปฌ๋ ‰์…˜ ํฌํ•จ
  • ์•„์นด๋ฐ๋ฏธ ๊ฐ„ ๋ฐ์ดํ„ฐ๊ฐ€ ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋จ

์•”ํ˜ธํ™”

๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋Š” mongoose-encryption ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์•”ํ˜ธํ™”๋˜์–ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค:

๋ชจ๋ธ ์•”ํ˜ธํ™” ํ•„๋“œ ์„ค๋ช…
Enrollment evaluation ํ•™์ƒ ํ‰๊ฐ€ ๋ฐ์ดํ„ฐ
Archive data ํ•™์ƒ ๊ธฐ๋ก ๋ฐ์ดํ„ฐ

๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” bcrypt๋กœ ํ•ด์‹œํ™”๋˜์–ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค:

๋ชจ๋ธ ํ•ด์‹œ ํ•„๋“œ ์„ค๋ช…
User password ์‚ฌ์šฉ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ (API ์‘๋‹ต์—์„œ ์ œ์™ธ)