Django

What(정의)와 WHY(왜)를 중심으로 공부하기 — 프레임워크(1)

SoniaComp
6 min readApr 10, 2021

Django

사용한 버전: 3 ( 파이썬 버전 3 변화 설명 )
→ 최신 파이썬과 호환(파이썬 3.6 이상 지원)
→ 보안적인 측면에서도 최신 버전을 사용하는 게 좋다고 생각함

장고 Coding Style

공식문서 링크

WHAT

  • 웹 개발을 빠르고 쉽게 할 수 있도록 디자인된 웹 프레임워크
  • DB 기반의 특히 CRUD 기능을 가진 웹 사이트를 만드는 데 강력
    → 어떤 API가 있나?
  • Model → URLs → Views → Templates

ORM

  • Object Relational Mapping 객체-관계 매핑
  • WHAT: 객체와 관계형 데이터 베이스의 데이터를 자동으로 매핑해주는 것
  • WHY: DB와 어플리케이션의 특징[특히 데이터를 다루는 인터페이스]의 차이
  • HOW: 객체 간의 관계를 바탕으로 SQL(Structured Query Language)을 자동으로 생성

장점

  • DB와의 매핑 부분에 더 이상 신경쓰지 않기 때문에,
    개발자가 객체 모델로 프로그래밍을 하는 데 집중할 수 있습니다.
  • 또한 코드의 가독성도 더 좋아지겠죠?
  • 하나의 ORM으로 MySQL, PostgreSQL에 연결할 수 있으므로, DBMS에 대한 종속성도 줄어듭니다.

단점

  • 자동으로 생성되는 쿼리 때문에 직접 SQL을 사용하는 것보다 복잡할 수 있다.

객체와 RDBMS 차이점

  • 세분성(Granularity): 경우에 따라서는 데이터베이스에 있는 테이블 수보다 더 많은 클래스를 가진 모델이 생길 수 있다.(User라는 Table이 Person, Address라는 클래스로 구분해서 생성하는 경우)
  • 상속성(Inheritance): RDBMS는 객체지향 프로그래밍 언어의 특징인 상속 개념이 없다.
  • 일치(Identity): RDBMS는 Primary key를 이용하여 동일성을 정의하지만 객체지향 언어는 객체 식별(a==b)과 객체 동일성(a is b)을 모두 지원한다.
  • 연관성(Associations): 객체지향 언어는 방향성이 있는 객체의 참고를 사용하여 연관성을 나타내지만 RDBMS는 방향성이 없는 외래키를 이용해서 나타낸다.(객체 지향 언어는 쌍방향 참조시 각 객체가 서로를 참조할 변수를 지녀야 한다.)
  • 탐색(Navigation): 객체지향 언어의 경우 객체간의 연결을 통해서 이동하며 탐색 및 순회하지만, RDBMS에서는 일반적으로 SQL문을 최소화하고 쿼리를 최적화하여 Join을 통해 여러 entity를 로드하고 탐색 및 선택한다.

Django ORM

  • 장고는 모델을 사용하여 데이터를 정의합니다. 모든 장고의 모델은 장고 모델 클래스를 상속 받습니다.
  • 모델의 각 속성은 DB의 필드를 나타냅니다.
  • 모델 클래스는 DB에 접근할 수 있는 API를 제공해줍니다.

ORM 쿼리 최적화

  • Lazy-Loading 방식
    ORM에서 명령을 실행할 때마다 데이터베이스에서 데이터를 가져오는 것이 아님
    → 모든 명령 처리가 끝나고 실제로 데이터를 불러와야 할 시점이 왔을 때 데이터베이스에 쿼리를 실행하는 방식
  • N+1 Problem
    → 쿼리 1번으로 N건의 데이터를 가져왔는데 원하는 데이터를 얻기 위해 이 N건의 데이터를 데이터 수 만큼 반복해서 2차적으로 쿼리를 수행하는 문제
  • Eager-Loading방식
    → 사전에 쓸 데이터를 포함하여 쿼리를 날리기 때문에 비효율적으로 늘어나는 쿼리 요청을 방지
    1) select_related : foreign-key , one-to-one 처럼 single-valued relationships에서만 사용이 가능하다. SQL의 JOIN을 사용하는 방법이다.
    2) prefetch_related : foreign-key , one-to-one 뿐만 아니라 many-to-many , many-to-one 등 모든 relationships에서 사용 가능하다. SQL의 WHERE … IN 구문을 사용하는 방법이다.

MVC 패턴

  • 어플리케이션을 Input, Output, 로직으로 분리한 패턴입니다.
  • Input(Controller) [ 사용자 입력 ] → [ 모델이나 뷰의 요청 ]
  • Output(View) [ 컨트롤러 요청 or Model 업데이트 ] → [ 사용자 인터페이스 ]
  • 데이터와 로직(Model) [ 컨트롤러 요청 ] → [ 뷰에 변경사항 업데이트 ]

MTV 프레임워크

  • 장고의 MTV 프레임워크는 MVC 변형 패턴을 구현한다.
  • Input(URL 디스패처) [ URI(Uniform Resource Identifier) ] → [ 특정 뷰 ]
  • Output(Template) [ 뷰 호출 ] → [ 데이터를 렌더링한 사용자 인터페이스 ]
  • 데이터와 로직
    1) 뷰
    [ URL 디스패처 요청 ] → [ ORM API 요청 ] (데이터 제작하고 변형)
    [ ORM API 응답 ] → [ 템플릿 ] (데이터와 Template 매핑)
    2) 모델 + Django ORM [ 객체 ] ←→ [ SQL ]
    3) 데이터베이스 [ SQL ] → [ SQL ]

Admin: 자동화된 모델 중심 뷰

  • WHAT: 자동 생성되는 관리자 인터페이스로, 모델을 코딩 없이 빠르게 생성 / 편집할 수 있습니다.
  • HOW: 모델의 메타 데이터를 읽음

CBV(Class Based Views)

  • 상속과 믹스인 기능을 이용하여 뷰를 체계적으로 구성할 수 있다.
  • 메소드로 행위를 정의함으로 코드가 깔끔하다.
    ex) GET, POST 등 HTTP 메소드에 따른 처리 코드를 작성할 때
  • 객체지향 기법(ex. 다중상속) 을 활용
    → 코드의 재사용과 개발 생산성을 높여준다.
    → ex) 제네릭 뷰 오버라이딩: 속성 변수 오버라이딩, 메소드 오버라이딩

CBV Code Style [ 지향하는 Views Style ]

  • 뷰는 간단 명료해야 한다.
  • 뷰 코드의 양은 적으면 적을수록 좋다.
  • 뷰 안에서 같은 코드를 반복적으로 사용하지 않는다.
  • 믹스인은 간단명료해야 한다.

Serializing Django Objects

장고의 Serialization Framework는 장고 모델을 다른 포맷으로 translating 하는 기능을 제공하기 위해 사용됩니다. → xml, json, yaml 로 변경 가능

  • 아래 모두 데이터를 표현하는 방식
  • xml: HTML가 흡사한 구조 (<></>)
    → XML 선언: version, encoding, standalone
    →주석 사용 가능
  • json: 주석을 사용할 수 없지만, API 개발에 많이 사용됨
    → 멀티 바이트 문자를 인코딩하여 보여줌
    → Javascript 객체의 형식을 기반으로 만들어짐
    → 용량이 작음
  • yaml: 공백 위주로 데이터를 구분
    → 한글과 같은 유니코드를 그대로 사용할 수 있음
    → 설정 파일을 작성할 때, 가장 많이 사용됨
    → 상속등의 기능도 적용할 수 있음

Django Settings

  • BASE_DIR
    프로젝트 루트 폴더를 지정한다
  • DEBUG
    디버그 모드를 설정한다.
    True일 경우 다양한 오류 메시지를 즉시 확인할 수 있다.
    배포 할 때는 False로 바꿔준다.
  • ALLOWED_HOSTS
    서비스의 호스트를 정한다.
    개발시에는 비어두고, 배포 시에는 실제 도메인을 적어준다.
  • INSTALLED_APPS
    현재 프로젝트에서 사용하는 앱의 목록을 기록하고 관리
  • MIDDLEWARE
    모든 요청/응답 메시지 사이에 실행되는 특수한 프레임워크
    주로 보안에 관한 내용
  • ROOT_URLCONF
    기준이 되는 urls.py의 경로를 설정한다.

--

--

SoniaComp
SoniaComp

Written by SoniaComp

Data Engineer interested in Data Infrastructure Powering Fintech Innovation (https://www.linkedin.com/in/sonia-comp/)

No responses yet