2. 장고 시작하기 - 2

2019. 5. 22. 20:01파이썬 웹프로그래밍

2.6. 장고 기본 명령들

대략적으로 파일들을 살펴보았으니 기본 명령들을 정리하고 살펴보겠습니다.

django-admin startproject : 장고 프로젝트를 만드는 명령입니다. 웹 서비스를 만들 때마다 한 번 실행합니다. 이후 명령들은 django-admin을 이용해 실행할 수 있지만 보통 python manage.py를 통해 실행합니다.
startapp : 프로젝트에 기능 단위인 앱을 새로 만들 때 사용합니다.
makemigrations : 어플리케이션에 변경 사항을 추적해 DB에 적용할 내용을 정리합니다. 보통 앱 안에 있는 모델(model)의 변경 사항이 있을 때 주로 사용합니다.
sqlmigrate : 실행할 SQL 명령문을 출력합니다. 어떤 명령문을 실행할지 확인할 때 사용하며, 튜닝이 안된 쿼리나 슬로우(slow) 쿼리 여부를 확인할 수 있습니다.
migrate : 실제 변경사항을 DB 반영합니다.
showmigrations : 프로젝트의 DB 변경사항 목록과 상태를 출력합니다.
runserver : 테스트 서버를 실행합니다. 웹 서비스를 실제로 동작시켜 확인할 때 사용합니다.
dumpdata : 현재 DB의 내용을 백업할 때 사용합니다.
loaddata : 백업 파일에서 DB로 내용을 복구 할 때 사용합니다.
flush : DB 테이블은 그대로 두고 테이블의 내용만 전부 삭제 합니다.
shell : 장고 쉘을 실행합니다. 작성한 모델 등을 불러와 실제로 테스트를 해볼 수 있습니다.
dbshell : DB에 직접 접근할 수 있는 쉘을 실행합니다. 장고 어플리케이션에 문제가 있어 관리자 페이지에 접근할 수 없을 때 보통 shell을 이용해 DB를 수정하는데 SQL 구문을 이용해 직접 수정하고 싶다면 dbshell을 이용할 수 있습니다.
createsuperuser : 관리자 계정을 생성합니다.
changepassword : 계정의 비밀번호를 변경할 수 있습니다.

위의 기본 명령들은 서비스를 만들 때 비번하게 사용합니다. 대략적인 쓰임새를 기억해두고 프로젝트를 만들어 가면서 사용법을 익혀봅니다.

2.7. 디자인 패턴과 MTV

웹 프로그래밍은 다양한 기술이 섞여 있는 영역입니다. 그래서 다양한 사람들이 섞여 일하기도 합니다. 여러 사람이 일을 할 때는 사람 수만큼이나 많은 문제들이 발생할 수 있습니다. 그래서 선배 프로그래머들이 디자인 패턴이란 것을 만들어 두었습니다.

2.7.1. 디자인 패턴이란?

디자인 패턴은 설계 문제의 해답이라고 할 수 있습니다. 웹 프로그래밍은 백엔드, 프론트엔드, 기획자, 디자이너까지 다양한 영역의 사람들이 얽혀서 일을 합니다. 그래서 종종 다툼이 생기기도 합니다. 백엔드 쪽 일도 한 사람이 전담하기보다는 DB엔지니어의 설계를 전달 받아 적용하기도 하고, 로직을 만들고 수정하기도 합니다. 또 웹 서버와의 연동도 생각해야 합니다.

이렇게 복잡한 형태로 일을 해야하기 때문에 설계상의 문제가 발생할 수 있습니다. 디자인 패턴은 웹 프로그래밍에서만 사용하는 설계 기법은 아닙니다. 그러나 웹 프로그래밍에서는 업무를 진행하는데 있어서 실제로 발생하는 문제를 해결하기 위해 사용하고 있습니다. 바로 프론트엔드 코드와 백엔드 코드의 분리 그리고 로직과 DB의 분리입니다.

디자인 패턴도 프레임워크도 없이 웹 프로그래밍을 할 때에는 하나의 스크립트에 서버에서 처리해야하는 로직과 프론트로 전달되야 하는 html 코드까지 다 섞여 있었습니다. 그래서 프론트를 수정해야 하는 문제에서도 서버쪽 스크립트를 만지는 일들이 생겼고 이를 수정하면서 실수를 하게 되면 로직 코드에도 문제가 발생할 수 있었습니다.

이런 문제들을 해결하기 위해 화면 출력을 위한 HTML 코드를 별도의 파일로 빼내고, 서버쪽 코드는 다시 DB 구조를 위한 파일, 기능을 위한 파일을 분리해 내는 디자인 패턴 방식을 사용하기 시작했습니다. 이렇게 하면 변경이 필요한 각 부분의 파일만 별도로 수정할 수 있기 때문에 다툼이나 위험부담 없이 수정이 가능하게 된 것입니다.

장고에서는 이를 특별한 패턴이름으로 부르고 있습니다. 바로 MTV입니다. 이제 이 MTV를 살펴봅시다.

2.7.2. MVC와 MTV

앞서 살펴본 웹 프로그래밍에서 자주 사용되는 디자인 패턴은 MVC입니다. Model-View-Controller의 약어인데 MTV는 이름만 조금 다를뿐 동일한 패턴입니다. 우선 각각의 기능부터 살펴보겠습니다.

Model : DB의 구조를 결정합니다. 대부분의 경우 테이블을 작성할 때 사용하는데 테이블의 이름, 각 열의 이름과 타입 등을 설계할 때 사용합니다.
View : 사용자에게 보여지는 UI 부분입니다. HTML 코드 등 실질적으로 클라이언트에게 보여질 부분이 들어갑니다.
Controller : 기능, 로직 부분입니다. 넘겨 받은 데이터를 어떻게 해석하고 가공할지 그리고 처리된 결과를 어떻게 클라이언트에게 돌려줄지 결정하는 부분입니다.

장고에서 MTV는 Model-Template-View입니다. MVC와 비교했을 때 View가 양쪽에 다 있지만 기능이 서로 다릅니다. 각각을 연결해보면 (Model:Model)-(View:Template)-(Controller-View)입니다. 단어의 뜻 보다는 같은 위치에 있는 것들끼리 똑같은 역할을 수행한다고 생각하면 됩니다.

이런 MTV 패턴은 장고 전테에 사용되지만 특히 앱 안에서 철저하게 분리해 사용합니다. 아직 앱을 만들지는 않았지만 앱을 만들었다고 가정하고 앱을 만들면 생기는 각각의 파일들의 목적과 용도를 살펴보겠습니다.

기존 프로젝트가 열려있는 파이참에서 터미널을 열고 다음 명령을 입력합니다.

python manage.py startapp app_default

앱을 생성하면 MTV 패턴이 적용된 파일과 폴더가 만들어집니다. 이들 중 중요한 부분을 살펴보겠습니다.

2.7.3. models.py

모델(Model)은 DB의 구조를 결정한다고 했습니다. 장고에서는 models.py를 통해 DB의 명세를 관리합니다. 모델은 클래스로 만드는 클래스의 이름이 테이블 이름이 되고 클래스의 속성들이 컬럼(Column)이 됩니다.

속성의 값이 컬럼의 데이터 타입과 제약 사항을 결정합니다. 또 모델을 이용해 DB의 종류에 상관없이 그리고 프로그래머가 SQL을 모르더라도 DB를 편하게 이용할 수 있도록 ORM이라는 기능을 사용합니다. ORM(Object Relational Mapping)은 객체를 이용해 관계형 DB를 이용할 수 있게 해주는 개념입니다. 장고에서만 사용하는 것은 아니고 다양한 웹 프레임워크에서 많이 사용하고 있습니다.

DB에 주로 하는 일이 생성, 검색, 수정, 삭제인데 모델을 이용하면 ORM 내부에서 자동으로 데이터베이스에 할 일을 전달하고 결과를 반환해 줍니다. 따라서 프로그래머는 특정 DB에서 사용되는 SQL 문이나 API 사용법을 몰라도 웹 어플리케이션을 작성할 수 있습니다. 웹 프로그래머는 다양한 영역을 알아야 한다는 부담감이 있었는데 이제는 ORM 때문에 DB까지 잘 알아야 한다는 부담감을 조금은 내려놓을 수 있게 됐습니다.

2.7.4. admn.py

모델을 이용해 DB에 테이블을 생성했다면 이를 추가, 수정, 삭제, 확인이 가능해야 합니다. 웹 프로그래밍에서 하는 일은 이것이 전부하고 해도 과언이 아닙니다.

모델을 만들고 CRUD 페이지를 사용할 수 있습니다. 이 때 자신이 만든 모델을 관리자 페이지에서 확인하거나 특별한 기능을 추가하고 싶다면 admin.py에 해당 내용을 써주면 됩니다.

2.7.5. views.py

게시판을 만든다고 할 때 어떤 페이지들이 필요할까요? 앞서 들었던 CRUD를 생각해보면 글쓰기, 글보기, 글수정, 글삭제 이런 페이지들이 필요할 것입니다. 이 페이지들을 하나 하나 만들 때는 views.py에 프로그래밍 해줍니다. 뷰(view)를 만든다고 하는데 이 뷰는 클래스형(Class Based)뷰와 함수형(Function Based) 뷰 두가지가 있습니다. 앞으로 대부분의 프로그래밍 작업은 뷰를 만들고 수정하는 일이 될 것입니다.

2.7.6. urls.py

views.py에 어떤 기능을 만들면 해당 기능을 동작 시키는 방식은 url을 통한 호출 방식이 주가 됩니다. '그럼 어떤 url를 이용해 어떤 view를 동작 시킬까'를 결정해야 하는데 이 내용을 urls.py에 기록합니다. 보통은 프로젝트 urls.py와 각 앱에 해당하는 urls.py들로 구성합니다.

2.7.7. templates

보통 HTML이 들어 있는 파일입니다. 확장자는 html이 대부분 이지만 안에는 html 아닌 템플릿 코드들도 들어 있습니다. 템플릿 코드의 문법은 어렵지 않기 때문에 필요할 때마다 익혀 가도록 하겠습니다.

템플릿 파일들 앱 폴더안에 temples 폴더에 위치 시키지만 프로젝트 루트에도 위치할 수 있습니다. 특정 폴더안에 템플릿 파일들을 모아두고 싶다면 파일의 위치를 settings.py에 설정해둬야 합니다.

2.8. 관리자 계정 생성하기

장고의 장점 중 하나인 관리자 페이지도 살펴보겠습니다. 관리자 계정 생성을 위해 다음의 명령을 터미널에 입력합니다.

$ python manage.py createsuperuser

계정명은 admin으로 하고 이메일은 본인의 이메일로 입력합니다. 비밀번호를 입력할 때 주의할 점은 영문과 숫자를 섞고 최소 8자리로 해야한다는 것입니다. 그리고 윈도우 사용자들이 간혹 당황하는 경우가 생기는데 비밀번호를 아무리 입력해도 커서는 움직이지 않습니다. 입력되지 않는 것처럼 보여도 입력되고 있는 것이니 비밀번호를 입력하고 Enter키를 누르면 됩니다.