Django
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의 경로를 설정한다.