📝Django ORM과 클래스 상속 원리

📌 1. Python에서 클래스 상속이란?

✅ 자식 클래스가 부모 클래스를 상속받으면 부모 클래스의 속성과 메서드를 자동으로 물려받는다. ✅ Python은 MRO (Method Resolution Order) 를 사용하여 메서드를 찾는 순서를 결정한다. ✅ 자식 클래스에서 부모 클래스의 메서드를 오버라이딩하면, 부모 클래스의 메서드는 실행되지 않는다. ✅ super()를 사용하면 부모 클래스의 메서드를 명시적으로 호출할 수 있다.

🔹 기본적인 클래스 상속 예제

class Parent:
    def greet(self):
        return "안녕하세요! (부모)"

class Child(Parent):
    pass  # 부모 클래스를 그대로 상속

child = Child()
print(child.greet())  # 안녕하세요! (부모)

✅ Child 클래스에는 greet() 메서드가 없지만, Parent에서 상속받았기 때문에 사용 가능하다.

🔹 자식 클래스에서 부모 메서드를 오버라이딩

class Child(Parent):
    def greet(self):  # 부모의 메서드를 덮어씀
        return "안녕하세요! (자식)"

child = Child()
print(child.greet())  # 안녕하세요! (자식)

✅ Child 클래스에서 greet()을 재정의(오버라이딩)하면, 부모 클래스의 greet()는 실행되지 않는다.

🔹 super()를 사용해서 부모 클래스의 메서드 호출하기

class Child(Parent):
    def greet(self):
        return super().greet() + " 그리고 안녕하세요! (자식)"

child = Child()
print(child.greet())  # 안녕하세요! (부모) 그리고 안녕하세요! (자식)

✅ super().greet()을 호출하면 부모 클래스의 greet() 메서드도 함께 실행된다.


📌 2. Django에서 models.Model을 상속받으면?

✅ Django에서 models.Model을 상속받으면 Django ORM 기능을 자동으로 사용할 수 있다. ✅ 내부적으로 Django ORM이 objects와 같은 클래스 변수를 자동으로 추가한다. ✅ Django ORM의 상속 구조를 확인하면 models.Model을 거쳐 object까지 연결되어 있다.

🔹 Django ORM의 클래스 상속 구조 확인

from django.db import models

class Post(models.Model):  # Django ORM 모델
    title = models.CharField(max_length=200)
    content = models.TextField()

print(Post.__mro__)

✅ 출력 결과:

(<class '__main__.Post'>, <class 'django.db.models.Model'>, <class 'django.db.models.base.ModelBase'>, <class 'object'>)

✅ 즉, Post → Model → ModelBase → object 순서로 메서드를 찾는다. ✅ 그래서 Post.objects.all() 같은 ORM 기능이 자동으로 동작한다.


📌 3. Django ORM이 자동으로 추가하는 클래스 변수

Django는 models.Model을 상속받으면 다음과 같은 클래스 변수를 자동으로 추가한다.

클래스 변수 역할

objects 기본 매니저 (데이터를 조회, 저장, 삭제할 수 있음)
_meta 모델의 메타 정보 (테이블 이름, 필드 정보 등)
DoesNotExist get()을 사용할 때 데이터가 존재하지 않으면 발생하는 예외
MultipleObjectsReturned get()을 사용할 때 여러 개의 데이터가 반환되면 발생하는 예외
id (기본 키) Django가 자동으로 추가하는 기본 키 (Primary Key)

🔹 objects는 어떻게 생성될까?

✅ objects는 Django ORM이 자동으로 추가하는 클래스 변수이며, 기본적으로 BaseManager의 인스턴스이다. ✅ Django 내부에서 models.Model을 정의할 때, BaseManager를 상속하여 objects가 자동으로 추가된다.

class Model:
    objects = BaseManager()  # Django가 자동으로 추가하는 클래스 변수

✅ 따라서 Post.objects.all()을 실행하면, BaseManager의 all() 메서드를 호출하게 된다.

🔹 objects와 all()의 원리

✔️ Python에서 일반적인 클래스 메서드 예제

class Manager:
    def all(self):
        return "나는 all() 메서드야!"

class Post:
    objects = Manager()  # 클래스 변수로 Manager 객체 추가

# 클래스 변수인 objects를 통해 all() 메서드 호출
print(Post.objects.all())  # 나는 all() 메서드야!

📌 즉, objects는 Manager 객체를 가지고 있고, all()은 그 Manager 객체의 메서드야! 🚀

✔️ Django ORM에서 all()의 실제 동작

all_posts = Post.objects.all()  # 모든 데이터 가져오기

📌 이것은 내부적으로 SELECT * FROM Post;

      => SQL로 변환됨!

✔️ Django 내부에서 all() 메서드는 이렇게 정의됨

class Manager:
    def all(self):
        return "데이터베이스에서 모든 데이터를 가져옴"

# Django ORM에서 Post.objects.all()의 원리
print(Post.objects.all())  # 데이터베이스에서 모든 데이터를 가져옴

📌 즉, all()은 objects가 가진 메서드이고, Post.objects.all()처럼 사용할 수 있는 것.

      다른 클래스 변수들도 이런 식으로 사용이 가능하고, 각 클래스내 정의된 메서드도 위와 같은 방식으로 사용가능. 


📌 4. 최종 정리

클래스 상속의 원리

  • 부모 클래스의 속성과 메서드를 자식 클래스가 자동으로 상속받는다.
  • Python 내부적으로 MRO(Method Resolution Order)를 사용해 메서드 탐색 순서를 정한다.
  • super()를 사용하면 부모 클래스의 메서드를 명시적으로 호출할 수 있다.

Django에서 models.Model을 상속하면?

  • Django ORM의 모든 기능(objects.all(), .save() 등)을 자동으로 사용할 수 있다.
  • Django ORM은 내부적으로 _meta, objects, DoesNotExist 같은 클래스 변수를 자동으로 추가한다.

Django ORM의 동작 방식

  1. models.Model을 상속하면 Django가 자동으로 ORM 기능을 추가함
  2. objects 매니저를 사용하여 데이터를 저장, 조회, 수정, 삭제할 수 있음
  3. _meta를 통해 모델의 테이블 정보 및 필드를 확인할 수 있음

즉, Python의 상속 개념을 확실히 이해하면 Django ORM뿐만 아니라 객체지향 프로그래밍(OOP)도 더 깊이 이해할 수 있다.

헷갈릴 수 있어요! Django는 Python 프레임워크이므로, Django 코드와 일반 Python 코드가 함께 사용되는 경우가 많아요. 하지만 각각의 역할을 이해하면 쉽게 구분할 수 있어요.


1. Python 코드 vs Django 코드 차이 이해하기

구분 역할 예제

Python 코드 데이터를 처리, 로직 작성, 기본 기능 제공 print(), for, def
Django 코드 웹 애플리케이션을 만들기 위한 기능 제공 models.Model, views.View, urls

📌 이렇게 이해하면 쉬워요!

  • "기본적인 로직을 처리할 때"Python 코드 사용
    • 예: 리스트 다루기, 반복문, 문자열 처리, 파일 읽기 등.
    • for 문, if 문, def 함수, open() 등
  • "웹 관련 기능을 구현할 때"Django 코드 사용
    • 예: 모델(DB), 뷰(로직 처리), URL 라우팅 등.
    • models.Model, render(), request.GET

2. 언제 Python을 쓰고, 언제 Django를 쓰나요?

예제 1: 게시글 저장 기능 (Python vs Django 비교)

① Python 코드 (일반적인 로직)

title = "Django 공부"
content = "Django ORM을 배우는 중이에요!"

# 리스트를 사용하여 간단한 데이터 저장
posts = []
posts.append({'title': title, 'content': content})

print(posts)  # [{'title': 'Django 공부', 'content': 'Django ORM을 배우는 중이에요!'}]
  • 여기서는 Django를 사용하지 않고 Python의 리스트와 딕셔너리를 활용해 데이터를 관리함.
  • 간단한 로직이나 테스트용으로 사용.

② Django 코드 (실제 웹 애플리케이션)

from myapp.models import BlogPost

# Django ORM을 사용하여 데이터베이스에 저장
post = BlogPost(title="Django 공부", content="Django ORM을 배우는 중이에요!")
post.save()  # DB에 저장됨

# 저장된 데이터 출력
print(BlogPost.objects.all())  # <QuerySet [<BlogPost: Django 공부>]>
  • Django의 models.Model을 사용해 실제 데이터베이스에 저장.
  • 이 방법은 웹 애플리케이션에서 사용해야 함.

예제 2: 사용자 입력 처리 (Python vs Django 비교)

① Python 코드 (콘솔에서 입력받기)

name = input("이름을 입력하세요: ")
print(f"안녕하세요, {name}님!")
  • Python의 input()을 사용하여 터미널에서 입력받고 출력.

② Django 코드 (웹 요청 처리)

from django.shortcuts import render

def greet_user(request):
    name = request.GET.get('name', 'Guest')
    return render(request, 'greet.html', {'name': name})
  • Django에서는 request.GET을 사용해 웹 페이지에서 입력을 받고 응답.

3. Django에서 Python을 활용하는 경우

Django를 사용할 때도 Python 코드가 많이 필요합니다. 예를 들어:

  1. 모델(데이터 저장)에서 Python 코드 사용

Django의 모델을 정의할 때, def를 이용한 Python 메서드를 추가하여 로직을 구현

from django.db import models

class BlogPost(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()

    def summary(self):  # Python의 메서드 작성
        return self.content[:100]  # 첫 100자만 반환

   2.뷰(로직 처리)에서 Python 코드 사용

 

Django의 뷰 함수 안에서 Python을 사용하여 데이터 처리.

def calculate_numbers(request):
    num1 = int(request.GET.get('num1', 0))
    num2 = int(request.GET.get('num2', 0))
    result = num1 + num2  # 여기서 Python 연산 활용
    return render(request, 'result.html', {'result': result})

 

3.템플릿(HTML 페이지)에서 Python 로직 활용

Django 템플릿에서도 반복문, 조건문을 사용해 Python의 일부 기능을 적용 가능.

<h1>게시글 목록</h1>
{% for post in posts %}
    <p>{{ post.title }}</p>  <!-- Django 템플릿 코드 (Python 활용) -->
{% endfor %}

4. 정리 (헷갈리지 않게 이해하는 방법)

상황 어떤 코드 사용? 예제

웹이 아닌 일반 작업(계산, 파일 처리) Python 코드 사용 open(), for, print()
데이터베이스 연동 Django 모델 코드 사용 models.Model
웹 페이지에서 데이터 가져오기 Django 뷰 코드 사용 request.GET, render()
웹에서 폼 입력 받기 Django 폼 코드 사용 forms.Form
API 개발 Django REST 프레임워크 사용 serializers.ModelSerializer

 


5.결론: Python과 Django의 차이를 쉽게 기억하기

  • Django는 Python의 웹 프레임워크 → 웹 기능을 담당.
  • Python은 기본적인 로직 처리 → 데이터 연산, 반복문, 조건문 등.
  • Django를 사용하지만, 결국 코어는 Python이므로 Python을 잘 이해하는 것이 중요.

결국, 어떤 로직을 처리하느냐에 따라 사용할 코드(파이썬 또는 장고)가 달라지므로, 먼저 무엇을 위해 어떤 것을 작성할 것인지를 고민하는 것이 중요하다는 것을 깨달았습니다.

Django의 아키텍처 설계 (MVC 패턴과 MTV 패턴)

Django는 웹 애플리케이션을 구조적으로 개발하기 위해 MTV(Model-Template-View) 패턴을 따릅니다.
이는 전통적인 MVC(Model-View-Controller) 패턴에서 일부 역할이 변형된 구조입니다.

(나는 설계 순서에 따라 M-V-T라고 생각 )


1. Django 아키텍처 개요

Django의 아키텍처는 다음 3가지 주요 요소로 구성됩니다:

  1. Model (모델):
    • 데이터베이스와의 상호작용을 담당 (데이터 저장, 검색, 수정, 삭제).
    • ORM(Object-Relational Mapping)을 통해 SQL 없이 데이터 처리 가능.
  2. Template (템플릿):
    • HTML/CSS로 구성된 프론트엔드, 사용자에게 데이터를 보여줌.
    • Django의 템플릿 엔진을 사용하여 동적인 콘텐츠 출력.
  3. View (뷰):
    • 요청을 처리하고 필요한 데이터를 모델에서 가져와 템플릿에 전달.
    • 비즈니스 로직을 담당.

2. MTV 패턴과 MVC 패턴의 차이점

패턴 설명

MVC 패턴 Model-View-Controller: 뷰와 컨트롤러를 분리하여 역할 수행.
MTV 패턴 (Django) Model-Template-View: Django는 "Template"을 View로 간주.

Django에서는 'View'가 실제로 컨트롤러 역할을 하고, 프론트엔드는 'Template'로 분리됩니다.

즉, Django에서의 역할 매핑은 다음과 같습니다:

MVC (기존) MTV (Django) 역할

Model Model 데이터 처리 및 저장
View Template 사용자에게 보여지는 화면
Controller View 요청을 처리하고 응답 반환

3. Django의 요청 흐름 (아키텍처의 동작 방식)

Django의 웹 요청 처리 흐름을 단계별로 살펴보겠습니다.

  1. 사용자가 웹 브라우저에서 특정 URL(예: http://example.com/products/)로 요청을 보냄.
  2. Django의 urls.py가 요청을 분석하여 적절한 view로 전달.
  3. view.py에서 비즈니스 로직 수행 및 필요 시 model을 통해 데이터를 가져옴.
  4. 데이터를 template에 전달하여 HTML로 렌더링.
  5. 완성된 웹 페이지가 사용자에게 반환.

4. 예제와 함께 아키텍처 흐름 살펴보기

(1) 프로젝트 및 앱 생성

django-admin startproject myshop
cd myshop
python manage.py startapp products

프로젝트 구조:

myshop/
│-- myshop/       # 프로젝트 설정 폴더
│   │-- settings.py  # 프로젝트 설정
│   │-- urls.py      # 프로젝트 전체 URL 관리
│
│-- products/     # 앱 폴더 (상품 기능)
│   │-- models.py     # 데이터 모델 정의
│   │-- views.py      # 비즈니스 로직 처리
│   │-- urls.py       # 앱 URL 설정
│   │-- templates/    # 템플릿 폴더
│       │-- product_list.html  # 상품 목록 템플릿
│
│-- manage.py     # Django 명령어 실행 파일

(2) Model (데이터베이스 모델 생성)

products/models.py에서 상품 모델 생성:

from django.db import models

class Product(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField()
    price = models.DecimalField(max_digits=10, decimal_places=2)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name

역할:

  • Product 모델이 products 테이블을 생성하며, 상품 이름, 설명, 가격을 저장.

(3) View (요청 처리 및 비즈니스 로직)

products/views.py에서 요청 처리:

from django.shortcuts import render
from .models import Product

def product_list(request):
    products = Product.objects.all()  # 모든 상품 가져오기
    return render(request, 'product_list.html', {'products': products})

역할:

  • 사용자의 요청을 받아 Product 모델의 데이터를 가져와 템플릿에 전달.

(4) URL 라우팅 (라우터 설정)

프로젝트 수준의 URL 설정 (myshop/urls.py)

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('products/', include('products.urls')),  # 앱의 URL 연결
]

앱 수준의 URL 설정 (products/urls.py)

from django.urls import path
from .views import product_list

urlpatterns = [
    path('', product_list, name='product_list'),
]

역할:


(5) Template (프론트엔드 구현)

products/templates/product_list.html

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Product List</title>
</head>
<body>
    <h1>Product List</h1>
    <ul>
        {% for product in products %}
            <li>{{ product.name }} - ${{ product.price }}</li>
        {% endfor %}
    </ul>
</body>
</html>

역할:

  • 데이터를 HTML로 렌더링하여 사용자에게 보여줌.

(6) 결과 확인

서버를 실행하여 테스트:

python manage.py runserver
  • 브라우저에서 http://127.0.0.1:8000/products/로 접속하면 상품 목록이 출력됨.

5. Django 아키텍처 설계의 주요 원칙

  1. 모듈화(Modularity):
    • 기능별로 앱을 나누고, 독립적으로 유지보수할 수 있도록 설계.
  2. 재사용성(Reusability):
    • 앱을 다른 프로젝트에서도 쉽게 재사용 가능.
  3. 확장성(Scalability):
    • 기능을 쉽게 추가할 수 있도록 분리된 구조.
  4. 보안(Security):
    • 내장된 보안 기능(세션, 사용자 인증 등)을 사용하여 보안 강화.

6. Django 아키텍처 설계 시 고려해야 할 사항

  1. 기능별로 앱을 나누어 설계.
    • 예: 사용자 관리, 게시판, 결제 등 각 기능을 독립적인 앱으로 분리.
  2. URL 라우팅을 체계적으로 구성.
    • 프로젝트 수준에서 앱을 포함하여 URL 관리.
  3. 모델을 설계할 때 관계(ForeignKey, ManyToMany 등)를 신중히 정의.
  4. 템플릿 시스템을 활용하여 UI의 재사용성을 높이기.
    • base.html을 만들어 공통 레이아웃 설정.

7. 요약

  1. Django는 MTV 패턴을 따름.
    • Model(데이터 처리), Template(프론트엔드), View(요청 처리).
  2. 요청 흐름:
    사용자 요청 → URL 매핑 → View 처리 → Model 조작 → Template 렌더링.
  3. 기능을 앱으로 세분화하여 확장성과 유지보수를 고려한 설계가 중요.
  4. 실제 예제:
    • 상품 관리 기능을 모델, 뷰, 템플릿으로 분리하여 구현.

 


Django에서 urls.py는 프로젝트 수준앱 수준에 존재할 수 있으며, 이들은 서로 다른 목적과 역할을 수행합니다. 어떤 작업을 하고 있는지(흐름에 따라) 적절한 위치의 urls.py를 사용하게 됩니다.


1. 프로젝트 수준의 urls.py vs 앱 수준의 urls.py

(1) 프로젝트 수준의 urls.py

1) 역할 및 목적

  • 웹 애플리케이션 전체의 URL 라우팅을 총괄하는 역할.
  • 개별 앱들의 urls.py를 포함하여 중앙에서 앱 단위로 URL을 관리.
  • 서버에 요청이 들어오면 가장 먼저 확인하는 URL 매핑 파일.

2) 위치 및 파일 구조

보통 프로젝트 폴더 안의 urls.py가 해당됩니다.

예시 디렉토리 구조:

myproject/
│-- myproject/
│   │-- __init__.py
│   │-- settings.py
│   │-- urls.py  <-- 프로젝트 수준의 urls.py
│   │-- wsgi.py
│-- myapp/
│   │-- urls.py  <-- 앱 수준의 urls.py
│-- manage.py

3) 작동 방식

프로젝트의 urls.py는 앱을 포함하는 역할을 합니다.

예제 (myproject/urls.py):

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),  # Django 기본 관리자 페이지
    path('myapp/', include('myapp.urls')),  # 앱 내부의 urls.py 포함
]

설명:

  • include('myapp.urls'): 앱의 URL 구성을 프로젝트에서 가져와서 사용.
  • 모든 요청이 먼저 프로젝트의 urls.py로 전달된 후, 등록된 앱의 URL로 이동함.

(2) 앱 수준의 urls.py

1) 역할 및 목적

  • 특정 앱(예: 블로그, 사용자 관리 등)에 대한 세부적인 URL 처리.
  • 개별적인 기능에 대한 URL을 정의하여 관리의 편의성을 높임.
  • 모듈화를 통해 코드 유지보수 및 확장성을 확보.

2) 위치 및 파일 구조

앱 폴더 내부에 위치.

예시 디렉토리 구조:

myproject/
│-- myapp/
│   │-- __init__.py
│   │-- models.py
│   │-- views.py
│   │-- urls.py  <-- 앱 수준의 urls.py
│   │-- admin.py
│   │-- tests.py

3) 작동 방식

앱 수준의 urls.py는 해당 앱의 특정 기능별 URL을 정의합니다.

예제 (myapp/urls.py):

from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home'),  # 기본 페이지
    path('detail/<int:id>/', views.detail, name='detail'),  # 상세 페이지
]

설명:

  • path(''): 기본 루트 요청(myapp/에 접속 시) → views.home 실행.
  • path('detail/<int:id>/'): myapp/detail/5/ 같은 URL 처리.

2. 프로젝트 수준과 앱 수준의 urls.py의 관계와 흐름

Django의 URL 처리는 다음과 같은 흐름을 따릅니다:

  1. 사용자가 브라우저에서 http://127.0.0.1:8000/myapp/detail/5/ 요청.
  2. **프로젝트의 urls.py**에서 'myapp/' 패턴을 찾아 myapp.urls로 연결.
  3. **앱의 urls.py**에서 detail/<int:id>/ 패턴을 찾아 해당 뷰(views.detail) 실행.
  4. 해당 뷰가 데이터를 가공 후 템플릿을 렌더링하여 응답.

3. 언제 프로젝트 vs 앱 수준의 urls.py를 사용해야 하나요?

상황별 사용 예시:

상황 urls.py 위치 설명

프로젝트 전체 URL을 설정할 때 프로젝트 urls.py 관리자 페이지, 앱을 포함할 때.
특정 기능(예: 블로그, 유저 관리)별로 URL 관리 앱 urls.py 블로그의 글, 사용자 등록, 주문 처리 등을 관리할 때.
여러 앱을 하나의 프로젝트에서 사용할 때 프로젝트 + 앱 urls.py 프로젝트에서 여러 앱을 포함하고 각각 기능을 나눌 때.

실전 예시:

  • http://127.0.0.1:8000/admin/ → 프로젝트 수준에서 처리
  • http://127.0.0.1:8000/blog/ → 프로젝트 수준 → 앱의 블로그 URL 매핑
  • http://127.0.0.1:8000/blog/post/1/ → 앱의 URL 처리

4. 전체적인 URL 처리 과정 흐름 요약

  1. 프로젝트 수준의 urls.py
    • 웹 애플리케이션의 전체 URL을 통제하고 앱의 URL을 포함.
    • 주 역할: admin/, app/ 등 주요 경로 설정.
  2. 앱 수준의 urls.py
    • 개별 앱의 특정 기능에 대한 URL 설정.
    • 주 역할: home/, detail/5/ 등 세부 기능 처리.
  3. 뷰(View)에서 요청 처리
    • urls.py에서 지정된 뷰 함수가 호출되어 데이터를 처리.

5. Django URL 설정의 목적 및 장점

  1. 모듈화
    • 프로젝트와 앱을 분리하여 관리가 용이함.
  2. 확장성
    • 새로운 앱을 쉽게 추가 가능.
  3. 유지보수 용이
    • 특정 앱의 URL 변경이 전체 프로젝트에 영향을 주지 않음.

6. 예제 프로젝트 설정 흐름

프로젝트 urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls')),  # blog 앱 URL 포함
]

앱 urls.py (blog 앱)

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),  # 기본 블로그 페이지
    path('post/<int:id>/', views.post_detail, name='post_detail'),
]

뷰 함수 (views.py)

from django.http import HttpResponse

def index(request):
    return HttpResponse("블로그 홈입니다.")

def post_detail(request, id):
    return HttpResponse(f"블로그 글 번호: {id}")

이제 http://127.0.0.1:8000/blog/로 접속하면 블로그 홈이 보이고,
http://127.0.0.1:8000/blog/post/1/로 접속하면 특정 게시글이 출력됩니다.


 

Django 웹 애플리케이션 개발 과정을 세부적으로 나누어 설명드릴게요. 전체 흐름에서 데이터 추가와 같은 실질적인 작업까지 단계별로 세분화하여 다뤄보겠습니다.


1. 전체적인 흐름 정리 (Django 개발 과정 개요)

Django 개발의 주요 단계는 다음과 같습니다.

  1. 프로젝트 및 앱 생성
  2. 모델 설계 및 데이터베이스 적용 (마이그레이션)
  3. 데이터 추가, 조회, 수정, 삭제 (CRUD)
  4. URL 라우팅 설정
  5. 뷰 작성 (비즈니스 로직)
  6. 템플릿 작성 (HTML 렌더링)
  7. 사용자 입력 처리 (폼 사용)
  8. 관리자 페이지 등록 및 관리
  9. 테스트 작성
  10. 배포 (실제 서비스 제공)

2. 단계별로 나열 및 설명 (각 과정의 역할 및 목적)

각 단계를 하나씩 세분화하여 설명드리겠습니다.


1) 프로젝트 및 앱 생성

무엇을 하는가?

  • Django 프로젝트와 앱을 생성하여 기본 구조를 설정.

작동 방식

  • Django의 명령어를 통해 프로젝트 및 앱을 생성.

역할 및 목적

  • 전체 프로젝트의 틀을 잡고, 앱 단위로 기능을 분리.

실행 명령어:

django-admin startproject myproject  # 프로젝트 생성
cd myproject
python manage.py startapp myapp      # 앱 생성

생성된 구조 예시:

myproject/
│-- myproject/       # 프로젝트 설정 파일
│-- myapp/           # 앱 폴더
│-- manage.py        # Django 관리 명령어 실행 파일

2) 모델 설계 및 데이터베이스 적용 (마이그레이션)

무엇을 하는가?

  • 앱에서 사용할 데이터 모델을 정의하고, 이를 데이터베이스 테이블로 생성.

작동 방식

  • models.py에 클래스 작성 → 마이그레이션 파일 생성 → 데이터베이스 적용.

역할 및 목적

  • 데이터를 저장할 구조를 정의하고 데이터베이스와 연결.

모델 예제 (myapp/models.py):

from django.db import models

class Customer(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField(unique=True)
    age = models.IntegerField()

마이그레이션 명령어 실행:

python manage.py makemigrations  # 모델 변경사항 감지 후 마이그레이션 파일 생성
python manage.py migrate         # 데이터베이스에 반영 (테이블 생성)

3) 데이터 추가, 조회, 수정, 삭제 (CRUD 작업)

무엇을 하는가?

  • 데이터베이스에 데이터를 추가하고 조작.

작동 방식

  • Django ORM을 사용하여 데이터를 다룸.

역할 및 목적

  • 데이터를 조작하기 위한 메커니즘 제공.

1. 데이터 추가 (Create)

from myapp.models import Customer

# 새 고객 추가
customer = Customer(name="홍길동", email="hong@example.com", age=30)
customer.save()

2. 데이터 조회 (Read)

customers = Customer.objects.all()  # 모든 고객 조회
print(customers)

specific_customer = Customer.objects.get(id=1)  # 특정 ID 고객 조회

3. 데이터 수정 (Update)

customer = Customer.objects.get(id=1)
customer.age = 35  # 나이 수정
customer.save()

4. 데이터 삭제 (Delete)

customer = Customer.objects.get(id=1)
customer.delete()

4) URL 라우팅 설정

무엇을 하는가?

  • 클라이언트의 요청을 적절한 뷰와 연결.

작동 방식

  • urls.py에서 URL 경로를 뷰와 매핑.

역할 및 목적

  • 사용자가 특정 URL로 접근 시 어떤 뷰가 실행될지 정의.

예제 (myapp/urls.py):

from django.urls import path
from . import views

urlpatterns = [
    path('customers/', views.customer_list),
]

5) 뷰 작성 (비즈니스 로직 구현)

무엇을 하는가?

  • 사용자의 요청을 처리하고 데이터를 가공.

작동 방식

  • 데이터베이스에서 데이터를 가져와 템플릿에 전달.

역할 및 목적

  • 데이터를 받아서 사용자에게 알맞은 응답을 생성.

예제 (myapp/views.py):

from django.shortcuts import render
from .models import Customer

def customer_list(request):
    customers = Customer.objects.all()
    return render(request, 'customer_list.html', {'customers': customers})

6) 템플릿 작성 (HTML 렌더링)

무엇을 하는가?

  • 데이터를 HTML로 표시하여 사용자에게 제공.

작동 방식

  • Django의 템플릿 엔진을 사용해 동적 HTML 생성.

역할 및 목적

  • 데이터를 시각적으로 표현하고 프론트엔드 렌더링 수행.

예제 (templates/customer_list.html):

<!DOCTYPE html>
<html>
<body>
    <h1>고객 리스트</h1>
    <ul>
        {% for customer in customers %}
            <li>{{ customer.name }} - {{ customer.email }}</li>
        {% endfor %}
    </ul>
</body>
</html>

7) 사용자 입력 처리 (폼 사용)

무엇을 하는가?

  • 사용자 입력을 받아 유효성 검증 후 데이터 저장.

작동 방식

  • Django의 폼 클래스를 활용.

역할 및 목적

  • 사용자 입력 데이터 처리를 효율적으로 수행.

예제 (forms.py):

from django import forms
from .models import Customer

class CustomerForm(forms.ModelForm):
    class Meta:
        model = Customer
        fields = ['name', 'email', 'age']

8) 관리자 페이지 등록 및 관리

무엇을 하는가?

  • 관리자 페이지에서 데이터를 관리.

작동 방식

  • Django의 admin.py에서 모델 등록.

역할 및 목적

  • 손쉽게 데이터를 조회하고 수정.

예제 (myapp/admin.py):

from django.contrib import admin
from .models import Customer

admin.site.register(Customer)

9) 테스트 작성

무엇을 하는가?

  • 코드의 동작을 검증.

작동 방식

  • Django의 테스트 프레임워크 활용.

역할 및 목적

  • 앱이 의도대로 동작하는지 확인.

예제 (myapp/tests.py):

from django.test import TestCase
from .models import Customer

class CustomerTestCase(TestCase):
    def test_customer_creation(self):
        customer = Customer.objects.create(name="테스트", email="test@example.com", age=25)
        self.assertEqual(customer.age, 25)

10) 배포 (실제 서비스 제공)

무엇을 하는가?

  • 로컬 환경에서 개발한 웹 애플리케이션을 배포 서버로 옮김.

작동 방식

  • AWS, Heroku 등 클라우드 플랫폼에 배포.

역할 및 목적

  • 실제 사용자에게 서비스 제공.

 

+ Recent posts