Django Views 기초: 웹 애플리케이션의 핵심 이해하기

안녕하세요, Django 사용자 여러분! 오늘은 Django Views 기초에 대해 알아볼 거예요. Django를 시작하셨다면, Views가 얼마나 중요한지 아시죠?

Views는 사용자의 요청을 처리하고 응답을 반환하는 Django의 두뇌라고 할 수 있어요. 어렵게 들리시나요? 걱정 마세요. 이 포스트를 통해 쉽고 재미있게 배워볼 거예요. 자, 시작해볼까요?

Django Views란 무엇인가?

Django Views는 웹 애플리케이션의 로직을 처리하는 부분이에요. 사용자가 URL을 통해 요청을 보내면, 그 요청을 받아 처리하고 적절한 응답을 돌려주는 역할을 해요. 쉽게 말해, Views는 웹 페이지의 내용을 결정하는 함수라고 할 수 있죠.

Django Views 기초 참고 이미지 - 로직 처리
( Django Views 기초 참고 이미지 – 로직 처리 )

Django Views 기초 – 함수형 Views 만들기

가장 기본적인 형태의 View는 함수예요. 한번 만들어볼까요?

from django.http import HttpResponse

def hello_world(request):
    return HttpResponse("안녕하세요, Django 세상!")

이 간단한 함수가 바로 View예요. request 객체를 받아서 HttpResponse를 반환하고 있죠.

코드 해설

1. from django.http import HttpResponse
  • 의미: Django의 django.http 모듈에서 HttpResponse 클래스를 가져옵니다.
  • 설명HttpResponse는 Django에서 HTTP 응답을 생성하는 데 사용되는 클래스입니다. 이 클래스를 사용하면 클라이언트(예: 웹 브라우저)에게 텍스트, HTML, JSON 등의 내용을 반환할 수 있습니다.
2. def hello_world(request):
  • 의미hello_world라는 이름의 뷰 함수를 정의합니다.
  • 설명: Django에서 뷰 함수는 HTTP 요청을 받아서 HTTP 응답을 반환하는 함수입니다. 이 함수는 request 객체를 매개변수로 받습니다. request 객체에는 클라이언트로부터 전송된 HTTP 요청 정보(예: 헤더, 쿠키, GET/POST 데이터 등)가 포함되어 있습니다.
3. return HttpResponse("안녕하세요, Django 세상!")
  • 의미HttpResponse 객체를 생성하여 반환합니다.
  • 설명: 이 줄은 “안녕하세요, Django 세상!”이라는 문자열을 포함한 HTTP 응답을 반환합니다. 이 문자열은 클라이언트(예: 웹 브라우저)에게 전송되어 화면에 표시됩니다.
Django Views의 주요 유형과 기능
( Django Views의 주요 유형과 기능 )

Django Views 기초 – URL과 View 연결하기

View를 만들었다면, 이제 URL과 연결해야 해요. urls.py 파일에 다음과 같이 작성해보세요.

from django.urls import path
from . import views

urlpatterns = [
    path('hello/', views.hello_world, name='hello'),
]

이제 /hello/ URL로 접속하면 우리가 만든 View가 동작할 거예요.

코드 해설

1. from django.urls import path
  • 의미: Django의 django.urls 모듈에서 path 함수를 가져옵니다.
  • 설명path 함수는 URL 패턴을 정의하는 데 사용됩니다. 이 함수는 두 개의 필수 인자(URL 패턴과 뷰 함수)와 선택적 인자(이름)를 받습니다.
2. from . import views
  • 의미: 현재 디렉토리(또는 현재 앱)의 views.py 파일에서 모든 내용을 가져옵니다.
  • 설명views.py 파일에는 뷰 함수(예: hello_world)가 정의되어 있습니다. 이 파일을 임포트하여 URL과 뷰 함수를 연결할 수 있습니다.
3. urlpatterns = [ ... ]
  • 의미: URL 패턴을 정의하는 리스트입니다.
  • 설명: Django는 urlpatterns라는 리스트를 통해 URL과 뷰 함수를 매핑합니다. 이 리스트에 정의된 순서대로 URL을 검색하고, 일치하는 URL 패턴이 있으면 해당 뷰 함수를 실행합니다.
4. path('hello/', views.hello_world, name='hello')
  • 의미/hello/ URL 패턴을 views.hello_world 뷰 함수와 연결합니다.
  • 설명:
    • 'hello/': URL 패턴을 나타냅니다. 이 경우, /hello/로 접속하면 이 뷰 함수가 실행됩니다.
    • views.hello_world: 이 URL 패턴에 매핑될 뷰 함수를 지정합니다. views.py 파일에 정의된 hello_world 함수를 호출합니다.
    • name='hello': 이 URL 패턴에 이름을 부여합니다. 이 이름은 템플릿이나 뷰에서 URL을 동적으로 생성할 때 사용됩니다. 예를 들어, {% url 'hello' %}와 같이 템플릿에서 사용할 수 있습니다.
전체적인 동작
  1. 사용자가 웹 브라우저에서 /hello/ URL로 접속합니다.
  2. Django는 urlpatterns 리스트를 순회하며 /hello/ 패턴을 찾습니다.
  3. 일치하는 패턴이 발견되면, views.hello_world 뷰 함수를 실행합니다.
  4. hello_world 뷰 함수는 HttpResponse("안녕하세요, Django 세상!")를 반환합니다.
  5. 클라이언트(웹 브라우저)는 “안녕하세요, Django 세상!”이라는 메시지를 화면에 표시합니다.

Django Views 기초 – 템플릿 렌더링하기

단순한 텍스트 대신 HTML 페이지를 반환하고 싶다면 어떻게 해야 할까요? Django의 템플릿 시스템을 사용하면 돼요:

from django.shortcuts import render

def home(request):
    context = {'message': '환영합니다!'}
    return render(request, 'home.html', context)

이 View는 home.html 템플릿을 렌더링하고, context 딕셔너리의 데이터를 템플릿에 전달해요.

코드 해설

1. from django.shortcuts import render
  • 의미: Django의 django.shortcuts 모듈에서 render 함수를 가져옵니다.
  • 설명render 함수는 템플릿을 렌더링하여 HTTP 응답을 반환하는 편리한 도구입니다. 이 함수는 세 가지 인자를 받습니다:
    1. request: HTTP 요청 객체.
    2. template_name: 렌더링할 템플릿 파일의 경로.
    3. context (선택적): 템플릿에 전달할 데이터를 담은 딕셔너리.
2. def home(request):
  • 의미home이라는 이름의 뷰 함수를 정의합니다.
  • 설명: 이 함수는 클라이언트로부터 HTTP 요청(request)을 받아서 처리한 후, HTTP 응답을 반환합니다. Django에서 모든 뷰 함수는 첫 번째 매개변수로 request 객체를 받습니다.
3. context = {'message': '환영합니다!'}
  • 의미context라는 딕셔너리를 생성하고, 'message' 키에 '환영합니다!'라는 값을 할당합니다.
  • 설명context는 템플릿에 전달할 데이터를 담는 딕셔너리입니다. 이 데이터는 템플릿에서 동적으로 사용될 수 있습니다. 예를 들어, {{ message }}와 같이 템플릿에서 변수로 사용됩니다.
4. return render(request, 'home.html', context)
  • 의미render 함수를 사용하여 home.html 템플릿을 렌더링하고, 그 결과를 HTTP 응답으로 반환합니다.
  • 설명:
    • request: HTTP 요청 객체.
    • 'home.html': 렌더링할 템플릿 파일의 경로. Django는 기본적으로 templates 디렉토리에서 이 파일을 찾습니다.
    • context: 템플릿에 전달할 데이터를 담은 딕셔너리.
전체적인 동작
  1. 사용자가 웹 브라우저에서 /home/ URL로 접속합니다.
  2. Django는 home 뷰 함수를 실행합니다.
  3. home 뷰 함수는 context 딕셔너리를 생성하고, 'message' 키에 '환영합니다!'라는 값을 할당합니다.
  4. render 함수는 home.html 템플릿을 렌더링할 때 context 데이터를 전달합니다.
  5. 템플릿 엔진은 home.html 파일을 처리하고, {{ message }} 부분을 '환영합니다!'로 치환합니다.
  6. 최종적으로 렌더링된 HTML이 클라이언트에게 전송되어 화면에 표시됩니다.

Django Views 기초 – 동적 URL 파라미터 처리하기

URL에서 동적으로 값을 받아 처리하고 싶을 때는 이렇게 해보세요:

def greet_user(request, username):
    return HttpResponse(f"안녕하세요, {username}님!")

그리고 urls.py에서:

path('greet/<str:username>/', views.greet_user, name='greet'),

이제 /greet/철수/와 같은 URL로 접속하면, “안녕하세요, 철수님!”이라는 메시지를 볼 수 있어요.

실제 View 작동 방식 시퀀스 다이어그램
( 실제 View 작동 방식 시퀀스 다이어그램 )

Django Views 기초 – HTTP 메서드 처리하기

View에서 다양한 HTTP 메서드(GET, POST 등)를 처리할 수 있어요:

from django.views.decorators.http import require_http_methods

@require_http_methods(["GET", "POST"])
def my_view(request):
    if request.method == 'GET':
        # GET 요청 처리
        return HttpResponse("GET 요청을 받았어요.")
    elif request.method == 'POST':
        # POST 요청 처리
        return HttpResponse("POST 요청을 받았어요.")

이 View는 GET과 POST 요청만 허용하고, 각각 다르게 처리해요.

코드 해설

1. from django.views.decorators.http import require_http_methods
  • 의미: Django의 django.views.decorators.http 모듈에서 require_http_methods 데코레이터를 가져옵니다.
  • 설명require_http_methods는 뷰 함수가 특정 HTTP 메서드(GET, POST, PUT, DELETE 등)만 처리하도록 제한하는 데코레이터입니다. 허용되지 않은 메서드로 요청이 들어오면 405 Method Not Allowed 응답을 반환합니다.
2. @require_http_methods(["GET", "POST"])
  • 의미my_view 뷰 함수가 GET과 POST 메서드만 허용하도록 설정합니다.
  • 설명: 이 데코레이터는 뷰 함수에 적용되며, ["GET", "POST"] 리스트에 지정된 메서드만 허용합니다. 다른 메서드(예: PUT, DELETE)로 요청이 들어오면 405 Method Not Allowed 오류를 반환합니다.
3. def my_view(request):
  • 의미my_view라는 이름의 뷰 함수를 정의합니다.
  • 설명: 이 함수는 HTTP 요청(request)을 처리하고, 적절한 HTTP 응답을 반환합니다. Django에서 모든 뷰 함수는 첫 번째 매개변수로 request 객체를 받습니다.
4. if request.method == 'GET':
  • 의미: 요청 메서드가 GET인지 확인합니다.
  • 설명request.method는 현재 요청의 HTTP 메서드(GET, POST 등)를 나타냅니다. 이 조건문은 요청이 GET 메서드인 경우에만 실행됩니다.
5. return HttpResponse("GET 요청을 받았어요.")
  • 의미: “GET 요청을 받았어요.”라는 메시지를 포함한 HTTP 응답을 반환합니다.
  • 설명HttpResponse는 Django에서 HTTP 응답을 생성하는 클래스입니다. 이 경우, 단순한 텍스트 응답을 반환합니다.
6. elif request.method == 'POST':
  • 의미: 요청 메서드가 POST인지 확인합니다.
  • 설명: 이 조건문은 요청이 POST 메서드인 경우에만 실행됩니다.
7. return HttpResponse("POST 요청을 받았어요.")
  • 의미: “POST 요청을 받았어요.”라는 메시지를 포함한 HTTP 응답을 반환합니다.
  • 설명: POST 요청이 들어오면 이 메시지를 반환합니다.
전체적인 동작
  1. 클라이언트가 my_view 뷰 함수에 GET 또는 POST 요청을 보냅니다.
  2. @require_http_methods(["GET", "POST"]) 데코레이터는 요청 메서드가 GET 또는 POST인지 확인합니다.
    • 허용된 메서드(GET, POST)인 경우, 뷰 함수가 실행됩니다.
    • 허용되지 않은 메서드(예: PUT, DELETE)인 경우, 405 Method Not Allowed 오류를 반환합니다.
  3. 뷰 함수 내부에서 request.method를 확인하여 GET 또는 POST 요청을 처리합니다.
    • GET 요청인 경우: “GET 요청을 받았어요.”라는 메시지를 반환합니다.
    • POST 요청인 경우: “POST 요청을 받았어요.”라는 메시지를 반환합니다.

Django Views 기초 – 데이터베이스와 상호작용하기

View에서 데이터베이스의 데이터를 가져와 사용할 수 있어요:

from django.shortcuts import render
from .models import Book

def book_list(request):
    books = Book.objects.all()
    return render(request, 'book_list.html', {'books': books})

이 View는 모든 Book 객체를 가져와 템플릿에 전달해요.

코드 해설

  1. from django.shortcuts import render
    • Django의 shortcuts 모듈에서 render 함수를 가져옵니다.
    • render 함수는 템플릿을 로드하고 컨텍스트 데이터와 함께 HttpResponse 객체를 반환하는 편리한 함수입니다.
  2. from .models import Book
    • 현재 앱의 models.py 파일에서 Book 모델을 가져옵니다.
    • ‘.’ 은 현재 디렉토리를 의미합니다.
  3. def book_list(request):
    • book_list라는 뷰 함수를 정의합니다.
    • 이 함수는 HTTP 요청(request)을 매개변수로 받습니다.
  4. books = Book.objects.all()
    • Book 모델의 모든 객체를 데이터베이스에서 가져와 books 변수에 저장합니다.
    • all() 메서드는 모델의 모든 레코드를 쿼리셋으로 반환합니다.
  5. return render(request, 'book_list.html', {'books': books})
    • render 함수를 사용하여 HTTP 응답을 생성합니다.
    • 첫 번째 인자 request는 원본 HTTP 요청 객체입니다.
    • 두 번째 인자 'book_list.html'은 사용할 템플릿 파일의 이름입니다.
    • 세 번째 인자 {'books': books}는 템플릿에 전달할 컨텍스트 데이터입니다. 여기서는 ‘books’라는 키로 books 쿼리셋을 전달합니다.

Django Views 기초 – 리다이렉션 처리하기

때로는 사용자를 다른 페이지로 리다이렉트 처리해야 할 때가 있어요:

from django.shortcuts import redirect

def redirect_view(request):
    return redirect('home')  # 'home'은 URL 이름이에요

이 View는 사용자를 ‘home’이라는 이름의 URL로 리다이렉트해요.

코드 해설

  1. from django.shortcuts import redirect
    • Django의 shortcuts 모듈에서 redirect 함수를 가져옵니다.
    • redirect 함수는 사용자를 다른 페이지로 리다이렉트하는 데 사용되는 편리한 함수입니다.
  2. def redirect_view(request):
    • redirect_view라는 뷰 함수를 정의합니다.
    • 이 함수는 HTTP 요청(request)을 매개변수로 받습니다.
  3. return redirect('home')
    • redirect 함수를 사용하여 사용자를 ‘home’이라는 이름의 URL로 리다이렉트합니다.
    • ‘home’은 Django의 URL 설정에서 정의된 URL 이름입니다.
    • 이 함수는 HTTP 리다이렉트 응답을 생성합니다.

Django Views 기초 마무리

지금까지 Django Views 기초에 대해 알아봤어요. Views는 Django 애플리케이션의 핵심이에요. 사용자의 요청을 처리하고, 데이터를 가공하고, 응답을 반환하는 모든 과정이 Views에서 이루어지죠.

처음에는 복잡해 보일 수 있지만, 하나씩 익혀가다 보면 금방 마스터할 수 있을 거예요. 계속해서 연습하고 실험해보세요. Django Views를 잘 다루게 되면, 여러분의 웹 개발 실력은 한층 더 업그레이드될 거예요.

참고로, Django Views 못지 않게 중요한 개념이 바로 Models이죠? Django Models 기초: 데이터베이스 구조를 쉽게 이해하는 완벽 가이드 포스트 를 통해서 그 기초지식을 쌓아보세요!

용어 해설

  • View: 사용자 요청을 처리하고 응답을 반환하는 Python 함수
  • URLconf: URL 패턴과 View를 연결하는 설정
  • HttpResponse: View가 반환하는 응답 객체
  • render(): 템플릿을 불러와 HttpResponse 객체로 반환하는 함수
  • 동적 URL: URL에 변수를 포함하여 동적으로 처리하는 방식
  • HTTP 메서드: GET, POST 등 클라이언트가 서버에 요청하는 방식
  • ORM: Object-Relational Mapping, Django에서 데이터베이스를 쉽게 다룰 수 있게 해주는 도구

Django Views, 이제 조금은 친숙해지셨나요? Views를 마스터하면 Django로 무엇이든 만들 수 있어요. 계속해서 공부하고 연습해보세요. 여러분의 Django 여정을 응원합니다!

테리 이모티콘
( 즐겁게 코딩을 합시다! )

유사한 게시물