Django
Python 기반 / 오픈 소스 / 웹 어플리케이션 프레임워크
프레임워크:
장고가 웹 어플리케이션 개발에 많은 기능을 제공하고, 만든 것을 효율적으로 돕는다는 뜻
소규모와 대규모로 나누어짐
# 장점
- 배터리 포함이라는 철학을 가지고 있음
- 소규모 대규모 관계 없이 웹 어플리케이션 개발에 사용됨
- 관리자 패널, 데이터베이스 인터페이스, 인증 및 권한 설정 등과 같은 다양한 기능들이 내장되어 있음
- 파이썬 언어를 사용함
MVC & MTV
기본적인 소프트웨어 디자인 패턴
MVC (Model-View-Controller) << 관심사 분리(Separation of Concern)
Model : 데이터베이스와 상호작용하는 부분. 데이터를 처리하고 검증함.
→ 어플리케이션 데이터와 비지니스 로직을 처리하는 부분. CRUD 작업 등을 수행함.
View : 사용자에게 보여지는 부분 (UI로직) >> 프론트엔드
→ User Interface. 모델에서 처리된 데이터를 사용자에게 보여줌. 사용자의 입력을 받음.
Controller : 모델과 뷰 사이에서 정보를 주고 받으며, 전체적인 흐름을 제어함 >> 백엔드
→ 사용자의 입력을 전달받아서 내부에서 해당 작업에 맞는 모델 함수를 호출하고, 그 결과를 다시 뷰에 전달함.
MTV (Model-Template-View)
→ 장고에서 사용하는 디자인 패턴
Model : 데이터베이스와 상호작용하는 부분. 데이터를 처리하고 검증함.
Templete : 사용자에게 보여지는 부분. HTML, Django 템플릿 언어를 사용해서 만듦.
View : 컨트롤러 역할. 사용자의 요청을 받아 적절한 모델을 호출하고, 데이터나 값 등을 최종적으로 템플릿에 전달하여 페이지 생성
▶ 3가지 역할로 구분한 이유
어플리케이션의 로직을 명확히 구분함으로써 코드의 유지보수성, 가독성을 높일 수 있음
MTV 구조 in Django
Model
데이터베이스의 구조를 Python 코드로 표현한 것
각 모델은 하나의 데이터베이스 테이블에 해당하며, 모델의 속성(attributes)은 테이블 필드(columns)를 나타냄
→ Post라는 이름의 테이블을 데이터베이스 내에 생성함
→ title, content, data는 각각 문자열필드, 텍스트필드, 날짜/시간필드에 대응되며 테이블에 columns를 생성함
ORM (Object Realtional Mapping)
객체지향프로그래밍 언어와 데이터베이스 사이의 관계를 매핑하기 위한 기술
장고는 자체적인 ORM 시스템을 보유하고있음
→ SQL쿼리 없이 데이터베이스 없이 작업을 할 수 있음
→ 실제로 첫 글이 등록되면 어떻게 처리해야하는지에 대한 예시
migration (마이그레션)
장고 모델 변경사항을 추적하고
이러한 변경사항을 실제 데이터베이스 스키마에 반영하기 위한 시스템
URLconf (URL configuration)
특정 URL이 뷰와 어떻게 연결되는지 장고에게 알려주는 매커니즘
장고가 웹 요청을 받으면 이를 처리하기 위해 URLconf를 사용하여 해당 요청 URL을 기반으로 적절한 뷰를 찾음
URLconf 은 urls.py 에 정의됨
→ 이 파일은 프로젝트의 각 폴더 안에 모두 있을 수 있음
urls.py 파일 안에서는 urlpatterns 라는 이름의 리스트 변수를 정의하여 URL 패턴과 뷰 함수/ 클래스 간의 매핑을 나타냄
Path함수 : 첫번째 인자 - URL 패턴 문자열 // 두번째 인자 - 해당 URL에 대응하는 뷰 함수/ 클래스
를 받아서 하나의 경로(route)를 생성함
→ 이렇게 생성된 경로들은 urlpatterns 에 추가됨
어딘가에 post가 만들어져있는 상황일 때,
▼ 해설
<int:id> : 장고 URL 패턴에서 동적 URL 패턴을 정의하는 방법 → 저기가 변할 수 있다고 알려주는 것
1) int : URL의 일부분을 정수로 매칭함
2) str : URL의 일부분을 비어있지 않은 문자열로 매칭함(슬래시 안대염)
3) slug : 아스키 문자, 숫자, 하이픈, 밑줄만 포함하는 문자열에 매칭
4) uuid : UUID 형식의 문자열과 매칭함(16진수)
5) path : 슬래시를 포함한 모든 문자열에 매칭함
뷰 ↔ 함수 / 클래스 연결
장고에서 웹 요청을 받아 처리하고 응답을 반환하는 컴포넌트
함수 형태(function-based view) // 클래스 형태(class-based view) 로 작성됨
function-based view
→ 가장 기본적인 형태의 뷰
→ 하나의 파이썬 함수가 하나의 웹페이지에 대응함
class-based view
→ 유지보수성과 코드 구조화 등 여러 면에서 이점이 있는 클래스 기반의 뷰
Template System
장고 템플릿 언어(DTL)와 템플릿 상속
장고에서 템플릿언어는 HTML 코드에 동적 데이터를 삽입하거나 제어구조(if, for 등)를 사용할 수 있게 해주는 템플릿 엔진
DTL (Django Template Language) :
Template Inheritance 템플릿 상속
여러 페이지에서 공유하는 기본 레이아웃을 한 번만 작성하고
이를 상속받아 각각의 페이지에서 추가해서 사용할 수 있음
→ child.html 파일은 parent.html 파일을 상속받음
→ 부모 템플릿에서 정의한 title 및 content 블록을 재정의하여 자신만의 내용을 추가함
뷰 함수
index() : 전체 질문 목록을 보여주는 페이지 처리
detail() : 하나의 질문에 대한 세부 정보 처리
vote() : 사용자의 투표를 처리하는 로직
results() : 특정 질문에 대한 투표 결과를 보여주는 페이지 처리
# 중간정리!
설계 과정)
프로젝트 설계 → 모델 정의 → URL conf(세팅) 지정→ 템플릿 만들기(정의) → 뷰 작성(정의)
새로운 마이그레이션 생성
python manage.py makemigrations 앱이름 --empty
▶ 마이그레이션 파일을 만들고 migrate 실행 이후 왜 다시 수정이 안될깡?
마이그레이션은 Django에서 데이터베이스 스키마를 변경하는 작업을 추적하는 방법임
모델에 대한 변경사항을 마이그레이션 파일로 생성한 후, migrate를 적용하여 스키마를 업데이트 함
새로운 데이터 생성, 삭제 등의 단순 작업들은 Python 코드 수준에서만 이루어짐
이러한 작업들은 데이터베이스 스키마에 영향을 줄 수가 없음
▼ 뭔가 해줄 때 마다 계속 새로 migrate 해줘야 함
Form 처리
Form 클래스
HTML의 Form요소를 python 코드로 생성하는 것
필드와 그에 대한 유효성 검사를 포함함
https://treasurehunter-jt.tistory.com/57
유효성 검사(Validation)
is_vaild() 메서드를 통해 제출된 데이터의 유효성을 검사함
>>데이터가 유효하다면 T, 아니면 F
해당 필드와 관련된 에러는 form.error에서 확인할 수 있음
모델 폼(Model Form)
ModelForm클래스
모델과 연관된 폼을 생성할 수 있음
모델 필드 기반으로 자동 폼 필드를 생성함
폼 커스터마이징
Form 및 ModelForm을 상속해서 커스텀 폼 생성
# views.py
뷰에서 어떻게 작업을 해줘야할지 고민중
리퀘스트메서드 : 포스트 겟 딜리트 어쩌구
발리드 : 유효성검사
# contact.html
FormView
폼 제출을 처리하는 뷰
form_class 속성을 사용하여 폼 클래스를 지정함
success_url 속성에 폼 제출성공시 리다이렉트할 URL을 지정할 수 있음
form_vaild() 메서드를 오버라이드 하여 추가로직을 구현할 수 있음
reverse
주어진 뷰에 대한 URL 생성
reverse_lazy
느린 reverse
명시적 엑세스(explicitly accessed) 될 때 까지 URL을 생성하지 않음
보통 success_url 같은 클래스 기반 뷰에서 사용
CBVs & FBVs
장고 뷰에서는 HTTP 요청을 받아서 처리하고 HTTP 응답을 반환함
해당 기능을 사용하기 위해 FBVs CBVs 를 사용함
함수형 뷰
Function-Based Views : FBVs
클래스 뷰
Class-Based Views : CBVs
OOP 객체지향
뷰 클래스
장고의 가장 기본적인 CBV
HTTP 메서드에 따라 호출되는 메서드를 정의할 수 있음
URL 패턴에 뷰를 연결하려면 as_view() 메서드를 사용해야 함
# urls.py
→ 클래스뷰의 get() 메서드와 urls의 as_view() 메서드는 항상 함께 다님!
templateView
템플릿을 랜더링 하고 그 결과를 HTTP 응답으로 반환함
ListView // DetailView
객체 목록과 단일 객체 상세정보를 보여줌
CreateView // UpdateView
추가적인 로직이 필요하다면 메서드 오버라이드 해서 사용하면 됨
→ 갯_컨텍트_데이타, 폼_발리드 같은 애들
GenericView
공통적으로 사용할 수 있는 기능들을 추상화하여 제공해주는 클래스형 뷰
→ 추상클래스
→ 클래스형 뷰를 만들때 보통 제네릭뷰를 상속받음
▼ django.views.generic. 패키지 ▼
BaseView : View, TemplateView, RedirectView
Generic Display View : ListView, DetailView
Generic Edit View : FormView, CreateView, UpdateView, DeleteView
Generic Date View :
ArchiveIndexView(날짜기반 최상위 뷰) - date_field 속성에 지정한 날짜 필드를 내림차순으로 보여줌
YearArchiveView - 추출된 연도 인자를 기준으로 Month를 보여줌
MonthArchiveView - 추출된 연, 월에 해당하는 객체들을 보여줌
WeekArchiveView - 추출된 연, 주에 해당하는 객체들을 보여줌
DayArchiveView - 추출된 연, 월, 일에 해당하는 객체들을 보여줌
TodayArchiveView - 오늘 날짜에 해당하는 객체를 보여줌
DateDetailView - 연, 월, 일 또는 pk에 해당하는 객체 하나를 보여줌
커스터마이징
메서드 오버라이딩
Mixin
여러 뷰에서 공통적으로 사용되는 동작을 Mixin 으로 정의해서 코드를 줄임
보통 클래스 기반에서 이친구를 사용할 수 있움
→ HellpView에서는 모든 요청에대해 Request Process 라는 메세지를 호출함
>> 믹스인을 상속 받았으니까
→ 주의할 점: 믹스인은 독립적으로 동작할 수 없음
>> 무조건 상속받아서 써야함
>> Python MRO에 따라 상속 순서가 중요함
>> MRO: Method Resolution Order
>> 실제 뷰 클래스는 최하위에 존재해야 함
CBVs | FBVs | |
- 복잡한 웹 어플리케이션에서는 클래스와 오버라이딩을 통해 체계적인 개발을 할 수 있음 - 유지보수성, 재사용성, Mixin - 제네릭클래스뷰를 활용하면 CRUD 작업같은 로직을 쉽게 구현할 수 있음 |
장 점 | - 간단한 로직이나 작은 프로그젝트에 적합 - HTTP메서드 별로 처리가 필요한 경우 if문만 가지고도 충분히 처리 가능 |
- 메서드를 오버라이딩하여 사용할 때, 항상 해당 메서드를 super() 로 호출해야 함 - Mixin 구조짜는거 |
주의점 | - |
랜더링
Django 에서 뷰를 구현할 때, render 함수를 사용하는 것이 일반적
render함수는 템플릿 파일과 context 데이터를 받아서
최종적인 HTML 응답을 생성하고 이를 HTTPResponse 객체에 담아 반환함
render(request, 'template.html', context)
→ 이미 내부적으로 HTTPResponse 를 사용하고 있는 것!
'BackEnd > Django' 카테고리의 다른 글
[Django] 로그 남기기 (0) | 2023.09.27 |
---|---|
[Django] Server (0) | 2023.09.25 |
[Django] admin Site (0) | 2023.09.20 |
[Django] Templates System (0) | 2023.09.20 |
[Django] (0) | 2023.09.18 |