- [DB] ORM의 특징과 SQL에서 ORM으로 변환 예제(SQLAlchemy, Django ORM)2024년 01월 21일
- 주사위 clice
- 작성자
- 2024.01.21.:09
반응형ORM이란?
ORM은 "Object-Relational Mapping"의 약자로, 객체와 관계형 데이터베이스 간의 상호 변환을 자동으로 처리하여 상호작용을 편리하게 만들어주는 기술이다. 이는 프로그래머가 객체 지향 프로그래밍(OOP) 언어를 사용하여 데이터베이스와 상호 작용할 수 있게 도와준다.
"데이터베이스"는 정보를 저장하는 곳이고, "상호 작용"은 데이터베이스와 정보를 주고받는 것을 의미한다
일반적으로 우리는 데이터베이스에 정보를 저장하고 조회하기 위해 SQL이라는 언어를 사용하는데, ORM은 이런 작업을 좀 더 쉽게 하도록 도와준다
일반적으로 우리가 사용하는 프로그래밍 언어(예: 파이썬)에서는 객체(클래스와 인스턴스)가 있으면, ORM은 이 객체들을 데이터베이스 테이블과 연결시켜준다
간단히 말하면, ORM은 객체와 데이터베이스 간의 매핑을 담당하여 개발자가 SQL 쿼리를 직접 작성하지 않고도 데이터베이스와 상호 작용할 수 있도록 돕는다.
ORM의 4가지 특징
객체와 테이블 매핑 (Object-Table Mapping)
- 각각의 클래스는 데이터베이스의 테이블과 매핑되며, 클래스의 인스턴스는 테이블의 레코드에 대응된다. 클래스의 속성은 테이블의 컬럼에 대응된다.
- 우선, 데이터베이스에는 테이블이 있다. 테이블은 열(column)과 행(row)으로 이루어진 구조로, 각 행은 하나의 레코드(데이터)를 나타낸다
- ORM을 사용할 때, 우리는 데이터베이스의 각 테이블을 파이썬 클래스로 나타낸다. 클래스의 속성은 테이블의 열에 해당하고, 클래스의 인스턴스는 테이블의 각 행에 해당한다
객체 지향적인 인터페이스 제공
- ORM은 SQL 쿼리를 직접 작성하지 않고도 객체 지향 프로그래밍 언어를 사용하여 데이터베이스와 상호 작용할 수 있도록 한다. 개발자는 클래스와 객체를 사용하여 데이터를 다루며, ORM이 이를 데이터베이스에 반영한다.
- 클래스를 통해 만든 객체를 사용하여 데이터베이스와 상호 작용할 수 있습니다. 객체를 생성하고, 속성을 설정하고, 메서드를 호출함으로써 데이터베이스 조작이 가능하다
- ORM은 이런 객체 조작을 내부적으로 SQL 쿼리로 변환하고 데이터베이스에 전달한다. 따라서 개발자는 SQL 문법에 익숙하지 않아도 된다는 장점이 있다(야호)
데이터베이스 추상화
- ORM은 특정 데이터베이스 시스템에 종속되지 않도록 하며, 다양한 데이터베이스 시스템에서 동일한 코드로 작업할 수 있게 해준다. 즉, 개발자는 데이터베이스 종류에 따라 코드를 수정하지 않고도 다양한 데이터베이스를 지원할 수 있다.
- ORM은 사용하는 데이터베이스 종류에 상관없이 동일한 코드로 작업할 수 있도록 도와줍니다. 즉, 데이터베이스를 변경하더라도 코드 수정이 최소화된다
CRUD 연산 지원
- ORM은 데이터 조작 작업인 CRUD 작업(생성, 읽기, 갱신, 삭제)을 지원한다. 개발자는 객체를 통해 데이터를 삽입, 조회, 갱신, 삭제할 수 있고, ORM은 이러한 작업을 데이터베이스에 대한 적절한 SQL 쿼리로 변환한다.
- 예를 들어, 객체를 생성하고 데이터베이스에 추가하거나, 특정 조건에 맞는 데이터를 조회하고 업데이트하는 등의 작업이 가능하다
ORM 라이브러리: SQLAlchemy와 DjangoORM
출처: Django ORM vs SQLAlchemy: Why Django ORM Takes the Crown Niranj Rajasekaran 대표적인 파이썬 ORM 라이브러리로는 SQLAlchemy와 Django의 ORM이 있다
이러한 라이브러리를 사용하면 개발자는 데이터베이스와의 상호 작용을 추상화하고, 높은 수준의 객체 지향 인터페이스를 통해 데이터를 다룰 수 있다.
두 라이브러리 사용 예제를 살펴보자
SQLAlchemy 사용 예시-강아지 정보 저장하기
간단한 예를 통해 ORM을 이해해보자
우리는 강아지 정보(이름, 나이, 종)를 데이터베이스에 저장하고 싶다
일반적인 SQL 방식은 다음과 같다
-- 데이터베이스에 Dog 모델을 저장하는 SQL 쿼리 INSERT INTO yourapp_dog (name, age, breed) VALUES ('멍멍이', 2, '비글'); -- 데이터베이스에서 모든 강아지를 조회하는 SQL 쿼리 SELECT * FROM yourapp_dog;
ORM(SQLAlchemy)을 사용한 방식으로 바꿔보자
from sqlalchemy import create_engine, Column, Integer, String, Sequence from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker # 데이터베이스 연결 engine = create_engine('sqlite:///:memory:', echo=True) # 기본 클래스 정의 Base = declarative_base() # Dog 클래스 정의 class Dog(Base): __tablename__ = 'dogs' id = Column(Integer, Sequence('dog_id_seq'), primary_key=True) name = Column(String(50)) age = Column(Integer) breed = Column(String(50)) # 데이터베이스 테이블 생성 Base.metadata.create_all(engine) # 데이터베이스 세션 생성 Session = sessionmaker(bind=engine) session = Session() # 데이터베이스에 Dog 객체 추가 dog_instance = Dog(name='멍멍이', age=2, breed='비글') session.add(dog_instance) session.commit() # 데이터베이스에서 모든 강아지 조회 all_dogs = session.query(Dog).all() for dog in all_dogs: print(f"이름: {dog.name}, 나이: {dog.age}, 종: {dog.breed}")
이 코드에서 Dog 클래스는 데이터베이스의 dogs 테이블과 매핑되고, SQLAlchemy는 이를 통해 데이터베이스와 상호 작용할 수 있도록 도와준다. 여기서 SQL 쿼리를 직접 작성하지 않고도 데이터베이스와 소통할 수 있게 된 것이다~
이것이 ORM이다
- SQLAlchemy는 Django ORM보다 더 많은 구조적인 설정이 필요하며, 클래스를 정의한 후에도 별도의 데이터베이스 테이블 생성 과정이 필요하다
- 사용 목적: SQLAlchemy는 일반적인 ORM 라이브러리로서 데이터베이스와의 상호 작용을 다루는 데 중점을 둔다
Django의 ORM 사용 예시-강아지 정보 저장하기
다음은 Django ORM을 사용한 코드 예시이다:
from django.db import models # Dog 모델 정의 class Dog(models.Model): name = models.CharField(max_length=50) age = models.IntegerField() breed = models.CharField(max_length=50) # 데이터베이스에 Dog 객체 추가 dog_instance = Dog(name='멍멍이', age=2, breed='비글') dog_instance.save() # 데이터베이스에서 모든 강아지 조회 all_dogs = Dog.objects.all() for dog in all_dogs: print(f"이름: {dog.name}, 나이: {dog.age}, 종: {dog.breed}")
- Django ORM은 모델을 정의하고 나면 자동으로 데이터베이스 테이블을 생성한다
- 사용목적: Django 웹 프레임워크와 통합되어 웹 애플리케이션 개발에 특화된 ORM 기능을 제공한다
반응형'서버 > 백엔드' 카테고리의 다른 글
command not found: json-server 에러 해결하기 (0) 2024.05.29 [DB] ERD cloud 로 간단한 알람 ERD 설계해보기 (1) 2024.01.22 다음글이전글이전 글이 없습니다.댓글