2편 — URL 한 줄의 정체 (라우팅) - 테크창
프로그래밍

2편 — URL 한 줄의 정체 (라우팅)

조회 0회
댓글 0개
0
📚 연재 시리즈 AI가 짜준 Django, 이제 알고 씁니다 3 / 3

🎬 지난 이야기

1편에서는 Django가 "웹 서버 운영에 필요한 반복 작업을 대신 해주는 프레임워크"라는 것을 살펴봤습니다. 요청이 들어오면 Django가 알아서 교통정리를 해준다고 했는데, 오늘은 그 교통정리의 첫 관문, 즉 "이 주소로 들어온 요청을 누구한테 넘길지 결정하는 규칙" 을 뜯어봅니다.


AI에게 "질문 목록 페이지 만들어줘"라고 했더니 프로젝트 안에 urls.py라는 파일이 생겼고, 그 안에 이런 한 줄이 있었죠.

path('question/', views.list)

근데 막상 http://localhost:8000/question/에 접속했을 때 동작은 됩니다. 그런데 http://localhost:8000/questions/로 잘못 입력하면 404 에러가 뜨고, views.list가 뭔지는 여전히 모르겠고… 이 한 줄이 도대체 무슨 일을 하는 건지, 지금 바로 통역해드리겠습니다.


🤖 AI가 짜준 코드

프롬프트 예시: "Django로 질문 목록 페이지를 만들고 싶어. url 설정이랑 뷰 함수도 같이 짜줘."

# myproject/urls.py
from django.contrib import admin
from django.urls import path
from questions import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('question/', views.list),
]
# questions/views.py
from django.http import HttpResponse

def list(request):
    return HttpResponse("질문 목록 페이지입니다.")

AI가 두 파일에 걸쳐 코드를 뿌려놨습니다. 지금부터 한 조각씩 통역합니다.


🔍 한 줄씩 통역

urlpatterns — 건물 입구의 안내판

urlpatterns건물 로비의 층별 안내판이라고 생각하시면 됩니다. 방문객(브라우저)이 건물(서버)에 들어오면 안내판을 보고 몇 층(어떤 함수)으로 가야 할지 찾습니다. Django는 이 리스트를 위에서 아래로 훑으면서 주소가 맞는 항목을 찾습니다.

path('question/', views.list) — 안내판의 한 줄

이 한 줄은 두 개의 정보를 담고 있습니다.

  • 'question/' : 주소 패턴입니다. 브라우저가 /question/으로 요청을 보내면 이 줄이 매칭됩니다. 안내판에서 "3층 회의실"에 해당하는 방 번호 역할이죠.
  • views.list : 매칭됐을 때 실행할 함수입니다. questions 앱의 views.py 파일 안에 있는 list라는 함수를 가리킵니다. 안내판에서 "3층 회의실 → 엘리베이터 오른쪽"처럼 실제로 데려갈 곳이에요.

💡 views.list에서 괄호 ()가 없는 이유: 함수를 지금 당장 실행하는 게 아니라, "요청이 오면 이 함수를 써라"고 주소만 건네주는 것이기 때문입니다. 피자 가게 번호를 수첩에 적어두는 것이지, 지금 전화하는 게 아닌 것처럼요.

from questions import views — 어느 파일에서 가져오나

questions는 앱 이름, views는 그 앱 폴더 안의 views.py 파일을 의미합니다. Django 프로젝트는 여러 앱으로 나뉘고, 각 앱마다 views.py가 따로 있을 수 있기 때문에 "어느 앱의 views냐"를 명시해주는 것입니다.


⚠️ 자주 깨지는 지점

① 슬래시(/) 하나 차이로 404

Page not found (404) — /questions/ does not match any pattern

path('question/', ...)로 등록했는데 브라우저에서 /questions/(s가 붙은 복수형)로 접속하면 안내판에 없는 층이라 404가 납니다. Django의 path()철자 하나까지 정확히 일치해야 합니다. 에러가 나면 주소창의 URL과 urls.py의 문자열을 나란히 놓고 비교해보세요.

views.list를 찾지 못하는 에러

AttributeError: module 'questions.views' has no attribute 'list'

urls.py에서 views.list를 불렀는데 questions/views.py 안에 def list(request):가 없거나 함수 이름이 다를 때 발생합니다. AI가 파일 두 곳에 코드를 분산해서 줬을 때 한쪽만 복붙했다면 꼭 확인해보세요.


🎮 직접 해보기

미션: 지금 여러분 프로젝트의 urls.py를 열어서 urlpatterns 리스트 안에 아래 한 줄을 추가하고, http://localhost:8000/hello/에 접속해보세요.

# urls.py에 추가
from django.http import HttpResponse

def hello(request):
    return HttpResponse("안녕하세요, URL 라우팅 성공!")

# urlpatterns 리스트 안에 추가
path('hello/', hello),

뷰 함수를 views.py가 아닌 urls.py에 직접 써도 동작합니다. 안내판과 직원을 같은 종이에 써놓은 셈이죠. 물론 실제 프로젝트에서는 분리하는 게 좋지만, "path가 함수를 연결한다"는 감각을 먼저 손으로 익히는 게 목적입니다.

잘 안 된다면 테크창 Q&A 게시판에 에러 메시지와 함께 올려주세요. 같이 풀어드립니다! 🙋


⏭️ 다음 편 예고

URL 안내판이 함수를 찾아줬다면, 그 함수는 대체 무슨 일을 하는 걸까요? — 3편에서는 views.py 안의 함수가 요청을 받아 응답을 돌려주는 과정, 즉 뷰(View)의 정체를 통역합니다.


📚 시리즈: AI가 짜준 Django, 이제 알고 씁니다 · 2편 (총 9편 중)
테크창 연구팀 | 인천대학교 창의인재개발학과 전공심화연구모임
본 칼럼은 AI 보조로 작성되었으며, 코드·예시는 학습용입니다.

T
techchang연구팀
시리즈 목차 전체 보기

아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요!

댓글을 작성하려면 로그인해주세요

로그인
모바일 버전