Django - Basic

김기훈·2026년 4월 4일

Django

목록 보기
2/17
post-thumbnail

Django ✅

기능

  • ORM 제공 → DB 구조/쿼리 처리 가능함
  • 인증 / 권한 기능 기본 제공
  • 관리자 페이지 자동 생성
  • 국제화 / 다국어 지원
  • URL 기반 라우팅 지원
  • 템플릿 엔진 제공

장단점

  • 장점

    • Flask, FastAPI는 패키지 설치 많이 필요한데 Django는 기본 제공 많음
    • 관리자 페이지 자동 제공 → 개발 시간 절약
    • 구조 정형화 → 가독성 좋음
    • 모듈화 쉬워 유지보수 편함
    • 사용 가능한 패키지/라이브러리 풍부
    • 커뮤니티 커서 자료 구하기 쉬움
    • 기본 기능 많아서 개발 속도 빠름
    • 코드 재사용 쉬움 → 모듈화 편함
    • 기본 보안 제공 → 안전함
  • 단점

    • 익숙해지려면 시간 필요
    • Django 특유 문법 학습 필요
    • 개념 많아서 복잡함

구조

  • Model.py | DB와 연결됨 / DB 구조
  • Views.py | 알고리즘 담당 / 로직 처리
  • Template | 화면단(Html)을 담당
  • URLs.py | URL에 따라 설정된 뷰(View)로 연결되는 작업을 수행 / 라우팅 담당
  • Web Server(ngnix, apache 등)
    • Python과 브라우저 요청 사이에서 요청은 Python 코드로 바꿔줌
    • Django 개발서버에서는 Django가 대신 역할 수행

일반적인 순서

    1. 브라우저에서 웹서버로 요청이 들어옴
      1. urls에서 view로 연결
        1. view에서 알고리즘에 따라서 필요한 데이터를 Model을 통해서 가져옴
          1. 가져온 데이터를 Template를 이용해 화면단에 보여줌

프로젝트 설정 및 시작 ✅

가상환경 설정 및 적용

  • Python virtualenv 3.12.1 oz
    • python버전 3.12.1인 이름이 oz인 가상환경을 생성
      • python local oz
        • 현재 위치한 Django-1에 oz가상환경을 적용

프로젝트 시작 준비

  • django-admin startproject config . → Django 전체 프로젝트 뼈대를 생성

    • Django가 실행 가능한 프로젝트 환경을 만들어줌
    • 서버 구동, 설정 관리, URL 라우팅 등 기반 구조를 생성
      • django-admin | Django 명령어 실행 도구
      • startproject | 프로젝트 생성
      • config | 프로젝트명
      • . | 현재 디렉토리에 생성
        • 보통 . 을 붙이면 프로젝트 루트에 필요 이상으로 폴더가 중복되는 걸 방지

Django 설정 구조

	config : 기초적인 설정 파일이 들어간 폴더
	├── __init__.py : Python 패키지를 만들어주는 파일
	├──	 asgi.py, wsgi.py : 웹 서버와 Django가 통신할 때 연결해주는 역할
	├──	 settings.py : 각종 설정 파일들
	└──	 urls.py : url 설정들. 기본적으로 admin만 설정되어있다.
	manage.py : Django를 실행시키는 명령어를 입력하는 파일

앱 생성

  • python manage.py startapp appname → Django 안에서 특정 기능 단위 "앱" 생성

    • 하나의 프로젝트가 여러 앱을 가질 수 있음(프로젝트 안에 속함)
    • config/settings.pyINSTALLED_APPS에 등록해야 함.

서버 실행

  • python manage.py runserver


pyenv / pyenv-virtualenv


pyenv ✅

설치


SHELL

  • which $SHELL
    • 내가 사용하는 Shell을 확인(/bin/zsh = zsh)
  • echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshrc
    • 가상환경 자동화 설정(zsh 기준)
  • source ~/.zshrc
    • Shell 다시 실행(zsh 기준) / 터미널 껏다 켜기도 가능
  • eval "$(pyenv init -)"
    • PATH 건들지 말기
  • eval "$(pyenv virtualenv-init -)"
    • alias 넣지 말기

주의 ⚠️

  • 폴더 기준으로 관리되기 때문에 최상위 경로에서 작업 X (폴더를 하나 만들 것)

명령어

  • 작동 시작
    • pyenv install --list / pyenv install 원하는 버전
      • 설치 가능한 버전 확인 / 원하는 버전을 골라 설치
기능명령설명
Python 설치pyenv install특정 버전 설치
가상환경 생성pyenv virtualenvPyenv 버전 기반 venv 생성
가상환경 삭제pyenv virtualenv-delete 가상환경 이름가상환경 지우기
폴더 적용pyenv local.python-version 파일 생성 → 해당 폴더 진입 시 자동 적용

테스트 실습 1️⃣

  • pyenv virtualenv 3.12.2 venv_A / pyenv virtualenv 3.12.2 venv_B
    • venv_A / venv_A 동일한 버전의 python 가상환경 2개 생성
  • pyenv local venv_A /pyenv local venv_B
    • 현재 위치한 폴더에 가상환경을 적용
      • 같은 버전을 사용하지만 각각 폴더를 들어가기만 해도 다른 설정을 사용 가능


간단 실습 ✅

HTTP 응답 만들어보기

기본 페이지

  • 127.0.0.1:8000/

book_list

  • 127.0.0.1:8000/book_list/

book_list/<int:num>

  • 127.0.0.1:8000/book_list/<int:num>

language/<str:lang>/

  • 127.0.0.1:8000/language/<str:lang>/

가짜 DB 활용

127.0.0.1:8000/movie/ or movie/<int:index>

  • 영화 제목을 클릭하면 해당 영화의 상세페이지로 이동하는 기능 구현


Django Template 이용

Django Template 설정 및 문법

  • 아직 movies.html에 아무것도 추가하지 않아서 텅텅

  • 파이프(|) 이용해서 forloop.counter 에 연산하기

Django Template 이용 페이지

도서 페이지


실습

구구단

  • forloop.counter : 1부터 시작해서 반복 횟수를 세어주는 Django 템플릿 변수

프로젝트 실습 ✅

앱 생성 및 등록

앱 생성


생성된 파일 기능

  • models.py
    • DB와 관련된 테이블과 컬럼을 관리한다.
  • views.py
    • 메인 알고리즘을 담당한다(요청 처리 함수)
  • tests.py
    • 테스트 코드를 작성한다.
  • apps.py
    • Django App 관련 설정 관련 내용(앱 설정 파일)
  • admin.py
    • 어드민 관련된 설정 관리.( Django 관리자(admin) 설정 파일 )
  • __init__.py
    • 파이썬 패키지를 관리하는 파일.(패키지 초기화 파일)
  • migrations
    • Model이 수정된 기록이 쌓임.(DB 마이그레이션 파일)

앱 등록

  • 생성한 앱을 Django 프로젝트에 등록해야 함
    • settings.pyINSTALLED_APPS 에 추가
  • 해두면 좋은 것
    • INSTALLED_APPSDJANGO_APPOWN_APPS 로 분리
      • Django에서 기본적으로 제공되는 APP(DJANGO_APPS)과
      • 본인이 만든 APP(OWN_APPS)을 구분하여 관리하기 위해서

Views / Model ✅

  • views.pyModels.py 는 Django의 App 구조 안에 들어 있음

views

Views 활용 페이지


Model

Model과 Field, Migrations

  • 처음 서버를 실행 했을 때, 나오는 빨간색 경고는 마이그레이트 하면 없어짐
    • python manage.py makemigrations = git의 commit 느낌
    • python manage.py migrate = git의 push 느낌
      • Django에서 기본적으로 migrate 되어야 하는 테이블이 생성

makemigrations / migrate

  • makemigrations

    • python manage.py makemigrations
      • migrations.py 파일을 만듬
    • migrate 명령어를 사용하기 전까지 데이터베이스에 영향을 주지 않음(실제 DB에는 영향 X)
      • 실제 DB에 넣기위한 정의를 하는 파일을 생성
    • Django 애플리케이션의 모델에 대한 변경 사항을 감지,
      • 이를 데이터베이스 스키마로 변환할 수 있는 마이그레이션 파일을 생성
    • git 의 commit -> github에 적용X , commit 기록
      • DB에 적용X / 적용할 파일 생성
  • migrate

    • python manage.py migrate
      • 마이그레이션을 실행하여 데이터베이스에 변경 사항을 적용하는 명령어.
        • migrations/ 폴더 안에 있는 migration 파일들을 실제 DB에 적용
    • Django의 ORM(Object-Relational Mapping) 시스템을 통해
      • 데이터베이스 스키마를 최신 상태로 유지.
    • git의 push -> github에 적용O / 로컬에는 commit 기록
      • DB에 적용O / migrations 파일들 가지고 적용

migrate 진행 과정

  • 1. migrations 실행

    • python manage.py makemigrations 명령어로 마이그레이션 파일을 생성
  • 2. migrate 실행

    • python manage.py migrate 명령어로 데이터베이스에 변경 사항을 적용
      • bookmarkbookmark( `App이름 테이블이름` ) 테이블이 확인 가능

Admin ✅


Django Admin

설정

  • Django는 강력한 관리자(어드민) 페이지를 가진 프레임워크

    • 로컬서버를 실행하고 127.0.0.1:8000/admin/ 로 접속 가능
      • Admin Page를 이용하기 위해서는 접근 권한을 가진 SuperUser가 필요
  • python manage.py createsuperuser

    • 이메일은 필수X / 비밀번호 8자 이상 추천 / 간단하면 경고 뜸

응용

  • 북마크 테이블을 어드민 페이지에서 관리해보기

  • 한국어 변경

    1. 각각 어떤값이 들어가는가
    1. 북마크 이름을 바꿔보자
    1. 어드민페이지의 여러 기능을 사용해보자

응용2(북마크 목록 페이지 만들기)

  • 북마크 리스트 페이지

    • objects.all() / all : SELECT * FROM bookmarks

  • 북마크 상세 페이지

    • target="_blank"
    • 새로운 페이지에서 열기

ORM ✅

objects

  • 모델 매니저 / 쿼리를 할 수 있게 해줌
    • Table.objects.all()
      • 테이블의 모든 데이터를 가져옴
      • (SELECT * FROM table 과 동일)
    • Table.objects.get(pk=pk)
      • pk가 동일한 데이터를 1개 가져옵니다. 2개 이상의 데이터를 가져오려고 하면 오류가 발생 - (SELECT * FROM table WHERE id=id LIMIT 1 과 동일)
    • Table.objects.filter(pk=pk)
      • 개수에 상관없이 리스트 형태로 데이터를 가져옴
      • (SELECT * FROM bookmark WHERE id=id와 동일)
Bookmark = Bookmark.objects.all()
SELECT * FROM bookmark

# get
Bookmark: Bookmark = Bookmark.objects.get(pk=pk)
SELECT * FROM bookmark WHERE id=id LIMIT 1

# filter
Bookmark: [Bookmark] = Bookmark.objects.filter(pk=pk)
SELECT * FROM bookmark WHERE id=id

Bookmark: [Bookmark] = Bookmark.objects.filter(name='네이버')
SELECT * FROM bookmark WHERE naem='네이버'

Bookmark: [Bookmark] = Bookmark.objects.filter(name__icontains='네이')
SELECT * FROM bookmark WHERE naem LIKE '%네이버%'

# gte = greater then equal == '>='
now = datetime.now()
Bookmark: [Bookmark] = Bookmark.objects.filter(created_at__gte=now)
SELECT * FROM bookmrak WHERE created_at >= now

# gt = greater == '>'
now = datetime.now()
Bookmark: [Bookmark] = Bookmark.objects.filter(created_at__gt=now)
SELECT * FROM bookmrak WHERE created_at > now

# lte = low then equal == '<='
now = datetime.now()
Bookmark: [Bookmark] = Bookmark.objects.filter(created_at__lte=now)
SELECT * FROM bookmrak WHERE created_at <= now

# lt = low == '<' 
now = datetime.now()
Bookmark: [Bookmark] = Bookmark.objects.filter(created_at__lt=now)
SELECT * FROM bookmrak WHERE created_at < now

SHELL

ipython

  • ipython — 더 똑똑한 파이썬 쉘

    • 기본 Python shell 보다 기능이 훨씬 많아서 장고 shell에서 테스트할 때 매우 편함
  • ipython 패키지 설치 : poetry add ipython

  • 장고 쉘 들어가기 : python manage.py shell

  • poetry add django-extensions : 여러가지가 한번에 임포트 됨 (권장)

  • python manage.py shell_plus


객체 조회

# bookmark App의 모델인 Boormark를 import
from bookmark.models import Bookmark

# Bookmark 테이블의 모든 객체를 가져오기
Bookmark.objects.all()

# Bookmark 테이블에서 id가 2인 객체만 가져오기
# 조회된 객체가 2개 이상일 경우 오류 발생
Bookmark.objects.get(id=2)

# 모든 객체를 bookmark_list 변수에 할당
bookmark_list = Bookmark.objects.all()

# 첫번째 객체 가져오기
bookmark_list[0]
Bookmark.objects.first()

# 마지막 객체 가져오기
Bookmark.objects.last()

# 객체의 아이디
bookmark_list[0].id

# id가 2이상인 객체 불러오기

# gte: greater than or equal (이상)
# gt: greater than (초과)
# lt: less than (미만)
# lte: less than or equal to (이하)
Bookmark.objects.filter(id__gte=2)

# name이 네이버인 객체 가져오기
Bookmark.objects.filter(name='네이버')


## like 검색
# DB에 부담을 많이 주기 때문에 너무 짧은 검색어 사용은 지양

# 검색어가 포함된 객체 찾기
Bookmark.objects.filter(name__icontains='네')

# 검색어로 시작하는 객체 찾기
Bookmark.objects.filter(name__startswith='다')

# 검색어로 끝나는 객체 찾기
Bookmark.objects.filter(name__endswith='글')

# 지정된 리스트 내의 값들 중 하나와 일치하는 객체 찾기
Bookmark.objects.filter(name__in=['구글','네이버'])

# , 로 and 조건 검색 가능
Bookmark.objects.filter(name='네이버', url__startswith="https://naver")

# 몇개 존재하는가
Bookmark.objects.count() 

객체 추가

# 기본
Bookmark.objects.create(name='야후', url='https://yahoo.com')

# 새로운 Bookmark 객체를 생성하고 데이터베이스에 저장
bookmark = Bookmark(name='야후2', url='https://yahoo.com')
bookmark.save()

## id값을 변경하여 새로운 데이터 만들기

# _를 쓰기 위해 모든 객체를 조회합니다.
# _는 마지막 Output값을 가져옵니다.
Bookmark.objects.all()

# b에 첫번째 데이터를 할당합니다.
b = _.first()   

# b의 id를 None으로 변경합니다.
# 첫번째 데이터에는 영향이 없습니다.
b.id = None

# id값이 없는 b 객체를 저장합니다.
# DB에서는 b를 새로운 데이터로 인식합니다.
b.save()

# b의 id가 새롭게 생겼습니다.
b.id
# b 객체의 name을 변경하면 차이를 알기 쉽습니다.
b.name = '네이버2'

# 다시 모든 객체를 불러옵니다
# b가 Bookmark에 추가되었습니다.
Bookmark.objects.all()

객체 추가(bulk_create)

  • 리스트 컴프리헨션으로 만들어진 데이터는 id값을 가지지 않는다.

  • Bookmark.objects.bulk_create(bookmark_list)

    • for문을 사용하면 한번씩 계속 반복이 되기 때문에 DB에 부담이 될 수 있음
    • 한번에 많은 양을 create 할 때에는 bulk_create 를 사용하면 db요청 횟수를 줄임
      • 즉, db의 부담을 줄일수 있음

조회


객체 업데이트 / 객체 삭제

## 객체 업데이트 

# url에 'naver.com'이 포함된 객체들의 name을 '네이버'로 업데이트합니다.
# Output에는 변경된 객체의 수가 출력됩니다.
Bookmark.objects.filter(url__icontains='naver.com').update(name='네이버')

## 객체 삭제

# b 객체를 삭제합니다.
# 메모리에서는 사라지지 않지만, b.id 값은 존재하지 않습니다.
# Django는 id값 유무에 따라 DB 저장 유무를 판단합니다.
b.delete()

# 여러개를 한 번에 삭제
Bookmark.objects.filter(name__icontains='야후').delete()

실습

  • 조건 1. 북마크 100개 만들기
    • poetry add django-extensions / python manage.py shell_plus
      • 하기전에 현재 경로에 manage.py가 있는지 확인
      • ls 했을때 manage.py가 나오는가 확인
    • Bookmark.objects.create(name='이름',url='https://~~.com')
# Shell에서 
for i in range(100)
	Bookmark.objects.creates(name=f'테스트 네이버 {i}',url=f'https://naver.com')

## 테스트 네이버 1~100으로 같은 url을 가진 북마크 100개 생성
  • 조건 2. 북마크 목록에서 북마크의 id가 50이상인 것들만 추출해서 보여주기
    • Bookmark.objects.filter(id__gte=50)

profile
안녕하세요.

0개의 댓글