장고는 ORM을 통해 데이터베이스와 '간편히' 상호작용할 수 있는 방법을 제공해줍니다. 여기서 '간편히'라는 의미가 생각보다 중요한데요. 이는 장고의 ORM 방식이 아닌 다른 방식으로 데이터베이스와 상호작용하는 기존의 방법을 대체한다는 의미를 내포하고 있습니다.
ORM과 SQL
먼저, ORM에 대해 살펴보도록 하겠습니다. ORM은 무엇일까요? ORM(Objcet Relational Mapper)은 객체 관계형 매핑을 의미하며, 객체를 관계형 데이터베이스와 연결해주는 개념입니다. 이렇게 되면 구조화된 쿼리 언어인 SQL(Structed Query Language)을 사용하지 않고도 파이썬만으로 데이터베이스 쿼리 요청을 처리할 수 있게 됩니다.
간단히 정리하자면, 장고의 ORM 방식은 SQL을 사용하지 않고 파이썬만으로 데이터베이스 쿼리를 처리하는 개념입니다.
장고 모델링과 쿼리셋
장고의 모델링은 데이터베이스 쿼리를 처리하기 위해 테이블의 틀을 잡는 과정입니다. 다음과 같이 카테고리 데이터를 담기 위한 모델링을 하고 migration을 진행하면 카테고리 이름을 저장할 수 있는 데이터베이스 테이블이 생성됩니다.
class MainCategory(models.Model):
name = models.CharField(max_length=200)
class Meta:
db_table = 'main_categories'
이제 파이썬을 사용하여 데이터베이스에 데이터를 추가할 수 있습니다.
MainCategory.objects.create(name='스킨 케어')
데이터베이스로 이동하여 직접 확인하면 다음과 같이 테이블 안에 데이터가 담겨 있는 것을 볼 수 있습니다!
그러나 SQL 쿼리문을 작성하지 않고도 파이썬으로 데이터베이스 테이블을 조회할 수도 있습니다. 다음은 카테고리에 있는 모든 데이터를 불러오는 코드입니다.
MainCategory.objects.all()
# <QuerySet [<MainCategory: MainCategory object (1)>]>
이를 통해 쿼리셋을 얻을 수 있으며, 리스트 안에 방금 생성한 카테고리 객체 하나가 들어가 있는 것을 볼 수 있습니다! 위의 코드가 정확히 SQL의 어떤 코드를 대체하는 것인지 확인해보도록 하겠습니다.
query = MainCategory.objects.all().query
print(query)
# `SELECT main_categories`.`id`, `main_categories`.`created_at`, `main_categories`.`updated_at`, `main_categories`.`name` FROM `main_categories`
쿼리문을 프린트해보면 이는 SQL에서 카테고리 테이블의 모든 데이터를 불러오는 select * from main_categories 쿼리를 대체하는 것임을 확인할 수 있습니다.
그런데 쿼리셋이란 무엇일까요? 쿼리셋은 장고 모델에서 비롯되는 객체 리스트를 의미하며, 테이블 내 데이터에 객체 방식으로 접근하여 쿼리를 처리할 수 있게 합니다. 즉, 이러한 쿼리셋을 활용하여 데이터를 추가하고, 읽어오고, 필터링하고, 업데이트하거나 정렬하는 등 ORM 방식으로 다양한 쿼리를 처리할 수 있습니다.
다음은 쿼리셋 내의 첫 번째 객체의 카테고리 이름에 접근하는 예시입니다. 이처럼 SQL문을 사용하지 않고 파이썬만으로 데이터베이스와 상호작용할 수 있습니다. 다양한 쿼리셋 API는 게시글 하단에 있는 장고의 공식 문서에서 확인해보실 수 있습니다.
categories = MainCategory.objects.all()
category_name = categories[0].name
print(category_name)
# 스킨 케어
마치며
데이터베이스는 보통 SQL이라는 구조화된 쿼리 언어를 사용하여 쿼리를 처리합니다. 장고의 ORM 방식은 이러한 SQL 구문을 사용하지 않고 객체 방식으로 관계형 데이터베이스 쿼리를 처리하는 것으로, 결과적으로 파이썬 언어만으로 데이터베이스와 상호작용할 수 있게 합니다.
'Django' 카테고리의 다른 글
장고 Q를 활용한 필터링, 정렬, 검색 방법 (0) | 2022.02.20 |
---|---|
장고에서 HTTP GET, POST 요청 처리하는 방법 (0) | 2022.02.20 |
장고, 파이썬 csv 파일 처리 방법 (0) | 2022.02.01 |
장고 프론트엔드와 통신 방법: HTTP POST, GET request 처리하기 (0) | 2022.01.28 |
장고 추상 모델 클래스 생성과 상속 방법 (0) | 2022.01.21 |