Django의 역할은 무엇일까? 여태 쭉 Django를 학습해왔는데 뜬금없는 질문이다. 당연하게도 웹서비스를 제공하기 위함 또는 더 쉽게 제공하기 위한 역할을 한다라고 대답할 수 있지만 더 구체적으로 들여다보자. 우리는 파이썬을 배웠고, DB를 따로 학습하지 않았다. 그런데 어떻게 models.py를 통해 DB에 영향을 주며 데이터를 들고올 수 있을까? 이는 절대 마법이 아니며 Django는 마술사가 아니다. 그래서 우리는 ORM에 대해 학습해보기로 하자.
객체 지향 프로그래밍 언어를 사용하여 호환되지 않는 유형의 시스템 간에 데이터를 변환하는 기술
ORM에서 데이터를 검색, 필터링, 정렬 및 그룹화 하는데 사용하는 도구
이를 통해 SQL이 아닌 Python 코드로 데이터를 처리할 수 있는데 그 문법을 한 번 들여다보자.
Article.objects.all()
# Article -> Model class
# objects -> Manager
# all() -> QuerySet API
의 형태로 사용한다.
- Query는 DB에 특정 데이터를 보여달라는 요청을 의미
- 파이썬으로 작성한 코드가 ORM을 통해 SQL로 변환되어 DB에 전달되며, DB의 응답 데이터를 ORM이 QuerySet이라는 자료 형태로 변환하여 우리에게 전달 (만약 단일 객체를 반환할 때는 QuerySet이 아닌 모델의 인스턴스로 반환됨)
$ pip install ipython django-extensions
# settings.py
INSTALLED_APPS = [
'articles',
'django_extensions',
]
$ pip freeze > requirements.txt
$ python manage.py shell_plus
생성하는 방법은 3가지가 있다.
1. 인스턴스 -> 속성 채우기 -> 저장
article = Article() # 인스턴스 생성
article.title = '첫번째 제목' # 인스턴스 속성 채우기
article.content = '첫번째 내용'
article.save() # DB에 저장
article = Article(title='두번째 제목', content='두번째 내용')
article.save()
Article.objects.create(title='세번째 제목', content='세번째 내용')
3번은 저장을 따로 하지 않아도 DB에 자동으로 기록된다. 그러나 3번의 방법은 지양한다.
그 이유는 이후 유효성 검사를 학습하게 되는데, 3번은 유형성 검사를 거치는 과정을 생략하기 때문에 이후 문제가 발생할 수 있다. 1번 or 2번 방법을 사용하자.
Article.objects.all()
Article.objects.get(pk=1)
# <Article: Article object (1)>
Article.objects.get(pk=100)
# 오류 발생(DoesNotExist)
Article.objects.get(content='django!')
# 오류 발생(MultipleObjectsReturned)
# get으로 조회시 고유값으로 조회해야 하므로 pk로 조회를 많이 한다.
Article.objects.filter(content='django!')
# <QuerySet [<Article obejct(1)>, <Article: Article object (2)>]>
Article.objects.filter(title='abc')
# <QuerySet []>
# 여러개나 대상이 없어도 오류가 발생하지 않음
article = Article.objects.get(pk=1)
article.title = '수정된 제목'
article.save()
article = Article.objects.get(pk=1)
article.delete()
# 삭제를 하면 삭제된 객체가 반환되며 삭제된다.
이와 같이 CRUD를 객체지향적인 파이썬 코드로 진행해보았다. 이렇게 DB에 반영되는 원리를 이해했으면 View 함수에 이를 녹여볼 것이다. 앞으로 모든 학습은 CRUD를 기반으로 진행되기 때문에 가장 기본이 되는 원리를 알아보았다.