Django/DRF

[ORM] Django의 ORM이란 무엇인가?

Jong_seoung 2024. 4. 21. 13:17
반응형

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});

 

반응형