ORM이란?
ORM은 Object Relational Mapping(객체 관계 매핑)의 줄임말입니다.
Object(객체)는 말 그대로 OOP에서 사용되는 객체 그 자체를 의미하고
Relational(관계)는 흔히 사용하는 관계형 데이터베이스를 의미합니다.
즉 객체와 관계형DB를 매핑해주는 개념이라고 생각하시면 될 것 같습니다.
자세히 알아보기
객체랑 DB를 매핑하니 어쩌니 하니 말이 좀 복잡해보이죠? 쉽게 풀어서 설명드리겠습니다.
원래 관계형 DB를 사용하기 위해선 SQL을 사용해야했었습니다.
하지만 어플리케이션 코드짜는것도 머리아픈데 DB쿼리까지 신경쓰려면 머리가 두 배로 아프겠죠?
ORM은 이런 불편함을 해소해줍니다.
파이썬(장고)으로 예를 들자면 작성한 파이썬 코드를 관계형 DB의 SQL 쿼리로 자동 변환 시켜서 개발자가 따로 SQL 쿼리를 작성할 필요 없이 파이썬 코드 작성만으로 DB를 조작할 수 있게 해 주는 것입니다.
예시
장고 코드로 간단한 모델을 하나 만들어보았습니다.
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=50)
body = models.CharField(max_length=1200)
Post라는 이름의 클래스를 하나 만들고 title과 body라는 속성을 주었습니다.
이 코드를 migration하면 DB에 Post 테이블이 생깁니다.
쿼리를 하나도 작성 안했는데 테이블이 생겼죠?
CREATE TABLE "blog1_post" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"title" varchar(50) NOT NULL,
"body" varchar(1200) NOT NULL
)
이는 장고가 ORM으로 위와 같은 쿼리를 생성해서 실행했기 때문입니다.
클래스의 모양 그대로 DB 테이블을 구성할 수 있도록 SQL을 생성한 것을 확인할 수 있습니다.
다른 코드로 한번 더 확인해봅시다.
우선 DB에 데이터를 몇 개 넣어주었습니다.
from django.shortcuts import render
from .models import Post
def post_view(request):
post = Post.objects.all()
그리고 생성된 모든 데이터를 가져오는 코드를 작성했습니다.
SELECT "blog1_post"."id", "blog1_post"."title", "blog1_post"."body" FROM "blog1_post"
Post.objects.all()이라는 코드가 위의 SQL문으로 생성되어 실행한 것을 확인할 수 있습니다.
(post 객체의 query 속성을 통해 위 SQL문을 확인할 수 있습니다.)
ORM의 장점과 단점
장점
1. 직관적이고 로직에 집중할 수 있음
- 객체 지향적 코드작성을 가능하게 해줌으로 인해 직관적이고 높은 가독성을 보장해줍니다. 또한 내부 로직 작성에 좀 더 집중할 수 있습니다.
2. 유지보수의 편리함
- 객체와 테이블의 매핑 관계가 명확하고 SQL쿼리를 별도로 작성하지 않고 DB를 관리할 수 있기 때문에 유지보수가 편리합니다.
3. 높은 재사용성
- 매핑시킨 객체들은 언제든지 목적에 따라 재사용 할 수 있습니다.
4. DB에 종속적이지 않음
- 단순히 구현 방법 뿐만 아니라 자료형 타입 등에도 종속적이지 않습니다.
5. 생산성
- ORM에 익숙해지는데 시간이 좀 걸릴 수 있지만 한번 익숙해진다면 SQL쿼리를 직접 작성하는 것보다 훨씬 빠른 개발속도를 보장합니다.
단점
1. 사상누각
- 설계를 신중하게 하지 않으면 최소 성능저하에서 심하면 일관성이 무너지는 결과를 초래할 수 있습니다.
2. 규모가 커질수록 힘을 쓰기 힘듬
- 프로젝트의 규모가 커질수록 직접 SQL문을 작성하는 것 보다 구현 난이도가 상승합니다.
3. 성능
- 직접 쿼리를 생성하는 것 보단 성능이 떨어집니다.
4. 문제 대처능력 저하
- ORM에 너무 의존하게 되면 직접 쿼리를 작성해야 하는 등의 문제가 발생했을때 대처할 수 없게 됩니다.
결론
종합적으로 보면 ORM은 굉장히 유용하고 좋은 친구지만 너무 의존해서는 안됩니다.
ORM하나만 믿고 DB에 대한 공부를 전혀 하지 않는것은 추후 엄청난 후회를 몰고 올 수 있습니다...
'Django' 카테고리의 다른 글
장고(Django) - 마이그레이션(Migration) (4) | 2020.11.12 |
---|---|
장고(Django) - WSGI(Web Server Gateway Interface) (1) | 2020.11.12 |
장고(Django) - MVC패턴과 MTV패턴 (0) | 2020.10.19 |
장고(Django) - Field lookup (0) | 2020.10.09 |
Django란? (0) | 2020.10.09 |