기술 스택 및 개발 환경 구성
본 프로젝트는 Python을 주 언어로 사용하며, 백엔드 데이터 저장소로 MySQL을 채택하고, 웹 프레임워크로는 Django와 Flask를 병행 활용한다. 특히 Django는 MVT(Model-View-Template) 아키텍처 기반의 고성능 프레임워크로, 빠른 개발과 확장성에서 뛰어난 장점을 제공한다.
- 개발 언어: Python 3.7 이상 (권장: 3.8)
- 프레임워크: Django 또는 Flask
- 데이터베이스: MySQL 5.7 / 8.0
- 개발 도구: PyCharm, Navicat for MySQL
- 브라우저: Google Chrome 최신 버전
시스템 개요
온라인 시험 관리 시스템은 교육 과정에서 평가 업무를 자동화하여 교수자의 채점 부담을 줄이고, 학습자는 언제든지 자기 주도적으로 평가를 수행할 수 있도록 지원한다. B/S(Browser/Server) 구조 기반으로 개발되어 별도 설치 없이 웹 브라우저만으로 접근 가능하며, 직관적인 UI를 통해 사용 편의성을 극대화하였다.
핵심 기능 목표
- PyCharm을 활용한 전후방단 코드 개발 능력 습득
- Django/Flask 기반 웹 애플리케이션 설계 및 구현 경험 축적
- MySQL 데이터베이스 설계 및 SQL 쿼리 운영 능력 향상
- 웹 보안 인증 메커니즘 구현을 통한 실무 역량 강화
시스템 아키텍처 설계
소프트웨어 공학 원칙에 따라 요구 분석부터 유지보수까지 전 생애주기 모델을 적용하여 체계적으로 개발을 진행한다.
1. 데이터베이스 설계
사용자 정보, 시험 문제, 응시 기록, 성적 데이터 등을 효율적으로 관리하기 위해 정규화된 스키마를 설계하며, 주요 테이블 간 외래키 기반의 관계를 정의한다. 예를 들어, users, exams, questions, results 테이블이 상호 연계되도록 구성한다.
2. 전반적인 아키텍처 구성
프론트엔드는 HTML/CSS/JavaScript 기반으로 제작되며, Vue.js와 같은 반응형 프레임워크와 통합 가능하다. 백엔드는 Python 기반의 RESTful API를 제공하며, 클라이언트 요청을 처리하고 데이터베이스와 상호작용한다.
3. 사용자 경험(UX) 중심 설계
로그인, 회원가입, 시험 응시, 성적 확인 등의 주요 흐름을 최소 클릭 수로 설계하여 사용자가 자연스럽게 탐색할 수 있도록 한다. 입력 폼 검증, 에러 메시지 표시 등 세부 요소에도 신경 쓴다.
4. 객체지향 설계 원칙 적용
시스템 전반에 걸쳐 클래스 기반의 설계를 적용하여 코드 재사용성과 유지보수성을 높인다. 예를 들어, 사용자 관련 로직은 UserManager 클래스로, 인증 처리는 AuthHandler 클래스로 캡슐화하여 개발한다.
기술 구현 경로
- 프론트엔드: HTML5, CSS3, JavaScript, Vue.js
- 백엔드: Python + Django 또는 Flask
- 데이터베이스: MySQL
- 통합 도구: PyCharm, Git, Navicat
설치 및 실행 절차
- MySQL 서버에 새로운 데이터베이스 생성 후, 제공된
.sql파일을 통해 스키마 및 초기 데이터 임포트 - PyCharm에서 프로젝트 열기
config.ini또는settings.py내 DB 연결 정보를 본인의 환경에 맞게 수정- 가상 환경 설정 및 필요한 패키지 설치 (
pip install -r requirements.txt) - 서버 실행:
python manage.py runserver(Django), 또는flask run(Flask) - 브라우저에서
http://localhost:8000접속
성능 및 보안 고려사항
다수의 동시 접속자를 고려하여 세션 관리, 쿼리 최적화, 인덱스 설계에 주의를 기울이며, 보안 면에서는 SQL 인젝션 방지, CSRF 토큰, 비밀번호 해시 저장(예: bcrypt), 로그 기록 등을 기본적으로 적용한다. 필요 시 HTTPS 적용 및 요청 제한(rate limiting) 기능을 추가할 수 있다.
기술적 타당성 분석
Django는 자체 ORM, 관리자 인터페이스, 사용자 인증 시스템 등을 내장하고 있어 개발 속도가 매우 빠르며, Flask는 마이크로서비스 형태로 유연하게 구성 가능하다. 두 프레임워크 모두 활성화된 커뮤니티와 풍부한 문서를 제공하므로 초보자도 비교적 쉽게 접근 가능하다. MySQL 또한 안정적이고 무료인 RDBMS로, 중소규모 시스템에 적합하다. 모든 사용 도구가 오픈소스이므로 경제적 비용이 거의 발생하지 않으며, 유지보수 및 확장 비용 또한 낮다.
핵심 코드 예시
Flask 기반 동적 라우팅 로딩
import os
from flask import Blueprint
api_bp = Blueprint('api', __name__)
# 뷰 모듈 자동 로딩
module_list = []
source_dir = os.path.join(os.getcwd(), 'views')
ignore_files = {'__init__.py', 'base.py'}
for filename in os.listdir(source_dir):
if filename.endswith('.py') and filename not in ignore_files:
module_name = filename[:-3]
exec(f'from views.{module_name} import *')
module_list.append(module_name)
print(f"Loaded modules: {', '.join(module_list)}")
Django 기반 사용자 인증 처리
from django.http import JsonResponse
from .models import User
from utils.auth import TokenGenerator
from utils.response import success_response, error_response
def login(request):
if request.method == "POST":
username = request.POST.get('username')
password = request.POST.get('password')
try:
user = User.objects.get(username=username)
if user.check_password(password):
token = TokenGenerator.generate(user.id)
return JsonResponse(success_response({
'token': token,
'user_id': user.id,
'role': user.role
}))
else:
return JsonResponse(error_response('비밀번호가 일치하지 않습니다.'))
except User.DoesNotExist:
return JsonResponse(error_response('사용자를 찾을 수 없습니다.'))
return JsonResponse(error_response('허용되지 않는 요청입니다.'))
연구 방법론
- 문헌 조사법: 기존 온라인 시험 시스템 관련 논문 및 오픈소스 프로젝트 분석을 통해 요구사항 파악 및 설계 기반 마련
- 실증 연구법: 실제 사용자 그룹을 대상으로 시스템 테스트를 수행하여 피드백 수집 및 UX 개선
- 경험 정리법: 개발 과정에서 발생한 문제 해결 사례를 문서화하고, 이를 바탕으로 최적의 개발 패턴 도출