3.1 장고의 특징
- MVC 패턴 기반 MVT: view는 template, controller를 view
- model: DB에 access하는 컴포넌트
- View: 데이터를 가져오고 변환하는 컴포넌트
- Template: 데이터를 사용자에게 보여주는 컴포넌트
- 객체 관계 매핑(ORM): DB시스템과 모델이라는 파이썬 클래스를 연결하는 다리 역할. 다양한DB시스템을 지원하고 SQL문장을 사용하지 않고도 테이블 조작 가능
- 자동으로 구성되는 관리자 화면
- 우아한 URL 설계
- 자체 템플릿 시스템: 화면 디자인과 로직에 관한 코딩을 분리하여 독립적으로 프로그래밍 가능, 장고의 템플릿 시스템은 HTML로 쉽게 다룰 수 있음.
- 캐시 시스템: 캐시용 페이지를 메모리, DB내부, 파일시스템 중 아무데나 저장가능, 캐시단위를 페이지에서부터 사이트 전체 또는 특정 뷰의 결과, 템플릿의 일부 영역만을 지정하여 저장가능
- 다국어 지원, 풍부한 개발 환경, 소스 변경 사항 자동 반영
3.2 장고에서의 애플리케이션 프로그래밍 방식
- 애플리케이션? 웹사이트의 전체 프로그램 or 단위 프로그램을 뜻함, 프로그램으로 코딩할 대상을 뜻함
- 장고에서 프로젝트? 웹사이트에 대한 전체 프로그램
- 장고에서 애플리케이션? 모듈화된 단위 프로그램
- MVT 패턴
- model: DB에 저장되는 데이터
- view: 실질적으로 프로그램 로직이 동작하여 데이터를 가져오고 적절하게 처리한 결과를 템플릿에 전달하는 역할 수행
- template: 사용자에게 보이는 UI부분

- Model - DB정의:
- 하나의 모델 클래스는 하나의 테이블에 매핑되고, 모델 클래스의 속성은 컬럼에 매핑됨.
- ORM? 객체를 대상으로 필요한 작업 실행 시, ORM이 자동으로 SQL구문이나 DB API를 호출해서 처리해줌.
- URLconf - url 정의:
- 클라로부터 요청을 받으면 장고는 요청에 들어있는 URL을 분석함
- = 요청에 들어있는 URL이 urls.py파일에 정의된 URL패턴과 매칭되는지 분석함.
- url을 정의하기 위해선 urls.py파일에 URL과 처리함수(뷰)를 매핑하는 파이썬 코드 작성.
- urlconf사용 시, URL과 뷰 함수를 서로 자유롭게 연결할 수 있기에 큰 프로젝트 개발 시 URL과 뷰 함수 이름이 자주 바뀌는 경우에도 URLconf에서 매핑한 부분만 수정하면 되므로 변경용이함.
- p.98 장고에서 URL분석순서 이미지 삽입
- urlpatterns에 정규표현식 사용 가능.
- 기본적으로 path()함수 많이 사용, but url을 정교하게 정의할때는 re_path()함수, 정규표현식사용함.
- View - 로직 정의:
- 뷰는 함수 or 클래스의 메소드로 정의되며, 웹 요청을 받고 응답(ex>html, 데이터, 리다이렉션 명령, 에러메시지..)을 반환해줌.
- 뷰는 views.py파일에 작성함.
- 뷰는 별도로 작성된 템플릿 파일을 해석해서 HTML코드를 생성하고 이를 HTTPResponse객체에 담아서 클라이언트에게 응답.
- Template - 화면 UI 정의:
- 장고가 클라이언트에게 반환하는 최종 응답은 HTML텍스트.
- 템플릿 파일은 *.html확장자를 가지며, 장고의 템플릿 시스템 문법에 맞게 작성함.
- 장고에서 템플릿 파일을 찾을 때는 TEMPLATES 및 INSTALLED_APPS에 지정된 앱의 디렉토리를 검색함.
- MVT 코딩 순서:
- 화면 설계는 뷰와 템플릿 코딩으로 연결, 테이블 설계는 모델 코딩에 반영됨.
- = 독립적으로 개발할 수 있는 모델먼저 코딩, 이후에 뷰와 템플릿을 같이 코딩.
- UI를 생각하면서 로직을 풀어나가는 것이 쉽기에, 보통은 템플릿 먼저 코딩
- 3장 순서:
- 프로젝트 뼈대 생성
- 모델 코딩(models.py, admin.py)
- URLconf코딩(urls.py)
- 템플릿코딩(UI)
- 뷰코딩(views.py)
3.3 애플리케이션 설계하기
- 하나의 애플리케이션이 여러개의 프로젝트에 포함될 수 있기에, 애플리케이션을 한번만 개발하고 이를 다른 프로젝트에 재사용하여 개발의 생산성을 높일 수 있음. --> 계층적인 웹 프로그램 개발 가능
- 프로젝트와 애플리케이션 모두 파이썬 패키지 디렉토리에 해당, 파이썬에서는 __init__.py파일이 존재하는 디렉토리를 패키지라고함.
3.4 프로젝트 뼈대 만들기
- 프로젝트에 필요한 디렉토리&파일을 구성하고 설정 파일을 세팅함, 기본 테이블 생성하고 관리자 계정인 슈퍼유저 생성함.
- 상위 mysite dir: 프로젝트 관련 dir/file을 모으는 역할만 하는 dir
- 하위 mysite dir: 프로젝트 dir
- settings.py: 프로젝트의 전반적인 사항을 설정해주는 곳, 루트 디렉토리 및 각종 디렉토리의 위치, 로그의 형식, 프로젝트에 포함된 애플리케이션의 이름 등이 지정되어 있음.
- 프로젝트에 포함되는 애플리케이션들은 모두 설정 파일에 등록해야함 --> 애플리케이션의 설정 클래스로 등록하는 것이 정확.
- 기본 테이블 생성: migrate명령 = DB에 변경사항이 있을 때, 이를 변경해주는 명령.
- admin사이트에서 Users와 Groups테이블에 대한 데이터의 입력, 변경, 삭제 등의 작업가능.
3.5 애플리케이션 개발 - Model 코딩
- 모델 작업은 DB에 테이블을 생성하는 작업.
- models.py --> 테이블 정의
- admins.py --> 정의된 테이블이 admin화면에 보이게함.
- python manage.py makemigrations --> DB에 변경이 필요한 사항을 추출함.
- python manage.py migrate --> DB에 변경사항 반영
- python manage.py runserver --> 현재까지 작업을 개발용 웹서버로 확인.
- 테이블 정의:
- 장고에서는 테이블을 하나의 클래스로 정의하고, 테이블의 컬럼은 클래스의 변수(속성)로 매핑함.
- __str__()메소드: 객체를 문자열로 표현할 때 사용하는 함수임.
- admin사이트에 테이블 반영:
- models.py에서 정의한 Question,Choice 클래스 import
- admin.site.register()함수를 써서 import한 클래스를 admin사이트에 등록해줌.
- --> 테이블 신규 생성 시, models.py와 admin.py 두개의 파일을 함께 수정해야함.
- DB변경사항 반영:
- python3 manage.py makemigrations
- python3 manage.py migrate
3.6 애플리케이션 개발 - View & Template 코딩
- UI를 위해 필요한 뷰,템플릿을 코딩하기 위해선, 요청에서부터 응답까지의 처리 흐름에 대한 로직이 설계되어야함.
- URL과 뷰는 1:1관계로 매핑됨. --> 이러한 URL/뷰 매핑을 URLconf라고 하고 urls.py파일에 작성함
- 개발 순서:
- urls.py 작성 //URLconf내용을 코딩
- views.index()함수 작성 //index.html 템플릿도 같이 작성
- views.detail()함수 작성 //detail.html 템플릿도 같이 작성
- views.vote()함수 작성 //리다이렉션 처리 들어있음.
- views.result()함수 작성 //results.html템플릿도 같이 작성
- URLconf 코딩:
- path('admin/', admin.site.urls) = 장고의 admin사이트에 대한 URlconf는 이미 정의되어 있어, 이를 활용하고 있음.
- path()함수: 함수 내 인자는 URL/뷰 매핑을 정의함.
- path(route, view, kwargs=None, name=None) --> 앞의 두개의 파라미터는 지정.
- route: URL패턴을 표현하는 문자열(=URL스트링), route가 ' ' 일 경우는 root url을 의미함.
- view: 해당 URL에 상응하는 View를 지정하는 것, HTTPRequest객체와 URL스트링에서 추출된 항목이 뷰 함수의 인자로 전달됨.
- kwargs: URL스트링에서 추출된 항목 외에 추가적인 인자를 뷰 함수에 전달할 때, 파이썬 사전 타입으로 인자를 정의함.
- name: 각 URL패턴별로 이름을 붙여줌(템플릿 파일에서 많이 사용됨)
- path('polls', views.index, name = 'index') --> 만일 요청의 URL이 /polls/면, 해당라인이 매칭되고 URL 스트링에서 추출되는 항목이 없으므로 views.index(request)처럼 뷰 함수가 호출됨.
- path('polls/<int:question_id>/', views.detail, name = 'detail') --> 만일 요청의 URL이 /polls/3/이면, 해당라인이 매칭되고 URL스트링에서 3이 추출되므로 뷰 함수 호출 시 views.detail(request, question_id=3)처럼 인자가 대입됨
- urlconf코딩 시, 하나의 urls.py파일에 작성하는 것 보다, mysite/urls.py와 polls/urls.py 2개의 파일에 작성하는 것이 효율적
- --> URLconf모듈을 계층적으로 구성하는 것이 변경,확장이 용이함.
- 뷰 함수 index() 및 템플릿 작성:
- UI화면을 생각하면서 로직을 풀어나가는 것이 쉽기에 템플릿을 먼저 코딩하고 뷰를 코딩하는게 효율적임.
- ※ html은 기본적으로 정적언어임(수정불가), 이런 html의 한계를 극복하기 위해 사용하는 것이 django의 템플릿 기능임
- ※ {% %}. {{ }와 같은 구문을 통해 HTML내에 동적인 구문을 삽입할 수 있음
- ※ 즉, {{ }} = 단순 변수 출력, {% %} = if, for등 임의의 로직 실행
- 단축함수? 웹프 개발 시, 자주 사용되는 기능들, render()함수처럼 템플릿 코드를 로딩한 후에 context변수를 적용하고, 그 결과를 HTTPResponse객체에 담아 반환하는 작업등의 공통적으로 사용되는 기능들을 장고에서는 이미 개발하여 내장 함수로 제공.
- 뷰 함수 detail() 및 폼 템플릿 작성:
- UI를 템플릿 파일인 detail.html에 내용입력.
- 뷰 함수 vote()및 리다이렉션 작성:
- 사용자가 vote버튼을 누르면, vote() 뷰 함수가 호출됨.
- 폼으로부터 수신한 POST데이터를 처리하는 vote()뷰 함수 작성. --> views.py파일에 vote() 뷰 함수 내용 입력/
- 최종적으로 vote()뷰 함수는 리다이렉트할 타겟 URL을 담은 HTTPResponseRedirect객체를 반환함.
- --> 웹프로그램에서 POST방식의 폼 데이터를 처리하는 경우, 그 결과를 보여주는 페이지로 이동시키기 위해 HTTPResponseRedirect객체를 리턴하는 것이 일반적임.
- Reverse()함수:
- reverse()함수를 사용해서 URL패턴명으로부터 URL스트링을 구할 수 있음.
- reverse()함수의 인자는 URL패턴의 이름과, URL 스트링에 사용될 파라미터임.
- 뷰 함수 results()및 템플릿 작성:
- results() 뷰 함수에 데이터 처리 결과를 보여주는 로직 작성. --> 뷰를 먼저 코딩한 다음에, 템플릿 코딩(앞부분과 반대로 진행)
'파이썬 웹 프로그래밍' 카테고리의 다른 글
파이썬 웹 프로그래밍: Django의 핵심 기능 (1) | 2023.02.03 |
---|---|
파이썬 웹 프로그래밍: 파이썬 웹 표준 라이브러리 (0) | 2023.01.27 |
파이썬 웹 프로그래밍: 웹 프로그래밍의 이해 (0) | 2023.01.26 |