Skip to content
/ Altsis Public template

๐Ÿ…ฐ๏ธ Altsis(Alternative School Infomation System)๋Š” ๋ชจ๋“  ํ•™๊ต๋ฅผ ์œ„ํ•œ ๋Œ€์•ˆ์ ์ธ ํ•™๊ต ์ •๋ณด ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.

License

Notifications You must be signed in to change notification settings

bmrdevteam/Altsis

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

GitHub Readme Stats

Altsis

๋ชจ๋“  ํ•™๊ต๋ฅผ ์œ„ํ•œ ๋Œ€์•ˆ์ ์ธ ํ•™๊ต ์ •๋ณด ์‹œ์Šคํ…œ

Tests Passing created-at count count GitHub Contributors Issues GitHub pull requests commit-activity commits-since

๋ชฉ์ฐจ

์•ˆ๋…•ํ•˜์„ธ์š”!

Important

์•ˆ๋…•ํ•˜์„ธ์š”! Altsis(Alternative School Infomation System)๋Š” ๋ชจ๋“  ํ•™๊ต๋ฅผ ์œ„ํ•œ ๋Œ€์•ˆ์ ์ธ ํ•™๊ต ์ •๋ณด ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค!

Tip

GitHub Readme Stats

  • Alt : ๋Œ€์•ˆ์ ์ด๊ณ  ์ˆ˜์ค€๋†’์€ ๊ต์œก์„ ์ง€ํ–ฅํ•˜๋Š” ๊ต์œก์ ์ธ ์‹œ์Šคํ…œ
  • Function Key : ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์œผ๋กœ ์ปค์Šคํ…€ ํ•  ์ˆ˜ ์žˆ๋Š” ๋งž์ถคํ˜• ์‹œ์Šคํ…œ
  • Keyboard : ์ •๋ณด๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ์ „๋ฌธ์ ์ธ ์‹œ์Šคํ…œ

์—ญ์‚ฌ

Important

2016๋…„ ๋ณ„๋ฌด๋ฆฌํ•™๊ต ์ˆ˜๊ฐ• ์‹ ์ฒญ ์‹œ์Šคํ…œ์„ ์œ„ํ•ด ๊ฐœ๋ฐœ๋œ BLMS๋ฅผ ๋ณด์™„ํ•˜๊ณ  ๋ฐœ์ „์‹œํ‚ค์œ„ํ•ด 2022๋…„ ๋ณ„๋ฌด๋ฆฌํ•™๊ต ๊ต์‚ฌ์™€ ์กธ์—…์ƒ์ด ํž˜์„ ๋ชจ์•„ ๊ฐœ๋ฐœํ•œ Altsis์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ AEG๋ฅผ ์šด์˜ํ•˜์—ฌ ๋Œ€์•ˆ์ ์ธ ํ•™๊ต ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ด ํ•„์š”ํ•œ ๋งŽ์€ ํ•™๊ต๋“ค์—๊ฒŒ ๋ณด๊ธ‰ํ•˜๊ธฐ ์œ„ํ•ด ํž˜์“ฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!

Note

ํŠน์ง•

Important

  • ๋Œ€์•ˆํ•™๊ต์—์„œ ๋งŒ๋“  ๋Œ€์•ˆ๊ต์œก์„ ์œ„ํ•œ ๋Œ€์•ˆ์ ์ธ ํ•™๊ต ์ •๋ณด ์‹œ์Šคํ…œ
  • ๋‹ค์–‘ํ•œ ํ•™๊ต์™€ ๊ต์œก๊ณผ์ •์— ์ ์šฉ ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐํ•˜๊ณ  ๋…์ฐฝ์ ์ธ ์‹œ์Šคํ…œ
  • ๋ฏธ๋ž˜ ์ง€ํ–ฅ์ ์ธ ๊ต์œก์ฒ ํ•™์„ ์‹คํ˜„ํ•˜๋Š” ๊ต์œก์ ์ธ ์‹œ์Šคํ…œ

Note

  • ๐Ÿซ ์•„์นด๋ฐ๋ฏธ ์‹œ์Šคํ…œ : ๋‹จ ํ•˜๋‚˜์˜ ์•„์นด๋ฐ๋ฏธ์—์„œ ๋ณต์ˆ˜์˜ ํ•™๊ต ๋‹จ์œ„ ๊ต์œก ๊ณผ์ • ์šด์˜ ๊ฐ€๋Šฅ
  • ๐Ÿ’ป ๋งž์ถคํ˜• ์‹œ์Šคํ…œ : ์‹œ์Šคํ…œ ์„ค์ •๊ณผ ์—๋””ํ„ฐ๋ฅผ ์ด์šฉํ•ด ํ•„์š”์— ๋งž๋Š” ๋งž์ถคํ˜• ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ
  • ๐Ÿง‘โ€๐ŸŽ“ ํ•™์ƒ ์ค‘์‹ฌ ์‹œ์Šคํ…œ : ํ•™์ƒ์ด ์ˆ˜์—… ๊ฐœ์„ค ๋ฐ ํ‰๊ฐ€ ๋“ฑ์—๋„ ์ฐธ์—ฌ ํ•  ์ˆ˜ ์žˆ๋Š” ํ•™์ƒ ์ค‘์‹ฌ ์‹œ์Šคํ…œ
  • ๐Ÿ›ฃ๏ธ ํ†ตํ•ฉ ์‹œ์Šคํ…œ : ํ•™์ƒ์˜ ์ˆ˜์—…, ํ‰๊ฐ€, ๊ธฐ๋ก, ์ถœ๋ ฅ์„ ํ•˜๋‚˜์˜ ์‹œ์Šคํ…œ์—์„œ ๊ด€๋ฆฌ

์„ค์น˜ํ•ด ๋ด…์‹œ๋‹ค!

Important

๋ฐฐํฌ ํ™˜๊ฒฝ

  • ๐Ÿ’พ Server : MongoDB, Redis, AWS Ec2, AWS S3๋ฅผ ์ด์šฉํ•ด ์„œ๋ฒ„ ๊ตฌ์„ฑ
  • โ—€๏ธ Backend : express๋ฅผ ์ด์šฉํ•œ REST-ful API
  • โ–ถ๏ธ Frontend : React๋ฅผ ์ด์šฉํ•œ Node.js ์‹œ์Šคํ…œ

Clone

git clone https://github.com/bmrdevteam/Altsis.git

Backend

  1. ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ > backend๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
cd Altsis\backend
  1. ์˜์กด์„ฑ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
yarn

Tip

OS ํ™˜๊ฒฝ์— ๋งž๊ฒŒ yarn์„ ์„ค์น˜ํ•ด ๋‘ก์‹œ๋‹ค!

  1. cross-env, nodemon์„ ์ „์—ญ์œผ๋กœ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
yarn global add cross-env
yarn global add nodemon
  1. .env ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ , ํ•„์š”ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

Altsis>backend>.env

# CORS ์„ค์ •์„ ์œ„ํ•œ Frontend URL : ์˜ˆ์‹œ
URL='http://localhost:3030'

# Backend ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•  PORT : ์˜ˆ์‹œ
SERVER_PORT=8080

# MongoDB ํด๋Ÿฌ์Šคํ„ฐ ์—ฐ๊ฒฐ URI
DB_URL='mongodb+srv://*********:****************@******.*******.mongodb.net'

# Redis ์—ฐ๊ฒฐ URI
REDIS_URL='redis://default:********************************@redis-*****.****.****************.ec2.cloud.redislabs.com:*****'

# Session ์ €์žฅ์— ์‚ฌ์šฉํ•  ์•”ํ˜ธํ‚ค (mongoose-encryption)
session_key='********************************************'

# Google Login์— ์‚ฌ์šฉ๋˜๋Š” client ID (Google Cloud)
GOOGLE_CLIENT_ID='*********************************************.apps.googleusercontent.com'

# AWS S3 ์ง€์—ญ ์ •๋ณด : ์˜ˆ์‹œ
s3_region='ap-northeast-2'

# S3์— ํ”„๋กœํ•„ ์‚ฌ์ง„์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜
# AWS S3 ๋ฒ„ํ‚ท๋ช… : ์˜ˆ์‹œ
s3_bucket='altsis-profile'

# AWS S3 ์—…๋กœ๋“œ ๊ถŒํ•œ์„ ๊ฐ€์ง„ IAM์˜ keyId
s3_accessKeyId='********************'

# AWS S3 ์—…๋กœ๋“œ ๊ถŒํ•œ์„ ๊ฐ€์ง„ IAM์˜ secretAccessKey
s3_secretAccessKey='****************************************'

# S3์— ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜
# AWS S3 ์—…๋กœ๋“œ ๊ถŒํ•œ์„ ๊ฐ€์ง„ IAM์˜ keyId : ์˜ˆ์‹œ
s3_bucket2='altsis-files'

# AWS S3 ์—…๋กœ๋“œ ๊ถŒํ•œ์„ ๊ฐ€์ง„ IAM์˜ keyId
s3_accessKeyId2='********************'

# AWS S3 ์—…๋กœ๋“œ ๊ถŒํ•œ์„ ๊ฐ€์ง„ IAM์˜ secretAccessKey
s3_secretAccessKey2='****************************************'

# ์ˆ˜๊ฐ• ์ •๋ณด์˜ ํ‰๊ฐ€ ์ •๋ณด๋ฅผ ์•”ํ˜ธํ™”ํ•˜๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ (mongoose-encryption)
# ๊ณต๊ฐœํ‚ค(32๋น„ํŠธ)
ENCKEY_E=********************************************

# ์•”ํ˜ธํ‚ค(64๋น„ํŠธ)
SIGKEY_E=****************************************************************************************

# ํ•™์ƒ ๊ธฐ๋ก ์ •๋ณด๋ฅผ ์•”ํ˜ธํ™”ํ•˜๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ (mongoose-encryption)
# ๊ณต๊ฐœํ‚ค(32๋น„ํŠธ)
ENCKEY_A=********************************************

# ์•”ํ˜ธํ‚ค(64๋น„ํŠธ)
SIGKEY_A=****************************************************************************************

# ๋น„๋ฐ€๋ฒˆํ˜ธ ํ•ด์‹ฑ์„ ์œ„ํ•œ ์„ค์ •๊ฐ’ (passport) : ์˜ˆ์‹œ
saltRounds=10

Tip

  • URL์€ REST-API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” Frontend ์„œ๋ฒ„์˜ URL์ž…๋‹ˆ๋‹ค.
  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด MongoDB, Redis, Google Cloud, AWS S3์— ํ™˜๊ฒฝ ์„ค์ • ๋ฐ ํ•ด๋‹น ๊ฐ’์„ ํ˜ธ์ถœ ํ•  ์ค€๋น„๋ฅผ ํ•ฉ๋‹ˆ๋‹ค!
  • mongoose-encryption๋ฅผ ์ด์šฉํ•ด ์„ธ์…˜ ๋ฐ ์•”ํ˜ธํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  1. ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
yarn dev

frontend

  1. ์˜์กด์„ฑ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
yarn
  1. .env ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ , ํ•„์š”ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

altsis>frontend>.env

# Google Login์— ์‚ฌ์šฉ๋˜๋Š” client ID (Google Cloud)
REACT_APP_GOOGLE_CLIENT_ID='*********************************************.apps.googleusercontent.com'

# Frontend ์„œ๋ฒ„ URL : Backend PORT - ์˜ˆ์‹œ
REACT_APP_SERVER_URL='http://localhost:8080'

# Frontend ์„œ๋ฒ„ PORT - ์˜ˆ์‹œ
PORT=3030

Tip

  • Google Cloud Client ID๋Š” Backend ์„ค์ •๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
  1. ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
yarn start

์ดˆ๊ธฐ ์„ค์ •

  1. ์„ค์น˜ํ•œ MongoDB Database์— ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.

Tip

์‚ฌ์ง„/์˜์ƒ

image

image

  1. root>academies์— Academy Document๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
{
  "_id": {
    "$oid": [์ž๋™ ์ƒ์„ฑ]
  },
  "academyId": "root",
  "academyName": "root",
  "dbName": "root",
  "isActivated": true
}

Tip

์‚ฌ์ง„/์˜์ƒ

image

  1. ์•„์นด๋ฐ๋ฏธ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์•„์นด๋ฐ๋ฏธ ์ž…์žฅ ํ™”๋ฉด์ด ๋‚˜์˜ค๋ฉด ์•„์นด๋ฐ๋ฏธ ID์— root๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์ž…์žฅ์ด ์ •์ƒ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Tip

์‚ฌ์ง„/์˜์ƒ

๋…นํ™”_2023_09_13_17_26_06_930

  1. root ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— users ์ปฌ๋ ‰์…˜์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

Tip

์‚ฌ์ง„/์˜์ƒ

image image

  1. users์— ์†Œ์œ ์ž Document๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
{
  "_id": {
    "$oid": [์ž๋™ ์ƒ์„ฑ]
  },
  "academyId": "root",
  "academyName": "root",
  "auth":"owner",
  "userId": "admin",
  "userName": "๊ด€๋ฆฌ์ž",
  "password": "",
}

Tip

์‚ฌ์ง„/์˜์ƒ

image

  1. ์‚ฌ์šฉ์ž ๊ณ„์ •์ด ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋กœ๊ทธ์ธ ํ™”๋ฉด์—์„œ ์•„์ด๋””์— ์œ„์—์„œ ์„ค์ •ํ•œ userId๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž„์˜๋กœ ์ž…๋ ฅํ•œ ํ›„ '๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค'๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜์˜ค๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Tip

์‚ฌ์ง„/์˜์ƒ

๋…นํ™”_2023_09_13_17_27_44_774

  1. backend>src>_passport>localStrategy2.js ํŒŒ์ผ์—์„œ ๋กœ๊ทธ์ธ ์‹œ ์ž…๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ์‚ฌ์šฉ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋น„๊ตํ•˜๋Š” ์ฝ”๋“œ(29~35 Line)๋ฅผ ์ฃผ์„์ฒ˜๋ฆฌํ•˜๊ณ  ์„œ๋ฒ„๋ฅผ ์žฌ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Warning

๋กœ๊ทธ์ธ ํ›„์—๋Š” ๋ฐ˜๋“œ์‹œ ์ฃผ์„์„ ํ’€์–ด์ฃผ์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.

backend>src>_passport>localStrategy2.js

import passport from "passport";
import { Strategy as CustomStrategy } from "passport-custom";
import { Academy, User } from "../models/index.js";
import {
  ACADEMY_INACTIVATED,
  PASSWORD_INCORRECT,
  __NOT_FOUND,
} from "../messages/index.js";

const local2 = () => {
  passport.use(
    "local2",
    new CustomStrategy(async function (req, done) {
      const { academyId, userId, password } = req.body;

      const academy = await Academy.findOne({
        academyId,
      });
      if (!academy) {
        const err = new Error(__NOT_FOUND("academy"));
        return done(err, null, null);
      }
      if (!academy.isActivated) {
        const err = new Error(ACADEMY_INACTIVATED);
        return done(err, null, null);
      }

      const user = await User(academyId)
        .findOne({ userId })
        .select("+password");
      if (!user) {
        const err = new Error(__NOT_FOUND("user"));
        return done(err, null, null);
      }
// ์ฃผ์„ ์‹œ์ž‘
      const isMatch = await user.comparePassword(password);
      if (!isMatch) {
        const err = new Error(PASSWORD_INCORRECT);
        return done(err, null, null);
      }
// ์ฃผ์„ ๋
      user.password = undefined;
      return done(null, user, academyId);
    })
  );
};

export { local2 };

Tip

์‚ฌ์ง„/์˜์ƒ

image

  1. ์„œ๋ฒ„๋ฅผ ์žฌ์‹คํ–‰ํ•œ ํ›„ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.

Tip

์‚ฌ์ง„/์˜์ƒ

๋…นํ™”_2023_09_13_17_31_24_852

  1. ์‚ฌ์šฉ์ž ์„ค์ •์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. 7๋ฒˆ์—์„œ ์„ค์ •ํ•œ ์ฃผ์„์„ ํ•ด์ œํ•œ ํ›„ ์„œ๋ฒ„๋ฅผ ์žฌ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ์•„์›ƒ ํ›„ ์„ค์ •ํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋กœ๊ทธ์ธ์ด ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Tip

์‚ฌ์ง„/์˜์ƒ

๋…นํ™”_2023_09_13_17_33_36_431

์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋‚˜์š”?

Important

์‹œ์Šคํ…œ์„ ์šด์˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ด€๋ฆฌ์ž ๊ธฐ๋Šฅ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ด€๋ฆฌ์ž ๊ธฐ๋Šฅ

Important

โš™๏ธ ๊ด€๋ฆฌ์ž : โšซ ์‹œ์Šคํ…œ ๊ด€๋ฆฌ์ž(owner), ๐Ÿ”ด ์•„์นด๋ฐ๋ฏธ ๊ด€๋ฆฌ์ž(admin), ๐Ÿ”ต ํ•™๊ต ๊ด€๋ฆฌ์ž(manager)

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

์•„์นด๋ฐ๋ฏธ ์ƒ์„ฑ โšซ

Tip

์‚ฌ์ง„/์˜์ƒ

CAcademy

๋ฐฑ์—… โšซ๐Ÿ”ด

Tip

์‚ฌ์ง„/์˜์ƒ
BackupAndRestore.mp4

ํ•™๊ต

ํ•™๊ต ์ƒ์„ฑ ๐Ÿ”ด

Tip

์‚ฌ์ง„/์˜์ƒ

CSchool

์‚ฌ์šฉ์ž ๊ณ„์ • ์ƒ์„ฑ ๐Ÿ”ด

Tip

์‚ฌ์ง„/์˜์ƒ

CUsers

์‚ฌ์šฉ์ž ํ•™๊ต์— ๋“ฑ๋ก ๐Ÿ”ด

Tip

์‚ฌ์ง„/์˜์ƒ

CUserSchool

ํ•™๊ธฐ

ํ•™๊ธฐ ์ƒ์„ฑ ๐Ÿ”ต

Tip

์‚ฌ์ง„/์˜์ƒ

CSeason

ํ•™๊ธฐ ๋ณต์‚ฌํ•˜์—ฌ ์ƒ์„ฑ ๐Ÿ”ต

Tip

์‚ฌ์ง„/์˜์ƒ

CCopySeason

ํ•™๊ธฐ์— ์‚ฌ์šฉ์ž ๋“ฑ๋ก ๐Ÿ”ต

Tip

์‚ฌ์ง„/์˜์ƒ

CRegistration

ํ•™๊ธฐ ๊ต๊ณผ๋ชฉ ์„ค์ • ๐Ÿ”ต

Tip

์‚ฌ์ง„/์˜์ƒ

USeasonSubject

ํ•™๊ธฐ ๊ฐ•์˜์‹ค ์„ค์ • ๐Ÿ”ต

Tip

์‚ฌ์ง„/์˜์ƒ

USeasonClassrooms

์–‘์‹

ํ‰๊ฐ€ ์–‘์‹ ๐Ÿ”ต

Tip

์‚ฌ์ง„/์˜์ƒ

UFormEvaluation

๊ธฐ๋ก ์–‘์‹ ๐Ÿ”ต

Tip

์‚ฌ์ง„/์˜์ƒ

USchoolFormArchive

์‹œ๊ฐ„ํ‘œ ์–‘์‹ (์—๋””ํ„ฐโš ๏ธ) ๐Ÿ”ต

Tip

์‚ฌ์ง„/์˜์ƒ

UFormTimetable

๊ฐ•์˜๊ณ„ํš์„œ ์–‘์‹ (์—๋””ํ„ฐโš ๏ธ) ๐Ÿ”ต

Tip

์‚ฌ์ง„/์˜์ƒ

UFormSylabus

์ถœ๋ ฅ ์–‘์‹ (์—๋””ํ„ฐโš ๏ธ)๐Ÿ”ต

Tip

์‚ฌ์ง„/์˜์ƒ

CFormPrint

๊ถŒํ•œ

ํ•™๊ธฐ ๊ถŒํ•œ ์„ค์ • ๐Ÿ”ต

Note

  1. ์ˆ˜์—… ๊ฐœ์„ค ๊ถŒํ•œ
  2. ์ˆ˜๊ฐ•์‹ ์ฒญ ๊ถŒํ•œ
  3. ํ‰๊ฐ€ ๊ถŒํ•œ

Tip

์‚ฌ์ง„/์˜์ƒ

USeasonPermission

ํ•™๊ธฐ ํ™œ์„ฑํ™”/๋น„ํ™œ์„ฑํ™” ๐Ÿ”ต

Tip

์‚ฌ์ง„/์˜์ƒ

UActivateSeason

์‚ฌ์šฉ์ž ๊ธฐ๋Šฅ

Important

๐Ÿ˜„ ์‚ฌ์šฉ์ž : ํ•™์ƒ(student), ๊ต์‚ฌ(teacher)

์ˆ˜์—…

๊ฐ•์˜๊ณ„ํš์„œ ์ƒ์„ฑ โšช

Tip

์‚ฌ์ง„/์˜์ƒ

CSyllabus

์ˆ˜๊ฐ• ์‹ ์ฒญ โšช

Tip

์‚ฌ์ง„/์˜์ƒ

CEnrollment

โญ ์ˆ˜๊ฐ•์‹ ์ฒญ์ด ๋ชฐ๋ฆฌ๋Š” ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜๊ฐ•์‹ ์ฒญ ๋Œ€๊ธฐ์ฐฝ์ด ํ™œ์„ฑํ™”๋œ๋‹ค.

enrollment.test.mp4

์ˆ˜์—… ์ดˆ๋Œ€ โšช

Tip

์‚ฌ์ง„/์˜์ƒ

CEnrollmentByMentor

ํ‰๊ฐ€ โšช

Important

โ— ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ต๊ณผ๋ชฉ์ด ๊ฐ™์€ ์ˆ˜์—…์€ ํ•œ ํ•™๊ธฐ ๋‚ด์—์„œ ํ‰๊ฐ€ ์ •๋ณด๊ฐ€ ๋™๊ธฐํ™”๋˜๊ณ , ํ‰๊ฐ€ ๋‹จ์œ„๊ฐ€ 'ํ•™๋…„๋„'์ธ ํ‰๊ฐ€ ํ•ญ๋ชฉ์€ ํ•œ ํ•™๋…„๋„ ๋‚ด์—์„œ ํ‰๊ฐ€ ์ •๋ณด๊ฐ€ ๋™๊ธฐํ™”๋œ๋‹ค.

Tip

์‚ฌ์ง„/์˜์ƒ
  • ํ‰๊ฐ€ CEvaluation

  • ํ‰๊ฐ€ ๋™๊ธฐํ™” CEvaluation2

๊ธฐ๋ก

๋ˆ„์  ๊ธฐ๋ก ์ž…๋ ฅ โšช

Tip

์‚ฌ์ง„/์˜์ƒ

UArchive1

๋‹จ์ผ ๊ธฐ๋ก ์ž…๋ ฅ โšช

Tip

์‚ฌ์ง„/์˜์ƒ

UArchive2

๋ฌธ์„œ

๋ฌธ์„œ ์กฐํšŒ โšช

Tip

์‚ฌ์ง„/์˜์ƒ

RDocument

ํŽธ์˜ ๊ธฐ๋Šฅ

์ผ์ • โšช

Tip

์‚ฌ์ง„/์˜์ƒ
UCalendar.mp4

์‚ฌ์šฉ์ž ๊ฒ€์ƒ‰ โšช

Tip

์‚ฌ์ง„/์˜์ƒ

UserSearch

์•Œ๋ฆผ โšช

Tip

์‚ฌ์ง„/์˜์ƒ

CNotification

๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์ •๋ณด!

์„œ๋ฒ„

Node.js

์„œ๋ฒ„ ๊ตฌ์กฐ

Important

ํ”„๋กœ์ ํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ผ์šฐํŠธ(Route): HTTP ์š”์ฒญ์„ ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค.
  • ์ปจํŠธ๋กค๋Ÿฌ (Controller): ๋ผ์šฐํŒ…๋œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋ฉฐ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋ธ (Model): ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋  ๋ฐ์ดํ„ฐ ์Šคํ‚ค๋งˆ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

Note

  • MongoDB Cloud: ๋ฉ”์ธ DB์ž…๋‹ˆ๋‹ค.
    • ํ•™๊ต ๋ฐ์ดํ„ฐ๋Š” ๊ด€๊ณ„๊ฐ€ ๋งŽ์•„์„œ sql์ด ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์„œ๋น„์Šค์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์ธ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๊ธฐ๋Šฅ์„ ์‚ด๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” MongoDB๊ฐ€ ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.
  • Redis Cloud: ์ผ์‹œ์ ์ด๊ณ  ๋น ๋ฅด๊ฒŒ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    • ๋กœ๊ทธ์ธ ์„ธ์…˜ ์ €์žฅ
    • ์•Œ๋ฆผ ์ˆ˜์‹  ์‹œ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ์„ ์œ„ํ•œ ์†Œ์ผ“ ์ •๋ณด ์ €์žฅ
    • ์ˆ˜๊ฐ•์‹ ์ฒญ ์‹œ ์‹ค์‹œ๊ฐ„ ๋Œ€๊ธฐ๋ฒˆํ˜ธ ์ „์†ก์„ ์œ„ํ•œ ์†Œ์ผ“ ์ •๋ณด ์ €์žฅ

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

Important

  • MongoDB ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์— ๋‘ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋ฃจํŠธ DB(root): ์•„์นด๋ฐ๋ฏธ ๋„ํ๋จผํŠธ์™€ ์†Œ์œ ์ž ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž ๋„ํ๋จผํŠธ๊ฐ€ ์ €์žฅ๋œ๋‹ค.
    • ์•„์นด๋ฐ๋ฏธ DB({academyId}-db): ๊ฐ€์ž…๋œ ์•„์นด๋ฐ๋ฏธ๋ณ„๋กœ ๋„ํ๋จผํŠธ๊ฐ€ ์ €์žฅ๋œ๋‹ค. ex) knu-db
  • ๊ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” ๋™์ผํ•œ ๊ตฌ์กฐ์˜ ์ปฌ๋ ‰์…˜์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

Note

๋ฃจํŠธ DB

  • academies: ๊ฐ€์ž…๋œ ์•„์นด๋ฐ๋ฏธ
  • users: ์•„์นด๋ฐ๋ฏธ๋ฅผ ์ƒ์„ฑ/๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์†Œ์œ ์ž ๊ณ„์ •

Note

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

  • users: ๊ด€๋ฆฌ์ž ๊ณ„์ •์„ ํฌํ•จํ•œ ์•„์นด๋ฐ๋ฏธ ์‚ฌ์šฉ์ž ๊ณ„์ •
  • schools: ํ•™๊ต ์ •๋ณด
    • ํ•™๊ต ๋ณ„๋กœ ๊ธฐ๋ก ์–‘์‹์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • seasons: ํ•™๊ต์— ์ƒ์„ฑ๋œ ํ•™๊ธฐ ์ •๋ณด
    • ํ•™๊ธฐ ๋ณ„๋กœ ๊ถŒํ•œ๊ณผ ์–‘์‹์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ถŒํ•œ: ์ˆ˜์—… ๊ฐœ์„ค/์ˆ˜๊ฐ•์‹ ์ฒญ/ํ‰๊ฐ€ ๊ถŒํ•œ
    • ์–‘์‹: ๊ฐ•์˜์‹ค, ๊ต๊ณผ๋ชฉ, ๊ฐ•์˜๊ณ„ํš์„œ ์–‘์‹, ํ‰๊ฐ€ ์–‘์‹
  • registrations: ํ•™๊ธฐ ๋“ฑ๋ก ์ •๋ณด
    • user A, school B, season C๊ฐ€ ์žˆ์„ ๋•Œ user A๋ฅผ school B์— ๋“ฑ๋กํ•œ ํ›„์— season C์— ํ•™์ƒ ๋˜๋Š” ์„ ์ƒ์œผ๋กœ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • syllabus: ๊ฐ•์˜๊ณ„ํš์„œ
  • enrollment: ์ˆ˜๊ฐ• ์ •๋ณด
    • user A, syllabus B๊ฐ€ ์žˆ์„ ๋•Œ user A๊ฐ€ B ์ˆ˜์—…์— ์ˆ˜๊ฐ•์‹ ์ฒญ์„ ํ•˜๋ฉด enrollment C๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
    • ์ˆ˜๊ฐ• ์ •๋ณด์—๋Š” ํ‰๊ฐ€ ์ •๋ณด(evaluation)๊ฐ€ ํฌํ•จ๋˜๊ณ , ํ‰๊ฐ€ ์ •๋ณด๋Š” ์•”ํ˜ธํ™”๋˜์–ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • archive: ๊ธฐ๋ก ์ •๋ณด
    • ํ•™๊ต ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ๊ธฐ๋ก ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค
    • ์•”ํ˜ธํ™”๋˜์–ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค
  • forms: ์–‘์‹
    • ํ•™๊ต ๋ณ„๋กœ ๊ฐ•์˜๊ณ„ํš์„œ, ์‹œ๊ฐ„ํ‘œ, ๋ฌธ์„œ ๋“ฑ์˜ ์–‘์‹์„ ์ƒ์„ฑํ•˜๊ณ  ์ •์˜ํ•ฉ๋‹ˆ๋‹ค
  • notification: ์•Œ๋ฆผ
    • ์ˆ˜์—…์˜ ๋ฉ˜ํ† ์ธ ์„ ์ƒ๋‹˜์€ ์ˆ˜๊ฐ•์ƒ๋“ค์—๊ฒŒ ์•Œ๋ฆผ์„ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

01 MongoDB Atlas | ๋ฉ”์ธ DB

Note

There are two types of DB; Root DB and academy DB

  • Root DB(root-db)
    • ์•„์นด๋ฐ๋ฏธ ๋„ํ๋จผํŠธ์™€ ์‚ฌ์šฉ์ž(์†Œ์œ ์ž) ๋„ํ๋จผํŠธ๊ฐ€ ์ €์žฅ๋œ๋‹ค.
  • Academy DB({academyId}-db)
    • ์•„์นด๋ฐ๋ฏธ ๊ด€๋ จ ๋„ํ๋จผํŠธ๊ฐ€ ์ €์žฅ๋œ๋‹ค.
      • ํ•™๊ต, ์‚ฌ์šฉ์ž(๊ด€๋ฆฌ์ž, ๋งค๋‹ˆ์ €, ๋ฉค๋ฒ„), ํ•™๊ธฐ, โ€ฆ

๋ฐ์ดํ„ฐ ๋ชจ๋ธ ์„ค๊ณ„

Note

  • https://bmrdevteam.github.io/altsis-docs/api/Models.html
  • backend>models ํด๋” ๋‚ด์˜ ๊ฐ ๋ชจ๋ธ ํŒŒ์ผ์—์„œ jsdoc์œผ๋กœ ๋ฌธ์„œ๋ฅผ ์ •์˜ํ•œ๋‹ค
  • npm run jsdoc ์‹คํ–‰ ์‹œ backend>docs์— html ํŒŒ์ผ์ด ์ƒ์„ฑ๋จ -> ์ด๋ฅผ ๊ฐœ๋ฐœ ๋ฌธ์„œ ์—…๋กœ๋“œ ๋ ˆํฌ์— ์—…๋กœ๋“œํ•œ๋‹ค

02 Redis Cloud | ์บ์‹œ DB

Note

  • ๋กœ๊ทธ์ธ ์„ธ์…˜ ์ €์žฅ
  • ์•Œ๋ฆผ ์ˆ˜์‹  ์‹œ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ์„ ์œ„ํ•œ ์†Œ์ผ“ ์ •๋ณด ์ €์žฅ
  • ์ˆ˜๊ฐ•์‹ ์ฒญ ์‹œ ์‹ค์‹œ๊ฐ„ ๋Œ€๊ธฐ๋ฒˆํ˜ธ ์ „์†ก์„ ์œ„ํ•œ ์†Œ์ผ“ ์ •๋ณด ์ €์žฅ

03 AWS S3 | ํŒŒ์ผ ์ €์žฅ์†Œ

Note

  • ํ”„๋กœํ•„ ์‚ฌ์ง„
  • ๊ธฐ๋ก ํŒŒ์ผ
  • ์•„์นด๋ฐ๋ฏธ ๋ฐฑ์—… ํŒŒ์ผ
  • ๋กœ๊ทธ

ํŒŒ์ผ ์ €์žฅ์†Œ

Note

  • AWS S3
    • ํ”„๋กœํ•„ ์‚ฌ์ง„ ๋ฒ„ํ‚ท
      • /original/ ๊ฒฝ๋กœ์— ํ”„๋กœํ•„ ์‚ฌ์ง„ ์—…๋กœ๋“œ๋˜๋ฉด AWS Lambda๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜์–ด ์‚ฌ์ง„์„ ๋ฆฌ์‚ฌ์ด์ง•ํ•˜๊ณ  /thumb/ ๊ฒฝ๋กœ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
    • ์•„์นด๋ฐ๋ฏธ ํŒŒ์ผ ๋ฒ„ํ‚ท
      • ํ•™์ƒ ๊ธฐ๋ก(archive) ํŒŒ์ผ ์ €์žฅ
      • ๋ฐฑ์—… ํŒŒ์ผ ์ €์žฅ
    • ๋กœ๊น… ๋ฒ„ํ‚ท
      • /raw/ ๊ฒฝ๋กœ์— ๋ฐฐํฌ ํ™˜๊ฒฝ ๋กœ๊ทธ๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
      • ์ •๊ฐ์ด ๋˜๋ฉด AWS Lambda๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜์–ด ์ „๋‚ ์˜ ๋กœ๊ทธ๋ฅผ /yyyy-mm-dd/ ๊ฒฝ๋กœ๋กœ ์˜ฎ๊น๋‹ˆ๋‹ค.

๋ฐฐํฌ

๋ฐฐํฌ ํ™˜๊ฒฝ

Note

  • AWS S3: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋นŒ๋“œ๋˜์–ด ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.
  • AWS CloudFront: ํด๋ผ์ด์–ธํŠธ์— ๋„๋ฉ”์ธ ์ฃผ์†Œ๋ฅผ ์ ์šฉํ•ด๊ณ  https ํ†ต์‹ ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ์บ์‹ฑ์œผ๋กœ ์†๋„ ํ–ฅ์ƒ์— ์ด์ ์„ ์ค„ ์ˆ˜ ์žˆ์ง€๋งŒ ํ˜„์žฌ๋Š” ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ฐ”๋กœ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
  • AWS EC2, Docker: EC2 ์ธ์Šคํ„ด์Šค์— Docker๋กœ ์„œ๋ฒ„ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ALB: https ํ†ต์‹ ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • Auto Scaling๋„ ๊ณ ๋ คํ–ˆ์œผ๋‚˜ ์ ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋ฐฐํฌ ์„ค๊ณ„ | AWS

ํด๋ผ์ด์–ธํŠธ ๋ฐฐํฌ

Note

  • AWS S3
  • AWS CloudFront
  • AWS Route53
  • AWSย Certificate Manager(ACM) - https ํ†ต์‹ ์„ ์œ„ํ•œ SSL ์ธ์ฆ์„œ ๋ฐœ๊ธ‰

์„œ๋ฒ„ ๋ฐฐํฌ

Note

  • AWS EC2
  • AWS ALB(Application Load Balancer)
    • https ํ†ต์‹ ์„ ์œ„ํ•ด ์ ์šฉํ•จ
  • AWS Route53
    • ์„œ๋ธŒ๋„๋ฉ”์ธ์œผ๋กœ ์„œ๋ฒ„ ์ฃผ์†Œ ํ• ๋‹น

CI/CD | Gihub Actions

๋ฐฐํฌ์šฉ Access Token์„ ๋ฐœ๊ธ‰๋ฐ›๊ณ  Github secret์— ๋“ฑ๋ก ๋ฐฉ๋ฒ•

Note

  1. Personal Access Token ์ƒ์„ฑ:
  • GitHub ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์˜ ํ”„๋กœํ•„ ์‚ฌ์ง„์„ ํด๋ฆญํ•˜๊ณ , "Settings"๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ์™ผ์ชฝ ๋ฉ”๋‰ด์—์„œ "Developer settings" ์•„๋ž˜์˜ "Personal access tokens"์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • "Generate token"์„ ํด๋ฆญํ•˜๊ณ  ํ•„์š”ํ•œ ๊ถŒํ•œ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐฐํฌ์— ํ•„์š”ํ•œ ๊ถŒํ•œ์„ ์„ ํƒํ•ด์•ผ ํ•˜๋ฉฐ, worlflow, write:packages, delete:packages๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • ํ† ํฐ์„ ์ƒ์„ฑํ•˜๊ณ  ์•ˆ์ „ํ•œ ์žฅ์†Œ์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  1. GitHub Secrets์— ๋“ฑ๋ก:
  • ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋กœ ์ด๋™ํ•˜์—ฌ "Settings"๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  • ์™ผ์ชฝ ๋ฉ”๋‰ด์—์„œ "Secrets"๋ฅผ ์„ ํƒํ•˜๊ณ , "New repository secret"์„ ํด๋ฆญํ•˜์—ฌ ์ƒˆ๋กœ์šด ์‹œํฌ๋ฆฟ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ์‹œํฌ๋ฆฟ ์ด๋ฆ„(GHCR_TOKEN_์•„์ด๋””)์„ ์ง€์ •ํ•˜๊ณ , ์•ž์„œ ์ƒ์„ฑํ•œ Personal Access Token ๊ฐ’์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ๋ฐฐํฌ ์ž๋™ํ™”

Note

  • See .github > workflows > frontend-pipeline.yml
  • frontend ๋ธŒ๋žœ์น˜์— push๊ฐ€ ์ผ์–ด๋‚˜๋ฉด ๋ฐฐํฌ๊ฐ€ ์‹œ์ž‘๋จ
  • CI/CD
    1. Github container registry์—์„œ ์บ์‹œ ๋ฐ›์•„์˜ด
    2. Github secrets์— ์ €์žฅ๋œ ๊ฐ’์œผ๋กœ .envํŒŒ์ผ ์ƒ์„ฑ
    3. ๋ชจ๋“ˆ ์„ค์น˜ ํ›„ ๋นŒ๋“œ
    4. ๋นŒ๋“œ ํŒŒ์ผ s3 ํด๋ผ์ด์–ธํŠธ ๋ฐฐํฌ์šฉ ๋ฒ„์ผ“์— ์—…๋กœ๋“œ
    5. ์Šฌ๋ž™ ์•Œ๋ฆผ

์„œ๋ฒ„ ๋ฐฐํฌ ์ž๋™ํ™”

Note

  • See .github > workflows > backend-pipeline.yml
  • backend ๋ธŒ๋žœ์น˜์— push๊ฐ€ ์ผ์–ด๋‚˜๋ฉด ๋ฐฐํฌ๊ฐ€ ์‹œ์ž‘๋จ
  • CI
    1. GitHub ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋กœ๊ทธ์ธ
    2. Github secrets์— ์ €์žฅ๋œ ๊ฐ’์œผ๋กœ .envํŒŒ์ผ ์ƒ์„ฑ
    3. bakcend>Dockerfile๋กœ Docker image ๋นŒ๋“œํ•˜๊ณ  Github container registry์— push
    4. ์Šฌ๋ž™ ์•Œ๋ฆผ
  • CD
    1. action runner๋กœ ๋“ฑ๋ก๋œ ec2์—์„œ ์‹คํ–‰๋จ
    2. Github container registry์— ๋กœ๊ทธ์ธ ํ›„ Docker image pull
    3. Docker container ์‹คํ–‰
      • --restart on-failure ์˜ต์…˜์œผ๋กœ ์„œ๋ฒ„๊ฐ€ ๋‹ค์šด๋์„ ๋•Œ ์ž๋™์œผ๋กœ ์žฌ์‹คํ–‰๋˜๋„๋ก ์„ค์ •
    4. ์Šฌ๋ž™ ์•Œ๋ฆผ

API

API ๋ฌธ์„œ

Note

  • https://bmrdevteam.github.io/altsis-docs/api/APIs.html
  • backend>controllers ํด๋” ๋‚ด์˜ ๊ฐ ์ปจํŠธ๋กค๋Ÿฌ ํŒŒ์ผ์—์„œ jsdoc์œผ๋กœ ๋ฌธ์„œ๋ฅผ ์ •์˜ํ•œ๋‹ค
  • npm run jsdoc ์‹คํ–‰ ์‹œ backend>docs์— html ํŒŒ์ผ์ด ์ƒ์„ฑ๋จ -> ์ด๋ฅผ ๊ฐœ๋ฐœ ๋ฌธ์„œ ์—…๋กœ๋“œ ๋ ˆํฌ์— ์—…๋กœ๋“œํ•œ๋‹ค

ํด๋ผ์ด์–ธํŠธ์—์„œ API ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•

Note

  • frontend>...>hooks>useAPIv2 ํ›…์œผ๋กœ API๋ฅผ ์ •์˜ํ•˜๊ณ  ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค
  • useAPIv2์—์„œ ์‚ฌ์šฉํ•˜๋Š” API ์ด๋ฆ„๊ณผ API ๋ฌธ์„œ์—์„œ์˜ API ์ด๋ฆ„์€ ๋™์ผํ•˜๋‹ค

API ๋ฒ„๊ทธ ํ•ด๊ฒฐ ์˜ˆ์‹œ

Note

  1. ํ•™๊ธฐ ์ƒ์„ฑ ๊ธฐ๋Šฅ์— ๋ฒ„๊ทธ ๋ฐœ๊ฒฌ
  2. ํด๋ผ์ด์–ธํŠธ์—์„œ ํ•™๊ธฐ ์ƒ์„ฑ์— ์–ด๋–ค API๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค ex) CSeason API
  3. API ๋ฌธ์„œ์—์„œ CSeason API๋ฅผ ์ฐพ๊ณ  ์š”์ฒญ์„ ์ œ๋Œ€๋กœ ๋ณด๋ƒˆ๋Š”์ง€ ํ™•์ธ
  4. ์š”์ฒญ์„ ์ œ๋Œ€๋กœ ๋ณด๋ƒˆ๋‹ค๋ฉด backend ํด๋”์—์„œ "CSeason"์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ํ•ด๋‹น API ์ฝ”๋“œ ํ™•์ธ
  5. ์‘๋‹ต์— ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ๋ถ€๋ถ„์„ ์ฐพ์•„ ์›์ธ ํŒŒ์•…
  6. ๋ฒ„๊ทธ ์ˆ˜์ • ํ›„ ๋ฐฐํฌ

LOGGING

๋กœ๊น… ๊ด€๋ จ ๋ชจ๋“ˆ

Note

winston, winston-daily-rotate-file, morgan, s3-streamlogger-daily

๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ์˜ ๋กœ๊น…

Note

  • backend>logs ํด๋”์— ๋กœ๊ทธ ํŒŒ์ผ ์ƒ์„ฑ๋จ

๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ์˜ ๋กœ๊น…

Note

  • AWS S3์˜ ๋กœ๊ทธ ๋ฒ„ํ‚ท์— ๋กœ๊ทธ ํŒŒ์ผ ์ƒ์„ฑ๋จ
  • raw ํด๋”์— ์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ ๊ธฐ๋ก๋จ
    • ์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ ํŒŒ์ผ ์ด๋ฆ„์€ ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋œ ์‹œ๊ฐ„์œผ๋กœ, ์‹ค์ œ ์„œ๋ฒ„๊ฐ€ ๊ธฐ๋ก๋˜๋Š” ์‹œ๊ฐ„๊ณผ๋Š” ๋ฌด๊ด€ํ•˜๋‹ค
  • ๋งค์ผ ์ž์ •์— AWS Lambda ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์‹คํ–‰๋˜์–ด ์ „๋‚  ๋กœ๊ทธ๋ฅผ archived ํด๋”๋กœ ์˜ฎ๊ธด๋‹ค
    • ex) 2023๋…„ 1์›” 10์ผ์— ๊ธฐ๋ก๋œ ๋กœ๊ทธ๋Š” 2023๋…„ 1์›” 11์ผ ์ž์ •์— archived/2023-01-10 ํด๋”๋กœ ์˜ฎ๊ฒจ์ง„๋‹ค

๋กœ๊ทธ ๊ตฌ์„ฑ

Note

์š”์ฒญ ์‹œ๊ฐ, http, http ๋ฒ„์ „, ip ์ฃผ์†Œ, user.academyId, user._id, method(POST, GET, ...), url, req.body, res.status, response time(ms), referrer, user agent

์ง์ ‘ ์„ค์น˜ํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ

Important

Altsis๋Š” ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์„œ๋ฒ„์— ์„ค์น˜ํ•˜์—ฌ ์ด์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง์ ‘ ์„ค์น˜ํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ ์ด๋ฏธ ์„œ๋ฒ„๋ฅผ ์ด์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ด€๋ฆฌ์ž์—๊ฒŒ ์š”์ฒญํ•˜์—ฌ ์•„์นด๋ฐ๋ฏธ๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์•„ ์ด์šฉ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์•„์นด๋ฐ๋ฏธ ์„œ๋ฒ„๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋‹จ์ฒด์˜ ์•ˆ๋‚ด์ž…๋‹ˆ๋‹ค.

Tip

  • AEG(Altsis Educator Group)๋Š” ๋ณ„๋ฌด๋ฆฌํ•™๊ต์—์„œ ์šด์˜ํ•˜๋Š” Altsis ์„œ๋ฒ„(https://altsis.org) ๋ฅผ ์ž„๋Œ€ํ•˜์—ฌ ํ•™๊ต(๋˜๋Š” ๋‹จ์ฒด)์—์„œ ์ œ๊ณตํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์‚ฌํ•ญ์€ AEG ๋ฌธ์„œ๋ฅผ ํ™•์•ˆํ•˜์„ธ์š”.

๋ฌธ์„œ๋“ค์€ ์–ด๋””์—?

Important

Altsis์™€ ๊ด€๋ จ๋œ ๋ฌธ์„œ๋Š” Github Page์—์„œ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Tip

๋ฌธ์„œ๋Š” ์•„๋ž˜์˜ ์„น์…˜์œผ๋กœ ๋‚˜๋ˆ ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์˜ ์ฐธ์—ฌ๋กœ Altsis์˜ ์‹œ์Šคํ…œ ๋ฌธ์„œ๋ฅผ ๋ฐœ์ „ ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์—ฌํ•˜๋Š” ๋ฐฉ๋ฒ•!

Important

์ด ํ”„๋กœ์ ํŠธ์˜ ์ฃผ์š” ๋ชฉ์ ์€ Altsis์˜ ์ฃผ์š” ๊ธฐ๋Šฅ์„ ๋”์šฑ ๋ฐœ์ „ ์‹œํ‚ค๊ณ  ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋”์šฑ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. Altsis๋Š” Github๋ฅผ ํ†ตํ•ด์„œ ๊ฐœ๋ฐœํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋Š” ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ๋ฐœ์ „์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ข‹์€ ๋„๊ตฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ์•„๋ž˜ ๋ฌธ์„œ๋ฅผ ์ž์„ธํžˆ ์ฝ๊ณ  ํ”„๋กœ์ ํŠธ์— ๋™์ฐธํ•ด์ฃผ์„ธ์š”.

Tip

Code of Conduct๋Š” ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌํ•  ๋•Œ ์ง€์ผœ์•ผ ํ•  ์•ฝ์†๊ณผ ํƒœ๋„๋ฅผ ๊ธฐ์ˆ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ผ์ด์„ผ์Šค

Altsis is MIT licensed.

About

๐Ÿ…ฐ๏ธ Altsis(Alternative School Infomation System)๋Š” ๋ชจ๋“  ํ•™๊ต๋ฅผ ์œ„ํ•œ ๋Œ€์•ˆ์ ์ธ ํ•™๊ต ์ •๋ณด ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.

Topics

Resources

License

Code of conduct

Security policy

Stars

Watchers

Forks