3편 — 뷰 = "요청 들어오면 뭐 할지" - 테크창
프로그래밍

3편 — 뷰 = "요청 들어오면 뭐 할지"

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

🎬 지난 이야기

2편에서는 URL 한 줄이 하는 일을 살펴봤습니다. urls.py는 "이 주소로 들어온 손님은 저 담당자한테 보내세요"라고 적힌 건물 안내판이라고 했죠. 오늘은 그 안내판이 가리키는 담당자, 즉 요청을 직접 받아서 "그래서 뭘 할지" 결정하는 함수를 뜯어봅니다.


게시판을 만들고 나서 브라우저로 접속했더니 게시글 목록이 뜨기는 하는데, 막상 views.py를 열어보면 이런 생각이 드시지 않나요?

"이 def index(request): 라는 함수가… 화면을 그리는 건가요? 데이터를 가져오는 건가요? 대체 뭘 하는 함수예요?"

URL에서 연결되는 건 알겠는데, 그 다음 과정이 블랙박스처럼 느껴지는 상황. 오늘 그 블랙박스를 열어드립니다.


🤖 AI가 짜준 코드

"게시글 목록을 보여주는 페이지 뷰 함수 만들어줘"

# boards/views.py
from django.shortcuts import render
from .models import Post

def index(request):
    posts = Post.objects.all()
    context = {
        'posts': posts,
    }
    return render(request, 'boards/index.html', context)

짧아 보이지만, 이 다섯 줄이 "게시글 목록 화면 전체"를 책임집니다.


🔍 한 줄씩 통역

def index(request): — 담당자가 전화를 받는 순간

함수 이름 index는 별 의미 없습니다. main이라고 지어도 됩니다. 중요한 건 괄호 안의 request예요.

브라우저가 서버에 접속하면, Django는 그 요청 정보를 통째로 꾸러미로 포장해서 이 함수에 건네줍니다. "누가, 어떤 브라우저로, 어떤 주소를 눌렀는지" 같은 정보가 전부 request 안에 담겨 있어요. 택배로 치면 송장 봉투입니다. 함수는 그 봉투를 받는 순간부터 시작되죠.

posts = Post.objects.all() — 창고에서 재고 전부 꺼내기

Post는 데이터베이스 테이블(게시글 창고)이고, .objects.all()은 "창고에 있는 것 전부 꺼내줘"라는 명령입니다. 결과는 게시글 목록 전체가 담긴 바구니예요. 아직 화면에는 아무것도 표시되지 않은 상태, 데이터를 손에 쥔 것뿐입니다.

context = {'posts': posts} — 배달할 내용물 포장

화면(템플릿)에 데이터를 전달하려면 딕셔너리(사전) 형태로 싸줘야 합니다. 'posts'라는 이름표를 붙여서 포장하는 거예요. 나중에 HTML 파일에서 {{ posts }}라고 쓰면 이 이름표를 보고 데이터를 꺼내 씁니다. 이름표가 틀리면 내용물을 못 꺼내니, 철자가 중요합니다.

return render(request, 'boards/index.html', context) — 완성된 화면을 브라우저로 배송

render()는 Django가 제공하는 포장+배송 서비스입니다. 세 가지를 넣어줍니다:
1. request — 원래 받은 송장 봉투 (브라우저가 누군지)
2. 'boards/index.html' — 어떤 HTML 틀을 쓸지
3. context — 그 틀에 채워 넣을 데이터

이 세 가지를 합쳐서 완성된 HTML 페이지를 만든 다음, 브라우저로 돌려보냅니다. 이 return이 없으면 손님은 빈손으로 돌아갑니다.


⚠️ 자주 깨지는 지점

① 템플릿 이름을 잘못 적었을 때

TemplateDoesNotExist: boards/index.html

render() 두 번째 인자의 경로가 실제 파일 위치와 다를 때 납니다. templates/boards/index.html로 파일이 있는지 확인하세요. templates 폴더 안에 있어야 Django가 찾을 수 있습니다.

② context 이름표와 템플릿 변수명이 다를 때

context = {'article_list': posts}   # 이름표: article_list
<!-- HTML에서는 posts로 불렀다면? -->
{% for post in posts %}   {# 아무것도 안 뜸, 에러도 안 남 #}

에러 메시지도 없이 화면이 그냥 비어 있습니다. 가장 찾기 어려운 버그예요. context의 키 이름과 HTML 안의 변수명을 똑같이 맞춰주세요.


🎮 직접 해보기

지금 views.py를 열고, index 함수 안에 줄을 한 줄 추가해보세요.

def index(request):
    posts = Post.objects.all()
    print("게시글 개수:", posts.count())   # ← 이 줄 추가
    context = {'posts': posts}
    return render(request, 'boards/index.html', context)

브라우저에서 목록 페이지를 새로고침하면, Django를 실행한 터미널 창에 게시글 개수가 찍힙니다. 화면이 아니라 터미널에요! print()가 서버 쪽에서 실행된다는 걸 눈으로 확인하는 미션입니다.

해보셨나요? 숫자가 안 뜨거나 에러가 생기면 테크창 Q&A 게시판에 터미널 화면 캡처와 함께 질문해주세요. 같이 찾아드립니다.


⏭️ 다음 편 예고

뷰가 데이터를 가져왔다면, 그걸 실제 화면으로 그려주는 건 index.html 안의 {% for post in posts %} — 다음 편에서는 이 중괄호들이 왜 HTML 같아 보이면서도 HTML이 아닌지, 템플릿 언어의 정체를 통역해드립니다.


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

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

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

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

로그인
모바일 버전