Django는 웹 애플리케이션을 빠르고 효율적으로 개발할 수 있는 강력한 Python 기반 프레임워크입니다. 이번 글에서는 Django를 사용해 방문 출입 관리 시스템을 구축하는 방법을 단계별로 설명합니다. 이 시스템은 방문자의 출입 정보를 관리하고, 사용자 친화적인 웹 인터페이스를 통해 데이터를 입력하고 조회할 수 있는 기능을 제공합니다.
목차
- 방문 출입 관리 시스템 설계
 - 개발 환경 준비
 - Django 프로젝트 생성
 - 앱 생성 및 설정
 - 데이터베이스 모델 설계
 - 관리자 페이지 설정
 - 방문자 정보 입력 및 목록 조회 기능 구현
 - 검색 및 필터링 기능 추가
 - 출입 상태 업데이트 기능 구현
 - 템플릿을 활용한 UI 개발
 - 배포 준비 및 테스트
 - 맺음말
 
1. 방문 출입 관리 시스템 설계
주요 요구사항
- 방문자 관리: 방문자의 이름, 연락처, 방문 목적, 방문 시간, 출입 상태(입장/퇴장) 기록.
 - 검색 및 필터링: 방문자 이름, 방문 목적, 날짜별 검색 기능.
 - 출입 상태 관리: 방문자가 입장했는지, 퇴장했는지 표시.
 - 보안: 관리자만 데이터에 접근 가능하도록 인증 기능 제공.
 
2. 개발 환경 준비
(1) Python 설치
Python 3.8 이상 설치. 설치 확인:
<bash>
python --version
(2) 가상환경 설정
<bash>
python -m venv venv  
source venv/bin/activate  # Mac/Linux  
venv\Scripts\activate     # Windows
(3) Django 설치
<bash>
pip install django
3. Django 프로젝트 생성
(1) 프로젝트 생성
<bash>
django-admin startproject visitor_management
cd visitor_management
(2) 개발 서버 실행
<bash>
python manage.py runserver
브라우저에서 http://127.0.0.1:8000/를 열어 Django 기본 페이지를 확인합니다.
4. 앱 생성 및 설정
(1) 앱 생성
방문 출입 관리를 위한 visitors 앱을 생성합니다.
<bash>
python manage.py startapp visitors
(2) 앱 등록
settings.py 파일의 INSTALLED_APPS에 새로 생성한 앱을 추가합니다.
<python>
INSTALLED_APPS = [
    ...
    'visitors',
]
5. 데이터베이스 모델 설계
방문자 정보를 저장할 모델을 정의합니다.
(1) 모델 정의
visitors/models.py에서 다음과 같이 방문자 모델을 작성합니다:
<python>
from django.db import models
class Visitor(models.Model):
    name = models.CharField(max_length=100)  # 방문자 이름
    contact = models.CharField(max_length=15)  # 연락처
    purpose = models.CharField(max_length=200)  # 방문 목적
    check_in_time = models.DateTimeField(auto_now_add=True)  # 입장 시간
    check_out_time = models.DateTimeField(null=True, blank=True)  # 퇴장 시간
    status = models.CharField(
        max_length=10,
        choices=[('IN', '입장'), ('OUT', '퇴장')],
        default='IN'
    )  # 출입 상태
    def __str__(self):
        return self.name
(2) 마이그레이션
모델을 데이터베이스에 반영합니다.
<bash>
python manage.py makemigrations
python manage.py migrate
6. 관리자 페이지 설정
(1) 관리자 페이지에서 방문자 관리
admin.py 파일에 모델을 등록합니다:
<python>
from django.contrib import admin
from .models import Visitor
@admin.register(Visitor)
class VisitorAdmin(admin.ModelAdmin):
    list_display = ('name', 'contact', 'purpose', 'check_in_time', 'status')
    list_filter = ('status', 'check_in_time')
    search_fields = ('name', 'purpose')
(2) 관리자 계정 생성
<bash>
python manage.py createsuperuser
http://127.0.0.1:8000/admin/에서 로그인 후 방문자 데이터를 관리할 수 있습니다.
7. 방문자 정보 입력 및 목록 조회 기능 구현
(1) 뷰(View) 작성
views.py에서 방문자 입력과 목록 조회를 처리하는 뷰를 작성합니다.
<python>
from django.shortcuts import render, redirect
from .models import Visitor
from .forms import VisitorForm
def visitor_list(request):
    visitors = Visitor.objects.all().order_by('-check_in_time')
    return render(request, 'visitors/visitor_list.html', {'visitors': visitors})
def add_visitor(request):
    if request.method == 'POST':
        form = VisitorForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('visitor_list')
    else:
        form = VisitorForm()
    return render(request, 'visitors/add_visitor.html', {'form': form})
(2) URL 설정
urls.py 파일을 작성합니다:
<python>
from django.urls import path
from . import views
urlpatterns = [
    path('', views.visitor_list, name='visitor_list'),
    path('add/', views.add_visitor, name='add_visitor'),
]
(3) 폼(Form) 작성
forms.py 파일을 생성하여 모델 폼을 작성합니다:
<python>
from django import forms
from .models import Visitor
class VisitorForm(forms.ModelForm):
    class Meta:
        model = Visitor
        fields = ['name', 'contact', 'purpose']
(4) 템플릿 작성
방문자 목록 템플릿 (visitor_list.html)
<html>
<!DOCTYPE html>
<html>
<head>
    <title>Visitor List</title>
</head>
<body>
    <h1>Visitor List</h1>
    <a href="/add/">Add Visitor</a>
    <table border="1">
        <tr>
            <th>Name</th>
            <th>Contact</th>
            <th>Purpose</th>
            <th>Check-in</th>
            <th>Status</th>
        </tr>
        {% for visitor in visitors %}
        <tr>
            <td>{{ visitor.name }}</td>
            <td>{{ visitor.contact }}</td>
            <td>{{ visitor.purpose }}</td>
            <td>{{ visitor.check_in_time }}</td>
            <td>{{ visitor.status }}</td>
        </tr>
        {% endfor %}
    </table>
</body>
</html>
방문자 추가 템플릿 (add_visitor.html)
<html>
<!DOCTYPE html>
<html>
<head>
    <title>Add Visitor</title>
</head>
<body>
    <h1>Add Visitor</h1>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Submit</button>
    </form>
    <a href="/">Back to List</a>
</body>
</html>
8. 검색 및 필터링 기능 추가
(1) 검색 기능
뷰에서 검색어를 처리합니다.
<python>
def visitor_list(request):
    query = request.GET.get('q')
    if query:
        visitors = Visitor.objects.filter(name__icontains=query)
    else:
        visitors = Visitor.objects.all().order_by('-check_in_time')
    return render(request, 'visitors/visitor_list.html', {'visitors': visitors})
(2) 검색 폼 추가
visitor_list.html에 검색 입력 폼 추가:
<html>
<form method="get">
    <input type="text" name="q" placeholder="Search by name">
    <button type="submit">Search</button>
</form>
9. 출입 상태 업데이트 기능 구현
(1) 상태 업데이트 뷰 작성
<python>
def update_status(request, pk):
    visitor = Visitor.objects.get(pk=pk)
    visitor.status = 'OUT' if visitor.status == 'IN' else 'IN'
    visitor.save()
    return redirect('visitor_list')
(2) URL 설정
<python>
path('update_status/<int:pk>/', views.update_status, name='update_status'),
(3) 버튼 추가
visitor_list.html에 상태 변경 버튼 추가:
<html>
<td>
    <a href="/update_status/{{ visitor.id }}/">
        {% if visitor.status == 'IN' %} Mark as Out {% else %} Mark as In {% endif %}
    </a>
</td>
10. 배포 준비 및 테스트
배포를 위해 Gunicorn 및 Nginx를 설정하거나 Heroku, AWS 등의 클라우드 서비스를 사용합니다.
확장 가능한 추가 기능 아이디어
1. Excel 내보내기 기능
- 방문 기록을 Excel 파일로 다운로드할 수 있는 기능을 추가하면 관리자가 데이터를 더 쉽게 분석할 수 있습니다.
 - Django의 django-import-export 라이브러리를 활용하여 구현 가능.
 
2. QR 코드 기반 방문 관리
- 방문자가 QR 코드를 스캔하여 입장/퇴장을 기록하도록 시스템 확장.
 - Python의 qrcode 라이브러리를 사용하여 QR 코드를 생성하고 스캔 이벤트 처리.
 
3. 알림 기능
- 방문자가 입장하거나 퇴장할 때 관리자가 이메일이나 SMS 알림을 받을 수 있도록 구현.
 - Django의 django.core.mail 모듈 또는 Twilio API를 활용.
 
4. 다중 사용자 인증
- 관리자뿐만 아니라, 리셉션 담당자, 보안 담당자 등 다양한 역할을 가진 사용자를 위한 권한 관리 추가.
 - Django의 Permission 및 Group 기능 활용.
 
5. 실시간 대시보드
- 현재 입장 중인 방문자 목록, 일별 방문자 수 등을 실시간으로 표시하는 대시보드 구현.
 - Django Channels와 WebSocket을 사용하여 실시간 데이터를 제공.
 
11. 맺음말
이 가이드를 통해 Django로 방문 출입 관리 시스템을 구축할 수 있습니다.
- 핵심 기능: 방문자 관리, 상태 업데이트, 검색 및 필터링 기능을 구현하여 방문 출입 데이터를 체계적으로 관리.
 - 확장 가능성: 이 시스템은 향후 알림 기능, 출입 기록 다운로드, QR 코드 스캔 등을 추가하여 더 강력한 관리 도구로 확장할 수 있습니다.
 
Django의 강력한 ORM과 내장 기능을 활용하면 복잡한 로직을 단순화하면서 효율적으로 웹 애플리케이션을 개발할 수 있습니다.
2930 Blog에서 더 알아보기
구독을 신청하면 최신 게시물을 이메일로 받아볼 수 있습니다.
