WeniVooks

검색

Django 베이스캠프

요구사항 명세서

우리는 앞서 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 사용자 관리
  1. 사용자 유형
    • 사서(Librarian): 도서 및 회원 정보 관리
    • 일반 사용자(User): 도서 대출, 반납 및 예약
  2. 인증 기능
    • 회원가입(이메일, 비밀번호)
    • 로그인, 로그아웃
1.3.2 도서 관리
  1. 도서 정보
    • 도서명, 저자, ISBN, 출판사
    • 전체 수량, 대출 가능 수량
    • 도서 상태(대출 중, 대출 가능)
    • 도서 등록, 수정, 삭제(사서 전용)
    • 도서 목록 출력
  2. 도서 검색 (선택 사항)
    • 도서명 또는 저자로 검색
    • ISBN으로 검색
    • 검색 결과 목록 출력
    • 도서 상세 정보 확인
    • 검색 결과 페이징
1.3.3 대출/반납 시스템
  1. 대출 관리
    • 도서 대출
    • 1인당 최대 3권 대출 가능
    • 대출 기간 (14일)
    • 연체 시 추가 대출 제한
  2. 반납 관리
    • 도서 반납
    • 연체일 수 계산
    • 반납 시 예약자 우선 순위 처리 (선착순)
1.3.4 예약 시스템
  1. 도서 예약 규칙
    • 대출 중인 도서 예약 불가
    • 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 프로젝트 구조 설명
  1. lms_project/: 프로젝트 폴더
  2. manage.py: Django 관리 명령어
  3. db.sqlite3: SQLite 데이터베이스 파일
  4. config/: 프로젝트 설정 폴더
    • settings.py: 프로젝트 설정
    • urls.py: 프로젝트 URL 설정
    • wsgi.py: WSGI 설정
    • asgi.py: ASGI 설정
  5. static/: 정적 파일
    • css/: CSS 파일
    • js/: JavaScript 파일
  6. templates/: 공통 템플릿
    • base.html: 기본 템플릿
    • navbar.html: 네비게이션 바
  7. accounts/: 사용자 관리 앱
    • models.py: 사용자 모델
    • forms.py: 사용자 폼
    • views.py: 사용자 뷰
    • urls.py: 사용자 URL 설정
    • admin.py: 사용자 관리 관리자 설정
    • templates/accounts/: 사용자 관리 템플릿
    • migrations/: 마이그레이션 파일
    • apps.py: 앱 설정
  8. 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>/: 도서 상태 확인 API
  • loans/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',
    }
}
 
7장 Library Management System (LMS) 구현 실습7.2 User, AbstractUser, AbstractBaseUser 모델 설명