개발 공부하다가 이렇게 화가 나본 적은 또 첨이었다. 후... 그래도 이제는 분에 못이겨 울진 않는데 장고 진짜 개열받았다. 너무 열받아서 그냥 안하고 만다는 심정으로 django 왜씀? 써야함? 이런걸 검색해봤지만 너무 인기있는 프레임워크였고요 ^^... 도망쳐봐야 언젠간 또 마주칠 새ㄲ... 아 아니 녀석이라는 것을 알기 때문에 날잡고 공부 함 해봐야겠다 생각했다.

그리고 금요일 같은 반 김건*씨의 도움을 받아서 대략적으로 어떻게 돌아가는지 구조에 대해서 설명을 들었다. 이 글을 보고 계실지 모르겠지만... 정말 감사했어요... 당신이 내 선생님... 제 2의 선생님입니다... 후후

그리고 토요일에 거의 혼절... 요새 정말 체력이 딸린다... 그래도 암튼 공부하러 늦게나마 맘 먹고 나왔으니 뭐라도 해본다.

MDN Web Docs와 강사님이 주신 자료를 통해 당고에 대해 공부하고 실습해보고 정리해보는 시간을 갖도록 하겠다. 그리고 왜 장고임? 당고라고 부르고 싶음 ㅡㅡ 디제이앙고아님? 아오~ 이름도 짱나~


Django 웹 프레임워크

보안이 우수하고 유지보수가 편리한 웹사이트를 신속하게 개발하도록 도움을 주는 파이썬 웹 프레임워크

잘 알고 사용하면 웹 개발을 하는데 많은 도움을 주기 때문에 프레임워크만 활용하여 애플리케이션 개발에만 집중할 수 있게 해준다고 한다. 흑흑... 나도 잘하고 싶어요.

  • Complete(완결성 있는)
  • Versatile(다용도의)
    → 대부분의 형식(HTML, RSS피드, JSON, XML 등)으로 컨텐츠를 전송할 수 있다
  • Secure(안전한)
    → SQL 인젝션, 크로스사이트 스크립팅, 크로스사이트 요청 위조, 클릭 하이재킹과 같은 보안 취약점을 보완할 방법을 기본적으로 제공한다
  • Scalable(확장성 있는)
    → 컴포넌트 기반의 'shared-nothing' 아키텍처를 사용
  • Maintainable(유지보수가 쉬운)
    → DRY(Don't Repeat Yourself) 원칙을 적용해서 불필요한 중복이 없고 많은 양의 코드를 줄였다
    → 관련된 기능들을 재사용 가능한 "applications"로 그룹화, 더 낮은 레벨에서 관련된 코드들을 모듈로 만들었다
  • Portable(포터블한)
    → 파이썬으로 작성되어있어서, 특정한 서버 플랫폼에 얽매이지 않는다

위와 같은 특성들이 있다고 한다. 내가 느끼기에 큰 장점에 볼드 표시를 해두었다. 특히 아직은 잘 모르겠지만 DRY 원칙이라는 것이 너무 맘에 든다. 오... 바로 약간 좋아지기 시작. 그렇구나... 암튼 일단 여기까지만 봐선 괜찮은 프레임워크같다.

장고를 사용하는 상위 사이트

👉🏻 Disqus, Instagram, Knight Foundation, MacArthur Foundation, Mozilla, National Geographic, Open Knowledge Foundation, Pinterest, and Open Stack

^^ 이런 굴지의 기업들이 사용하는데 나따위가 뭐라고 이걸 안 사용하겠어요 공부해야지 뭐...

MTV 아키텍쳐

사진 출처 - MDN

Django는 Model-Template-View 아키텍쳐를 기반으로 한다. MVC 패턴과 너무너무 비슷한걸요...?

Model : 데이터베이스 구조를 정의하는 곳, 장고의 ORM을 사용하여 데이터베이스와 상호작용을 한다
Template : 사용자에게 표시되는 HTML 페이지를 정의하고, 데이터를 동적으로 표시할 수 있다
View : 사용자의 요청을 처리하고, 적절한 응답을 반환하는 역할을 한다

Model-View-Controller 패턴과 전혀 다를 것이 없는! 다만 View가 같은 단어를 사용하지만 쓰임새가 완전 다른 것 같다. MTV의 V는 MVC의 C와 동일하고, T는 V와 동일한 역할을 하는 것으로 보여진다. 약간 헷갈리네용 ^^

좀 더 자세히 파보자면,

urls.py - 요청을 알맞은 뷰로 전달

URL mapper는 보통 urls.py 파일에 저장되어 있다.

urlpatterns = [
    path('admin/', admin.site.urls),
    path('book/<int:id>/', views.book_detail, name='book_detail'),
    path('catalog/', include('catalog.urls')),
    re_path(r'^([0-9]+)/$', views.best),
]

urlpatterns 맵퍼가 경로들에 해당하는 뷰 함수에 대한 맵핑 목록을 정의한다. (MVC 패턴을 사용할 때 사용했던 라우터 역할을 해주는 곳으로 이해했다.)

urlpatterns 객체는 path() 함수와 re_path() 함수를 항목으로 갖는다.

  • 첫 번째 인수: 일치시킬 경로(패턴), URL의 한 부분이다! 명명된 인수로 수집되어 뷰 함수로 보내진다.
  • 두 번째 인수: 패턴이 일치할 때 호출되는 다른 함수 (ex. vews.book_detail은 이 함수가 book_detail()이며 views 모듈 안에서 찾을 수 있다는 것을 의미한다.)

views.py - 요청 처리하기

뷰는 웹 클라이언트로부터 HTTP 요청을 수신하고 HTTP 응답을 되돌려주는 웹 애플리케이션의 심장이다. 데이터베이스에 접근하고, 템플릿을 렌더링하기 위해 프레임워크의 다른 자원들을 정리한다.

## filename: views.py (Django view functions)

from django.http import HttpResponse

def index(request):
    # Get an HttpRequest - the request parameter
    # perform operations using information from the request.
    # Return HttpResponse
    return HttpResponse('Hello from Django!')

위의 예시는 URL mapper가 불러올 수 있는 최소 뷰 함수 index()의 예시다.

HttpRequest 객체를 인자 (request)로 받고 HttpResponse 객체를 반환한다. 여기서는 단순히 문자열을 반환하고 있다.

models.py - 데이터 모델 정의하기

장고 웹 어플리케이션은 모델이라는 파이썬 객체를 통해 데이터를 관리하고 쿼리한다.

# filename: models.py

from django.db import models

class Team(models.Model):
    team_name = models.CharField(max_length=40)

    TEAM_LEVELS = (
        ('U09', 'Under 09s'),
        ('U10', 'Under 10s'),
        ('U11', 'Under 11s'),
        ...  #list other team levels
    )
    team_level = models.CharField(max_length=3, choices=TEAM_LEVELS, default='U11')

필드 타입과 그들의 최대 크기, 기본 값들, 선택 목록 옵션, 문서의 도움말 텍스트, 폼을 위한 label text등을 포함하여 저장된 데이터의 구조를 정의한다. node.js로 개발할 때 sequelize라는 type orm을 사용해본 적이 있어서 익숙하면서도... class로 정의된 걸 보니 자바같기도 하고... 묘하다 묘해.

암튼 위와 같이 코드를 작성하면, 장고가 알아서 내가 선택한 데이터베이스와 소통하며 모든 작업들을 뒤에서 처리해준다.

views.py - 데이터 쿼리하기

장고는 데이터베이스를 간단히 탐색하기 위해 쿼리 API를 제공한다. 다양한 조건을 통해 수많은 필드를 빠르게 매칭시킨다.

## filename: views.py

from django.shortcuts import render
from .models import Team

def index(request):
    list_teams = Team.objects.filter(team_level__exact="U09")
    context = {'youngest_teams': list_teams}
    return render(request, '/best/index.html', context)

쿼리 작업을 함수로 대체해준다! 사용법은 천천히 배우면 될듯 하다.

데이터 렌더링 (HTML 템플릿)

템플릿 시스템을 사용하면 페이지가 생성될 떄 채워질 데이터에 자리 표시자를 사용하여 출력 문서의 구조를 지정할 수 있다.

## filename: best/templates/best/index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Home page</title>
</head>
<body>
  {% if youngest_teams %}
    <ul>
      {% for team in youngest_teams %}
        <li>{{ team.team_name }}</li>
      {% endfor %}
    </ul>
  {% else %}
    <p>No teams are available.</p>
  {% endif %}
</body>
</html>

오... 이거 아주 JSP와 유사한 듯한 코드 모양...?! 이것도 자세한 문법은 실습을 하면서 공부를 해야겠지만, 아주 읽지 못할 것도 아니긴 하다. 암튼 이런 방식으로 장고가 돌아간다는 것을 한 번 싹 정리했으니 실습을 하면서 차차 더 공부를 해나가면 될듯 하다.

추가로 제공하는 기능들

  • 양식
  • 사용자 인증 및 권한
  • 캐싱
  • 관리 사이트
  • 데이터 직렬화

관리 페이지를 제공하는 것이 너무 신기하고요...?

Python Django 설정 - 가상 환경 생성

Django 프로젝트마다 서로 다른 라이브러리 버전을 사용하거나 충돌이 생기지 않도록 가상 환경을 사용하는 것이 좋다고 한다. 파이썬의 venv 모듈을 사용해서 가상 환경을 생성할 수 있다.

python - m venv myenv
→ 프로젝트 폴더로 이동해서 위의 명령어로 가상 환경을 생성한다.

myenv\Scripts\activate
→ 가상 환경을 활성화한다.

사실 이걸 왜 하는지 이유를 몰랐는데, 김건*님에게 설명을 들으며 대충 이해를 했음.

가상환경 생성 명령어를 입력하면 위와 같이 폴더가 하나 생성된다. 나는 파이참으로 프로젝트 만들 때 자동으로 생성됨... 노트북이랑 학원 노트북이랑 개발환경 맞춰놔야 하는데 귀찮다 ㅠ 암튼 myenv라고 이름을 지었으면 이름이 myenv가 생길 것이다.

Scripts 폴더 안에 activate 라는 파일을 누르면 위와 같은 파일이 열린다. 뭔가를 실행시키는 실행파일이라는 것은 한눈에 알아보겠음! 나머진 모르겠음! 그래서 우리가 myenv\Scripts\activate라는 명령어를 입력하면 이 파일이 실행되며 가상 환경을 띄워주는 것이다. 그래서 다른 프로젝트와 격리를 시켜주는 셈! 그러면 이걸 왜 할까요? 그 이유는 lib 폴더를 들어가보면 알 수 있다.

립 폴더 목록이다. 보면 가운데 Django 파일이 있다. 왜냐면 내가 가상환경을 실행시키고 pip3 install django 명령어를 통해서 패키지를 설치했기 때문이다.

파이썬에는 어떤 패키지라도 설치할 수 있지만, 각 패키지의 하나의 버전만 설치할 수 있다. 때문에 내가 기본/전역 환경에 장고를 설치하면 내 컴퓨터로 작업하기 위해서는 단 하나의 장고 버전만을 대상으로 지정할 수 있다. 이는 내가 과거의 옛날 버전으로 돌아가는 웹사이트를 관리하며 새로운, 최신 버전의 장고를 이용한 웹사이트를 만들고 싶을 때 문제가 된다. 때문에 우리는 독립적인 파이썬 환경에서 파이썬 앱들을 실행한다.

그래서 myenv 폴더에 내가 설치한 패키지들의 목록이 lib에 담겨있고, 그래서 우리가 가상환경을 실행시킨 후에 패키지를 설치해야하는 이유이다! lib은 약간... 휴대용 도서관 같은 느낌... 암튼 왜 가상환경 위에서 해야 하는지, 그리고 이걸 어디에 설치를 해야하는지 몰라서 폴더마다 venv를 만들어 사용했는데 그것이 매우... 이상한 짓이란 것을 깨달았다. 껄껄. 뭐 관리할게 많다면 그렇게 하는 게 맞겠지만 굳이 나는 그럴 필요가 없는 간단한 실습생이기 때문에 ㅎ 월욜에 가면 myenv 폴더부터 싹다 정리 좀 해야겠다. 불필요하게 작업공간을 잡아먹기만 할듯 ㅎㅎ...

암튼 대충 프로젝트 구조와 왜 가상환경에서 파이썬을 실행하는지 이유도 알았다!


본 포스팅은 글로벌소프트웨어캠퍼스와 교보DTS가 함께 진행하는 챌린지입니다.

profile
영차영차 😎

0개의 댓글