1월 31, 2022

~Routing

 *생활코딩 Django 편을 개인 공부를 목적으로 정리한 글임을 밝힙니다*

출처:https://www.youtube.com/watch?v=pbKhn2ten9I&list=PLuHgQVnccGMDLp4GH-rgQhVKqqZawlNwG



웹 어플리케이션을 만드는 작업중에 많은 부분은 공통적입니다. 따라서 어떠한 사이트를 만들더라도 똑같이 해야할 일들이 많습니다. 

⇒ 이런 작업을 미리 해둔 소프트웨어를 Web Framework라고 합니다.

Django는 파이썬 진영의 대표적인 Web Framework로써,요청이 들어올때마다 웹 페이지를 순간적으로 찍어낼 수 있는 일종의 웹 페이지 공장입니다. 


포트의 개념

127.0.0.1이라는 IP adress를 가진 서버컴퓨터에 3개의 서버 소프트웨어가 동작하고 있습니다. 저는 서버에 접속하기 위해 http://127.0.0.1 으로 주소를 입력합니다.

이때, 3개의 소프트웨어 중 어느것과 통신하게 될지 모호해지는 문제가 발생합니다. 

이러한 문제를 해결하기 위하여 PORT라는 개념이 존재합니다. 

예를들어, 첫번째 프로그램이 80번 포트를 listening하는 중이고, 제가 그 포트를 통해 접속하고 싶다면, http://127.0.0.1:80 이렇듯 주소에 포트번호를 주어 80번 포트를 listening하는 서버와 통신할 수 있게 됩니다. 

파이썬 개발서버는 기본적으로 8000번 포트에서 listening하게 됩니다. 제가 8000번 포트를 접속하려 하는데, 가끔은 이미 8000번 포트에 파이썬 개발서버가 아닌 다른 서버가 실행되고 있을 수 있겠죠? 이럴때는 

1. 그 개발 서버를 끄고 해당 개발 서버를 실행하거나

2. 나의 개발서버를 다른 포트에 listening시킴으로서 문제를 해결할 수 있습니다

2번의 경우 ,python manage.py runserver 8888,  이런식으로 다른 포트(8888)에서 서버를 운용하라는 명령어를 주면 됩니다.


app 만들기


django-admin startproject myproject .  

으로 현재 디렉토리에 myproject라는 프로젝트를 시작합니다.

settings.py 안에는 프로젝트를 운용하는데 필요한 여러 설정들이 있습니다

urls.py 는 사용자가 접속하는 그 path에 따라서, 그 접속을(요청을) 어떻게/누가 처리해줄것인가를 지정하는 , 말하자면 routing(네트워크 안에서 통신 데이터를 보낼 때 최적의 경로를 선택하는 과정)을 담당하는 파일입니다

myproject 폴더 밖에 있는 manage.py : 프로젝트를 진행하는데 있어서 필요한 여러가지 기능이 들어가 있는 유틸리티 파일입니다.

근데, 실제로 애플리케이션은 프로젝트 안에서 구현하는 것이 아니라, app이라고 하는 더 작은 단위를 만들어서, 그 안에서 실제 구현을 하게 됩니다.

프로젝트를 만들다보면 복잡해질 수 있는데, 여러개의 app들을 만든 후, 서로 연관된 로직들을 모아서 grouping하게 됩니다. 

각각의 app안에도 urls.py 라는 파일이 또 담겨져 있게 됩니다. 

그리고 app 안에는 views.py 라는 파일이 담기고 , 그 파일 안에 여러 함수를 만들어 application의 구체적인 구현을 하게 됩니다. 

전반적인 작동과정을 보면 이해가 한결 쉽습니다.




1. 사용자가  여러가지 경로로 접속하게 되는데, 그 각각의 경로를 누구에게 위임할 것인가를 urls.py 파일을 수정해서 결정합니다
2. 그 urls.py 파일에 적혀있는데로 적당한 app으로 위임이 됩니다
3. 그럼 app 안에 있는 urls.py 안에서도 제가 작성한데로 적당한 view의 적당한 함수에 위임이 됩니다
4. 이제 구체적인 작업을 해나갈 것인데, 그 과정에서 Database를 사용하게 됩니다. 근데 django안에 model이라는 굉장히 편리한 수단이 있어서, 그 model을 통해서 DB를 사용하게 됩니다.
5. model을 통해 DB에 있는 정보를 받아서, 우리는 클라이언트에게 응답을 해주게 됩니다.
6. 그 결과 최종적으로 html이나 json이나 xml같은 형태의 데이터를 만들어 사용자에게 보내주게 됩니다.

app을 직접 만들어봅시다. django-admin startapp myapp(뒤의 myapp은 app이름) 의 명령어를 실행하자




myapp이라는 폴더가 생겼습니다.


Routing

사용자가 접속한 각각의 경로를 누가 처리할 것인가를 지정하는 것이 routing입니다

Django에서는 project폴더 안의 urls.py가 가장 큰 틀의 routing을 하고, 그것을 적당한 app으로 위임을 해주면, app이 view안에 있는 특정 함수로 위임을 하여 그 함수가 작업을 처리하게 됩니다. 


myproject/urls.py 

 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
"""myproject URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/4.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from xml.etree.ElementInclude import include
from django.contrib import admin
from django.urls import path, include    #include를 사용하기 위해import해줌

# http://127.0.0.1/
# http://127.0.0.1/app/

# http://127.0.0.1/create/
# http://127.0.0.1/read/1/

urlpatterns = [                          # urlpatterns안에 routing과 관련된 list가 있어야 함
    path('admin/', admin.site.urls),     # 관리자화면으로 이동하기 위한 routing설정
    path('',include('myapp.urls'))       # http://127.0.0.1/ 으로 사용자가 접속했을 때 myapp에 있는 urls의 views로 위임하기 위해
]                                     # include의 인자는 myapp.urls

myapp/urls.py

 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
"""myproject URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/4.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from xml.etree.ElementInclude import include
from django.contrib import admin
from django.urls import path
from myapp import views 

urlpatterns = [
    path('', views.index), 
    #사용자가 아무것도 없는 경로로 들어왔다면, views.index 실행해라
    path('create/',views.create), #사용자가 create로 들어왔다면 #views.create실행
    path('read/<id>/',views.read) #사용자가 read/1으로 들어왔다면 views.read 실행
]                                  # 가변 값이라는 것을 나타내기 위해 <>안에 값의 이름을 넣음

myapp/views.py

1
2
3
4
5
6
7
8
9
from django.shortcuts import render, HttpResponse

# Create your views here. #클라이언트로 정보를 전송하는 역할을 하는 함수
def index(request):                    #관습적으로 request를 인자에 사용(요청과 관련된 여러 정보 들어오는 객체가 전달되기에)          
    return HttpResponse('Welcome!')    # client로 보내줄때 http를 이용해서 return하겠다는 의미
def create(request):
    return HttpResponse("create")
def read(request,id):                  #가변값 id를 파라미터로 받아 return함
    return HttpResponse("Read"+id)  

127.0.0.1:8000/read/1/ 로 접속했을 시 




127.0.0.1:8000/read/2/ 로 접속했을 시 



정리!!



1. read/1 로 들어오면 사용자는 myproject의  urls.py의 urlpatterns를 확인
1-a. 확인 후 myapp.urls.py 로 이동
2. myapp.urls.py의 urlpatterns의 read/<id>를 확인
2-a. views.read로 위임됨 
3. read함수가 실행되어 HttpResponse(’Read’+id)값을 client에 보내줌