∟Framework/∟Django

Django - ORM(Object-Relational Mapping)

최 수빈 2025. 1. 14. 22:58

 

ORM(Object-Relational Mapping)

 

 

객체지향 언어(예: Python)의 객체를 사용해 데이터베이스를 조작할 수 있게 해주는 도구

 

객체지향 언어는 데이터를 클래스 객체로 다루고,

   관계형 데이터베이스 테이블 으로 데이터를 관리

→ 두 시스템 간의 개념적 차이를 줄이는 것이 ORM의 역할

 

ORM을 사용하면 SQL문을 직접 작성하지 않고도 Python 코드만으로 데이터베이스를 조작할 수 있음

 

 

 

ORM의 주요 사례

Python: Django ORM, SQLAlchemy, Tortoise ORM

Java: JPA, Hibernate

Node.js: Sequelize

 

Django 프로젝트에서는 별도의 언급 없이 ORM을 기본으로 사용(Django가 기본적으로 ORM기능 내장)

 

 

 

Django ORM

 

ORM의 작동 원리

 

ORM은 SQL 쿼리 ↔ Python 객체 간의 변환을 처리

예: Articles.objects.all() → SQL 쿼리를 대신 작성해주는 역할

 

ORM의 장점

  • SQL을 몰라도 데이터베이스를 조작 가능
  • 복잡한 SQL 대신 객체지향적인 접근 가능
  • 생산성 향상: 코드 작성이 간단하고 유지보수 용이

ORM의 단점

  • 지원하지 않는 쿼리는 직접 작성 필요
  • 대규모 서비스에서는 성능 및 확장성 문제 발생 가능
  • 최적화된 SQL 작성에는 제약이 따름

 

→ 현대 개발에서는 생산성이 중요한 경우가 많음

→ 복잡한 쿼리를 직접 작성해야 하는 경우나 성능 문제가 있더라도, ORM을 사용하는 것이 개발과 유지보수의 생산성을 크게 높일 수 있음

 

 

*성능 문제가 매우 중요한 대규모 프로젝트의 경우

일부 핵심 부분 - SQL을 직접 작성

나머지 부분 - ORM으로 처리

→ 생산성과 성능의 균형을 맞출 수 있음

 

 

Database API

Django ORM을 사용해 데이터베이스를 조작하는 방법

 

 

Manager

모델 클래스에 자동 생성되는 객체로, 데이터베이스와의 쿼리 작업을 담당

 

→ Django ORM Manager : 모델 클래스를 이용, 데이터 베이스 쿼리작업을 도와줌

기본 Manager 이름: objects

 

QuerySet

데이터베이스에서 가져온 객체들의 집합

Articles.objects.all()은 모든 Article 데이터를 QuerySet 형태로 반환

 

 

 

 

기본 형태

MyModel.objects.all()

Model Class.Manager.QuerysetAPI

 

 

 

CRUD with Shell

 

Django Shell

 

Django 프로젝트 환경에서 명령어를 실행할 수 있는 인터페이스

→Django가 제공하는 여러가지 기능을 명령어로 입력해서 실행해볼 수 있는 Shell 환경

python manage.py shell

 

종료

quit()
exit()

 

 

Shell 환경 확장

 

기본 Shell보다 더 강력한 django-extensions, ipython 

→모델 자동 로드, 자동완성 등

django-extensions shell_plus 사용: python manage.py shell_plus

 

 

설치 및 설정

pip install django-extensions
pip install ipython

 

 

settings.py/django_extensions 앱 등록 

 

 

pip freeze

 

 

django shell_plus

 

 

 

 

CRUD with Django ORM

 

CRUD

Create, Read, Update, Delete

작성, 조회, 수정, 삭제

 

대부분의 웹 서비스는 CRUD를 중심으로 동작

 

 

Articles 생성(작성)

 

방법 1: 속성 별도 지정 후 저장

 

article = Articles()
article.title = '첫번째 제목'
article.content = '첫번째 내용'
article.save()

 

방법 2: 생성과 동시에 저장

Articles.objects.create(title='세번째 제목', content='세번째 내용')

 

 

Articles 조회

 

 

 

모두 조회

Articles.objects.all()

 

→ 결과는 QuerySet 형태로 반환

 

 

하나만 조회

Articles.objects.get(id=1)

 

조건에 맞는 객체가 없으면 DoesNotExist 예외 발생

여러 개의 객체가 반환되면 MultipleObjectsReturned 예외 발생

 

 

조건으로 조회

Articles.objects.filter(content='my_content')

 

다양한 조건 지정 가능

  • id__gt=2
    id가 2보다 큰 객체
  • id__in=[1, 2, 3]
    id가 1, 2, 3에 해당하는 객체
  • content_contains='my'
    content에 'my'가 포함된 객체

 

field_lookup

 

Making queries | Django documentation

The web framework for perfectionists with deadlines.

docs.djangoproject.com

 

 

 

Articles 수정

first_article = Articles.objects.get(id=1)
first_article.content = '일번'
first_article.save()

new_article = Articles.objects.get(id=1)
new_article.content

 

Articles 삭제

target_article = Articles.objects.get(id=1)
target_article.delete()

 

 

 

 

 __str__ 메서드(dunder string)를 사용하여 객체를 문자열로 표현

 

 

 Article.objects.all() 결과를 더 쉽게 이해 가능

 

magic method 사용 전
magic method 사용 후

 

'∟Framework > ∟Django' 카테고리의 다른 글

Django - MTV 패턴을 활용한 RUD(Read, Update, Delete) 구현  (0) 2025.01.22
Django - MTV패턴을 활용한 C(Create)와 R(Read) 구현  (0) 2025.01.18
Django - Model  (1) 2025.01.14
Django - URLs  (0) 2025.01.14
Django - HTTP Form  (0) 2025.01.12