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'가 포함된 객체
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() 결과를 더 쉽게 이해 가능
'∟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 |