요구사항 명세서
우리는 앞서 Django의 여러가지 기능을 배우고 사용해봤습니다. 이제 이를 활용하여 가상의 시나리오(요구사항)를 기반으로 한 프로젝트를 구현해보겠습니다.
도서관 관리 시스템(Library Management System, LMS) 을 구현해보겠습니다.
이를 통해 Django의 다양한 기능을 활용하여, 프로젝트 요구사항에 맞게 모델을 설계하고 기능을 구현하는 실습을 진행하겠습니다.
1. 도서관 관리 시스템(Library Management System, LMS) 요구사항 명세서
1.1 프로젝트 개요
- 프로젝트명: 도서관 관리 시스템(Library Management System, LMS)
- 개발 기간 3일(18시간)
- 개발 환경: Django, Python, SQLite, Bootstrap(선택사항)
1.2 프로젝트 설명
도서관 관리 시스템(Library Management System, LMS)은 도서관의 도서 및 회원 정보를 관리하는 시스템입니다.
1.3 프로젝트 기능
1.3.1 사용자 관리
- 사용자 유형
- 사서(Librarian): 도서 및 회원 정보 관리
- 일반 사용자(User): 도서 대출, 반납 및 예약
- 인증 기능
- 회원가입(이메일, 비밀번호)
- 로그인, 로그아웃
1.3.2 도서 관리
- 도서 정보
- 도서명, 저자, ISBN, 출판사
- 전체 수량, 대출 가능 수량
- 도서 상태(대출 중, 대출 가능)
- 도서 등록, 수정, 삭제(사서 전용)
- 도서 목록 출력
- 도서 검색 (선택 사항)
- 도서명 또는 저자로 검색
- ISBN으로 검색
- 검색 결과 목록 출력
- 도서 상세 정보 확인
- 검색 결과 페이징
1.3.3 대출/반납 시스템
- 대출 관리
- 도서 대출
- 1인당 최대 3권 대출 가능
- 대출 기간 (14일)
- 연체 시 추가 대출 제한
- 반납 관리
- 도서 반납
- 연체일 수 계산
- 반납 시 예약자 우선 순위 처리 (선착순)
1.3.4 예약 시스템
- 도서 예약 규칙
- 대출 중인 도서 예약 불가
- 1인당 도서별 1회 예약 가능
- 예약 유효기간 (1일)
1.4 프로젝트 구조
프로젝트 구조는 다음과 같이 구성합니다.
lms_project/
├── manage.py # Django 관리 명령어
├── db.sqlite3 # SQLite 데이터베이스 파일
│
├── config/ # 프로젝트 설정 폴더
│ ├── __init__.py
│ ├── asgi.py # ASGI 설정
│ ├── settings.py # 프로젝트 설정
│ ├── urls.py # 프로젝트 URL 설정
│ └── wsgi.py # WSGI 설정
│
├── static/ # 정적 파일
│ ├── css/ # CSS 파일
│ └── js/ # JavaScript 파일
│
├── templates/ # 공통 템플릿
│ ├── base.html # 기본 템플릿
│ └── navbar.html # 네비게이션 바
│
├── accounts/ # 사용자 관리 앱
│ ├── migrations/
│ ├── templates/ # 사용자 관리 템플릿
│ │ └── accounts/ # accounts 앱 템플릿
│ │ ├── login.html # 로그인
│ │ ├── register.html # 회원가입
│ │ └── profile.html # 프로필
│ ├── __init__.py
│ ├── admin.py # 사용자 관리 관리자 설정
│ ├── apps.py
│ ├── forms.py # 사용자 폼
│ ├── models.py # 사용자 모델
│ ├── urls.py # 사용자 URL 설정
│ └── views.py # 사용자 뷰
│
└── books/ # 도서 관리 앱
├── migrations/
├── templates/ # 도서 관리 템플릿
│ └── books/ # books 앱 템플릿
│ ├── book_list.html # 도서 목록
│ ├── book_detail.html # 도서 상세
│ ├── loan_list.html # 대출 목록
│ ├── loan_form.html # 대출 폼
│ └── reservation_list.html # 예약 목록
├── __init__.py
├── admin.py # 도서 관리 관리자 설정
├── apps.py
├── forms.py # 도서 폼
├── models.py # 도서 모델
├── urls.py # 도서 URL 설정
└── views.py # 도서 뷰
lms_project/
├── manage.py # Django 관리 명령어
├── db.sqlite3 # SQLite 데이터베이스 파일
│
├── config/ # 프로젝트 설정 폴더
│ ├── __init__.py
│ ├── asgi.py # ASGI 설정
│ ├── settings.py # 프로젝트 설정
│ ├── urls.py # 프로젝트 URL 설정
│ └── wsgi.py # WSGI 설정
│
├── static/ # 정적 파일
│ ├── css/ # CSS 파일
│ └── js/ # JavaScript 파일
│
├── templates/ # 공통 템플릿
│ ├── base.html # 기본 템플릿
│ └── navbar.html # 네비게이션 바
│
├── accounts/ # 사용자 관리 앱
│ ├── migrations/
│ ├── templates/ # 사용자 관리 템플릿
│ │ └── accounts/ # accounts 앱 템플릿
│ │ ├── login.html # 로그인
│ │ ├── register.html # 회원가입
│ │ └── profile.html # 프로필
│ ├── __init__.py
│ ├── admin.py # 사용자 관리 관리자 설정
│ ├── apps.py
│ ├── forms.py # 사용자 폼
│ ├── models.py # 사용자 모델
│ ├── urls.py # 사용자 URL 설정
│ └── views.py # 사용자 뷰
│
└── books/ # 도서 관리 앱
├── migrations/
├── templates/ # 도서 관리 템플릿
│ └── books/ # books 앱 템플릿
│ ├── book_list.html # 도서 목록
│ ├── book_detail.html # 도서 상세
│ ├── loan_list.html # 대출 목록
│ ├── loan_form.html # 대출 폼
│ └── reservation_list.html # 예약 목록
├── __init__.py
├── admin.py # 도서 관리 관리자 설정
├── apps.py
├── forms.py # 도서 폼
├── models.py # 도서 모델
├── urls.py # 도서 URL 설정
└── views.py # 도서 뷰
1.4.1 프로젝트 구조 설명
lms_project/
: 프로젝트 폴더manage.py
: Django 관리 명령어db.sqlite3
: SQLite 데이터베이스 파일config/
: 프로젝트 설정 폴더settings.py
: 프로젝트 설정urls.py
: 프로젝트 URL 설정wsgi.py
: WSGI 설정asgi.py
: ASGI 설정
static/
: 정적 파일css/
: CSS 파일js/
: JavaScript 파일
templates/
: 공통 템플릿base.html
: 기본 템플릿navbar.html
: 네비게이션 바
accounts/
: 사용자 관리 앱models.py
: 사용자 모델forms.py
: 사용자 폼views.py
: 사용자 뷰urls.py
: 사용자 URL 설정admin.py
: 사용자 관리 관리자 설정templates/accounts/
: 사용자 관리 템플릿migrations/
: 마이그레이션 파일apps.py
: 앱 설정
books/
: 도서 관리 앱models.py
: 도서 모델forms.py
: 도서 폼views.py
: 도서 뷰urls.py
: 도서 URL 설정admin.py
: 도서 관리 관리자 설정templates/books/
: 도서 관리 템플릿migrations/
: 마이그레이션 파일apps.py
: 앱 설정
1.5 URL 구조
1.5.1 메인
/
: 메인 페이지(도서 목록 페이지)
1.5.2 인증 관련 (Accounts)
/accounts/register/
: 회원가입/accounts/login/
: 로그인/accounts/logout/
: 로그아웃/accounts/profile/
: 프로필(마이페이지)- 대출 내역
- 예약 내역
- 개인 정보 수정
1.5.3 도서 관련 (Books)
/books/
: 도서 목록 및 검색 (도서명, 저자, ISBN)/books/<int:pk>/
: 도서 상세 정보/books/create/
: 도서 등록(사서 전용)/books/<int:pk>/update/
: 도서 수정(사서 전용)/books/<int:pk>/delete/
: 도서 삭제(사서 전용)
1.5.4 대출 관련 (Loans)
/loans/
: 전체 도서 대출 목록 (사서 전용)/loans/user/
: 사용자 대출 목록 (일반 사용자)/loans//create/<int:book_id>/
: 도서 대출 신청/loans/return/<int:loan_id>/
: 도서 반납/loans/overdue/
: 연체 도서 목록 (사서 전용)
1.5.5 예약 관련 (Reservations)
/reservations/
: 전체 도서 예약 목록 (사서 전용)/reservations/user/
: 내 예약 현황 (일반 사용자)/reservations/create/<int:book_id>/
: 도서 예약 신청/reservations/cancel/<int:reservation_id>/
: 도서 예약 취소
1.5.6 선택 사항 엔드 포인트
/books/search/
: 도서 검색/books/status/<int:book_id>/
: 도서 상태 확인 APIloans/status/<int:loan_id>/
: 대출 상태 확인 API
2. 기본 셋업 명령어
2.1 가상환경 설정
python -m venv venv
source venv/bin/activate # macOS/Linux
.\venv\Scripts\activate # Windows
python -m venv venv
source venv/bin/activate # macOS/Linux
.\venv\Scripts\activate # Windows
2.2 Django 설치
pip install django
pip install django
2.3 프로젝트 생성
django-admin startproject config . # 현재 폴더에 config 프로젝트 생성
django-admin startproject config . # 현재 폴더에 config 프로젝트 생성
2.4 서버 실행
python manage.py runserver
# 이후 db.sqlite3 파일이 생성됩니다.
python manage.py runserver
# 이후 db.sqlite3 파일이 생성됩니다.
2.5 앱 생성
python manage.py startapp accounts
python manage.py startapp books
python manage.py startapp accounts
python manage.py startapp books
2.6 앱 등록
config/settings.py
파일의 INSTALLED_APPS
에 앱 등록
INSTALLED_APPS = [
...
'accounts',
'books',
]
INSTALLED_APPS = [
...
'accounts',
'books',
]
2.7 프로젝트 추가 설정
config/settings.py
파일에 추가 설정
# Static files (CSS, JavaScript, Images)
STATIC_URL = '/static/'
STATICFILES_DIRS = [
BASE_DIR / 'static',
]
# templates
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')], # 템플릿 폴더 설정
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
# language, timezone
LANGUAGE_CODE = 'ko-kr'
TIME_ZONE = 'Asia/Seoul'
# Database
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# Static files (CSS, JavaScript, Images)
STATIC_URL = '/static/'
STATICFILES_DIRS = [
BASE_DIR / 'static',
]
# templates
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')], # 템플릿 폴더 설정
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
# language, timezone
LANGUAGE_CODE = 'ko-kr'
TIME_ZONE = 'Asia/Seoul'
# Database
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}