Skip to content

dev-everyday/exam_scheduler

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

49 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

시험 일정을 예약하고 관리할 수 있는 REST API 서비스입니다.

1. 설치 및 실행 방법

필수 요구사항

  • Python 3.10 이상
  • PostgreSQL 14 이상
  • Redis

설치 방법

  1. 저장소 클론
git clone https://github.com/dev-everyday/exam_scheduler.git
cd exam_scheduler
  1. 가상환경 생성 및 활성화
python -m venv venv
source venv/bin/activate  # Linux/Mac
venv\Scripts\activate     # Windows
  1. 의존성 패키지 설치
pip install -r requirements.txt
  1. PostgreSQL 데이터베이스 생성
# PostgreSQL 접속
psql -U postgres

# 데이터베이스 생성
CREATE DATABASE exam_scheduler;

# 데이터베이스 생성 확인
\l
  1. 환경 변수 설정 .env 파일을 생성하고 다음 내용을 입력합니다:
DB_NAME=exam_scheduler
DB_USER=postgres
DB_PASSWORD=your_db_password
DB_HOST=localhost
DB_PORT=5432
SECRET_KEY=your_secret_key
  1. Redis 설치 및 실행
# Redis 설치 및 실행 (Windows)
# Window의 경우 https://github.com/microsoftarchive/redis/releases 에서 Redis-x64-xxx.msi 다운로드 및 설치
redis-server

# Redis 설치 및 실행 (Mac)
brew install redis
brew services start redis

# Redis 서버 상태 확인
redis-cli ping
  1. 데이터베이스 마이그레이션
python manage.py migrate
  1. 관리자 계정 생성
python manage.py createsuperuser
# 사용자 이름, 이메일, 비밀번호를 입력하세요
  1. 서버 실행
python manage.py runserver

2. 주요 기능 요약

  • 시험 일정 예약

    • 현재 시간에서 3일 이상 이후부터 3개월 이내의 날짜만 예약 가능
    • 시간대별 최대 5만명까지 예약 가능
    • 예약 가능한 시간대 조회 기능(1시간 단위로 신청 가능)
  • 예약 관리

    • 본인 예약 조회/수정/취소(수정, 취소는 대기 중일 경우에만 가능)
    • 관리자 사용자 예약 관리
  • 자동화된 기능

    • 초기 시험 시간대 생성(3일 후부터 3개월 후까지 24시간 기준으로 자동 추가)
    • 매일 자동으로 다음 날의 시험 시간대 생성(마지막 시간으로부터 24시간)
    • 분산 락을 통한 동시성 제어

3. Swagger 기반 API 문서 활용 가이드

  1. 서버 실행 후 다음 URL에 접속:
http://localhost:8000/swagger/
  1. API 문서 확인

    • 각 API의 요청/응답 형식 확인 가능
    • API 테스트 가능
  2. 인증

    • 맨 처음 Login을 통해서 생성한 유저의 token 발급
    • 우측 상단의 'Authorize' 버튼 클릭
    • 토큰 입력 (형식: Token your_token_here)
    • 'Authorize' 버튼 클릭하여 인증 완료

4. API 목록

메서드 엔드포인트 설명
GET /examslots/available/ 특정 날짜의 예약 가능한 시간대 조회
POST /reservation/ 시험 예약 생성
GET /reservation/my/ 본인의 예약 조회
PATCH /reservation/my/ 본인의 예약 수정 (대기 중일 경우)
DELETE /reservation/my/ 본인의 예약 삭제 (대기 중일 경우)
GET /reservation/admin/ 관리자 - 전체 예약 목록 조회
GET /reservation/admin/{id} 관리자 - 해당 예약 조회
PATCH /reservation/admin/{id} 관리자 - 해당 예약 수정
DELETE /reservation/admin/{id} 관리자 - 해당 예약 삭제
POST /reservation/admin/{id}/confirm 관리자 - 해당 예약 확정
POST /users/login/ 로그인 (Token 발급)
POST /users/signup/ 회원 가입
GET /users/my/ 본인 정보 조회
PUT /users/my/ 본인 정보 수정
DELETE /users/my/ 본인 정보 삭제
GET /users/admin/ 관리자 - 전체 사용자 목록 조회
GET /users/admin/{id} 관리자- 해당 사용자 조회
PUT /users/admin/{id} 관리자- 해당 사용자 수정
DELETE /users/admin/{id} 관리자- 해당 사용자 삭제

5. 기술 스택

  • Backend

    • Django 5.2
    • Django REST Framework 3.16.0
    • PostgreSQL
    • Redis
    • APScheduler 3.11.0
  • 인증/인가

    • Token Authentication
    • Django Authentication System
  • 문서화

    • drf-yasg (Swagger/OpenAPI)
  • 동시성 제어

    • Redis Distributed Lock
    • Django Transaction

6. DB 스키마

users

필드 타입 설명
id BigAutoField Primary Key
username CharField(150) 사용자 아이디
password CharField(128) 비밀번호
is_superuser BooleanField 관리자 여부
created_at DateTimeField 생성 시간
updated_at DateTimeField 수정 시간

exam_slots

필드 타입 설명
id BigAutoField Primary Key
date DateField 날짜
hour IntegerField 시간 (0-23)
max_capacity IntegerField 최대 수용 인원
current_count IntegerField 현재 예약 인원
created_at DateTimeField 생성 시간
updated_at DateTimeField 수정 시간

reservations

필드 타입 설명
id BigAutoField Primary Key
user ForeignKey 사용자 ID
start_time DateTimeField 시작 시간
end_time DateTimeField 종료 시간
count IntegerField 예약 인원 수
status CharField 상태 (pending/cancelled/accepted)
created_at DateTimeField 생성 시간
updated_at DateTimeField 수정 시간

reservations_exam_slots (중간 테이블)

필드 타입 설명
id BigAutoField Primary Key
reservation_id ForeignKey 예약 ID
examslot_id ForeignKey 시험 시간대 ID

7. 고려했던 상황과 해결방안

동시성 제어 문제

  • 상황: 여러 관리자가가 동시에 같은 시간대를 예약을 확정할 때 발생할 수 있는 경쟁 상태 문제
  • 해결방안:
    • Redis 분산 락(Distributed Lock)을 사용하여 동시 접근 제어
    • Django의 트랜잭션 관리와 함께 사용하여 데이터 일관성 보장
    • 락 획득 시도 시 타임아웃 설정으로 데드락 방지

예약 시간대 자동 생성

  • 상황: 매일 새로운 예약 시간대를 수동으로 생성하는 것은 비효율적
  • 해결방안:
    • APScheduler를 사용하여 매일 자동으로 다음 날의 시간대 생성
    • 서버 시작 시 초기 시간대 데이터 생성 로직 구현(시작일~3달 뒤까지 1시간 단위로 생성함)
    • 시간대 생성 시 벌크 인서트(Bulk Insert)를 사용하여 성능 최적화

시간대 검증

  • 상황: 과거 시간대나 너무 먼 미래의 시간대 예약 방지 필요
  • 해결방안:
    • 예약 시 시작 시간과 종료 시간의 유효성 검증
    • 현재 시간에서 3일 이상 이후부터 3개월 이내의 날짜만 예약 가능하도록 제한

API 문서화

  • 상황: 다양한 API를 제공하나 사용자(클라이언트 개발자, 운영자 등)들이 요청/응답 형식과 사용 방법을 명확히 이해하지 못할 수 있음
  • 해결방안:
    • drf-yasg를 활용한 Swagger 기반 자동 문서화 적용
    • 각 API에 대한 request/response 스펙 명시 및 테스트 기능 제공
    • 인증이 필요한 API 사용을 위한 Token 기반 인증 방식 가이드 제공

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages