Skip to content

사용자 인증, 학점 관리, 졸업 요건 관리, 포트폴리오 관리를 위한 오픈소스 백엔드 서버

License

Notifications You must be signed in to change notification settings

ssum21/uniment-server

Repository files navigation

Uniment-Server

소개

Uniment-Server는 대학생들의 학업 및 진로 관리를 위한 종합 플랫폼의 백엔드 서버입니다. MongoDB와 Express.js를 기반으로 구축되었으며, 학점 관리부터 포트폴리오 및 자기소개서 관리까지 통합된 서비스를 제공합니다.

주요 기능

1. 학사 정보 관리

  • 대학별 졸업 요건 관리
  • 학점 계산 및 트래킹
  • 수강 과목 관리

2. 포트폴리오 관리

  • 어학 성적, 자격증, 수상 경력 등 관리
  • 카테고리별 분류 및 검색
  • 성과 트래킹

3. 자기소개서 관리

  • 기업별 자기소개서 작성 및 관리
  • 버전 관리 및 히스토리 추적
  • 템플릿 기반 작성 지원

기술 스택

Backend

const express = require('express');
const mongoose = require('mongoose');
const cors = require('cors');
const jwt = require('jsonwebtoken');
const app = express();
app.use(cors());
app.use(express.json());

Database

  • MongoDB with Mongoose
  • 데이터 모델링 및 정규화
async function initializeUniversities() {
    try {
        await mongoose.connect(process.env.MONGODB_URI);
        console.log('MongoDB 연결 성공');
        await University.deleteMany({});
        const result = await University.insertMany(universities);
        console.log(`${result.length}개 대학 정보 추가 완료`);
    } catch (error) {
        console.error('초기화 실패:', error);
        process.exit(1);
    }
}

API

  • RESTful API 설계
  • 모듈화된 라우터 구조
app.use('/api/graduation', graduationRouter);
app.use('/api/portfolio', portfolioRouter);
app.use('/api/resumes', resumesRouter);
app.use('/api/users', userRouter);
app.use('/api/courses', courseRouter);
app.use('/api/credits', creditsRouter);

강점

1. 확장성 있는 아키텍처

  • 모듈화된 코드 구조
  • 마이크로서비스 지향 설계
  • 유연한 API 구조

2. 실시간 데이터 동기화

router.get('/credits/summary', async (req, res) => {
    try {
        const { userId } = req.query;
        const user = await User.findById(userId);
        const credits = await Credit.find({ userId });
        let totalRequired = 0;
        let totalCurrent = 0;
        credits.forEach(credit => {
            if (credit.category === '전체') {
                totalRequired = credit.credits.required;
                totalCurrent = credit.credits.current;
            }
        });
        res.json({
            totalCredits: {
                current: totalCurrent,
                required: totalRequired,
                remaining: totalRequired - totalCurrent
            }
        });
    } catch (error) {
        res.status(500).json({ message: error.message });
    }
});

3. 대학별 맞춤 정보

router.get('/universities/:name', async (req, res) => {
    try {
        const university = await University.findOne({ name: req.params.name });
        res.json({
            name: university.name,
            credits: {
                total: university.totalCredits,
                major: university.majorCredits,
                general: university.generalCredits
            }
        });
    } catch (error) {
        res.status(500).json({ message: error.message });
    }
});

설치 및 실행

환경 변수 설정

.env 파일을 생성하고 다음 값을 추가하세요:

MONGODB_URI=your_mongodb_connection_string
JWT_SECRET=your_jwt_secret
PORT=3000
FIREBASE_ENABLED=true
FIREBASE_STORAGE_BUCKET=your_storage_bucket

의존성 설치

npm install

개발 서버 실행

npm run dev

프로덕션 서버 실행

npm start

API 문서

자기소개서 API

엔드포인트

  • GET /api/resumes/user/:userId: 사용자의 자기소개서 목록 조회
  • GET /api/resumes/:id: 특정 자기소개서 상세 조회
  • POST /api/resumes: 새 자기소개서 작성
  • PUT /api/resumes/:id: 자기소개서 수정
  • DELETE /api/resumes/:id: 자기소개서 삭제
  • GET /api/resumes/count/:userId: 사용자의 자기소개서 개수 조회
// 자기소개서 작성 예시
POST /api/resumes
{
  "userId": "user_id",
  "company": "회사명",
  "position": "지원 포지션",
  "type": "신입",
  "applicationDate": "2024-03-20",
  "content": "자기소개서 내용",
  "tags": ["태그1", "태그2"]
}

학점 관리 API

엔드포인트

  • POST /api/credits: 학점 정보 추가/수정
  • GET /api/credits/summary: 학점 요약 정보 조회
    • 필수 이수 학점
    • 전체 이수 학점
    • 남은 학점 계산
    • 이수 과목 수 통계
// 학점 요약 조회 예시
GET /api/credits/summary?userId=user_id
Response:
{
  "totalCredits": {
    "current": 85,
    "required": 130,
    "remaining": 45
  },
  "courses": {
    "completed": 28,
    "required": 42,
    "remaining": 14
  }
}

졸업 요건 API

  • POST /api/requirements: 졸업 요건 등록
    • 대학/학과별 졸업 요건 설정
    • 전공/교양 필수 학점 관리
    • 세부 이수 요건 설정
// 졸업 요건 등록 예시
POST /api/requirements
{
  "university": "대학명",
  "major": "전공명",
  "requirements": {
    "totalCredits": 130,
    "major": {
      "basic": 18,
      "required": 45,
      "elective": 21
    },
    "general": {
      "required": 15,
      "distributed": 21,
      "free": 10
    }
  }
}

대학 정보 API

엔드포인트

  • GET /api/universities/names: 모든 대학 목록 조회

  • GET /api/universities/:name: 특정 대학 정보 조회

  • GET /api/universities/:name/majors: 특정 대학의 전공 목록 조회

// 대학 정보 조회 예시
GET /api/universities/경희대학교
Response:
{
  "name": "경희대학교",
  "credits": {
    "total": 130,
    "major": 66,
    "general": 64
  }
}

인증 및 보안

  • 모든 API는 JWT 기반 인증 필요

  • CORS 설정으로 허용된 출처만 접근 가능

// 인증 헤더 예시
headers: {
  'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'
}

에러 처리

모든 API는 다음과 같은 표준화된 에러 응답 포맷을 사용합니다: { "message": "에러 메시지", "status": 400, "details": "상세 에러 정보" }

API 테스트

API 테스트는 Jest와 Supertest를 사용하여 수행할 수 있습니다:

// API 테스트 예시 const request = require('supertest'); const app = require('../index');

describe('API Tests', () => { test('학교 정보 등록', async () => { const response = await request(app) .post('/api/users/school-info') .send({ name: "테스트대학교", major: "컴퓨터공학", admissionYear: 2024 }); expect(response.status).toBe(201); }); });

기여 가이드

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

라이선스

Apache License 2.0

연락처


이 프로젝트는 대학생들의 학업과 진로 관리를 돕기 위한 오픈소스 프로젝트입니다. 많은 기여와 피드백을 환영합니다.

About

사용자 인증, 학점 관리, 졸업 요건 관리, 포트폴리오 관리를 위한 오픈소스 백엔드 서버

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published