반응형

CRUD 구현과 Todo 앱 개발

여러분, 나만의 Todo 앱, 어렵다고만 느껴졌나요?
오늘은 Django로 누구나 쉽게 만들 수 있도록 친절하게 알려드릴게요!
반응형

 

안녕하세요, 여러분! 😊

오늘은 웹 개발에서 가장 기본이면서도 실습으로 정말 많이 등장하는 CRUD 기능 구현과 Todo 앱 개발을 함께 진행해볼 거예요.

특히 Django 프레임워크를 활용해서 폼(Form) 처리부터 CRUD 사이클을 자연스럽게 익힐 수 있도록 구성했어요.

"Create-Read-Update-Delete"라는 말을 들어본 적은 있지만 실제로 프로젝트에 적용하는 과정이 막막했던 분들,

지금부터 하나씩 차근차근, 꼭 필요한 부분만 쏙쏙 집어서 설명드릴 테니 끝까지 따라와 주세요! 🙌

 

1. CRUD 개념 이해하기 ✨

여러분, CRUD라는 단어, 개발 입문하면서 한 번쯤은 들어보셨죠? 😊

하지만 정확히 어떤 의미인지 헷갈리는 분들도 많더라고요.

그래서 오늘은 아주 쉽게, 그리고 확실하게 정리해드릴게요!

CRUD란 무엇인가요?

  • Create (생성): 새로운 데이터를 만들어요.
  • Read (조회): 저장된 데이터를 읽어와요.
  • Update (수정): 기존 데이터를 수정해요.
  • Delete (삭제): 더 이상 필요 없는 데이터를 지워요.

이 네 가지 행동이 바로 CRUD예요.

거의 모든 웹 애플리케이션은 이 CRUD 사이클을 기반으로 동작한다고 해도 과언이 아니에요!

블로그 글 작성, 댓글 남기기, 쇼핑몰 상품 수정하기, 회원 탈퇴하기... 다 CRUD입니다.

CRUD를 자유자재로 다룰 수 있으면 웹 개발의 70%는 이미 마스터했다고 봐도 무방할 정도예요. 😎

CRUD 흐름, 어떻게 돌아가는 걸까?

  1. 사용자가 폼에 데이터를 입력하고 생성(Create) 요청을 보낸다.
  2. 서버가 데이터베이스에 데이터를 저장한다.
  3. 사용자가 목록을 보거나 검색해서 조회(Read)를 요청한다.
  4. 특정 항목을 수정하고 싶으면 수정(Update) 요청을 보낸다.
  5. 필요 없는 데이터는 삭제(Delete) 요청을 통해 삭제한다.

이렇게 보면 CRUD는 그냥 "데이터를 만들고, 읽고, 고치고, 없애는 것"이죠.

그리고 이 모든 과정을 Django에서는 아주 쉽게 처리할 수 있도록 도와줘요.

(진짜 너무 편해요, 감동할걸요? 😭)

 

즉, CRUD는 웹 서비스의 '심장'이라고 할 수 있습니다.

이 개념을 제대로 이해하고 구현할 수 있어야 제대로 된 웹 애플리케이션을 만들 수 있어요!

 

 

2. Django 폼(Form)과 ModelForm 활용법 📝

CRUD를 제대로 구현하려면 사용자로부터 데이터를 입력받을 수 있어야 해요.

그걸 담당하는 게 바로 폼(Form)입니다.

Django에서는 폼을 정말 쉽게 만들 수 있도록 Form 클래스와 ModelForm 클래스를 제공해줘요.

Form 클래스란?

Form 클래스는 말 그대로 입력 폼을 정의하는 클래스입니다.

입력받을 필드를 직접 하나하나 지정해줘야 해요.

from django import forms

class TodoForm(forms.Form):
    title = forms.CharField(max_length=100)
    content = forms.CharField(widget=forms.Textarea)

이렇게 하면 titlecontent를 입력할 수 있는 폼이 완성돼요!

폼 유효성 검증도 자동으로 해주기 때문에 "빈칸이면 오류" 같은 기본적인 체크도 따로 코딩할 필요가 없어요.

진짜 편하죠? 😆

ModelForm 클래스란?

ModelForm은 Form을 더 쉽게 만들기 위한 강력한 무기예요!

특정 모델(Model)과 연결해서 폼을 자동 생성해주는 클래스거든요.

from django import forms
from .models import Todo

class TodoModelForm(forms.ModelForm):
    class Meta:
        model = Todo
        fields = ['title', 'content']

ModelForm을 쓰면 모델에 정의된 필드 정보로 폼을 알아서 만들어줘요.

그리고 save() 메서드 하나만 호출하면 바로 데이터베이스에 저장까지 끝!

노가다 코딩은 이제 안녕입니다. 👋

Form vs ModelForm 요약

구분 Form ModelForm
특징 필드를 직접 지정 모델을 기반으로 자동 생성
작성 난이도 조금 번거로움 매우 간편
추천 상황 비표준 폼 필요시 모델 기반 CRUD 작업

Tip: CRUD 구현할 때는 대부분 ModelForm을 사용하는 게 훨씬 편하고 효율적입니다! 😎

 

 

3. GET과 POST 요청 흐름 파헤치기 🔄

Django로 폼을 만들었으면 이제 중요한 게 하나 남았어요.

바로 요청(Request) 처리 흐름입니다. 특히 GETPOST 요청을 제대로 이해해야 CRUD 기능을 완성할 수 있어요!

GET 요청: 페이지를 보여주는 요청

GET은 사용자가 페이지를 보러 올 때 보내는 요청이에요.

예를 들어, 글쓰기 폼을 보여줄 때 GET 요청을 사용합니다.

def todo_create(request):
    if request.method == 'GET':
        form = TodoModelForm()
        return render(request, 'todo_form.html', {'form': form})

위 코드를 보면 알겠지만, GET 요청이면 빈 폼을 만들어서 보여줘요.

"폼 열어줘!" 하는 느낌이라고 생각하면 쉽습니다. 😉

POST 요청: 데이터를 제출하는 요청

POST는 사용자가 폼에 입력한 데이터를 제출할 때 보내는 요청이에요.

예를 들어, 글쓰기 버튼을 눌렀을 때 POST 요청이 발생합니다.

def todo_create(request):
    if request.method == 'POST':
        form = TodoModelForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('todo_list')

POST 요청이면, 폼에 입력된 데이터를 form 객체에 담고, 검증(is_valid())한 뒤, 이상 없으면 save() 메서드로 저장해요!

그리고 저장이 완료되면 redirect()를 사용해 목록 페이지로 이동시켜줍니다.

요약: GET vs POST

요청 종류 역할
GET 폼을 보여준다 (읽기용)
POST 폼 데이터를 제출하고 처리한다 (쓰기용)

이 흐름을 확실히 이해하면, 폼 처리와 CRUD 기능 구현이 정말 쉬워져요!

"GET이면 보여주고, POST면 처리한다" 이 공식만 기억하세요! 😎

 

 

4. 기능별 URL 설계 방법 🛤️

이제 폼도 만들었고, 요청 흐름(GET/POST)도 알게 되었어요.

그럼 다음으로 중요한 건 바로 URL 패턴 설계입니다! 🚀

CRUD 각각의 기능에 맞게 알기 쉬운 URL을 짜야 해요.

사용자가 길을 잃지 않게 해주는 일종의 "표지판" 같은 거죠.

기능별 URL 기본 패턴 ✨

  • 목록 보기(Read) : /todos/
  • 상세 보기(Read) : /todos/<id>/
  • 새로 만들기(Create) : /todos/new/
  • 수정하기(Update) : /todos/<id>/edit/
  • 삭제하기(Delete) : /todos/<id>/delete/

기능별 URL을 이렇게 직관적으로 설계하면, 개발자도 헷갈리지 않고 사용자도 편리하게 이용할 수 있어요.

특히 id를 경로에 포함시키는 부분은 아주 중요합니다!

(어떤 Todo 항목을 수정하거나 삭제할지 구분해야 하니까요.)

Django URL 설정 예시 🛠️

from django.urls import path
from . import views

urlpatterns = [
    path('todos/', views.todo_list, name='todo_list'),
    path('todos/new/', views.todo_create, name='todo_create'),
    path('todos//', views.todo_detail, name='todo_detail'),
    path('todos//edit/', views.todo_update, name='todo_update'),
    path('todos//delete/', views.todo_delete, name='todo_delete'),
]

URL 패턴을 이렇게 깔끔하게 맞춰주면 뷰 함수도 훨씬 체계적으로 관리할 수 있어요.

게다가 name을 지정해주면 나중에 {% url 'todo_list' %} 이런 식으로 템플릿에서 바로 사용 가능!

진짜 효율적입니다. 😎

정리!

  • 기능별로 URL을 명확하게 구분하자.
  • id를 경로에 포함해서 특정 항목을 다루자.
  • name 속성으로 URL 이름을 정해서 템플릿에서도 활용하자.

 

 

5. 클래스 기반 뷰(Generic Views) 살펴보기 🏗️

자, 여기까지 온 여러분! CRUD를 함수 기반 뷰로 처리하는 법은 잘 이해하셨죠? 👏

그런데 Django는 여기서 더 친절하게도 클래스 기반 뷰(Class-Based Views, CBV)라는 걸 제공해요.

특히 Generic Views를 사용하면 CRUD 작업을 훨씬 더 빠르고 깔끔하게 만들 수 있답니다!

Generic Views란 무엇인가요?

Generic View는 Django가 CRUD 작업을 위해 미리 만들어놓은 뷰 클래스를 말해요.

우리는 상속만 받아서 살짝 설정만 해주면, 복잡한 코드를 직접 작성할 필요 없이 CRUD 기능을 자동으로 사용할 수 있어요.

진짜 개발자의 삶의 질이 달라집니다... ✨

대표적인 CRUD Generic View 종류

  • ListView - 객체 목록을 보여줄 때 사용
  • DetailView - 하나의 객체 상세 정보를 보여줄 때 사용
  • CreateView - 새로운 객체를 생성할 때 사용
  • UpdateView - 기존 객체를 수정할 때 사용
  • DeleteView - 객체를 삭제할 때 사용

Generic View 코드 예시 ✍️

from django.views.generic import ListView, CreateView
from .models import Todo

class TodoListView(ListView):
    model = Todo
    template_name = 'todo_list.html'

class TodoCreateView(CreateView):
    model = Todo
    fields = ['title', 'content']
    template_name = 'todo_form.html'
    success_url = '/todos/'

봐요, 진짜 깔끔하죠?

이런 식으로 기본적인 목록보기, 생성하기 기능이 몇 줄 코드만으로 뚝딱 완성됩니다!

정리!

  • 클래스 기반 뷰는 CRUD 작업을 빠르고 쉽게 만든다!
  • ListView, CreateView, UpdateView 등을 잘 활용해보자!

 

6. 미니 Todo 앱 만들기 🗒️

여러분, 드디어 실습 시간이에요! 🎉

지금까지 배운 걸 바탕으로 간단한 미니 Todo 앱을 만들어볼 거예요.

처음엔 복잡해 보여도 걱정 마세요. 하나하나 따라 하면 금방 멋진 결과물이 나옵니다!

1. 모델 생성하기

from django.db import models

class Todo(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

제목(title), 내용(content), 생성일(created_at)을 갖는 아주 심플한 모델이에요.

makemigrationsmigrate 명령어로 데이터베이스 반영도 잊지 말기!

2. URL 설정하기

아까 배운 CRUD URL 패턴을 토대로 urls.py를 작성해요!

from django.urls import path
from .views import TodoListView, TodoCreateView, TodoDetailView, TodoUpdateView, TodoDeleteView

urlpatterns = [
    path('todos/', TodoListView.as_view(), name='todo_list'),
    path('todos/new/', TodoCreateView.as_view(), name='todo_create'),
    path('todos//', TodoDetailView.as_view(), name='todo_detail'),
    path('todos//edit/', TodoUpdateView.as_view(), name='todo_update'),
    path('todos//delete/', TodoDeleteView.as_view(), name='todo_delete'),
]

3. 뷰(Views) 작성하기

from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
from .models import Todo
from django.urls import reverse_lazy

class TodoListView(ListView):
    model = Todo
    template_name = 'todo_list.html'

class TodoDetailView(DetailView):
    model = Todo
    template_name = 'todo_detail.html'

class TodoCreateView(CreateView):
    model = Todo
    fields = ['title', 'content']
    template_name = 'todo_form.html'
    success_url = reverse_lazy('todo_list')

class TodoUpdateView(UpdateView):
    model = Todo
    fields = ['title', 'content']
    template_name = 'todo_form.html'
    success_url = reverse_lazy('todo_list')

class TodoDeleteView(DeleteView):
    model = Todo
    template_name = 'todo_confirm_delete.html'
    success_url = reverse_lazy('todo_list')

4. 템플릿 만들기

각 페이지를 위한 HTML 파일을 작성해야겠죠?

  • todo_list.html (목록 페이지)
  • todo_form.html (작성 및 수정 폼)
  • todo_detail.html (상세보기)
  • todo_confirm_delete.html (삭제 확인)

템플릿은 Django 템플릿 언어(DTL)를 써서 {{ todo.title }} 같은 식으로 데이터를 출력할 수 있어요. 초반에는 간단하게, 차차 예쁘게 꾸며나가면 됩니다. ✨

정리!

  • 모델 → URL → 뷰 → 템플릿 순서대로 개발 진행
  • Generic View를 적극 활용하면 빠르게 개발 가능
  • 완성 후 서버를 돌려 테스트하기!

 

마무리 ✨

자, 여기까지 함께 따라오신 여러분 정말 고생 많으셨습니다! 👏

오늘은 CRUD 개념부터 시작해서 Django의 Form 처리, GET과 POST 요청 흐름, 기능별 URL 설계, 그리고 클래스 기반 뷰(Generic Views)까지 배운 다음, 직접 미니 Todo 앱을 만들어봤어요.

처음에는 막막하게 느껴질 수 있지만, 작은 프로젝트를 하나씩 완성하다 보면 어느 순간 "아, CRUD는 이렇게 돌아가는구나!" 하고 자연스럽게 체득할 수 있습니다. 실전 프로젝트를 만들 때도 오늘 배운 이 흐름을 그대로 활용할 수 있어요.

 

Tip! 👉 오늘 만든 Todo 앱을 조금 더 발전시키고 싶다면?

  • 완료 여부(체크박스)를 추가해보세요 ✅
  • 마감일(deadline) 필드를 추가해 날짜순 정렬을 해보세요 📅
  • 사용자 인증(로그인 기능)을 붙여서 개인별 Todo 관리로 발전시켜보세요 🔐

 

이렇게 한 걸음 한 걸음 업그레이드해 나가면서 실전 웹 개발자로 성장할 수 있습니다! 🚀

오늘도 함께 성장하는 하루였길 바라요. 감사합니다! 🙏

반응형

+ Recent posts