1 – Django 프로젝트 세우기
1.1 – 작업 폴더 만들고 도구 설치하기
- 터미널을 엽니다. Windows는 시작 메뉴에서
PowerShell을 검색해 실행하고, macOS는 ⌘+Space를 누른 뒤터미널을 입력해 실행합니다. - 홈 폴더로 이동합니다.
cd ~
- 작업 폴더를 만들고 그 안으로 들어갑니다.
mkdir chatbot-app && cd chatbot-app
- 도구 두 가지를 설치합니다.
pip install django djangorestframework
Successfully installed로 시작하는 줄이 나타납니다. 설치에는 약 10초에서 1분이 걸립니다.
설치한 두 도구는 하는 일이 다릅니다. Django는 파이썬으로 웹 서버를 만드는 도구이고, Django REST framework는 Django가 HTML 화면 대신 JSON을 돌려주게 해 주는 확장 도구입니다. JSON(제이슨)은 데이터를 주고받을 때 쓰는 글자 형식으로, 사람이 읽을 수 있는 형태이면서 프로그램이 바로 해석할 수 있습니다.

두 도구를 함께 쓰는 이유는 화면을 React가 맡기 때문입니다. Django가 HTML을 직접 그리지 않고 데이터만 JSON으로 넘기면, 그 데이터를 받아 화면에 그리는 일은 React가 합니다. 가운데 Django 서버가 지금 만드는 자리이고, 왼쪽 React 화면과 오른쪽 허깅페이스 모델은 뒤에서 붙입니다.
4번에서 command not found가 나타나면 파이썬이 설치돼 있지 않습니다. https://www.python.org/downloads/에서 내려받아 설치하고, Windows는 설치 화면 맨 아래 [Add python.exe to PATH] 항목을 체크한 뒤 진행합니다. macOS는 python 대신 python3를 써야 하는 경우가 있습니다.
1.2 – 프로젝트를 만들고 서버 켜기
chatbot-app폴더 안에 있는지 확인합니다.
pwd
- 프로젝트를 만듭니다. 맨 뒤의 마침표는 현재 폴더에 바로 만들라는 뜻이므로 빠뜨리지 않습니다.
django-admin startproject config .
- 폴더 안을 확인합니다.
ls
- 서버를 켭니다.
python manage.py runserver
- 브라우저 주소창에
http://127.0.0.1:8000/을 입력하고 Enter를 누릅니다.
config 폴더와 manage.py 파일이 보이고, 브라우저에는 로켓 그림과 함께 The install worked successfully!라는 문장이 있는 화면이 나타납니다.
manage.py는 Django 명령을 실행할 때 쓰는 파일이고, config 폴더 안의 settings.py가 설정을 적는 자리입니다. Django는 코드를 두 층으로 나눠 담는데, 방금 만든 프로젝트가 설정과 주소 목록을 담는 바깥 층입니다. 실제 기능을 담는 안쪽 층은 다음에 만듭니다.
서버가 켜져 있는 동안에는 그 터미널에 명령을 입력할 수 없습니다. 서버를 끌 때는 Ctrl+C를 누릅니다.
터미널 창을 두 개 열어 하나를 서버 전용으로 두면 서버를 켜고 끄는 횟수를 줄일 수 있습니다. 새로 연 터미널에서도 chatbot-app 폴더로 이동해야 합니다.
1.3 – 앱을 만들고 설정에 등록하기
- 서버가 켜져 있으면 Ctrl+
C로 끕니다. - 앱을 만듭니다.
python manage.py startapp chat
- 편집기로
config/settings.py파일을 엽니다. INSTALLED_APPS목록을 찾아 아래처럼 두 줄을 더합니다.
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"rest_framework", # JSON을 돌려주는 확장 도구
"chat", # 방금 만든 앱
]- 파일을 저장합니다. Windows는 Ctrl+
S, macOS는 ⌘+S를 누릅니다.
chat 폴더가 만들어집니다. 이 안의 models.py에 데이터 모양을 적습니다.
INSTALLED_APPS에 적은 것만 Django가 인식합니다. 앱 폴더를 만들어 두어도 이 목록에 이름이 없으면 그 안의 코드는 실행되지 않습니다.
목록에 적는 이름은 밑줄을 쓴 rest_framework입니다. 설치할 때 쓴 이름 djangorestframework와 다릅니다. 설치용 이름과 코드에서 부르는 이름이 다른 도구이므로, 설치 이름을 그대로 적으면 ModuleNotFoundError가 나타납니다.
실습 코칭 프롬프트
이 부분을 혼자 해 보다 막히면 아래 프롬프트를 대화형 AI(ChatGPT·Claude·Gemini)에 붙여 넣어 한 단계씩 도움받습니다.
실습에 쓰던 대화창이 아니라 새 대화창에 붙여 넣습니다. 실습 대화창에는 앞서 시킨 다른 지시가 남아 있어, 그 위에 얹으면 답이 뒤섞입니다.
아래는 Django 프로젝트 세우기 실습을 혼자 해 보다 막혀서 도움을 받으려는 요청입니다.
지금 하려는 것: Django와 Django REST framework를 설치해, 프로젝트와 앱을 만들고 개발용 서버를 띄우는 것입니다.
지금까지 한 것: {지금까지 한 것}
막힌 지점: {막힌 지점}
화면에 나온 메시지: {에러 메시지}
다음 규칙을 지켜 주세요.
- 정답 코드를 통째로 주지 마세요. 다음 한 단계만 알려 주세요.
- 먼저 왜 막혔는지 짚어 주고, 제가 직접 해 보게 하세요.
- 제가 해 본 결과를 말하면 그때 확인 질문을 던지고 다음 단계로 넘어가세요.
- 제가 놓치기 쉬운 부분이 보이면 마지막에 한 줄로 짚어 주세요.
- 설치가 끝났는지, 명령을 어느 폴더에서 실행했는지를 먼저 확인해 주세요.
아래는 Django 프로젝트 세우기 실습을 혼자 해 보다 막혀서 도움을 받으려는 요청입니다.
지금 하려는 것: Django와 Django REST framework를 설치해, 프로젝트와 앱을 만들고 개발용 서버를 띄우는 것입니다.
지금까지 한 것: 홈 폴더에 chatbot-app 폴더를 만들고 pip install django djangorestframework 까지 실행했습니다
막힌 지점: django-admin startproject config . 를 입력하면 실행이 안 됩니다
화면에 나온 메시지: django-admin: command not found
다음 규칙을 지켜 주세요.
- 정답 코드를 통째로 주지 마세요. 다음 한 단계만 알려 주세요.
- 먼저 왜 막혔는지 짚어 주고, 제가 직접 해 보게 하세요.
- 제가 해 본 결과를 말하면 그때 확인 질문을 던지고 다음 단계로 넘어가세요.
- 제가 놓치기 쉬운 부분이 보이면 마지막에 한 줄로 짚어 주세요.
- 설치가 끝났는지, 명령을 어느 폴더에서 실행했는지를 먼저 확인해 주세요.
{지금까지 한 것}— 어느 단계까지 마쳤는지 적습니다. 예:django-admin startproject config . 까지 실행했습니다{막힌 지점}— 무엇을 하려다 안 됐는지 적습니다. 예:python manage.py runserver 를 실행하면 서버가 바로 꺼집니다{에러 메시지}— 화면에 나온 글을 그대로 붙여 넣습니다. 없으면없음이라고 적습니다.
AI가 고친 코드 전체를 한 번에 내놓으면 “코드 전체 말고 어느 줄을 왜 고쳐야 하는지 한 단계만 알려 주세요”라고 되물으십시오. 에러 메시지를 요약해 적으면 원인을 못 짚습니다. 화면에 나온 글을 그대로 붙여 넣습니다.
2 – 데이터 모양 정의하기
2.1 – 대화방 모델 만들기
- 편집기로
chat/models.py파일을 엽니다. - 파일 내용을 아래로 바꿉니다.
from django.db import models
class Conversation(models.Model):
"""대화방 하나를 나타냅니다."""
# 방 제목. 최대 100글자까지 저장합니다.
title = models.CharField(max_length=100, default="새 대화")
# 만든 시각. auto_now_add=True 를 적으면 저장하는 순간의 시각이 자동으로 들어갑니다.
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
# 관리자 화면 목록에 이 문장이 표시됩니다.
return self.title- 파일을 저장합니다.
모델(model)은 데이터베이스에 저장할 데이터의 모양을 파이썬 코드로 적어 둔 것입니다. 방금 적은 항목이 데이터베이스 표의 칸이 됩니다.

챗봇에는 모델 두 개가 필요합니다. 대화방과, 그 방에서 주고받은 글입니다. 대화방을 따로 두면 목록을 만들고 이름을 바꾸고 지울 수 있습니다. 주고받은 글만 저장하면 대화 내용을 보여 줄 수는 있어도 방 단위로 관리할 수 없습니다.
id 항목을 적지 않은 이유가 있습니다. Django는 모든 모델에 번호를 매기는 id 칸을 자동으로 붙입니다. 이 번호가 각 줄을 구분하는 이름표가 되며, 나중에 특정 대화방 하나를 지목할 때 씁니다.
__str__는 이 데이터를 글자로 나타낼 때 무엇을 보여 줄지 정하는 부분입니다. 적지 않으면 관리자 화면 목록에 Conversation object (1)처럼 표시돼 어느 방인지 구분할 수 없습니다.
2.2 – 메시지 모델을 만들고 대화방과 잇기
chat/models.py파일 맨 아래에 아래 내용을 이어 적습니다.
class Message(models.Model):
"""대화방 안에서 주고받은 글 하나를 나타냅니다."""
ROLE_CHOICES = [
("user", "사람"),
("assistant", "모델"),
]
# 이 글이 어느 대화방에 속하는지 가리킵니다.
# on_delete=models.CASCADE : 방을 지우면 그 방의 글도 함께 지웁니다.
# related_name="messages" : 방 쪽에서 conversation.messages 로 글 목록을 꺼내게 합니다.
conversation = models.ForeignKey(
Conversation,
on_delete=models.CASCADE,
related_name="messages",
)
# 사람이 쓴 글인지 모델이 쓴 글인지 구분합니다.
role = models.CharField(max_length=10, choices=ROLE_CHOICES)
# 글 내용. 길이 제한이 없는 칸입니다.
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
# 목록을 꺼낼 때 오래된 글이 위로 오도록 정렬합니다.
ordering = ["created_at"]
def __str__(self):
return f"[{self.role}] {self.content[:20]}"- 파일을 저장합니다.
ForeignKey는 다른 모델의 한 줄을 가리키는 항목입니다. 글 하나는 방 하나에 속하고, 방 하나에는 글이 여러 개 붙습니다. 이런 관계를 일대다 관계라고 부릅니다.
on_delete는 가리키던 대상이 지워졌을 때 어떻게 할지 정하는 항목이며, 반드시 적어야 합니다. CASCADE를 적으면 방을 지울 때 그 방의 글도 함께 지웁니다. 이 설정이 없으면 방을 지운 뒤 어디에도 속하지 않는 글이 데이터베이스에 그대로 쌓입니다.
role 칸에 choices를 준 이유는 값을 정해진 것으로 묶어 두기 위해서입니다. 이 항목이 없으면 같은 뜻을 user, User, human처럼 제각각 적게 되고, 나중에 화면에서 사람 글과 모델 글을 갈라 보일 때 조건이 늘어납니다.
2.3 – 마이그레이션으로 표 만들기
- 터미널에서 아래 명령을 입력합니다.
python manage.py makemigrations
- 설계도를 데이터베이스에 적용합니다.
python manage.py migrate
1번에서는 Migrations for 'chat':에 이어 0001_initial.py라는 파일 이름과 Create model Conversation, Create model Message가 나타납니다.
2번에서는 Applying으로 시작하는 줄이 지나가고 각 줄 끝에 OK가 붙으며, 폴더 안에 db.sqlite3 파일이 만들어집니다.

코드에 모델을 적는 것만으로는 데이터베이스에 표가 생기지 않습니다.
코드를 데이터베이스에 반영하는 단계를 따로 거쳐야 하며, 이 단계를 마이그레이션(migration)이라고 부릅니다.
makemigrations는 바뀐 곳을 찾아 설계도 파일로 적고, migrate가 그 설계도대로 표를 만듭니다. 1번만 하고 2번을 빠뜨리면 설계도만 있고 표는 없는 상태가 됩니다.
SQLite는 파일 하나로 동작하는 데이터베이스이며, Django가 기본으로 쓰도록 정해 둔 것입니다.
모델 코드를 고칠 때마다 두 명령을 다시 실행합니다. 앞으로 no such table 또는 no such column이라는 오류를 만나면, 대개 makemigrations만 하고 migrate를 실행하지 않은 경우입니다.
2.4 – 관리자 화면에서 데이터 넣어 보기
- 편집기로
chat/admin.py파일을 엽니다. - 파일 내용을 아래로 바꿉니다.
from django.contrib import admin
from .models import Conversation, Message
# 관리자 화면에 두 모델을 등록합니다.
admin.site.register(Conversation)
admin.site.register(Message)- 파일을 저장합니다.
- 관리자 화면에 들어갈 계정을 만듭니다.
python manage.py createsuperuser
- 아래 순서로 입력합니다. 비밀번호는 입력해도 화면에 글자가 나타나지 않습니다.
Username: admin
Email address: (비워 두고 Enter)
Password: 원하는 비밀번호
Password (again): 같은 비밀번호Superuser created successfully.가 나타나면 서버를 켭니다.
python manage.py runserver
- 브라우저에서
http://127.0.0.1:8000/admin/에 접속해 앞에서 만든 계정으로 로그인합니다. CHAT항목 아래의 [Conversations]를 클릭하고, 오른쪽 위 [ADD CONVERSATION]을 클릭합니다.Title칸에첫 번째 대화를 입력하고 [SAVE]를 클릭합니다.- 왼쪽 [Messages]를 클릭한 다음 [ADD MESSAGE]를 클릭합니다.
Conversation에서 방금 만든첫 번째 대화를 고르고,Role은사람,Content에는안녕하세요를 입력한 뒤 [SAVE]를 클릭합니다.
메시지 목록에 [user] 안녕하세요가 나타납니다. 이 표시는 앞에서 적은 __str__가 만든 것입니다.
Django에는 데이터를 직접 넣고 볼 수 있는 관리자 화면이 들어 있어, 화면을 따로 만들지 않고도 표가 제대로 만들어졌는지 확인할 수 있습니다. Conversation 칸에서 대화방을 고를 수 있었다는 것은 두 모델이 ForeignKey로 이어졌다는 뜻입니다.
비밀번호를 잊으면 관리자 화면에 들어갈 수 없습니다. python manage.py createsuperuser를 다시 실행해 다른 이름으로 계정을 만듭니다.
실습 코칭 프롬프트
이 부분을 혼자 해 보다 막히면 아래 프롬프트를 대화형 AI(ChatGPT·Claude·Gemini)에 붙여 넣어 한 단계씩 도움받습니다.
실습에 쓰던 대화창이 아니라 새 대화창에 붙여 넣습니다. 실습 대화창에는 앞서 시킨 다른 지시가 남아 있어, 그 위에 얹으면 답이 뒤섞입니다.
아래는 대화방과 메시지 모델 만들기 실습을 혼자 해 보다 막혀서 도움을 받으려는 요청입니다.
지금 하려는 것: Conversation 모델과 Message 모델을 만들어 ForeignKey로 잇고, 마이그레이션으로 데이터베이스에 표를 만드는 것입니다.
지금까지 한 것: {지금까지 한 것}
막힌 지점: {막힌 지점}
화면에 나온 메시지: {에러 메시지}
다음 규칙을 지켜 주세요.
- 정답 코드를 통째로 주지 마세요. 다음 한 단계만 알려 주세요.
- 먼저 왜 막혔는지 짚어 주고, 제가 직접 해 보게 하세요.
- 제가 해 본 결과를 말하면 그때 확인 질문을 던지고 다음 단계로 넘어가세요.
- 제가 놓치기 쉬운 부분이 보이면 마지막에 한 줄로 짚어 주세요.
- 모델 코드를 고친 뒤 makemigrations 와 migrate 를 모두 실행했는지 먼저 확인해 주세요.
아래는 대화방과 메시지 모델 만들기 실습을 혼자 해 보다 막혀서 도움을 받으려는 요청입니다.
지금 하려는 것: Conversation 모델과 Message 모델을 만들어 ForeignKey로 잇고, 마이그레이션으로 데이터베이스에 표를 만드는 것입니다.
지금까지 한 것: models.py 에 Conversation 과 Message 를 적고 makemigrations 를 실행했습니다
막힌 지점: 관리자 화면에서 Messages 를 누르면 오류가 납니다
화면에 나온 메시지: no such table: chat_message
다음 규칙을 지켜 주세요.
- 정답 코드를 통째로 주지 마세요. 다음 한 단계만 알려 주세요.
- 먼저 왜 막혔는지 짚어 주고, 제가 직접 해 보게 하세요.
- 제가 해 본 결과를 말하면 그때 확인 질문을 던지고 다음 단계로 넘어가세요.
- 제가 놓치기 쉬운 부분이 보이면 마지막에 한 줄로 짚어 주세요.
- 모델 코드를 고친 뒤 makemigrations 와 migrate 를 모두 실행했는지 먼저 확인해 주세요.
{지금까지 한 것}— 어느 단계까지 마쳤는지 적습니다. 예:django-admin startproject config . 까지 실행했습니다{막힌 지점}— 무엇을 하려다 안 됐는지 적습니다. 예:python manage.py runserver 를 실행하면 서버가 바로 꺼집니다{에러 메시지}— 화면에 나온 글을 그대로 붙여 넣습니다. 없으면없음이라고 적습니다.
AI가 고친 코드 전체를 한 번에 내놓으면 “코드 전체 말고 어느 줄을 왜 고쳐야 하는지 한 단계만 알려 주세요”라고 되물으십시오. 에러 메시지를 요약해 적으면 원인을 못 짚습니다. 화면에 나온 글을 그대로 붙여 넣습니다.