티스토리 뷰

반응형

🚀  들어가며...

  • 오늘은 저의 기술스택중 하나인 Django에 대해 알아보는 시간을 가져보겠습니다. 또한 다른 프레임워크와는 다른 Django만의 특장점에 대해서도 기술해보겠습니다.

 

📑 내용

Django 개념?

파이썬으로 만들어진 무료 오픈소스 웹 애플리케이션 프레임워크(web application framework)입니다. 쉽고 빠르게 웹사이트를 개발할 수 있도록 돕는 구성요소로 이루어진 웹 프레임워크 입니다.

모델-뷰-컨트롤러 패턴을 따르고 있습니다. 또한 고도의 데이터 베이스 기반 웹사이트를 작성하는 데 있어서 수고를 더는 것이 장고의 주된 목표입니다. 장고는 컴포넌트(Component)의 재사용성과 플러그인화 가능성, 빠른 개발등을 강조 하고 있습니다.

인스타그램, NASA, 빗버킷, Disqus, 모질라 등에서 장고를 사용하는 것으로 알려져 있습니다.

 

 

🔗 장고만의 특징

 

MVC 패턴 기반의 MVT 기반

다른 곳에서는 MVC패턴이라면 Django에서는 MVT(Model-View-Templates)기반입니다. 여기서 모델(Model)은 테이블을 정의합니다. 예를 들면 데이터에 대한 접근, 검증, 작동과 데이터 사이의 관계를 정의합니다. 그리고 뷰(View)의 역할은 애플리케이션의 제어 흐름 및 처리 로직을 정의합니다. 또한 뷰는 HTTP 응답(response)를 반환해야 하며 응답의 종류는 웹 페이지, 리디렉션, 문서 등의 다양한 형태가 가능합니다. 장고에서는 자주 사용되는 형태의 뷰를 패턴화 하여 추상화 해둔 재사용 가능한 뷰들을 내장해 놓았는데 이것을 보고 제네릭 뷰라고 합니다. 템플릿(Template) 데이터가 어떻게 표시되는 지를 정의합니다. 템플릿을 통해 사용자에게 실제로 보여지는 웹 페이지나 문서를 다룹니다.

Django의 MVT패턴

웹 클라이언트의 요청을 받고, 장고에서 MVT 패턴에 따라 처리하는 과정을 요약하면 다음과 같습니다.

  1. 클라이언트로부터 요청을 받으면 URLconf를 이용하여 URL을 분석합니다.
  2. URL 분석 결과를 통해 해당 URL에 대한 처리를 담당할 뷰를 결정합니다.
  3. 뷰는 자신의 로직을 실행하면서 만일 데이터 베이스 처리가 필요하면 모델을 통해 처리하고 그 결과를 반환받습니다.
  4. 뷰는 자신의 로직 처리가 끝나면 템플릿을 사용하여 클라이언트에 전송할 HTML 파일을 생성합니다.
  5. 뷰는 최종 결과로 HTML 파일을 클라이언트에게 보내 응답합니다.

 

객체 관계 매핑(ORM)

ORM은 장고만의 특징은 아니지만, Django에서 자체적으로 지원한다는 것이 장고만의 특징인것 같아서 기술하였습니다.

객체 관계 매핑(Object-relational mapping)이란 데이터베이스와 객체 지향 프로그래밍 언어 간의 호환되지 않는 데이터를 변환하는 프로그래밍 기법입니다. 객체 지향 언어에서 사용할 수 있는 "가상" 객체 데이터베이스를 구축하는 방법입니다. 예를들면 데이터베이스를 SQL문 없이 파이썬 언어를 통해 처리할 수 있습니다. 또한 모델에서 보면 데이터 베이스를 선언할때도 마찬가지로 SQL없이 데이터베이스를 만드는 것을 확인할 수 있습니다.

 

다음과 같은 SQL문을 다음과 같이 바꾸어서 설명할 수 있습니다. 아래는 SQL문으로 유저라는 테이블에 있는 모든 값을 가져오라는 것입니다.

SELECT * FROM USER;

이것을 장고 ORM 으로 표현하면 다음과 같이 표현할 수 있습니다.

User.objects.all()

저희 SmartA10에서도 처음에는 ORM으로 개발을 진행하려 했으나, 워낙 기존 쿼리가 길고(긴것은 쿼리 함수 하나에 300줄 이상) 복잡하여 ORM으로 변환해주기 어렵다고 판단하여 Postgresql로 작성하고 있고, 현재 저도 ORM을 따로 공부하고 있습니다. ORM의 단점은 쿼리 자체가 복잡하면 구현하는데 시간이 오래 걸린다는 것 같습니다.

 

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

장고는 웹 서버의 콘텐츠, 즉 데이터베이스에 대한 관리 기능을 위하여 프로젝트를 시작하는 시점에 기본적으로 관리자 화면을 제공합니다. 커스터마이징도 할 수 있습니다.

 

편리한 URL 설계

웹 프로그래밍에서 URL 디자인은 필수인데, 장고에서는 유연하면서도 강력한 기능을 제공해서 직관적이고 쉽게 표현할 수 있습니다.

저는 보통 Router를 통해 일괄적으로 urlpatterns에 등록하는 편인데 제가 실제로 사용하는 코드를 예로 들어보겠습니다.

 

from django.conf.urls import url
from rest_framework.routers import DefaultRouter

from sabc0109 import views, views_old

urlpatterns = [
    url(r'^$', views.basic_view, {'old_view': views_old.basic_view}),
    url(r'^(?P<question_id>\d+)/$', views.detail_view, {'old_view': views_old.detail_view}),
    url(r'^employment/$', views.employment_view, {'old_view': views_old.employment_view}),
    url(r'^employment/load/$', views.employ_load, {'old_view': views_old.employ_load}),
    url(r'^driver/(?P<question_id>\d+)/$', views.update_driver, {'old_view': views_old.update_driver}),
    url(r'^chkfix/$', views.check_fixast, {'old_view': views_old.check_fixast}),
    url(r'^renew/$', views.renew_view, {'old_view': views_old.renew_view}),
    url(r'^prn/$', views.sabc0109_prn, {'old_view': views_old.sabc0109_prn}),
    url(r'^chkdpl/$', views.check_duplicate, {'old_view': views_old.check_duplicate}),
    url(r'^chk_available/$', views.chk_available, {'old_view': views_old.chk_available}),
    url(r'^renewal/table/$', views.check_yn_exist_sub, {'old_view': views_old.check_yn_exist_sub})
    # url(r'^$', views.index_view, name='index'),
]

router = DefaultRouter()
#ORM관련
#router.register(r'^', views.class명)
#urlpatterns += router.urls

이런식으로 urlpatterns에 한번에 등록하여 사용합니다. 정말 편리하고 우아합니다.

 

자체 템플릿 시스템

settings.py에서 템플릿 경로를 지정해 주어서 내부적으로 확장이 가능하고 디자인이 쉬운 강력한 템플릿 시스템을 가지고 있습니다. 또한 이것을 통해 화면 디자인과 로직에 대한 코딩을 분리하여 독립적으로 개발을 진행할 수 있습니다.

 

캐시 시스템

컨텐츠를 동적으로 작성하는 것은 정적 컨텐츠를 제공하는 것 보다 많은 연산을 필요로 하기 때문에 느립니다. 장고는 유연한 캐싱을 제공하여 렌더링된 페이지 전체 또는 일부를 저장하여 필요할 때를 제외하고 다시 렌더링하지 않도록 할 수 있도록 하는 기능을 제공합니다.

먼저 캐시 시스템은 간단하게 설명하자면 컴퓨터 과학에서 데이터나 값을 미리 복사해 놓는 임시 장소를 뜻합니다. 캐시는 캐시의 접근 시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우나 값을 다시 계산하는 시간을 절약하고 싶은 경우에 사용합니다.

장고에서 캐시는 다음과 같은 과정을 통해 진행합니다.

  1. URL이 오면, 그 페이지를 먼저 캐시에 찾는다.
  2. 캐시에 있다 → 캐시된 페이지를 보여줍니다.
  3. 캐시에 없다 → 페이지를 가져오고 캐시에 저장하고, 보여줍니다.

 

다국어 지원

장고는 동일한 소스코드를 다른 나라에서도 사용할 수 있도록 텍스트의 번역, 날짜/시간/숫자의 포맷, 타임존의 지정 등과 같은 다국어 환경을 제공합니다. 이것또한 settings.py에서 설정할 수 있습니다.

# Internationalization
# https://docs.djangoproject.com/en/1.9/topics/i18n/
LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'Asia/Seoul'

USE_I18N = True

USE_L10N = True

USE_TZ = True

 

 

이 밖에도 여러가지 특징이 있습니다. 공부하면서 하나씩 하나씩 추가해보도록 하겠습니다.

 

🙋🏻‍♂️ 후기

글만 보셔도 알겠지만 상당히 강력한 프레임워크인 것을 알 수 있습니다. 저도 Django에 대해 더욱 더 깊게 공부하여 언젠가는 Django의 마스터가 되었으면 좋겠습니다!

 

 

🔗  참고한 글

https://ko.wikipedia.org/wiki/%EC%9E%A5%EA%B3%A0_(%EC%9B%B9_%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC)

 

장고 (웹 프레임워크) - 위키백과, 우리 모두의 백과사전

다른 뜻에 대해서는 장고 문서를 참고하십시오. 장고(Django, FAQ 발음으로는 "쟁고"(IPA: [ˈdʒæŋgoʊ])[2])는 파이썬으로 작성된 오픈 소스 웹 프레임워크로, 모델-뷰-컨트롤러(MVC) 패턴을 따르고 있

ko.wikipedia.org

https://eun-jeong.tistory.com/31

 

[DB] ORM (Object Relational Mapping) 사용 이유, 장단점

ORM (Object Relational Mapping) 객체지향적 구조? 모든 데이터는 객체이며, 각 객체는 독립된 데이터와 독립된 함수를 지님 SQL 구조? 데이터는 테이블 단위로 관리되며 객체들을 조회하기 위한 명령어

eun-jeong.tistory.com

http://milooy.github.io/TIL/Django/django-cache.html#%E1%84%8C%E1%85%A1%E1%86%BC%E1%84%80%E1%85%A9%E1%84%8B%E1%85%B4-%E1%84%8F%E1%85%A2%E1%84%89%E1%85%B5

 

Django Cache | Today Yurim Learned

Django Cache 캐시 캐시: 고비용의 계산 결과를 저장해둠으로써 다음 번에는 실행하지 않아도 되도록. 순서 URL이 오면, 그 페이지를 먼저 캐시에서 찾는다. 캐시에 있다 -> 캐시된 페이지를 보여준다

milooy.github.io

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함