본문 바로가기
Django

[Django] Django 웹 프레임워크

by dio-han 2022. 1. 3.

 

 

1.  일반적인 특징

 

1. MVC 패턴 기반 MVT

 

장고는 MVC(Model-View-Controller)를 기반으로 한 프레임워크이다.

하지만 View를 Template, Controller를 View라고 부른다. 장고에서 Model은 데이터베이스에 액세스하는 컴포넌트이고,

View는 데이터를 가져오고 변형하는 컴포넌트인 반면에 Template은 데이터를 사용자에게 보여주는 컴포넌트이다.

 

2. 객체 관계 매핑

 

장고 객체 관계 매핑(ORM, Object-Relational-Mapping)은 데이터베이스 시스템과 데이터 모델 클래스를 연결시키는

다리와 같은 역할을 한다. ORM 기능을 통해 다양한 데이터베이스 시스템을 지원하고 있으며, SQL 문장을 사용하지 않 고도

데이블을 조작할 수 있다.

 

3. 자동으로 구성되는 관리자 화면

 

장고는 웹 서버의 콘텐츠, 즉 데이터베이스에 대한 관리 기능을 위하여 프로젝트를 시작하는 시점에 기본 기능으로 관리자

화면을 제공한다. 관리자 화면을 통해서 애플리케이션에서 사용하는 데이터들을 쉽게 생성하거나 변경할 수 있으며,

개발자가 별도로 관리 기능을 개발할 필요도 없다.

 

4. 우아한 URL 설계

 

장고에서는 우아한(Elegant) URL 방식을 채택하여 URL을 직관적이고 쉽게 표현할 수 있다.

정규표현식 또한 사용가능하여 복잡한 URL도 표현할 수 있으며, 각 URL 형태를 파이썬 함수에 1:1로 연결하도록

되어있어 개발이 편리하며, 이해하기도 쉽다.

 

5. 자체 템플릿 시스템

 

장고는 내부적으로 확장이 가능하고 디자인이 쉬운 강력한 템플릿 시스템을 갖고 있다.

이를 통해 화면 디자인과 로직에 대한 코딩을 분리하여 독립적으로 개발 진행이 가능하다.

 

6. 캐시 시스템

 

동적인 페이지를 만들기 위해서 데이터베이스 쿼리를 수행하고 템플릿을 해석하며, 관련 로직을 실행해서 페이지를

생성하는 일은 서버에 엄청난 부하를 주는 작업이다. 그래서 캐시 시스템을 사용하여 자주 이용되는 내용을 저장해

두었다가 재사용하면 성능을 높일 수 있다.

장고의 캐시 시스템은 캐시용 페이지를 메모리, 데이터베이스 내부, 파일 시스템 중 아무 곳에나 저장할 수 있다. 또한

캐시 단위를 페이지에서부터 사이트 전체 또는 특정 뷰의 결과, 템플릿의 일부 영역만을 지정하여 저장해 둘 수도 있다.

 

2. 장고에서의 애플리케이션 개발 방식

 

1. MVT 패턴

 

MVC 패턴이란 데이터, 사용자 인터페이스, 데이터를 처리하는 로직을 구분해서 한 요소가 다른 요소들에 영향을 주지

않도록 설계하는 방식이다. 

장고 프레임워크에서는 View를 Template, Controller는 View라고 표현하며, MVC를 MVT 패턴이라고 한다.

모델은 데이터베이스에 저장되는 데이터를 의미하는 것이고, 템플릿은 사용자에게 보여지는 UI 부분을, 뷰는 실질적으로

프로그램 로직이 동작하여 데이터를 가져오고 적절하게 처리한 결과를 템플릿에 전달하는 역할을 수행한다.

 

웹 클라이언트의 요 청을 받고, 장고에서 MVT 패턴에 따라 처리하는 과정

- 클라이언트로부터 요청을 받으면 URLconf를 이용하여 URL을 분석

- URL 분석 결괄르 통해 해당 URL에 대한 처리를 담당할 뷰를 결정

- 뷰는 자신의 로직을 실행하면서, 만일 데이터베이스 처리가 필요하면 모델을 통해 처리하고 그 결괄르 반환받음

- 뷰는 자신의 로직 처리가 끝나면 템플릿을 사용하여 클라이언트에 전송할 HTML 파일을 생성

- 뷰는 최종 결과로 HTML 파일을 클라이언트에게 보내 응답

 

 

2. Model - 데이터베이스 정의

 

모델이란 사용될 데이터에 대한 정의를 담고 있는 장고의 클래스로 매핑해서 코딩할 수 있다. 즉, 하나의 모델 클래스는

하나의 테이블에 매핑되고, 모델 클래스의 속성은 테이블의 컬럼에 매핑된다.

 

이렇게 ORM 기법을 사용하여 테이블을 클래스로 매핑하면, 애플리케이션에서는 데이터베이스에 대한 액세스를 SQL

없이도 클래스를 다루는 것처럼 할 수 있어서 편리하다. 필요에 따라 데이터베이스 엔진을 훨씬 쉽게 변경가능

 

* ORM이란?

ORM(Object-Relational Mapping)은 쉽게 표현하면 객체와 관계형 데이터베이스를 연결해주는 역할을 한다.

기존의 웹 프로그래밍에서 데이터베이스에 접근하려면 직접 SQL 언어를 사용해 데이터를 요청해야 했고, 개발자는

SQL 및 데 이터베이스에 접근하기 위한 드라이버 API 등에 대해 잘 알고 있어야 했다. 하지만 ORM에서는 데이터베이스

대신에 객체(클래스)를 사용해 데이터를 처리할 수 있다. 객체를 대상으로 필요한 작업을 실해앟면, ORM이 자동으로

적절한 SQL 구문이나 데이터베이스 API를 호출해서 처리해주기 때문이다. 

 

3. URLconf -  URL 정의

 

클라이언트로부터 요청을 받으면 장고는 가장 먼저 요청에 들어있는 URL은 분석하여 URL이 urls.py 파일에

정의된 URL 패턴과 매칭되는지를 분석한다.

URL을 정의하기 위해서는 urls.py 파일에 URL과 처리 함수(뷰)를 매핑하는 파이썬 코드를 작성하며 ㄴ된다.

이렇나 URL/뷰 매핑을 URLconf 라고 한다.

 

이와 같이 URL과 처리 함수를 별도로 정의하고, 이 둘을 매핑하는 방법은 개발자에게 많은 유연성을 제공한다.

URLconf를 사용하면 URL과 뷰 함수를 서로 자유롭게 연결할 수 있어서 규모가 큰 프로젝트를 개발할 때처럼

URL과 뷰 함수 이름이 자주 바뀌는 경우에도 URLconf에서 매핑한 부분만 수정하면 되므로 변경이 쉽다.

 

URL 분석하는 순서

- settings.py 파일에 ROOT_URLCONF 항목을 읽어 최상위 URLconf(urls.py)의 위치를 알아낸다.

- URLconf를 로딩하여 urlpatterns 변수에 지정되어 있는 URL 리스트를 검사한다.

- 위에서부터 순서대로 URL 리스트의 내용을 검사하면서 URL 패턴이 매치되면 검사를 종료한다.

- 매치된 URL의 뷰를 호출한다. 호출 시 HttpRequest 객체와 그리고, 매칭할 때 추출된 단어들을 뷰에 인자로 넘겨준다.

- URL 리스트 끝까지 검사했는데도 매칭에 실패하면 에러르 처리하는 뷰를 호출한다.

 

 

꺽쇠 부분을 장고에서는 Path Converter라고 부르는데, 여기에 사용되는 타입

- str : /를 제외한 모든 문자열과 매치된다. 타입이 지정되지 않았다면 디폴트로 str 타입을 사용

- int : 0 또는 양의 정수와 매치된다. 매치된 정수는 파이썬의 int 타입으로 변환된다.

- slug : slug 형식의 문자열(ASCll, 숫자, 하이픈, 밑줄로만 구성됨)과 매치된다.

- uuid : UUID  형식의 문자열과 매치된다. 매치된 문자열은 파이썬 UUID 타입으로 변환된다.

- path : /를 포함한 모든 문자열과 매치된다. 이는 URL패턴의 일부가 아니라 전체를 추출하고자 할 때 많이 사용

 

 

3. View - 로직정의

 

장고는 웹 요청에 있는 URL을 분석하고, 그 결과로 해당 URL에 매핑된 뷰를 호출한다.

 

일반적으로 뷰는 웹 요청을 받아서 데이터베이스 접속 등 해당 애플리케이션의 로직에 맞는 처리를 하고, 그 결과

데이터를 HTML로 변환하기 위하여 템플릿 처리를 한 후에, 최종 HTML로 된 응답 데이터를 웹 클라이언트로 반환하는

역할을 한다.

 

장고에서의 뷰는 함수 또는 클래스의 메소드로 작성되며, 웹 요청을 받고 응답을 반환해준다. 여기서 응답은 HTML 

데이터일 수도 있고, 리다이렉션 명령일 수도 있고, 404 에러 메시지일 수도 있다. 다양한 형태의 응답 데이터를

만들어내기 위한 로직을 뷰에 작성하는 것이다. 이러한 뷰는 보통 views.py 파일에 작성하지만, 원한다면 다른 파일에

작성해도 무방하다. 

 

이 경우는 클래스가 아니라 함수로 뷰를 작성한 예시이다. 뷰는 첫 번재 인자로 HttpRequest 객체를 받는다.

그리고 필요한 처리를 한 후에 최종적으로 HttpResponse 객체를 반환한다.

 

 

5. Template - 화면 UI 정의

 

장고가 클라이언트에 반환하는 최종 응답은  HTML 텍스트이다. 개발자가 응답에 사용할 *.html 파일을 작성하면

장고는 이를 해석해서 최종 HTML 텍스트 응답을 생성하고, 이를 클라이언트에 보내준다. 클라이언트는 응답으로

받은 HTML 를 해석해서 우리가 보는 웹 브라우저 화면에 UI를 보여주는 것이다.

이런 과정에서 개발자가 작성하는 *.html 파일을 템플릿이라 부르며, 여기에 화면 UI 모습을 템플릿 문법에 맞게

작성한다.

 

템플릿 파일은 *.html 확장자를 가지며, 장고의 템플릿 시스템 문법에 맞게 작성한다. 유의할 점은 템플릿 파일을

적절한 디렉토리에 위치시켜야 한다는 것이다. 즉, 장고에서 템플릿 파일을 찾는 방식을 이해하고 있어야 하며, 

장고는 그에 맞는 위치에 템플릿 파일이 위치해야 템플릿 파일을 찾을 수 있다.

 

장고에서 템플릿 파일을 찾을 때는 TEMPLATES 및 INSTALLED_APPS에서 지정된 앱의 디렉토리를 검색한다.

이 항목들은 프로젝트 설정 파일인 settings.py 파일에 정의되어 있다.

 

 

6. MVT 코딩 순서

 

모델, 뷰, 템플릿 셋 중에서 무엇을 먼저 코딩해야 하는지에 대해 정해진 순서는 없다. MVT 방식에 따르면 화면

설계는 뷰와 템플릿 코딩으로연결되고, 테이블 설계는 모델 코딩에 반영된다. 그렇게 때문에 독립적으로 개발할

수 있는 모델을 먼저 코딩하고, 뷰와 템플릿은 서로 영향을 미치므로 모델 이후에 같이 코딩하는 것이 일반적

 

뷰와 템플릿의 코딩 순서도 굳이 정할 필요는 없지만, UI 화면을 생각하면서 로직을 풀어나가는 것이 쉽기 때문에

보통은 템플릿을 먼저 코딩한다. 다만 클래스형 뷰 처럼 뷰의 코딩이 매우 간단한 경우에는 뷰를 먼저 코딩하고

그 다음 템플릿을 코딩하낟.

 

 

3. 애플리케이션 설계하기

 

프로젝트란 개발 대상이 되는 전체 프로그램을 의미하며, 프로젝트를 몇 개의 기능 그룹으로 나누었을 때, 

프로젝트 하위의 서브 프로그램을 애플리케이션이라고 한다. 즉 서브 프로그램인 애플리케이션을 개발하고

이들을 모아서 프로젝트 개발을 완성하게 되는 것이다. 이런 개념으로 프로젝트 디렉토리와 애플리케이션

디렉토리를 구분하고, 코딩하는 파일도 프로젝트 파일인지 애플리케이션 파일인지 구분해서 적절한 위치에

저장해야 한다.

 

- 애플리케이션의 로직 설계

ex) 설문에 해당하는 질문을 보여준 후 질문에 포함되어 있는 답변 항목을 투표하면 그 결과를 알려주는 예제

 

4. 프로젝트 뼈대 만들기

 

프로젝트에 필요한 디렉토리 및 파일을 구성하고, 설정 파일을 세팅한다. 그 외에도 기본 테이블을 생성하고,

관리자 계정인 슈처유저를 생성하는 것이 필요하다. 프로젝트가 만들어지면 그 하위에 애플리케이션 디렉토리

및 파일을 구성한다.

 

이 외에도 프로젝트가 완성된 후에는 templates, static, logs 등의 디렉토리가 더 필요하다.

뼈대를 만들기 위한 명령어 순서