1.0 웹 프로그래밍 최근 동향

웹 프로그래밍이란 클라이언트와 서버를 분리하지 않고 양쪽을 한 번에 개발하는 방식입니다. 시간이 흐르고 시장이 원하는 시스템이 복잡하고 다양해짐에 따라 시스템 개발자들은 많은 요구사항을 충족시켜야 하게 되었습니다. 더 이상 두 가지를 동시 개발하는 방식으로는 복잡한 시스템 개발에 대응할 수 없게 되었고, 클라이언트 쪽은 프론트엔드, 서버 쪽은 백엔드 개발로 분업화가 이루어지게 되었습니다. 프론트엔드 개발자는 자바스크립트를 주 언어로 사용하며 react, angular, vue 등의 프레임워크를 활용하고 있습니다. 백엔드 개발자는 파이썬, 자바, 루비, 고, C++ 등 각자 취향과 기호에 맞는 언어를 사용하여 개발을 진행하면 됩니다.

예전에는 자바스크립트의 언어 자체 성숙도가 그리 높지 않았고 자바스크립트가 처리해야 할 기술적 요구사항이 복잡하지 않았기 때문에 기능적 한계가 있었지만 시대가 변하면서 요구 사항이 복잡해졌습니다. 이에 맞춰 자바스크립트도 발전했고 그 결과 UI 제어 및 데이터 전달과 관련된 모든 로직을 전담할 수 있게 되었습니다. 이로 인해 서버사이드 언어와 가벼운 자바스크립트 로직을 혼합하여 사용하는 MVT 패턴은 최근 웹 프로그래밍 트렌드에서 선호되지 않는 방식이 되었습니다.

규모가 작은 프로젝트의 경우 한 사람이 프론트엔드/백엔드를 모두 담당한다면 MVT 아키텍처 개발 방식이 유용하겠지만, 현업에서는 주로 프론트엔드와 백엔드를 나누어 개발하는 방식을 선호합니다. 분업 방식에서는 일정 수준 이상의 복잡도가 요구되는 서비스를 개발하기 위해 MVT 패턴의 템플릿이 해야 하는 역할을 프론트엔드(자바스크립트)가 전부 대체하게 됩니다. 이 책은 파이썬 언어, 장고 프레임워크를 사용하게 될 백엔드 개발자를 위해 쓰여졌습니다. 백엔드 개발을 중심으로 내용을 구성하였기에 프론트엔드에 관한 내용은 제한적으로 수록하고 있습니다. 요즘 시대의 현업에서는 분업화된 개발 방식을 선호하니 새겨두시길 바랍니다.

1.1 장고란 무엇인가

장고는 풀스택 프레임워크입니다. 장고라는 개발 생태계 내부에서 대부분의 기능이 전부 제공된다는 의미입니다. 장고는 자체적으로 ORM을 가지는 몇 안 되는 파이썬 웹 프레임워크입니다. 여기에 필수 모듈 중 하나인 django REST framework를 붙이면 풀스택 웹 프레임워크로 사용하는데도 무리가 없습니다.

장고가 풀스택 프레임워크로서 모든 기능을 제공한다는 것은 장고의 설계 의도에 맞게 기능들이 유기적으로 얽혀 있음을 의미합니다. 그렇기 때문에 장고를 잘 이해하고 있다면 손쉽게 활용할 수 있겠으나, 그렇지 못한 경우에는 오히려 개발속도를 저해하는 요인이 될 수 있습니다.

장고의 구조

MTV 아키텍쳐 (Model, Template, View)를 기본으로 하며 장고 모듈과 맵핑됩니다. 장고에서는 MTV 패턴으로 전반적인 개발을 진행합니다. 여기서 어떤 패턴으로 개발을 진행한다는 것은 작업을 함에 있어 어느 정도의 정해진 규칙과 방식이 있고, 그 방식을 따라가며 중간중간 방식이 요구하는 내용을 순서대로 채워 넣으며 개발한다는 개념으로 이해하시면 좋습니다. 다른 예시로 레고를 조립하는 방법을 알려주는 설명서와 같은 개념으로 이해하시면 좋습니다. 레고를 완성하는 다양한 방법이 있을 수 있겠지만, 설명서에 나온 체계적인 프로세스를 따르다보면 더 최적의 효율로 간편하고 쉽게 완성할 수가 있는 것과 같습니다.

개발하는 패턴에는 여러 방법이 있을 수 있습니다. 이러한 패턴은 앞서 말했듯 어떤 문제를 해결하기 위해 제시될 수 있는 다양한 방법론 중 하나입니다. 본 책을 통해 학습하는 학습자들은 프로젝트를 혼자 진행하고 있지만, 세상의 모든 개발을 혼자할 수 없기 때문에 다른 사람이 이해하기 쉬운 구조로 프로젝트를 개발하는 것은 매우 중요합니다. 대부분의 개발자들이 알고 있는 방식이라면 더할 나위 없을 것입니다. 그러한 직관적이고 잘 알려진 개발 방법론 중 하나가 MTV 패턴입니다.

코드1. 모델(model): 앱의 데이터와 관련된 부분을 다루는 부분입니다.

from django.db import models

class ExampleModel(models.Model):
    ...

코드2. 뷰(view): 모델과 템플릿 사이에서, 모델 -> 템플릿으로의 데이터 전달과 템플릿에서 발생하는 이벤트를 처리해줍니다.

from django.views.generic import TemplateView

class MainPageTemplateView(TemplateView):
    template_name = '.../.../...'

코드3. 템플릿(template): 사용자에게 보이는 부분을 담당하고 있습니다.