IT/Django

[Django] ORM(Object-Relation-Mapping) 이란!?

쉰몬 2025. 2. 6. 19:43

  이번에 Django로 유튜버 마이쮸님의 인스타그램 강의 클론코딩 및 인프런의 이진석님의 인프런 강의를 사서 보고 있는 와 중에 나에게는 생소한 개념인 ORM 이라는걸 이용해 Django는 Model 도 정립을 하고 migrate 을 하면서 DataBase에 바로 반영해서 사용을 하는 익숙치 않은 기능을 익히게 되었다.  그래서 마이쮸님의 인스타그램 강의를 다 보고 나서는 꼭 이 부분에 대해서는 다루어야지 라는 생각이 들어서 ORM(Object-Relation-Mapping) 에 대해 다루고자 한다. 그 전에 가장 영향을 많이 받은 마이쮸님의 인스타그램 클론코딩 링크 및  이진석님의 장고 강의 주소 링크 해놓고간다. 

 


 

https://youtu.be/M8UPyeF5DfM?si=9HawEc9BLMWkPWgF

유튜브 마이쮸님의 제로부터 시작하는 인스타그램 만들기..Django가 흘러가는 부분에 대해 이해도가 올라가서 너무너무 좋았다. 감사합니다.

 

 

https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4-with%EB%A6%AC%EC%95%A1%ED%8A%B8/dashboard

 

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준) 강의 | 이진석 - 인프런

이진석 | , ❗본 강의는 연재식 강의입니다. 2024년 5월 31일에 업로드 100% 완료했습니다. 🎉🔥 기존 파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 강의는 장고 3.0 기반이며, 이 강의는 리뉴

www.inflearn.com

이진석님의 인프런 강의...방대한 양이지만 Django로 개발함에 있어서는 정석적으로 꼭 들어야되는 강의 같아서 구매해서 들었다. 

감사합니다. 

 


1.Chat Gpt 에서 다루고 있는 ORM의 개념

정리하는데에는 역시 Chat Gpt 만한게 없어..

 

 

ORM(Object-Relational Mapping)란?

**ORM(Object-Relational Mapping)**은 객체 지향 프로그래밍 언어를 사용하여 데이터베이스와 상호 작용할 수 있도록 해주는 기술입니다. 쉽게 말해, 데이터베이스의 테이블과 프로그래밍 언어의 객체를 매핑(연결) 해주는 역할을 합니다.


✅ 1. 왜 ORM이 필요한가?

  • SQL 직접 작성의 번거로움:
    SQL 쿼리를 직접 작성하면 코드가 길어지고, 유지보수가 어려워질 수 있습니다.
  • 언어 간 불일치(Paradigm Mismatch):
    객체 지향 프로그래밍(OOP)과 관계형 데이터베이스(RDB)는 데이터 처리 방식이 다릅니다. ORM은 이 차이를 자연스럽게 연결합니다.
  • 생산성 향상:
    개발자는 객체 조작만으로 데이터베이스 작업을 처리할 수 있으므로, 빠르게 개발할 수 있습니다.

✅ 2. ORM의 동작 방식

  1. 클래스 ↔ 테이블 매핑:
    • 하나의 클래스는 데이터베이스의 한 테이블과 매핑됩니다.
    • 클래스의 속성은 테이블의 컬럼에 대응됩니다.
  2. 객체 ↔ 레코드 매핑:
    • 클래스의 인스턴스(객체)는 테이블의 한 행(레코드)과 연결됩니다.
  3. 메서드 ↔ SQL 쿼리 매핑:
    • .save(), .delete(), .filter() 등의 메서드가 내부적으로 SQL 쿼리로 변환되어 실행됩니다.

✅ 3. Django ORM 예제

📌 1) 모델 정의하기

from django.db import models

# User 모델 정의
class User(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField(unique=True)
    age = models.IntegerField()

    def __str__(self):
        return self.name
  • User 클래스 → 데이터베이스의 user 테이블로 매핑
  • name, email, age 필드 → 각각 테이블의 컬럼으로 생성

 

📌 2) 데이터 삽입 (Create)

# 새로운 사용자 생성
user = User(name='Alice', email='alice@example.com', age=25)
user.save()  # SQL INSERT 쿼리가 자동 실행됨
  • ORM은 내부적으로 다음과 같은 SQL을 실행합니다:
    INSERT INTO user (name, email, age) VALUES ('Alice', 'alice@example.com', 25);
    


📌 3) 데이터 조회 (Read)

# 모든 사용자 조회
users = User.objects.all()  # SELECT * FROM user;

# 조건부 조회
alice = User.objects.get(name='Alice')  # SELECT * FROM user WHERE name='Alice' LIMIT 1;

# 필터링
adults = User.objects.filter(age__gte=18)  # SELECT * FROM user WHERE age >= 18;

 

📌 4) 데이터 수정 (Update)

# Alice의 나이 업데이트
alice.age = 26
alice.save()  # UPDATE user SET age=26 WHERE id=1;

📌 5) 데이터 삭제 (Delete)

# Alice 삭제
alice.delete()  # DELETE FROM user WHERE id=1;

✅ 4. ORM의 장점과 단점

🎯 장점

  1. 생산성 향상: SQL을 일일이 작성할 필요 없이 빠른 개발 가능
  2. 가독성: 직관적인 코드로 데이터베이스 작업
  3. 보안성: SQL Injection 공격 방지에 유리
  4. DB 독립성: 데이터베이스 변경 시 코드 수정 최소화 (예: MySQL → PostgreSQL)

⚠️ 단점

  1. 성능 이슈: 복잡한 쿼리는 ORM이 비효율적으로 처리할 수 있음
  2. 추상화의 한계: 고급 SQL 기능(Join, 서브쿼리 등)은 ORM만으로 구현이 어려울 수 있음
  3. 디버깅 어려움: 자동 생성된 SQL을 추적하기 어려움

✅ 5. Django ORM에서의 고급 기능

  • 쿼리셋 체이닝:
  • users = User.objects.filter(age__gte=18).exclude(name='Bob').order_by('-age')
  • Q 객체 (복잡한 조건 처리):
  • from django.db.models import Q users = User.objects.filter(Q(age__gte=18) | Q(name__icontains='Alice'))
  • Aggregate & Annotation (집계 함수):
  • from django.db.models import Avg average_age = User.objects.all().aggregate(Avg('age'))
  • Raw SQL 쿼리 실행 (필요 시):
  • users = User.objects.raw('SELECT * FROM user WHERE age > %s', [18])

✅ 6. Django ORM과의 최적화 팁

  1. select_related()와 prefetch_related()로 쿼리 최적화
  2. 인덱스 추가로 검색 성능 향상
  3. only()와 defer()로 불필요한 데이터 로딩 최소화
  4. 쿼리셋 캐싱 활용

 


위의 Chat Gpt 에서 아주 간략하고 포인트을 잘 찝어서 서술해주었기에 추가 사항이 더 있을까 하고 생각해 이것 저것 검색해서 찾아보니 이미 블로그 같은데에 많이들 올라와 있고 ORM을 사용해본 다음의후기!? 라고 해야되는 식의 포스팅 되어 있는 곳들도 많은것 같다. 

ORM의 특징중 나무위키에 서술해 있는 기본적인 특징은 이와 같다. 


특징

강력한 풀스텍 웹 프레임워크 답게 기본적으로 제공되는 것들이 많다.

ORM 을 기본적으로 제공 

 

  • 원래 Django 자체가 풀스텍으로 만들어진 프레임워크 이기에 당연 ORM을 제공
관리자 페이지를 기본적으로 제공

 

자주 사용되는 로직들을 묶어서 기본적으로 제공

 

✅ 1. Django 인증 시스템의 핵심 구성 요소

  • User 모델
    • Django에서 기본 제공하는 사용자 모델
    • username, password, email, first_name, last_name 등의 필드 포함
  • 위의 Django Admin에서 사용하는 User 모델 같은 것들은 Django에 ORM을 사용해서 쓸수 있는 용어이다. java의 클래스 같은 것들이라고 생각하면 된다. java에서는 생성자를 이용 컬럼 값들을 초기화하고 클래스를 각 컬럼을 사용할 수 있게 용어를 정의 하면 된다. Model도 마찬가지이다. Model.py 를 만들어 각 사용할 객체 명칭과 컬럼들을 정의하면서 그걸 ORM 에서 Metpping 할 수 있다. 

그리고 아래에는 해당 ORM 관련 설명을 잘해놓은 블로그및 유튜브 강의 투척해놓고 나간다. 

 

https://velog.io/@emrrbs9090/DjangoDjango-ORM%EC%9D%B4-%EC%9E%91%EC%84%B1%ED%95%98%EB%8A%94-SQL-%EB%B3%B4%EB%8A%94-%EB%B0%A9%EB%B2%95

 

[Django]Django ORM이 작성하는 SQL 보는 방법

Django ORM이 작성하는 SQL query 보기

velog.io

장단점 맛도리

 

 

https://www.incodom.kr/ORM#h_ea3d40041db650b8c49e9a81fb17e208

 

생물정보 전문위키, 인코덤

Wikipedia for Bioinformatics

www.incodom.kr

에시정리를 간단하게 잘해주셨습니다.

 

 

https://www.youtube.com/watch?v=6mHpfGjpE_M

니꼬쌤의 강의 ㅎㅎ 역시나 명불허전이다.