티스토리 뷰

 에듀캐스트에서 이진석님의 강좌 '리액트와 함께 장고 시작하기 Complete'를 다 들었는데 막상 정리를 안 해놔서 강좌 내용을 바탕으로 장고 이론을 정리해보기로 했다.

 

ORM이란?

  • Object-Relational-Mapper의 약자로 프로그래밍언어의 OOP 스타일로 쿼리를 작성할 수 있게 해주는 것.
  • 장: 어떤 디비를 사용하든지 이미 잘 알고있는 언어를 사용해 디비를 조작할 수 있으므로 매우 편리하다.
  • 단: ORM을 사용함으로서 오버헤드가 발생하며, SQL을 통해 튜닝하는 것이 ORM을 통해서는 불가능할 경우가 많다.

Django Models

  • 장고 ORM은 RDB만 지원한다. (따라서 MongoDB 등의 NoSQL을 쓴다면 장고보다는 다른 파이썬 프레임워크를 쓰는 것이..)
  • 상황에 따라 다르겠지만 되도록이면 SQL보다는 ORM을 사용하는걸 권장하는 편이다. 이는 SQL Injection을 방지하기 위함이다.
    • SELECT 등의 간단한 쿼리는 SQL을 사용하지만, 외래키등으로 물리고 물리는 복잡한 관계의 경우엔 ORM을 사용해서 처리하는 경우가 많다. 다만 위의 단점이 존재하므로 만약 한번에 많은 데이터를 처리할 일이 있다면 Raw Query를 작성하는 방법도 고려해봐야할 것 같다. (나의 경우엔 아직은 그정도로 큰 트래픽을 처리해 볼 일은 없었다.)

*SQL 인젝션이란?

- SQL 삽입(영어: SQL Injection, SQL 인젝션, SQL 주입)은 응용 프로그램 보안 상의 허점을 의도적으로 이용해, 악의적인 SQL문을 실행되게 함으로써 데이터베이스를 비정상적으로 조작하는 코드 인젝션 공격 방법이다.

 

Django ORM
- Django ORM이니만큼 파이썬 클래스와 DB 테이블을 1:1로 매핑한다.
- 모델 클래스명은 단수형으로 지정하고, PascalCase 네이밍을 권장 (참고: camelCase, PascalCase, SnakeCase Kebab 네이밍(영문))
- 매핑되는 모델 클래스와 DB테이블 필드 내역이 일치 해야한다.

 

장고 모델에서 DB 관리하기 & 장고 외부에서 DB 관리하기

  • 장고 모델에서 관리하기
    • 모델 클래스 작성
    • makemigrations: 모델에 기반하여 마이그레이션 파일 생성하는 명령어
    • migrate: 마이그레이션 파일을 DB에 적용하는 명령어
  • 장고 외부에서 관리하기
    • inspectdb:  데이터베이스로부터 모델 클래스 소스 생성.
    • django-admin instpectdb [table[table ..]] 식으로 사용. 이름을 통해서 데이터베이스 상의 테이블을 찾고 이를 바탕으로 장고 모델 모듈을 산출해내는 명령어. 아래와 같은 몇가지 특징이 있다.
      1. 만약 모델 필드 타입을 제대로 매핑하지 못하면 'This field type is a guess.'라는 코멘트와 함께 textfield를 삽입한다.
      2. 데이터베이스 컬럼명이 파이썬의 예약어를 사용하는 경우에는 뒤에 '_field'라는 속성명을 추가한다.
      3. 기본적으로 inspectdb는 관리되지 않는(unmanaged) 모델을 생성한다. 해당 모델의 meta클래스상에서 managed=False로 지정되어있어 장고가 각 테이블의 생성, 수정, 삭제에 관여하지 못하게 되어있는데, 만약 장고가 테이블의 라이프싸이클을 관리하도록 하고 싶으면 이 옵션을 True로 수정해준다.

 

Django Model Field

  • 모델필드들은 DB 필드들을 반영한다 Ex) Varchar 필드타입 -> CharField, SlugField, URLField, EmailField ...
  • 파이썬 데이터타입과 데이터베이스 데이터 타입을 매핑하는데, 유효성 검사에 따라 다른 모델 필드가 될 수 도 있다.
  • 같은 모델 필드라 할지라도 DB에  따라 다른 타입이 될 수도 있다.

자주 쓰는 필드 옵션

  • blank: empty 허용여부
  • null
  • choices: select 박스 소스로 사용
  • validators: validators를 수행할 함수를 다수 지정. 다양하고 타이트하게 지정해주자.
  • verbose_name: 필드 레이블, 미지정시 필드 명 사용


설계한 데이터베이스구조에 따라 최대한 필드 타입을 타이트하게 지정해주는 것이 입력값 오류를 막을 수 있다!
validator를 다양하고 타이트하게 지정해주는것을 강력히 권장한다.

 

verbose_fields

  • ForeignKey, ManyToManyField and OneToOneField를 제외하고 각 필듵타입은 verbose name이라는 옵션 인자를 받을 수있다. 만약 verbose name이 주어지지 않으면 장고가 필드의 속성명을 사용해 속성명의 빈칸을 언더스코어(_)로 변환해서 자동으로 생성해준다. 

관계형 데이터베이스에서 모델간의 관계는 다음과 같다.

  • 1:1 관계, 1:N 관계, M:N관계

장고에서는 이를 다음과 같이 부른다.

one-to-one, many-to-one, many-to-many 

 

Many-To-One (N:1)

  • django.db.models의 ForeignKey를 사용해서 정의한다. 아래의 예시대로 정의하면 Car는 하나의 manufacturer를 가지지만, Manufacturer은 여러 개의 Car를 가질 수 있단 뜻이다.
class Car(models.Model):
    company_that_makes_it = models.ForeignKey(
        Manufacturer,
        on_delete=models.CASCADE,
    )
    # ...
  • 재귀적으로 참조를 할 수도 있다. models.ForeignKey('self', on_delete=models.CASCADE)식으로 작성해주면 된다.
  • on_delete: foreignkey가 참조하고있는 모델이 삭제될때 장고가 어떻게 처리할지를 정해주는 인자로 다음과 같은 종류를 갖고있다
    • CASCADE : 해당 foreignkey를 가지고있는 모델도 같이 삭제
    • PROTECT: 참조된 객체의 삭제를 ProtectedError를 일으킴으로서 예방한다.
    • RESTRICT: 장고3.1에 새로 추가된 부분.RestrictedError를 일으키며 참조된 객체의 삭제를 예방한다. PROTECT와 달리 상황에 따라서 참조된 객체의 삭제가 허용된다. 

Many to Many: ManyToManyField를 사용한다. ForeignKey와 마찬가지로 셀프 참조가 가능하다.
One to One: OneToOneField를 사용한다.

반응형
댓글