Search

장고 어플리케이션의 개발 방식

장고를 개발하는데 있어서 가장 중요한 부분은 철저한 분업화다.
MTV라 불리우는 패턴이 그를 말하는데, Model(DB에서 자료를 꺼내오는 부분), Template(사용자에게 실제로 보여지는 페이지), View(꺼내온 자료를 사용자가 볼 수 있는 페이지로 전달하는 부분) 로 나뉜다.
참고로, 자바에서는 이 패턴을 MVC라고 부르는데, 장고의 Template을 View로 칭하는 것뿐이고, 장고의 View를 Controler라고 부르는 차이뿐이다.
사용자에게 노출되는 페이지 부분과 데이터 로직부분을 분리함으로서 유지보수와 개발 용이성을 높이는 방식으로 이름높으며 현재 2000년대 초반 이후로 웹개발의 정석으로 자리잡은 방식이다.
먼저 이클립스를 켜보면, mysite, mysite, manage.py 가 있는데,
1.
manage.py → 장고 프로젝트와 코드를 연결해주는 파일이다. 간단한 수준의 개발에서는 다루지 않는다.
2.
mysite/ __ init __.py → 이 파일은 알아서 생성되는데 이 파일이 있어야 장고 프로젝트 파일들이 하나의 덩어리로 인식된다.
3.
mysite/settings.py → 프로젝트 환경설정 및 언어설정 등등 전반적 설정을 다 작성하게 된다.
4.
mysite/urls.py → 장고 내부 페이지 접근시 사용할 url들을 저장하는 파일이다.
5.
mysite/wsgi.py → 장고를 추후 배포할 때 설정해줘야 하는 파일이다.

1. 슈퍼 계정 생성하기

사이트가 만들어졌을 때는 소위 “운영자”라 불리는 유저 계정이 있어야 한다. 당연히 일반 유저보다 더 강한 권한을 가지고 있다. 사이트 관리를 위한 밑거름이라고 생각하면 된다.
1.
cmd 창을 켠 다음 현재 프로젝트 경로(dir을 했을 때 manage.py가 보여야 함)로 가기

2. django 프로젝트에 명령 내리기

원래 장고 프로젝트는 터미널 창을 통해 개발을 진행하도록 되어있다. 하지만, 명령어가 복잡하므로 이클립스의 pydev는 장고에서 자주 사용하는 명령어를 클릭 한 번에 진행할 수 있도록 모아두었다.
프로젝트 우클릭 → django → 명령어 선택
관리자 설정 등의 중요한 명령어를 제외하고 편리하게 명령을 내릴 수 있으므로 나름대로 진입장벽을 낮추는 한 요인이라고 볼 수 있다.
이제, startapp 명령을 이용해 polls라는 프로젝트를 만들어보겠다.

3. polls 프로젝트 시작

startapp을 통해 polls기능을 추가하자.
mysite 우클릭 → django → create application 클릭 → polls
생성된 프로젝트가 안보이면 pydev package explorer를 클릭한다음 F5를 누르면 생긴 것을 확인할 수 있음.
1.
첫번째로 할 일은 view 작성이다. views.py에서
from django.shortcuts import render from django.http import HttpResponse def index(request): return HttpResponse("Hello world!")
Python
복사
이때, request는 무조건 넣어줘야 한다.
2.
URL conf를 생성해준다. 이를 위해 urls.py를 만들어줘야 한다. 이 패키지의 기능은 “어떤 패턴으로 url을 입력했을 때 어떤 것을 실행해라” 를 만들어주는 것이다.
a.
polls 오른쪽 클릭 → New → Pydev Module 클릭 → 이름에 urls 입력 → finish
그런 다음, 다음과 같이 입력
from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), ] ''' 이때 path가 패턴의 기능을 부여하는 것이고 ''은 아무형식의 url을 의미하고 views.index는 views파일의 index함수를 실행하라는 의미다. from . import views 에서 .은 현 폴더위치를 의미하는 것이고 그 폴더에 있는 views라는 파일을 불러오겠다는 의미다.
Python
복사
그냥 print()는 콘솔창에 결과를 띄우지만 HttpResponse()를 사용하면 웹페이지에 결과를 띄운다.
c.
1차 url과 2차 url의 차이
먼저, 1차 url은 mysite에 있는 urls 를 의미한다. 2차 url은 1차 url안에 있는 url을 의미한다.
mysite안에 있는 urls.py를 먼저 확인해보면 대강 아래와 같다.
from django.contrib import admin from django.urls import include, path urlpatterns = [ path('admin/', admin.site.urls), # 기본 url path('polls/', include('polls.urls')), # 1차 url ]
Python
복사
admin.site.urls는 기본 url의 path를 지정해줄때만 사용한다.
1차 url을 만들때는 startapp을 이용해 만든 파일을 연결해주는 include() 를 사용한다. 그리고 그 파일 내부에 있는 url, 즉 2차 url들과 연결시켜주는 특징을 가진다.
이제, 2차 urls.py를 확인해보자. 여기서는 polls의 urls.py다.
from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), path('main',views.main, name='main'), path('test', views.start, name='test'), ]
Python
복사
먼저, from . import views의 의미는 . 즉, 같은 디렉토리 안에 있는 views.py의 정보를 가져온다는 것이다. urlpatterns는 리스트객체로 이루어지는데, 여러 path를 지정해준다. 이 path들이 2차 url들이 되는 것이다. path의 첫 인자는 해당하는 패턴을 지정해준다. ‘ ‘ 은 정해진 패턴이 없다는 의미이므로 polls라는 url에 들어오게 되면 무조건 실행된다. 반면, main과 test는 웹페이지 상에서 언급을 해줘야 들어가게 되고 각각 views.main과 views.start의 내용을 읽어들인다. 이때, main과 start는 각각의 views안에 들어있는 실행함수다. 뒤에 있는 name은 추후에 배울 것이다.
d.
GET 방식 데이터 처리하기
GET 방식 데이터 처리는 view에서 이루어진다.
좀 더 구체적으로는 view내부의 함수의 request파라미터를 통해서 GET방식으로 들어오는 자료를 수집할 수 있다.
request 파라미터는 사용자의 요청을 저장하는 변수다. 이 변수는 들어온 모든 정보를 일단 저장한다.
GET 방식 자료는 request.GET이라는 방식을 이용해 호출할 수 있다. GET방식은 URL에 사용자가 원하는 요청을 하고 결과를 얻는 방식이다. URL이 공개되도 상관 없는 자료일 때 사용한다.
request.GET은 모든 정보를 조회하는 것과 다를바가 없다. 따라서 원하는 자료를 선별적으로 조회해야 한다.
일단, 딕셔너리 자료형이기 때문에 key로 value를 조회하게 된다.
예를들어, request.GET[’파라미터명’]으로 value값을 조회한다. 하지만, 파라미터값이 들어오지 않으면 에러를 발생시킨다.
이때 error를 발생시키지 않은 방법으로는 request.GET.get(’파라미터명’) 을 사용할 수 있다. 이 방법은 자료가 들어오지 않아도 에러 대신에 None을 출력하기 때문에 자료가 없어서 코드가 멈추는 일이 발생하지는 않는다. (return할때 HttpResponse()를 해도 error는 발생하지 않음, 단 아무값도 반환 x, (하지만 HttpResponse()에 값을 집어넣으면에러발생한다. )
반면, URL에 포함을 안하고 요청하는 방식이 POST방식이다. 민감한 정보를 처리할 때 사용한다.
e.
장고에서 사용할 패키지를 메인 패키지 및 settings.py에 등록해야 한다.
등록하지 않으면 실제 구동이 되지 않기 때문에 반드시 적어줘야 한다. settings.py의 INSTALLED_APPS 리스트에 ‘패키지명’, 을 추가해준다. (임시로 적어두는 것)
실제로 컴퓨터에게 확인을 시키려면 migrate(모델을 실제로 등록하는것)을 진행해야 한다. → 이작업은 모델 관련 사항이 변경될 때마다 한 번씩 진행해줘야 한다.
→ 메인프로젝트 우클릭 → django → make migration → 프로젝트이름 입력
→ makemigrations 작업이 끝나면 바로 메인프로젝트 우클릭 → django → migrate 을 클릭
f.
장고 모델
모델저장 정보를 정의하는 것. 설문조사 어플리케이션은 두 개의 정보를 저장해야 한다. 먼저 첫번째는 질문 관련 정보를 저장해야 한다. 질문 정보는 질문 날짜질문 내용을 저장해야 한다.
두번째는 질문 정보와 더불어서 답변도 저장해야한다. 두번째 정보는 질문정보가 연결되어있어야 하고, 거기에 연결된 자료를 불러올 수 있도록 질문 내역을 연결해야 한다.
사실, 번호에 대한 정보도 설정해야 하지만 장고에서는 다른 프로그램과 다르게 번호를 자동으로 생성해준다.
polls에 models.py에다가 클래스 두개를 만든다. (Question, Choice)
from django.db import models # 모든 장고 모델은 반드시 클래스 생성시 ()내부에 models.Model을 # 넣어서 만들어야 한다. 그래야 모델로 기능할 수 있다. class Question(models.Model): # 창고 1 # 변수명은 칼럼의 이름이 된다. # = models..은 자료의 속성을 나타낸다. # models.CharField()는 문자열 자료임을 나타낸다. question_text = models.CharField(max_length=200) # 문자 칼럼 하나, 200자 이내 # pub_date라는 이름을 가진 칼럼을 만들며 # 이 칼럼은 날짜 자료를 저장한다. # models.DateTimeField()를 사용한다. pub_date = models.DateTimeField('date published') # 날짜 칼럼 하나 class Choice(models.Model): # 창고 2 # ForeignKey는 외부 창고와 연동할 칼럼을 의미한다. # ForeignKey로 생성시 다른 창고의 자료와 공유하는 # 칼럼이 된다. 이때 연결되는 모델의 프라이머리키값(여기서는 ID)를 공유하는 것이다. # on_delete는 ForeignKey로 연동된 모델의 자료가 삭제될때 # 함께 자료가 삭제될지 여부를 정한다. question = models.ForeignKey(Question, on_delete=models.CASCADE) # 문제 번호는 참조변수 choice_text = models.CharField(max_length=200) # 답변 저장할 칼럼 # 숫자를 저장하고 싶을 때는 models.IntegerField를 사용한다. # 단, 저장할 때 처음부터 디폴트값을 지정해주고 싶다면 # default=0 과 같이 입력되자마자 부여될 값을 정해줄 수 있다. votes = models.IntegerField(default=0) # 득표수 칼럼
Python
복사
g.
어드민 활용하기
admin에서는 지난번에 생성한 슈퍼유저 계정을 이용해 로그인할 수 있다. 그러나 로그인 시 polls에 대한 정보를 아직 어드민 사이트에 적용하지 않았기 때문에 아무런 편집도 할 수 없다.
따라서 먼저, admin에 polls를 등록하는 과정을 거쳐야 한다. 등록을 위해서는 admin.py에 polls에 해당하는 모델을 등록한다.
https://docs.djangoproject.com/ko/4.0/intro/tutorial02/ 에서 관리 사이트에서 poll app을 변경가능하도록 만들기내용을 본다.
polls의 admin.py 에 들어가서 다음과 같이 입력한다.
from django.contrib import admin from .models import Question # Register your models here. admin.site.register(Question)
Python
복사
그리고 다시 run as pydev django를 하고 페이지를 새로고침하면 admin 사이트에 Question모델에 대한 수정 권한이 부여된 것을 확인할 수 있다.
Question을 클릭한 다음, question text와 date published를 지정하고 저장을하면 Question object 가 생성된다.
h.
어드민에 등록하기 위한 __ str __ 함수
현재 어드민에 모델 관련 정보가 없지는 않지만 모델을 보기 불편하다.
따라서, admin에서 보여질 정보를 model에 있는 각 클래스들에서 정의해줘야 한다.
이함수들은 반드시 __ str __() 이라는 이름으로 만들어야 하며, 일단 __ str __함수가 추가되면 admin사이트에서 설정한 자료가 노출되며 모델을 구분할 수 있게 된다.
i.
url의 작동원리
urls.py를 지난번에 살펴보았다. 이번에는 urls.py에 대해 좀 더 심도있는 학습을 해 보겠다.
장고에서는 url관련해서 특별한 문법을 제공하고 있다.
바로 우아한 url문법이라는 것인데, 굉장히 편하게 url패턴을 지정할 수 있기 때문에 많은 사랑을 받고 있는 방법이다.
여태까지는 고정 url을 사용했지만 우아한 url을 사용하면 url을 유동적으로 사용할 수 있게 된다.
사용방법은 <int:이 부분을 지칭할 url명칭>과 같은 문법을 사용한다. 지칭할 명칭이 정해지면, 이 명칭을 그대로 뷰에 작성한 함수가 받아서 사용할 수 있게 된다.
i.
먼저, views.py에 elegant 함수를 만들어준다. 이때 필요한 인자는 request, 아무 객체 하나다.
def elegant(request,test): return HttpResponse("<h1>우아한 URL 테스트</h1>")
Python
복사
여기서는 test 를 아무 객체로 만들어준다.
ii.
urls.py에 urlpatterns에 위의 함수를 집어넣어준다.
path('<int:test>',views.elegant),
Python
복사
<int:이 부분을 지칭할 url 명칭> 이 <int: test> 가 되는 것. 구동을 시킨다음 웹페이지에 djangoq/아무숫자 를 입력해보자.
두개 이상 입력하고 싶을 때는 다음과 같이 한다. url의 구분은 / 로 한다.
path('<int:number>'/'<int:number2>', views.elegant),
Python
복사
int형이 아닌 str형을 넣고 싶다면 다음과 같이 한다.
path('<str:number>/<str:number2>', views.elegant),
Python
복사
j.
url을 템플릿에서 활용하기.
urls.py 내부에는 url패턴을 작성할 수 있다. 거기에 더해 name이라는 파라미터에 이름을 부여할 수 있었는데, 이는 나중에 링크주소 등을 나타낼 때 유용하게 쓰인다.