Django

ORM(Object Relational Mapping)이란?

티베트 모래여우 2020. 10. 20. 20:58
반응형

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