본문 바로가기
파이썬 웹 프로그래밍

파이썬 웹 프로그래밍: Django 웹 프레임워크

by MoonGa 2023. 1. 28.

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부분

클라이언트로부터 요청을 받으면 url conf를 이용해서 URL분석함, URL처리를 담당할 뷰를 결정함, 뷰는 자신의 로직을 실행하면서 DB처리가 필요하면 모델을 통해 처리하고 결과를 반환받음, 뷰는 자신의 로직처리가 끝나면 템플릿을 사용하여 클라이언트에게 전송할 HTML파일을 생성함, 뷰는 최종 결과로 HTML파일을 클라이언트에게 보냄.

  • 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파일에 작성함
  • 개발 순서:
    1. urls.py 작성    //URLconf내용을 코딩
    2. views.index()함수 작성     //index.html 템플릿도 같이 작성
    3. views.detail()함수 작성     //detail.html 템플릿도 같이 작성
    4. views.vote()함수 작성       //리다이렉션 처리 들어있음.
    5. 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() 뷰 함수에 데이터 처리 결과를 보여주는 로직 작성. --> 뷰를 먼저 코딩한 다음에, 템플릿 코딩(앞부분과 반대로 진행)