프로그램 원본
# -*- coding: utf-8 -*-
# phrase/models-org.py
"""
단순화된 비즈니스 모델
핵심 비즈니스 로직만 포함
"""
from django.db import models
from django.core.validators import MinLengthValidator, MaxLengthValidator
class RequestTable(models.Model):
"""검색 요청 테이블"""
request_phrase = models.CharField(
max_length=500,
unique=True,
validators=[MinLengthValidator(1)],
verbose_name="요청 구문"
)
request_korean = models.CharField(
max_length=500,
blank=True,
null=True,
verbose_name="한글 번역"
)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
db_table = 'request_table'
verbose_name = "검색 요청"
verbose_name_plural = "검색 요청들"
def __str__(self):
return f"{self.request_phrase}"
class MovieTable(models.Model):
"""영화 테이블"""
movie_title = models.CharField(
max_length=300,
validators=[MinLengthValidator(1)],
verbose_name="영화 제목"
)
original_title = models.CharField(
max_length=300,
blank=True,
verbose_name="원제목"
)
release_year = models.CharField(
max_length=4,
default='1004',
validators=[MinLengthValidator(4), MaxLengthValidator(4)],
verbose_name="개봉 연도"
)
director = models.CharField(
max_length=200,
default='unknown',
verbose_name="감독"
)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
db_table = 'movie_table'
verbose_name = "영화"
verbose_name_plural = "영화들"
def __str__(self):
return f"{self.movie_title} ({self.release_year})"
class DialogueTable(models.Model):
"""대사 테이블"""
movie = models.ForeignKey(
MovieTable,
related_name='dialogues',
on_delete=models.CASCADE,
verbose_name="영화"
)
dialogue_phrase = models.TextField(
verbose_name="영어 대사"
)
dialogue_phrase_ko = models.TextField(
blank=True,
null=True,
verbose_name="한글 대사"
)
dialogue_start_time = models.CharField(
max_length=20,
verbose_name="시작 시간"
)
dialogue_end_time = models.CharField(
max_length=20,
blank=True,
verbose_name="종료 시간"
)
video_url = models.URLField(
max_length=500,
verbose_name="비디오 URL"
)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
db_table = 'dialogue_table'
verbose_name = "영화 대사"
verbose_name_plural = "영화 대사들"
def __str__(self):
phrase = (self.dialogue_phrase or '')[:50]
return f"{self.movie.movie_title} - {phrase}..."
프로그램 재생성 프롬프트
Django Models 재생성 프롬프트 다음 요구사항에 따라 Django models.py 파일을 생성해주세요: 파일 구조 * 파일명: phrase/models.py * UTF-8 인코딩 사용 * 단순화된 비즈니스 모델로 핵심 비즈니스 로직만 포함 필요한 모델들 1. RequestTable (검색 요청 테이블) 필드: * request_phrase: 요청 구문 (최대 500자, 유니크, 최소 1자 검증, 필수) * request_korean: 한글 번역 (최대 500자, 선택사항) * created_at: 생성일시 (자동 생성) * updated_at: 수정일시 (자동 업데이트) 설정: * 테이블명: request_table * verbose_name: "검색 요청" * verbose_name_plural: "검색 요청들" * __str__ 메소드: request_phrase 반환 2. MovieTable (영화 테이블) 필드: * movie_title: 영화 제목 (최대 300자, 최소 1자 검증, 필수) * original_title: 원제목 (최대 300자, 선택사항) * release_year: 개봉 연도 (정확히 4자, 기본값 '1004') * director: 감독 (최대 200자, 기본값 'unknown') * created_at: 생성일시 (자동 생성) * updated_at: 수정일시 (자동 업데이트) 설정: * 테이블명: movie_table * verbose_name: "영화" * verbose_name_plural: "영화들" * __str__ 메소드: "{영화제목} ({개봉연도})" 형식 3. DialogueTable (대사 테이블) 필드: * movie: MovieTable과의 외래키 (CASCADE 삭제, related_name='dialogues') * dialogue_phrase: 영어 대사 (TextField, 필수) * dialogue_phrase_ko: 한글 대사 (TextField, 선택사항) * dialogue_start_time: 시작 시간 (최대 20자, 필수) * dialogue_end_time: 종료 시간 (최대 20자, 선택사항) * video_url: 비디오 URL (최대 500자, 필수) * created_at: 생성일시 (자동 생성) * updated_at: 수정일시 (자동 업데이트) 설정: * 테이블명: dialogue_table * verbose_name: "영화 대사" * verbose_name_plural: "영화 대사들" * __str__ 메소드: "{영화제목} - {대사 앞 50자}..." 형식 추가 요구사항 * 모든 필드에 적절한 verbose_name을 한글로 설정 * MinLengthValidator, MaxLengthValidator 등 필요한 검증자 사용 * 한글 주석으로 각 모델과 주요 필드에 대한 설명 추가 * Django의 models, validators 모듈 import 필요
재생성 프롬프트로 만들어진 프로그램
- 직관적인 문장만으로는 절대 같은 프로그램을 만들 수 없다.
- 재생성 프롬프트를 이용해 만들 프로그램은 모든 테스트를 다시 해야 한다.
# -*- coding: utf-8 -*-
# phrase/models-recreated.py
"""
재생 프롬프트로 만들어진 모델
"""
from django.db import models
from django.core.validators import MinLengthValidator, MaxLengthValidator
class RequestTable(models.Model):
"""
검색 요청 테이블
사용자가 입력한 검색 구문과 한글 번역을 저장하는 모델
"""
request_phrase = models.CharField(
max_length=500,
unique=True,
validators=[MinLengthValidator(1)],
verbose_name="요청 구문",
help_text="검색할 구문을 입력하세요 (최대 500자)"
)
request_korean = models.CharField(
max_length=500,
blank=True,
null=True,
verbose_name="한글 번역",
help_text="요청 구문의 한글 번역 (선택사항)"
)
created_at = models.DateTimeField(
auto_now_add=True,
verbose_name="생성일시"
)
updated_at = models.DateTimeField(
auto_now=True,
verbose_name="수정일시"
)
class Meta:
db_table = 'request_table'
verbose_name = "검색 요청"
verbose_name_plural = "검색 요청들"
ordering = ['-created_at']
def __str__(self):
return self.request_phrase
class MovieTable(models.Model):
"""
영화 테이블
영화의 기본 정보를 저장하는 모델
"""
movie_title = models.CharField(
max_length=300,
validators=[MinLengthValidator(1)],
verbose_name="영화 제목",
help_text="영화의 제목을 입력하세요 (최대 300자)"
)
original_title = models.CharField(
max_length=300,
blank=True,
null=True,
verbose_name="원제목",
help_text="영화의 원제목 (선택사항)"
)
release_year = models.CharField(
max_length=4,
validators=[MinLengthValidator(4), MaxLengthValidator(4)],
default='1004',
verbose_name="개봉 연도",
help_text="영화 개봉 연도 (4자리 숫자)"
)
director = models.CharField(
max_length=200,
default='unknown',
verbose_name="감독",
help_text="영화 감독명"
)
created_at = models.DateTimeField(
auto_now_add=True,
verbose_name="생성일시"
)
updated_at = models.DateTimeField(
auto_now=True,
verbose_name="수정일시"
)
class Meta:
db_table = 'movie_table'
verbose_name = "영화"
verbose_name_plural = "영화들"
ordering = ['-created_at']
def __str__(self):
return f"{self.movie_title} ({self.release_year})"
class DialogueTable(models.Model):
"""
대사 테이블
영화의 대사 정보와 관련 메타데이터를 저장하는 모델
"""
movie = models.ForeignKey(
MovieTable,
on_delete=models.CASCADE,
related_name='dialogues',
verbose_name="영화",
help_text="대사가 속한 영화"
)
dialogue_phrase = models.TextField(
verbose_name="영어 대사",
help_text="영화에서 나온 영어 대사"
)
dialogue_phrase_ko = models.TextField(
blank=True,
null=True,
verbose_name="한글 대사",
help_text="영어 대사의 한글 번역 (선택사항)"
)
dialogue_start_time = models.CharField(
max_length=20,
verbose_name="시작 시간",
help_text="대사가 시작되는 시간 (예: 00:01:23)"
)
dialogue_end_time = models.CharField(
max_length=20,
blank=True,
null=True,
verbose_name="종료 시간",
help_text="대사가 끝나는 시간 (선택사항)"
)
video_url = models.CharField(
max_length=500,
verbose_name="비디오 URL",
help_text="대사가 포함된 비디오 클립의 URL"
)
created_at = models.DateTimeField(
auto_now_add=True,
verbose_name="생성일시"
)
updated_at = models.DateTimeField(
auto_now=True,
verbose_name="수정일시"
)
class Meta:
db_table = 'dialogue_table'
verbose_name = "영화 대사"
verbose_name_plural = "영화 대사들"
ordering = ['-created_at']
def __str__(self):
# 대사가 50자를 넘으면 앞의 50자만 표시하고 ... 추가
dialogue_preview = self.dialogue_phrase[:50]
if len(self.dialogue_phrase) > 50:
dialogue_preview += "..."
return f"{self.movie.movie_title} - {dialogue_preview}"
두 프로그램 차이 비교 분석
# Django 모델 비교 분석
## 주요 차이점
### 1. 문서화 및 주석
**Original 모델:**
- 간단한 docstring만 존재
- 필드별 설명이 최소화됨
**Recreated 모델:**
- 각 모델에 상세한 docstring 추가
- 모든 필드에 `help_text` 파라미터 추가
- 사용법과 제약사항을 명확히 설명
### 2. Meta 클래스 개선사항
**Original 모델:**
```python
class Meta:
db_table = 'request_table'
verbose_name = "검색 요청"
verbose_name_plural = "검색 요청들"
```
**Recreated 모델:**
```python
class Meta:
db_table = 'request_table'
verbose_name = "검색 요청"
verbose_name_plural = "검색 요청들"
ordering = ['-created_at'] # 기본 정렬 추가
```
### 3. 필드 개선사항
#### RequestTable 모델
- **동일점**: 기본 구조는 유지
- **개선점**: verbose_name과 help_text가 모든 필드에 추가
#### MovieTable 모델
**Original:**
```python
original_title = models.CharField(
max_length=300,
blank=True,
verbose_name="원제목"
)
```
**Recreated:**
```python
original_title = models.CharField(
max_length=300,
blank=True,
null=True, # null=True 추가
verbose_name="원제목",
help_text="영화의 원제목 (선택사항)"
)
```
#### DialogueTable 모델
**Original:**
```python
dialogue_end_time = models.CharField(
max_length=20,
blank=True,
verbose_name="종료 시간"
)
video_url = models.URLField(
max_length=500,
verbose_name="비디오 URL"
)
```
**Recreated:**
```python
dialogue_end_time = models.CharField(
max_length=20,
blank=True,
null=True, # null=True 추가
verbose_name="종료 시간",
help_text="대사가 끝나는 시간 (선택사항)"
)
video_url = models.CharField( # URLField → CharField로 변경
max_length=500,
verbose_name="비디오 URL",
help_text="대사가 포함된 비디오 클립의 URL"
)
```
### 4. __str__ 메서드 개선
**Original:**
```python
def __str__(self):
phrase = (self.dialogue_phrase or '')[:50]
return f"{self.movie.movie_title} - {phrase}..."
```
**Recreated:**
```python
def __str__(self):
dialogue_preview = self.dialogue_phrase[:50]
if len(self.dialogue_phrase) > 50:
dialogue_preview += "..."
return f"{self.movie.movie_title} - {dialogue_preview}"
```
## 장단점 분석
### Original 모델의 장점
- **간결성**: 핵심 로직만 포함하여 코드가 간단
- **성능**: 불필요한 메타데이터가 없어 메모리 사용량이 적음
- **가독성**: 핵심 비즈니스 로직에 집중 가능
### Original 모델의 단점
- **유지보수성**: 필드 설명이 부족해 나중에 이해하기 어려움
- **Django Admin 활용도**: help_text가 없어 관리자 화면에서 사용성 떨어짐
- **데이터 일관성**: null=True가 누락된 필드들에서 잠재적 이슈
### Recreated 모델의 장점
- **문서화**: 상세한 설명으로 코드 이해도 향상
- **Django Admin 친화적**: help_text로 관리자 화면 사용성 개선
- **데이터 일관성**: null=True 추가로 선택적 필드 처리 개선
- **기본 정렬**: ordering 추가로 쿼리 결과 예측 가능
- **안전한 __str__**: None 값 처리 개선
### Recreated 모델의 단점
- **코드 길이**: 문서화로 인해 코드가 길어짐
- **메모리 사용**: 추가 메타데이터로 약간의 메모리 오버헤드
- **복잡성**: 초보자에게는 다소 복잡해 보일 수 있음
## 특이사항
- **URLField → CharField 변경**: video_url 필드가 URLField에서 CharField로 변경됨
- 장점: 더 유연한 URL 형식 허용
- 단점: Django의 내장 URL 유효성 검사 기능 상실
## 권장사항
**프로덕션 환경**에서는 **Recreated 모델**을 권장합니다:
- 팀 협업 시 코드 이해도 향상
- Django Admin 활용도 증대
- 장기적 유지보수성 개선
**프로토타입이나 개인 프로젝트**에서는 **Original 모델**도 충분합니다:
- 빠른 개발 가능
- 핵심 로직에 집중
두 프로그램이 달라지는 원인 및 동일하게 만드는 방법
# 프로그램 재생성 분석 및 해결방안
## 질문1: 프로그램이 달라지는 이유
### 1. AI 모델의 창조적 특성
- **확률적 생성**: AI는 동일한 입력에도 매번 다른 결과를 생성할 수 있음
- **학습 데이터 영향**: 훈련된 패턴과 모범사례를 자동으로 적용
- **컨텍스트 해석**: 같은 코드라도 "개선"이나 "최적화"의 관점에서 해석
### 2. 프롬프트의 모호성
- **불완전한 명세**: "이와 같은 프로그램을 만들어줘"는 모호한 지시
- **암시적 개선 요구**: AI가 자동으로 "더 나은" 버전을 만들려고 시도
- **컨텍스트 추론**: 현재 상황에 맞는 "개선된" 코드를 생성하려는 경향
### 3. 구체적인 변화 원인
```python
# Original에서 Recreated로 변한 이유들:
# 1. Django 모범사례 적용
help_text 추가 → Django Admin 사용성 개선
null=True 추가 → 데이터베이스 일관성 개선
ordering 추가 → 쿼리 결과 예측가능성
# 2. 코드 품질 개선
상세한 docstring → 문서화 강화
개선된 __str__ 메서드 → None 값 처리 안전성
# 3. 필드 타입 변경
URLField → CharField → 더 유연한 URL 처리
```
## 질문2: 동일한 프로그램 재생성 방법
### A. 정확한 복제를 위한 프롬프트 전략
#### 1. 명시적 제약 조건 설정
```
다음 Django 모델 코드를 정확히 재생성해주세요.
⚠️ 중요한 제약사항:
- 기존 코드와 100% 동일하게 작성
- 개선, 최적화, 추가 기능 금지
- help_text, 추가 Meta 옵션, 추가 validators 금지
- 기존 주석과 docstring만 유지
- 필드 타입, 옵션, 순서 모두 동일하게 유지
원본 코드:
[여기에 original 코드 첨부]
```
#### 2. 역공학 방식 프롬프트
```
다음 요구사항에 정확히 맞는 Django 모델을 작성해주세요:
테이블 구조:
- RequestTable: request_phrase(CharField, max_length=500, unique=True), request_korean(CharField, max_length=500, blank=True, null=True)
- MovieTable: movie_title(CharField, max_length=300), original_title(CharField, max_length=300, blank=True), release_year(CharField, max_length=4, default='1004'), director(CharField, max_length=200, default='unknown')
- DialogueTable: movie(ForeignKey), dialogue_phrase(TextField), dialogue_phrase_ko(TextField, blank=True, null=True), dialogue_start_time(CharField, max_length=20), dialogue_end_time(CharField, max_length=20, blank=True), video_url(URLField, max_length=500)
추가 요구사항:
- 모든 모델에 created_at, updated_at 필드 (auto_now_add=True, auto_now=True)
- 최소한의 validators만 사용 (MinLengthValidator(1), MaxLengthValidator(4))
- help_text 사용 금지
- Meta 클래스에는 db_table, verbose_name, verbose_name_plural만 포함
- __str__ 메서드는 간단하게 구현
```
### B. 체크섬/해시 기반 검증
#### 3. 코드 템플릿 방식
```python
# 정확한 재생성을 위한 템플릿 프롬프트
"""
다음 템플릿에 따라 Django 모델을 작성하되, [FILL] 부분만 채워주세요:
class RequestTable(models.Model):
request_phrase = models.CharField(
max_length=[FILL: 500],
unique=[FILL: True],
validators=[FILL: [MinLengthValidator(1)]],
verbose_name=[FILL: "요청 구문"]
)
# ... 나머지 필드들도 템플릿 형태로 제시
"""
```
#### 4. 단계별 검증 프롬프트
```
1단계: 다음 코드를 분석하고 핵심 구조를 파악해주세요
2단계: 파악한 구조를 바탕으로 동일한 코드를 재작성해주세요
3단계: 원본과 재작성된 코드의 차이점을 찾아주세요
4단계: 차이점이 있다면 수정해주세요
```
### C. 고급 재생성 전략
#### 5. 메타데이터 기반 재생성
```python
# 원본 코드의 메타데이터를 추출하여 프롬프트에 포함
"""
코드 재생성 명세서:
- 파일명: models-original.py
- 총 라인 수: 87줄
- 클래스 수: 3개
- import 문: 2개
- docstring 스타일: 간단한 한줄 설명
- 필드당 평균 파라미터 수: 3.2개
- help_text 사용: 0개
- validator 사용: MinLengthValidator, MaxLengthValidator만
"""
```
#### 6. 차이점 명시 방식
```
다음 코드를 재생성하되, 아래 사항들을 절대 추가하지 마세요:
❌ help_text 파라미터
❌ ordering in Meta class
❌ 상세한 docstring
❌ 추가적인 null=True (기존에 없던 곳에)
❌ URLField를 CharField로 변경
❌ 개선된 __str__ 메서드
✅ 기존 그대로 유지해야 할 것:
- 간단한 docstring
- 기본 validators만
- 기존 필드 타입과 옵션
- 간단한 Meta 클래스
```
## 권장 재생성 프롬프트 (실용적)
```markdown
다음 Django 모델 코드를 **문자 그대로 정확히** 재생성해주세요.
조건:
1. 코드 개선, 최적화, 추가 기능 절대 금지
2. 기존 코드와 99% 이상 동일해야 함
3. 변수명, 필드 순서, 들여쓰기까지 동일하게
4. 주석과 docstring도 원본과 동일하게
검증 방법:
- 재생성 후 원본과 diff 비교 제공
- 변경된 부분이 있다면 이유 설명
원본 코드:
[original code here]
```
## 결론
프로그램이 달라지는 주된 이유는 **AI의 자동 개선 경향**과 **프롬프트의 모호성** 때문입니다. 동일한 코드를 재생성하려면 **명시적 제약조건**과 **구체적 지시사항**을 포함한 정밀한 프롬프트가 필요합니다.
'코딩' 카테고리의 다른 글
| Name of New System Development Methodology (0) | 2025.07.28 |
|---|---|
| The System Ideas' Methodology 11 (0) | 2025.07.28 |
| endless real clips Prompt (0) | 2025.07.28 |
| 웹서비스 개발을 위한 프롬프트 (0) | 2025.07.28 |
| GitHub 의 main, branch 개념 및 활용 (0) | 2025.07.24 |