이 글은 피로그래밍 22기 Django 세션을 위해 작성되었습니다.
오늘 세션의 내용은 아니지만 제가 19기에 진행한 Django 기초 세션 자료를 다시 정리해 봤습니다. 오늘 세션을 위해 간단하게 읽어만 주세요!
웹 개발의 시작
웹 개발을 배우기 위해서는 기본적인 웹 동작 원리를 이해하는 것이 필요하다. 웹이 어떻게 동작하는지 알면 클라이언트와 서버의 역할을 명확히 이해하고, 개발 과정에서 발생할 수 있는 문제를 더 쉽게 해결할 수 있다. 따라서 이번 글에서는 클라이언트-서버 구조, 프론트엔드와 백엔드의 차이를 가볍게 다룬 뒤 Django에 대해서 알아볼 예정이다.
웹 동작 흐름
웹의 기본 동작은 클라이언트와 서버 간의 요청과 응답으로 이루어진다. 브라우저가 클라이언트 역할을 하여 서버에 요청을 보내면, 서버는 그에 대한 응답을 돌려준다. 이러한 상호작용은 HTTP 프로토콜을 기반으로 이루어진다. 이를 통해 클라이언트는 원하는 데이터를 받아 화면에 출력할 수 있다.
클라이언트와 서버
- 클라이언트: 요청을 보내는 주체이다. 예를 들어, 브라우저나 모바일 앱이 클라이언트 역할을 한다.
- 서버: 요청에 응답하는 주체이다. 클라이언트의 요청을 처리하고 데이터를 반환하거나 HTML 페이지를 생성한다.
이러한 구조는 데이터를 주고받기 위한 기본적인 흐름을 제공하며, 모든 웹 애플리케이션에서 중요한 개념이다.
프론트엔드와 백엔드 비교
프론트엔드와 백엔드는 서로 다른 역할을 담당하며, 웹 애플리케이션을 완성하는 데 필요한 두 축이다.
- 프론트엔드:
- 사용자 인터페이스(UI)를 설계하고 구현한다.
- 사용자 입력 데이터를 처리한다.
- 데이터와 시각적인 요소를 사용자에게 출력한다.
- 백엔드:
- 데이터베이스와의 연동을 처리한다.
- 비즈니스 로직을 구현한다.
- 시스템 전반의 관리와 제어를 담당한다.
이 둘의 협업을 통해 사용자는 직관적이고 빠른 웹 애플리케이션을 경험할 수 있다.
프레임워크와 라이브러리
웹 개발에서는 효율적인 개발을 위해 프레임워크와 라이브러리를 사용한다.
- 프레임워크:
- 소프트웨어 개발을 위한 구조와 기능을 제공한다.
- 개발자가 (프레임워크의) 규칙에 따라 코드를 작성하도록 돕는다. = 시스템 흐름을 프레임 워크가 제어한다.
- 예: Django, React, Flask, FastApi, Springboot 등
- 라이브러리:
- 특정 기능을 제공하는 코드 모음이다.
- 개발자가 시스템 흐름을 직접 제어한다.
- 예: NumPy, jQuery 등
여기서 프레임워크 Django에 대해서 배울 예정이다.
Django란?
Django는 Python 기반의 웹 프레임워크로, "마감 시간이 있는 완벽주의자를 위한 웹 프레임워크"라는 슬로건을 가지고 있다.
Django는 빠르고 확장 가능하며, 안정성을 중시하는 웹 애플리케이션을 쉽게 개발할 수 있도록 설계된 고수준의 Python 웹 프레임워크이다. 이 프레임워크는 복잡한 기능을 단순화하고, 재사용 가능한 모듈을 제공하여 효율적인 웹 개발을 지원한다.
Django 외에도 다양한 Python 기반 웹 프레임워크가 존재한다.
- Flask: 단순하고 가벼운 구조로, 소규모 프로젝트나 빠른 프로토타입 개발에 적합하다.
- FastAPI: 비동기 처리가 가능하며, 높은 성능과 직관적인 코드 작성이 장점이다.
왜 Django인가?
Django는 다음과 같은 강점이 있어 선택된다.
- 빠른 개발 속도: 기본적으로 제공되는 기능(ORM, Admin, Templates 등)으로 인해 반복 작업을 줄이고, 개발 시간을 단축할 수 있다.
- 보안 기능: XSS, CSRF 방지 등 다양한 보안 기능이 내장되어 있어 안전한 웹 애플리케이션을 구현할 수 있다.
- 확장성: 대규모 프로젝트에서도 안정적인 성능과 구조를 제공한다.
- 강력한 커뮤니티: 풍부한 문서와 패키지 생태계 덕분에 개발 중 발생하는 문제를 쉽게 해결할 수 있다. (-> 물론 우리나라는 자바 공화국이라 외국 자료에 비해 없다..)
Django는 백엔드 중심의 프레임워크로 설계되었으며, 데이터베이스 관리와 서버 로직 처리에 강점을 가진다. 하지만 우리는 현재 개발에 입문하는 단계에 있으며, 백엔드와 프론트엔드의 각각의 프레임워크를 따로 익히기에는 학습 부담이 클 수 있다. Django는 이러한 점에서 매우 유용하다. Django는 기본적으로 제공하는 템플릿 시스템을 통해 프론트엔드도 쉽게 구현할 수 있으며, 입문자가 백엔드와 프론트엔드를 동시에 학습하기에 적합하다.
추후 프로젝트가 확장되어 프론트엔드와 백엔드를 분리하고 싶을 때, Django REST Framework(DRF)를 활용하여 Django를 백엔드 API 서버로 전환할 수 있다. DRF는 RESTful API 개발에 최적화된 도구를 제공하며, React, Vue.js와 같은 프론트엔드 프레임워크와 결합하여 더 확장된 개발이 가능하다.
Django의 주요 특징
- MTV 디자인 패턴 (아래 자세한 설명)
- 오픈 소스이며, Python의 생태계(인공지능 활용 등..)를 적극 활용할 수 있다.
- 앱 단위로 프로젝트를 구성하여 재사용성과 확장성이 뛰어나다.
장고 앱(App)
- 앱(App)이란 장고 프로젝트 구성하는 모듈을 의미한다.
- 장고 프로젝트 관점에서 관련된 기능을 모아둔 파이썬 파일
- 앱 이름은 영문 복수형으로 생성한다.
- ex) 장고프로젝트 내 사용자 앱, 블로그 앱, 인증 앱 … (목적의 기능에 따라 분리)
Django 핵심 요소
- Python, ORM, Templates, Forms, Authentication, Admin, Internationalization, Security
ORM (Object-Relational Mapping):
- 객체지향 언어와 관계형 데이터베이스를 연결해 주는 기술
- Models, QuerySet API 등이 ORM에 포함된다.
Templates:
- 자체 템플릿 시스템으로 디자인과 로직을 분리하여 독립적 개발 가능
- HTML 파일을 분리하여 재사용, 체계적으로 관리할 수 있음
- HTML 파일에 include, if, for 등 템플릿 언어 사용 가능
Forms:
- 데이터의 유효성 검사
- HTML 태그를 생성하여 폼을 구성함
- 제출하는 폼 데이터의 변경을 감지하고 처리
Authentication:
- 사용자 인증 및 권한 관리 기본 제공
- 사용자의 인증과 권한 부여를 제공
Admin:
- 관리자 인터페이스 제공
- 모델의 기본 CRUD 기능 제공
Internationalization:
- 다국어 지원 및 포맷 변환 기능 제공
Security:
- CSRF, SQL Injection, XSS 보호 기능 제공
MTV (Model-Template-View) 패턴
- Model (models.py): 데이터베이스와의 연동 및 데이터 관리
- Template (html): 사용자 인터페이스 구성 및 데이터 출력
- View (views.py): 비즈니스 로직 처리 및 컨트롤러
MVC패턴을 이해하면서 장고의 실행 흐름을 아는 것이 가장 중요하다.
Django 실습
Django 프로젝트를 시작하려면 Python과 가상환경 설정이 필요하다. 모든 명령어 기준은 Mac 운영체제 기준이며 Window와 큰 차이는 없지만 다를 경우, 주석을 참고하면 된다.
python 설치 확인
python -V
-> Mac 운영체제는 기본적으로 Python 2와 Python 3 두 가지 버전을 함께 설치하고 있어 3을 붙여줘야 했는데(ex. python3 -V) 이제는 안쳐도 되는 것 같다.
pip(Python Package Installer for Python)
→ 파이썬 패키지 관리 시스템
pip 최신 버전 업그레이드
pip install --upgrade pip
가상 환경 설치
가상 환경 설치 이유
- 패키지 격리: 가상환경은 프로젝트마다 독립적 환경 제공, 각 프로젝트마다 필요한 패키지와 버전 분리하여 관리 가능하다.
- 의존성 관리: Django 프로젝트는 다양한 외부 패키지를 사용 가능하며, 필요한 패키지를 명시하고 버전을 지정하여 프로젝트에 필요한 환경 재현 가능하다.
- 이식성: 가상환경을 사용하면 Django 프로젝트를 다른 환경 또는 다른 시스템으로 이식하기 쉽고, 다른 개발자나 서버에서 프로젝트 실행하거나 배포 시 일관된 환경 유지 가능하다.
- 개발자 편의성: 프로젝트 개발, 관리에 도움 된다.
# 가상환경 설치 : python -m venv venv이름
python -m venv venv
# 가상환경 활성화 : source 만든 venv 이름/bin/activate
source venv/bin/activate # Windows에서는 venv\Scripts\activate
가상환경 설치 시 위와 같이 내가 venv이름으로 설정한 이름의 폴더가 생성되며, source 명령어를 통해 가상환경을 활성화(실행)해주면 된다.
참고) 가상환경 삭제 명령어는 rm -v venv 또는 폴더를 삭제하면 된다.
참고) 가상환경은 보통 github에 올리지 않는다. 따라서 프로젝트에 파일을 생성하고 .gitignore(파일명) 하시면 gitignore 파일이 생성된다. 해당 파일에 venv/ 를 입력하면 가상환경이 github에 올라가는 것을 막을 수 있다.
gitignore.io 이 링크를 통해 django를 치고 나오는 내용을 복사해서 해당 파일에 넣어주면 가상환경은 물론 그 외의 필요 없는 파일들이 github에 올라가는 것을 막아주니 활용하면 편리하다.
가상환경을 제대로 활성화했다면 터미널 앞에 (venv)라고 나오게 된다.
참고) 가상환경을 비활성화할 때는 deactivate로 비활성화해 주면 된다. 그럼 기존 터미널처럼 터미널 앞에 (venv) 사라지고 비활성화된다.
Window도 동일하게 (venv) 이렇게 떠야 활성화된 것이다. 앞으로의 모든 프로젝트 진행은 venv가 활성화되어 있는 상태여야 한다. 프로젝트를 껐다 키는 과정에서 저 표시가 없다면 다시 활성화해 주면 된다.
참고) 활성화 상태에서 pip list는 가상환경에 설치된 패키지를 보여준다.
Django 설치
가상환경 활성화 상태에서 Django를 설치한다.
pip install django
참고) 설치된 패키지들 파일화 하기 위해서는
1. pip freeze의 출력을 requirements.txt 파일로 리디렉션 하여 저장한다. (pip list와 동일하나, 나온 목록들을 requirements.txt를 생성해 저장해 준다.)
pip freeze > requirements.txt
2. requirements.txt에 있는 패키지들을 모두 설치해 준다. requiremnets.txt 파일이 해당 루트에 있어야 한다.
pip install -r requirements.txt
-> 협업할 때, 서버 배포할 때!!! 동일한 버전의 패키지들을 이용하기 위해 필요하니 알아두면 좋다.
첫 프로젝트 생성
프로젝트를 생성하고 기본적인 구조를 살펴보자.
django-admin startproject config .
django-admin startproject 프로젝트명 (.) .은 있어도 되고 없어도 된다. 여기서 . 은 현재 디렉토리에 생성할 것을 의미한다.
참고) .을 붙이는 것과 붙이지 않는 것의 차이
- django-admin startproject 프로젝트명 .: 현재 디렉토리에 새로운 Django 프로젝트를 생성합니다. 프로젝트를 생성한 후, 프로젝트의 최상위 디렉토리가 현재 디렉토리가 된다. 이 경우, Django 프로젝트의 파일과 폴더가 현재 디렉토리에 생성되므로, 현재 디렉토리를 프로젝트 디렉토리로 사용한다. 주로 작은 프로젝트나 단일 애플리케이션의 경우에 사용된다.
- django-admin startproject 프로젝트명: 새로운 디렉토리를 생성하고 해당 디렉토리 안에 Django 프로젝트를 생성한다. 프로젝트 이름과 같은 이름을 가진 디렉토리가 생성되며, 프로젝트의 파일과 폴더는 해당 디렉토리 안에 생성된다. 이 방식은 보다 체계적인 프로젝트 구조를 유지할 수 있으며, 여러 개의 애플리케이션이 포함된 대규모 프로젝트에서 일반적으로 사용된다.
django 로컬 환경 서버 실행
- 개발 서버가 시작되고, 설정된 호스트와 포트에서 django 애플리케이션을 실행한다.
- 로컬 환경에서 웹 브라우저를 통해 해당 호스트와 포트에 접속하면 django 애플리케이션 확인 가능하다.
- 실제 배포 환경에서는 보안 및 성능 측면에서 다른 웹 서버를 고려해야 한다.
- 개발 서버는 단지 테스트 및 개발 목적으로만 사용한다. (확인용)
프로젝트 생성 후에는 manage.py 파일과 프로젝트 디렉토리가 생성된다. 이제 개발 서버를 실행하여 기본 화면을 확인할 수 있다.
python manage.py runserver
manage.py 파일은 Django 프로젝트의 최상위 디렉토리에 위치한 스크립트 파일이다.
python manage.py runserver 명령어는 manage.py 가 존재하는 폴더에서 입력해야 한다.(위 예시는 djangopr 폴더에서 입력해야 한다.)
참고) 초보자들이 자주 하는 python manage.py runserver 오류
1. from django. core-management import execute_from_command_ line ModuleNotFoundError: No module named 'django'이나 ImportError: Couldn't import Django. Are you sure it's installed and available on your PYTHONPATH environment variable? Did you forget to activate a virtual environment?처럼
django 모듈이 없다 하는 경우, 가상환경(venv)이 활성화 안 됐을 경우가 크다. → 가상환경 활성화를 하면 된다.
2. C: \Users \yj418\AppData\Local\Programs\Python\Python39\python.exe: can't open f ile 'C: \Users\OneDrive#™ PE|(E) \djangopr\MusicShare\manage-py' : [Errno 2] No such file or directory처럼
manage.py 에 해당하는 file과 directory를 찾을 수 없다 하는 경우, python manage.py runserver의 위치가 manage.py가 있는 폴더가 아닐 경우가 크다 → cd 명령어를 통해 manage.py가 있는 폴더로 이동하면 된다.
웹 브라우저에서 http://127.0.0.1:8000/에 접속하면 Django 환영 화면을 볼 수 있다.
http://127.0.0.1:8000/
로컬 개발 서버에서 실행 중인 Django 애플리케이션에 접속하기 위한 URL이다.
- Django의 개발 서버는 기본적으로 8000번 포트에서 실행한다.
- 127.0.0.1은 로컬 호스트(localhost)를 나타내는 IP 주소이다.
로컬 환경 서버 중지
- Ctrl + c
앱 생성 및 등록
1. 앱 생성
django-admin startapp myapp1
2. settings.py 파일에 앱을 등록해야 한다. (’’와 , 잊지 않기)
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
...
'myapp1',
]
언어와 시간을 한국 ver으로 변경하기 위해선 settings.py를 변경해 준다.
LANGUAGE_CODE = 'ko-kr'
TIME_ZONE = 'Asia/Seoul'
views.py 작성하기
views.py 파일에 간단한 함수형 View를 작성한다.
from django.http import HttpResponse
def hello(request):
return HttpResponse("안녕하세요, Django!")
# return render(request, 'myapp1/index.html')
# return HttpResponse('html에 들어갈 내용')
# return render(request, '각 앱/templates 폴더에서의 html 경로')
urls.py 작성하기
urls.py 파일을 앱별로 url을 분리해서 관리할 것이다.
프로젝트명 app (최상위 폴더)의 urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path("admin/", admin.site.urls),
path("myapp1/", include('myapp1.urls')),
# path("login/", include('login.urls', namespace='login')), #namespace는 app_name 설정과 같은 것
]
그 후 myapp1 폴더에 urls.py 파일을 생성해 준다.
myapp1에 생성된 urls.py
from django.urls import path
from .views import *
app_name = 'myapp1' # path('myapp1/', include('myapp1.urls', namespace='myapp1')),와 동일
urlpatterns = [
path('hello/', hello, name='hello'),
]
Django의 URL 라우팅과 앱 분리의 장점
이렇게 되면 http://127.0.0.1:8000/myapp1/hello/로 접속하면 위와 같이 성공한 것을 볼 수 있다. 이처럼 프로젝트의 urls.py에서 include()를 사용하여 각 앱별로 URL을 분리할 수 있다. myapp1의 URL은 myapp1/ (이 부분은 myapp1의 urls.py에서 정의)로 접근할 수 있다.
- 모듈화: 각 앱별로 URL을 관리할 수 있어 프로젝트가 체계적으로 구성된다.
- 유지보수 용이: 기능별로 URL 구성을 나누어 코드 가독성과 유지보수가 쉬워진다.
- 확장성: 앱을 추가하거나 제거할 때 URL을 손쉽게 수정할 수 있다.
Templates
각 앱에 templates 폴더를 만든다.(보통 templates/app이름/html파일 구조로 사용)
ex) myapp1/templates/myapp1/index.html
실습 - 간단한 계산기 만들기 (코드만)
여유가 된다면 각자 따라 해보면서'Django가 어떤 원리로 실행되는지'이해해 보는 것이 좋다.
아직 Template 언어나 Django 문법이 완벽하게 이해되지 않는 것이 당연하지만, URL → View → Template으로 연결되는 실행 흐름을 이해하는 것이 가장 중요하기 때문에 이에 집중해서 실습해 보는 것을 추천한다.
1. myapp1/views.py에 작성
def calculator(request):
# return HttpResponse('계산기 기능 구현 시작입니다. 이게 맞나요?')
# 1. 데이터 확인
num1 = request.GET.get('num1')
num2 = request.GET.get('num2')
operators = request.GET.get('operators')
# 2. 계산
if operators == '+':
result = int(num1) + int(num2)
elif operators == '-':
result = int(num1) - int(num2)
elif operators == '*':
result = int(num1) * int(num2)
elif operators == '/':
result = int(num1) / int(num2)
else:
result = 0
# 3. 응답
return render(request, 'myapp1/calculator.html', {'result': result})
2. myapp1/templates/myapp1/calculator.html 생성 후 작성
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>계산기</title>
</head>
<body>
<h1>윤정원이 만든 계산기</h1>
<form action="">
<input type="text" name="num1">
<select name="operators" id="">
<option value="+">+</option>
<option value="-">-</option>
<option value="*">*</option>
<option value="/">/</option>
</select>
<input type="text" name="num2">
<input type="submit">
</form>
<br/>
<p>결과값: {{result}}</p>
</body>
</html>
3. myapp1/urls.py에 작성
from django.urls import path
from .views import *
app_name = 'myapp1' # path('myapp1/', include('myapp1.urls', namespace='myapp1')),와 동일
urlpatterns = [
path('hello/', hello, name='hello'),
path('calculator/', calculator, name='calculator'),
]
잘 따라왔다면 위와 같이 허접한(?) 계산기를 볼 수 있다.
오늘 세션의 내용은 아니지만, Django에서 자주 사용하는 기본 명령어들을 아래 추가로 정리해 두었다. 프로젝트를 진행하며 헷갈릴 수 있는 부분이니, 필요할 때 참고용으로 확인하면 된다.
DB migrate
python manage.py migrate
- django는 데이터베이스 스키마를 관리하기 위해 migration 시스템 제공한다.
- 스키마의 변경 사항을 추적하고, 변경 사항을 데이터베이스에 적용해, 스키마를 동기화하는 과정이다.
- 모델(models.py)의 변경사항을 처리하고 업데이트한다.
- 맨 처음 migrate는 db를 생성한다. (이후 모델 변경 시 db 변경할 때 사용한다.)
python manage.py makemigrations
python manage.py migrate
참고) migrate와 makemigrations의 차이
- python manage.py makemigrations:
- makemigrations 명령은 Django 모델의 변경 사항을 기반으로 데이터베이스 마이그레이션 파일을 생성한다.
- 모델을 수정하거나 새로운 모델을 추가한 경우, makemigrations 명령을 실행하여 데이터베이스 스키마에 반영되는 마이그레이션 파일을 생성한다.
- 이 명령은 데이터베이스의 스키마 변경을 추적하기 위해 마이그레이션 파일을 생성하는 과정이며, 마이그레이션 파일은 데이터베이스 스키마 변경에 대한 정보를 갖고 있다.
- python manage.py migrate:
- migrate 명령은 생성된 마이그레이션 파일을 기반으로 데이터베이스 스키마 변경을 수행한다.
- migrate 명령은 마이그레이션 파일을 데이터베이스에 적용하여 데이터베이스 스키마를 변경한다.
- 데이터베이스 마이그레이션은 makemigrations 명령으로 생성된 마이그레이션 파일을 읽고, 데이터베이스 스키마에 대한 변경 사항을 실제로 적용하는 과정이다.
- 일반적인 데이터베이스 마이그레이션의 흐름
- 모델을 수정(변경)하거나 새로운 모델을 추가 = model에 변화
- makemigrations 명령을 실행하여 마이그레이션 파일을 생성한다.
- migrate 명령을 실행하여 마이그레이션 파일을 데이터베이스에 적용하여 스키마를 변경한다.
- python manage.py migrate와 python manage.py makemigrations는 Django에서 데이터베이스 마이그레이션을 관리하기 위해 사용되는 두 가지 명령어들이다,
CreateSuperuser
- 관리자(superuser) 계정 만들기
python manage.py createsuperuser
'Django' 카테고리의 다른 글
[Django] Django 프로세스, Request-Response Lifecycle (Web Server, WSGI/ASGI, Middlewares, Django) (1) | 2025.01.24 |
---|---|
[Django] URL dispatcher 공식 문서 파헤치기 (1) | 2025.01.18 |
[Django] settings.py 완전 정복 (..파일 분리까지) (0) | 2025.01.11 |
[Django] User Model, Custom User (Extending User) (0) | 2025.01.11 |
[Django] Django 마이그레이션과 MySQL 활용 (0) | 2025.01.10 |