ORM
ORM은 객체(Object)와 관계형 데이터베이스(Relational Database)를 연결해준다.
SQL을 작성하는 것이 아니라, ORM을 이용하여 프로그래밍 언어로 DML을 수행할 수 있다. 즉, ORM은 객체 지향 프로그래밍에서 관계형 데이터 베이스의 데이터를 객체로 매핑하는 기술이다.
ORM의 장점으로는 객체지향적인 코드를 통해서 데이터를 다루기 때문에 코드 가독성이 높고, 생산성을 높여준다.
반대로, 단점으로는 쿼리하는 데이터가 복잡해질 수록 ORM이 불편하고 제약으로 인해 SQL의 모든 기능을 활용하지 못할 수 도 있다는 단점이 있다.
그 외의 ORM의 장점
1. 트랜잭션 관리
ORM은 트랜잭션을 사용하여 데이터베이스의 작업의 일관성과 안전성을 보장한다. Django의 ORM은 'atomic' 데코레이터나 'transaction.atomic()' 컨텍스트 매니저를 통해서 트랜잭션을 쉽게 다룰 수 있다.
2. 관계형 데이터베이스와 객체지향 프로그래밍의 불일치해결
관계형 데이터베이스는 테이블간의 관계를 표현하고 테이블 형태로 저장하는 반면, 객체지향 프로그래밍은 객체 간의 관계를 표현하고 데이터를 개체로 표현하는데. 이러한 불일치를 ORM을 이용하여 매핑할 수 있다.
3. 캐싱과 성능 최적화
ORM은 쿼리 결과를 캐싱하여 성능을 최적화 할 수 있다. 데이터베이스에 대한 다수의 쿼리를 줄이고 애플리케이션의 응답 시간을 개서나, 캐싱을 투명하게 처리하여 별도의 작업을 하지 않아도 된다.
Queryset
Queryset은 ORM에서 데이터베이스로의 쿼리를 추상화한 객체로, 이 쿼리는 SQL로 변환되어 데이터베이스에 전송된다.
Model - 데이터 베이스
Django에서 모델 클래스는 데이터베이스의 테이블이라고 생각하고,
Django에서 모델 클래스를 통해 생성한 필드는 칼럼이라고 생각하면 편하다.
Django | Database | |
Model | = | Table |
instance | = | recode |
예제를 보자면 아래와 같다.
# Django
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
class Meta:
# 데이터 베이스에 저장될 테이블명 지정
db_table = 'person'
# Dtabase
CREATE TABLE myapp_person (
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(30) NOT NULL
);ame" varchar(30) NOT NULL
);
- Django에서는 모델을 만들때, 자동으로 auto increment를 생성하여 주기 때문에 따로 선언해줄 필요는 없다.
- Django에서 모델을 만들고 데이터베이스에 적용시킬때, 따로 meta태그로 테이블 명을 정의해주지 않으면 models.py가 있는 "앱의 이름_class이름" 의 양식으로 만들어진다.
- 위의 예시처럼 Person클래스 안에 Meta클래스를 지정해 db_table을 지정해주면 "person"으로 저장되지만 그렇지 않을 경우 "앱의 이름_person"으로 저장되는 것이다.
변경사항 반영
위쪽의 예시처럼 Person class를 models.py를 작성하였다면, 바로 데이터베이스에 반영되는것이 아니라 명령어를 통해서 적용 시켜줘야한다.
# 데이터베이스 변경사항 정의서
python manage.py makemigrations
# 데이터베이스에 변경사항 반영
python manage.py migrate
즉, makemigrations를 통해서 데이터베이스에 반영하기 위한 파일을 생성하고, migrate를 실행하면 앞서 만든 파일을 통해서 데이터베이스에 반영되는 것이다.
마이그레이션 파일을 수정하거나 Database에 직접 접근해서 수정할시, 마이그레이션 파일과 Database의 상태의 불일치가 일어남으로 변경시 조심히 진행해야한다.
ORM Manager와 데이터 베이스 인터페이스
조회
Django
User.objects.all()
SQL
SELECT * FROM User
필터링
Django
from myapp.models import User
# 나이가 30 이상인 모든 사용자 조회
User.objects.filter(age__gte=30)
SQL
SELECT * FROM User WHERE age >= 30;
정렬
Django
from myapp.models import User
# 이름으로 오름차순 정렬하여 모든 사용자 조회
User.objects.order_by('name')
SQL
SELECT * FROM User ORDER BY name;
연결 객체 조회
Django
from myapp.models import User, Post
# 특정 사용자가 작성한 모든 게시물 조회
user = User.objects.get(id=1)
user.post_set.all()
SQL
SELECT * FROM Post WHERE user_id = 1;
집계함수
Django
from myapp.models import User
# 사용자 수 세기
User.objects.count()
SQL
SELECT COUNT(*) FROM User;
연결 객체 추가
Django
from myapp.models import User, Post
# 새로운 사용자 생성 및 해당 사용자가 작성한 게시물 추가
user = User.objects.create(name="John")
Post.objects.create(title="First post", content="Content of the first post", user=user)
SQL
INSERT INTO User (name) VALUES ('John');
INSERT INTO Post (title, content, user_id) VALUES ('First post', 'Content of the first post', {user_id});
'Django > DRF' 카테고리의 다른 글
[Custom] DRF Custom Response fomat (Response) (1) | 2024.05.01 |
---|---|
[Custom] DRF Custom Render fomat (JSONRenderer) (0) | 2024.04.29 |
[Convention] Django Import 순서에 대해서 (0) | 2024.04.11 |
venv 가상환경 명령어 (0) | 2024.04.09 |
[Method] DRF PUT과 PATCH의 차이점 (0) | 2024.04.03 |
ORM
ORM은 객체(Object)와 관계형 데이터베이스(Relational Database)를 연결해준다.
SQL을 작성하는 것이 아니라, ORM을 이용하여 프로그래밍 언어로 DML을 수행할 수 있다. 즉, ORM은 객체 지향 프로그래밍에서 관계형 데이터 베이스의 데이터를 객체로 매핑하는 기술이다.
ORM의 장점으로는 객체지향적인 코드를 통해서 데이터를 다루기 때문에 코드 가독성이 높고, 생산성을 높여준다.
반대로, 단점으로는 쿼리하는 데이터가 복잡해질 수록 ORM이 불편하고 제약으로 인해 SQL의 모든 기능을 활용하지 못할 수 도 있다는 단점이 있다.
그 외의 ORM의 장점
1. 트랜잭션 관리
ORM은 트랜잭션을 사용하여 데이터베이스의 작업의 일관성과 안전성을 보장한다. Django의 ORM은 'atomic' 데코레이터나 'transaction.atomic()' 컨텍스트 매니저를 통해서 트랜잭션을 쉽게 다룰 수 있다.
2. 관계형 데이터베이스와 객체지향 프로그래밍의 불일치해결
관계형 데이터베이스는 테이블간의 관계를 표현하고 테이블 형태로 저장하는 반면, 객체지향 프로그래밍은 객체 간의 관계를 표현하고 데이터를 개체로 표현하는데. 이러한 불일치를 ORM을 이용하여 매핑할 수 있다.
3. 캐싱과 성능 최적화
ORM은 쿼리 결과를 캐싱하여 성능을 최적화 할 수 있다. 데이터베이스에 대한 다수의 쿼리를 줄이고 애플리케이션의 응답 시간을 개서나, 캐싱을 투명하게 처리하여 별도의 작업을 하지 않아도 된다.
Queryset
Queryset은 ORM에서 데이터베이스로의 쿼리를 추상화한 객체로, 이 쿼리는 SQL로 변환되어 데이터베이스에 전송된다.
Model - 데이터 베이스
Django에서 모델 클래스는 데이터베이스의 테이블이라고 생각하고,
Django에서 모델 클래스를 통해 생성한 필드는 칼럼이라고 생각하면 편하다.
Django | Database | |
Model | = | Table |
instance | = | recode |
예제를 보자면 아래와 같다.
# Django
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
class Meta:
# 데이터 베이스에 저장될 테이블명 지정
db_table = 'person'
# Dtabase
CREATE TABLE myapp_person (
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(30) NOT NULL
);ame" varchar(30) NOT NULL
);
- Django에서는 모델을 만들때, 자동으로 auto increment를 생성하여 주기 때문에 따로 선언해줄 필요는 없다.
- Django에서 모델을 만들고 데이터베이스에 적용시킬때, 따로 meta태그로 테이블 명을 정의해주지 않으면 models.py가 있는 "앱의 이름_class이름" 의 양식으로 만들어진다.
- 위의 예시처럼 Person클래스 안에 Meta클래스를 지정해 db_table을 지정해주면 "person"으로 저장되지만 그렇지 않을 경우 "앱의 이름_person"으로 저장되는 것이다.
변경사항 반영
위쪽의 예시처럼 Person class를 models.py를 작성하였다면, 바로 데이터베이스에 반영되는것이 아니라 명령어를 통해서 적용 시켜줘야한다.
# 데이터베이스 변경사항 정의서
python manage.py makemigrations
# 데이터베이스에 변경사항 반영
python manage.py migrate
즉, makemigrations를 통해서 데이터베이스에 반영하기 위한 파일을 생성하고, migrate를 실행하면 앞서 만든 파일을 통해서 데이터베이스에 반영되는 것이다.
마이그레이션 파일을 수정하거나 Database에 직접 접근해서 수정할시, 마이그레이션 파일과 Database의 상태의 불일치가 일어남으로 변경시 조심히 진행해야한다.
ORM Manager와 데이터 베이스 인터페이스
조회
Django
User.objects.all()
SQL
SELECT * FROM User
필터링
Django
from myapp.models import User
# 나이가 30 이상인 모든 사용자 조회
User.objects.filter(age__gte=30)
SQL
SELECT * FROM User WHERE age >= 30;
정렬
Django
from myapp.models import User
# 이름으로 오름차순 정렬하여 모든 사용자 조회
User.objects.order_by('name')
SQL
SELECT * FROM User ORDER BY name;
연결 객체 조회
Django
from myapp.models import User, Post
# 특정 사용자가 작성한 모든 게시물 조회
user = User.objects.get(id=1)
user.post_set.all()
SQL
SELECT * FROM Post WHERE user_id = 1;
집계함수
Django
from myapp.models import User
# 사용자 수 세기
User.objects.count()
SQL
SELECT COUNT(*) FROM User;
연결 객체 추가
Django
from myapp.models import User, Post
# 새로운 사용자 생성 및 해당 사용자가 작성한 게시물 추가
user = User.objects.create(name="John")
Post.objects.create(title="First post", content="Content of the first post", user=user)
SQL
INSERT INTO User (name) VALUES ('John');
INSERT INTO Post (title, content, user_id) VALUES ('First post', 'Content of the first post', {user_id});
'Django > DRF' 카테고리의 다른 글
[Custom] DRF Custom Response fomat (Response) (1) | 2024.05.01 |
---|---|
[Custom] DRF Custom Render fomat (JSONRenderer) (0) | 2024.04.29 |
[Convention] Django Import 순서에 대해서 (0) | 2024.04.11 |
venv 가상환경 명령어 (0) | 2024.04.09 |
[Method] DRF PUT과 PATCH의 차이점 (0) | 2024.04.03 |