본문 바로가기
개발/Django

[Django] ORM과 모델

by 유다110 2019. 2. 12.
반응형

Django ORM(Object Relational Mapping)


# 개요

Object-Relational Mapping(ORM)은 관계형 데이터베이스와 Django 모델 객체 간의 매핑을 제공하는 매우 유용한 기술이다.

Django를 처음 써보는, 혹 아직 써보지 않은 사람들에게는 이 개념이 잘 와닿지 않을 수 있는데, 한 마디로 SQL문을 사용하지 않고도 데이터베이스를 관리할 수 있게 해준다는 거다.


예를 들어, 데이터베이스에 'person'이라는 테이블을 생성하기 위해 다음 SQL문을 짰었다면,

CREATE TABLE person (
    "id" serial NOT NULL PRIMARY KEY,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(30) NOT NULL
);


Django에서는 다음 코드를 실행하면 된다.

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)


물론 약간의 설정(DB 명세, 테이블명 포매팅 등)도 필요하지만 초보자가 무리없이 사용할 정도로 간단하다.

요는 "각 모델 클래스는 데이터베이스 테이블에 매핑된다"는 것.



# 모델

Django 모델은 데이터베이스에 매핑되는 객체이다. 보통 하나의 모델은 하나의 테이블에 매핑되며, 모델 클래스 내의 어트리뷰트들은 데이터베이스 필드를 나타낸다.

위의 예시에서 모델 Person 아래의 어트리뷰트들(first_name, last_name)은 각각 person 테이블의 first_name 필드, last_name 필드가 된다.


참고로 모델에서 id를 따로 명시하지 않는다면 ORM이 PRIMARY KEY 속성의 id 필드를 자동으로 생성해준다. PRIMARY KEY를 따로 부여하고 싶다면 해당 필드에 primary_key=True 속성을 추가하도록 한다.



# 관계형 데이터베이스

관계형 데이터베이스의 중요 역할은 모델들을 서로 엮어 관계를 형성하는 것이다. 관계형 데이터베이스의 대표적인 관계로는 1) 다대일(many-to-one), 2) 다대다(many-to-many), 3) 일대일(one-to-one) 이렇게 세 가지가 있다.


1) 다대일(many-to-one)

아마 가장 흔하게 사용되는 관계지 싶다. FOREIGN KEY에 해당하는 필드는 다른 필드와 똑같이 명시하되, 필드 타입으로 ForeignKey를 사용해야 한다.

from django.db import models

class Manufacturer(models.Model):
    # ...
    pass

class Car(models.Model):
    manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)
    # ...

참고로 ForeignKey의 파라미터로 사용된 on_delete는 삭제 옵션으로, 해당 모델이 삭제될 때 참조된 테이블의 열(row)을 어떻게 할지 결정한다. 위의 CASCADE 옵션은 참조 테이블의 열도 함께 삭제한다. 


2) 다대다(many-to-many)

필드 타입이 ForeignKey에서 ManyToManyField로 바뀌는 것 외에는 다대일 관계와 거의 유사하다. 주의할 것은, 해당 필드드를 갖는 모델이 어디건 상관 없지만 반드시 하나의 모델에만 명시돼야 한다는 것이다.

from django.db import models

class Topping(models.Model):
    # ...
    pass

class Pizza(models.Model):
    # ...
    toppings = models.ManyToManyField(Topping)


3) 일대일(one-to-one)

필드 타입으로 OneToOneField를 사용한다. 일대일 관계는 어떤 객체(모델)에 다른 객체를 확장할 때 PRIMARY KEY로서 사용하기에 적합하다. 잘 이해가 안 간다면 예시를 보자.나도 잘 이해 안 갔음



# 지원 데이터베이스

Django가 공식적으로 지원하는 데이터베이스는 PostgreSQL, MySQL, SQLite, Oracle이며 이밖의 데이터베이스 연결을 위한 서드파티 어플리케이션도 많다. 다행히도 Django에는 기본적으로 SQLite가 설치되어 있기 때문에 초보자가 데이터베이스를 설치할 필요는 없다.


- 어떤 데이터베이스를 써야 할까?

SQLite: 초기 개발/테스팅 단계에서 사용한다. 절대 배포 단계에서 사용하지 말도록.

Oracle: 충분한 자금을 가지고 있는 대기업에서 사용한다. 대규모 사업에 참여하지 않는 이상, 그리고 다른 선택지가 없는 이상 사용할 일이 거의 없을 것이다.

PostgreSQL/MySQL: 알아서 선택하도록.




참고:

https://djangobook.com/django-tutorials/django-overview/

https://docs.djangoproject.com/en/2.1/topics/db/models/

반응형

댓글