💡 AI 인사이트

🤖 AI가 여기에 결과를 출력합니다...

댓글 커뮤니티

쿠팡이벤트

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

검색

    [코담] 웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트

    Part 1 | ✅저자: 이유정(박사)

    🔹 Django 튜토리얼 Part 1- Django App 만들기 (설문조사앱)

    📖 공식 문서 링크:

    🔗 https://docs.djangoproject.com/ko/5.2/intro/tutorial01/

    목표

    • 사람들이 투표할 수 있는 공개 사이트
    • 관리자가 설문을 추가/수정/삭제할 수 있는 관리용 사이트

    ✅ 1단계: Django 설치 확인

    python -m django --version
    

    ✅ 2단계: 프로젝트를 위한 폴더 만들기

    mkdir djangotutorial
    cd djangotutorial
    

    ✅ 3단계: 앱 생성

    django-admin startproject mysite .
    

    ◽ polls 앱 생성후 전체구조는 다음과 같습니다:

    djangotutorial/
    ├── manage.py
    └── mysite/
        ├── __init__.py
        ├── settings.py
        ├── urls.py
        ├── asgi.py
        └── wsgi.py
    
    • manage.py: Django 프로젝트를 관리하는 명령어 도구
    • settings.py: 환경 설정
    • urls.py: URL 연결(라우팅) 설정
    • asgi.py / wsgi.py: 서버용 진입점

    ✅ 4단계: 개발 서버 실행 및 서버 종료

    python manage.py runserver
    
    Ctrl + C
    

    ✅ 5단계: 앱(App) 만들기 이제 실제 설문조사 기능을 담을 앱(app) 을 생성합니다.

    python manage.py startapp polls
    

    polls/ 폴더가 생기고 구조는 다음과 같습니다:

    polls/
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── migrations/
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    ├── views.py
    

    ✅ 6단계: 라우터

    mysite/urls.py

    from django.contrib import admin
    from django.urls import include, path
    
    urlpatterns = [
        path("polls/", include("polls.urls")),  # polls 앱의 URL 연결
        path("admin/", admin.site.urls),
    ]
    

    Admin(관리자)

    from django.contrib import admin
    
    • django.contrib는 장고가 기본으로 제공하는 내장 앱 모음 패키지입니다.
    • 그 안의 admin 모듈은 관리자(admin) 웹사이트를 생성하고 관리할 수 있게 해주는 기능을 포함합니다.
    • 자동 생성된 admin 사이트를 통해 데이터베이스의 모델 데이터를 시각적으로 편리하게 추가/편집/삭제할 수 있습니다.

    polls/urls.py 파일 새로 만들기

    from django.urls import path
    from . import views
    
    urlpatterns = [
        path("", views.index, name="index"),
    ]
    

    🔹 path( )include():

    모듈 불러오기

    from django.urls import path, include
    

    path() 함수란?

    • 특정 URL 경로(URL Pattern) 가 들어왔을 때
    • 어떤 View 함수(또는 클래스) 를 실행할지 직접 연결하는 함수입니다.

    📖 문법, 구문(syntax):

    path('URL패턴', 실행할뷰함수, name='이름')  
    

    ◽ URL에 이름 부여 (name) URL 경로에 이름을 부여하여, 나중에 템플릿이나 코드에서 하드코딩 없이링크 참조가 가능합니다.

    💬 하드코딩이란? 고정된 값(데이터, 설정 등)을 코드 내부에 직접 써넣는 것을 의미합니다.
    그래서 나중에 바꾸려면 코드를 수정해야만 합니다.

    path('', views.index, name='index')
    

    템플릿 예시:

    <a href="{% url 'index' %}">홈으로</a>
    

    include() 함수란?

    • 다른 앱의 urls.py를 현재 프로젝트의 URLconf에 포함(include) 시킬 때 사용합니다.
    • 앱 단위로 URL을 관리할 수 있게 해주는 함수입니다.
    path("polls/", include("polls.urls")), # polls 앱의 urls.py를 연결
    

    💬 한 줄 요약

    • path() → URL 경로와 view 함수를 연결
    • include() → 앱 단위로 만든 URL 파일(앱의 urls.py) 을 불러와 연결

    즉, include는 “앱 통째로 붙이기”,
    path는 “URL 한 줄 붙이기”라고 이해하면 됩니다.


    ✅ 7단계: 첫 번째 뷰(view) 만들기

    📁 polls/views.py 열고 아래 코드 작성:

    from django.http import HttpResponse
    
    def index(request):
        return HttpResponse("Hello, world. You're at the polls index.")
    

    ◽ 뷰 함수 (views.py) polls/views.py

    • URL 요청이 들어오면 실행되는 비즈니스 로직을 담당합니다.
    • HTML 출력, DB 조회, 템플릿 렌더링 등 다양한 역할을 합니다

    💬 비즈니스 로직이란? 사용자의 요청을 실제 서비스나 도메인 규칙에 따라 처리하는 핵심 규칙을 말합니다.

    예를 들어, 쇼핑몰 시스템이라면 다음과 같은 것들이 비즈니스 로직입니다:

    • 장바구니에 담긴 상품의 총 금액 계산
    • 재고가 없을 경우 주문 불가 처리
    • 특정 회원 등급에 따른 할인율 적용
    • 결제 완료 시 포인트 적립

    ◽ 확장된 HTML + CSS 포함 예시 (브라우저에 꾸며서 출력)

    📁 polls/views.py (연습용)

    from django.http import HttpResponse
    
    def index(request):
        html = """
        <html>
        <head>
            <title>투표 사이트</title>
            <style>
                body {
                    font-family: Arial, sans-serif;
                    background-color: #f2f2f2;
                    padding: 2em;
                }
                h1 {color: #333399;}
                .box {
                    background: white;
                    padding: 1.5em;
                    border-radius: 10px;
                    box-shadow: 0 0 10px rgba(0,0,0,0.1);
                    max-width: 600px;
                    margin: auto;
                }
            </style>
        </head>
        <body>
            <div class="box">
                <h1>안녕하세요!</h1>
                <p>여기는 <strong>설문조사(polls)</strong> 
                사이트의 메인 페이지입니다.
                </p>
                <p>관리자는 설문을 추가하고, 사용자는 투표할 수 있습니다.</p>
            </div>
        </body>
        </html>
        """
        return HttpResponse(html)
    

    🔹 Django 프로젝트 흐름도

    🔹 이미지 흐름도 요약 설명 이미지에는 사용자의 요청이 프로젝트의 urls.py → 앱의 urls.py → 앱의 views.pymodels.py와 DB로 이어지는 흐름이 그려져 있습니다.

    ◽ 1. 클라이언트 요청 (웹 브라우저에서 URL 요청이 들어옵니다.)

    예: http://localhost:8000/polls/
    

    ◽ 2. 프로젝트 루트의 urls.py (mysite/urls.py) 요청 URL을 앱(polls)의 URL로 연결합니다.

    from django.contrib import admin
    from django.urls import include, path
    
    urlpatterns = [
        path("polls/", include("polls.urls")),  # polls 앱의 URL 연결
        path("admin/", admin.site.urls),
    ]
    
    • 역할: 전체 프로젝트의 URL 라우팅 담당, 앱별로 연결을 분배

    ◽ 3. 앱의 urls.py (polls/urls.py)

    • 각 앱에서 요청 URL에 따라 적절한 view 함수를 호출합니다.
    from django.urls import path
    from . import views
    
    urlpatterns = [
        path("", views.index, name="index"),
    ]
    
    • 역할: 앱 내부에서 어떤 함수를 실행할지 결정

    ◽ 4. 앱의 polls/views.py URL로 연결된 요청을 처리하고, 데이터를 가져오거나 템플릿에 넘겨줍니다.

    from django.http import HttpResponse
    
    def index(request):
        return HttpResponse("Hello, world. You're at the polls index.")
    

    ◽ 5. 앱의 polls/models.py 데이터베이스와 연결되는 데이터 구조(테이블) 정의

    from django.db import models
    
    class Question(models.Model):
        question_text = models.CharField(max_length=200)
        pub_date = models.DateTimeField('date published')
    

    ◽ 6. 데이터베이스 (DB) models.py를 통해 정의된 구조가 마이그레이션 되어 실제 데이터가 저장됩니다. 예: SQLite(db.sqlite3)

    🔚 마무리 구조 요약:

    사용자 요청 → mysite/urls.py → polls/urls.py → views.py → models.py → DB
    

    이러한 방식으로 Django는 MTV(Model-Template-View) 아키텍처를 기반으로 모든 흐름을 관리하며, 각각의 파일은 이 흐름 속에서 고유한 역할을 수행합니다.


    ✅ 8단계: 앱을 프로젝트에 등록 (앱을 생성하면 자동생성됨)

    polls/apps.py

    from django.apps import AppConfig
    
    class PollsConfig(AppConfig):
        default_auto_field = 'django.db.models.BigAutoField'
        name = 'polls'
    

    name = 'polls' : 이 속성은 앱의 이름을 Django에게 알려주는 용도임. default_auto_field = 'django.db.models.BigAutoField' : Django가 모델의 기본 자동 필드(primary key)로 어떤 타입을 사용할지를 지정하기 위한 설정입니다.

    mysite/settings.pyINSTALLED_APPS'polls.apps.PollsConfig' 추가:

    INSTALLED_APPS = [
        'polls.apps.PollsConfig',  # 이 줄 추가
    ]
    

    두 코드를 꼭 같이 써야 하는것은 아니지만 apps.py 사용이 권장됩니다. 최소 설정만 할 경우:

    # settings.py
    INSTALLED_APPS = [
        'polls',  # 가능함
    ]
    
    • 이렇게 'polls'만 써도 Django는 자동으로 polls 앱을 인식해서 잘 작동합니다.
    • Django는 내부적으로 polls/apps.py가 있는지도 찾아보고, 없으면 그냥 polls 디렉토리를 기준으로 앱을 등록하며, apps.py 없이도 동작합니다.

    ❓ 왜 apps.py를 쓰는 이유는 apps.py를 사용하면 앱의 추가 설정을 커스터마이즈할 수 있기 때문입니다.

    ready() 메서드 예시

    class PollsConfig(AppConfig):
        name = 'polls'
    
        def ready(self):
            import polls.signals # 앱 시작 시 실행할 초기 설정
    

    ✅ 9단계: 개발 서버 실행 테스트

    python manage.py runserver
    

    http://127.0.0.1:8000/ 에 접속하여 Django 환영 페이지가 잘 나오는지 확인


    ✅ 10단계: 결과 확인

    http://127.0.0.1:8000/polls/
    
    출력 결과:  
    Hello, world. You're at the polls index.
    

    ==공식문서에 있는 part1 완료==


    🔹 첫 Commit

    1️⃣ .gitignore파일을 만든다.

    # Python 기본 캐시 및 가상환경 파일 제외
    venv/
    env/
    __pycache__/
    *.pyc
    *.pyo
    *.pyd
    
    # 환경 변수 파일 (보안 중요)
    .env
    # 개발중에만 사용
    
    # 데이터베이스 파일 제외 (SQLite 등)
    db.sqlite3
    *.sqlite3
    
    # Django 마이그레이션 캐시 제외
    **/migrations/*.pyc
    **/migrations/*.py
    !**/migrations/__init__.py
    
    # 로그 파일 제외
    *.log
    *.out
    *.err
    
    # 미디어 및 정적 파일 (수동 업로드 방지)
    # media/
    # staticfiles/
    # static/
    node_modules/
    
    # VS Code 및 IDE 설정 파일 제외
    .vscode/
    .idea/
    *.sublime-workspace
    
    # Docker 관련 파일 제외 (사용할 경우)
    docker-compose.override.yml
    

    ◽ .gitignore파일 경로를 반드시 확인:


    🔹 requirements.txt 파일 생성

    1️⃣ 가상환경을 활성화한 상태에서 실행:

    source venv/bin/activate
    venv\Scripts\activate
    

    2️⃣ requirements 명령어 실행:

    pip freeze > requirements.txt
    

    3️⃣ requirements.txt 파일 생성 확인

    asgiref==3.8.1
    Django==5.2.1
    sqlparse==0.5.3
    Python==3.12.3
    

    🔹 Git Commit Push & Pull

    ◽ Git 첫 Commit : CLI 명령어 방식

    # Git 초기화
    git init
    
    # 브랜치 이름을 바로 Eunice로 지정
    git checkout -b Eunice
    
    # 커밋할 임시 파일 만들기
    touch README.md
    
    # Git에 추가하고 커밋
    git add README.md
    git commit -m "Initial dummy commit for Eunice branch"
    
    # 원격 저장소 연결
    git remote add origin https://github.com/handgonpo/Django_first.git
    
    # 푸시
    git push -u origin Eunice
    

    git init : 로컬 프로젝트 디렉토리를 Git 저장소로 초기화 .gitignore 설정 : - 추적하지 않을 파일 지정 (예: .env, __pycache__/, db.sqlite3 등) - 보안에 민감한 API키(.env) - 개인개발환경에서만 생성되는 임시파일 __pycache__/.DS_Store - 용량절약: db.sqlite3 DB는 자주 바뀌고 용량이커서 버전 관리에 부적 - 협업방지: 개발자마다 개발환경이 다르므로 로컬설정을 고유하면 오류 git add . : 모든 변경 사항을 Git 스테이징 영역에 추가 git commit -m "처음 커밋" : 커밋 메시지는 반드시 입력해야 커밋이 됩니다. 커밋메시지는 변경사항의 의미를 적어서 기록에 남긴다. git remote add origin 깃헙주소 : GitHub 원격 저장소 연결 (한 번만 설정하면 됨) git branch -M main` : 브랜치를 main으로 명명 (기본 브랜치 명 통일용)

    git checkout -b Eunice        # 새 브랜치 생성
    git push origin Eunice        # GitHub에 푸시
    

    브런치를 자신의 이니셜로 바꾸면 협업, 분류, 관리 측면에서 매우 실용적입니다

    git push -u origin main : 원격 저장소에 처음으로 푸시 (앞으로는 git push만 해도 됨)

    초기 설정 이후 커밋하는 방법: 터미널에서 CLI로 입력하는 방법과 VSCode 이용 ◾ Git Commit :

    # 전체 파일 add 
    git add .
    
    # 커밋 메시지 작성
    git commit -m "전달할 메시지"
    

    ◾ GitHub에서 수정한 내용을 VSCode로 가져오는 방법:

    # 현재 브랜치 확인
    git branch
    
    # 현재 브랜치가 'Eunice' 라면:
    git pull origin Eunice
    

    ◾ VSCode에서 Commit & Push

    TOP
    preload preload