✅ 일주일 동안 한 일과 느낀 점
15주차(22~26일) 동안 장고(Django) 웹 프레임워크를 처음 접하며 풀스택 개발의 기초를 다졌다. 위키독스의 "점프 투 장고" 커리큘럼을 따라 01-02 파이썬 설치부터 03-15 파이보 추가기능까지 진행하며, URL 라우팅·모델·뷰·템플릿의 MVT 패턴과 ORM 기반 데이터베이스 조작, 사용자 인증·권한·페이징·검색까지 질문-답변 게시판 "파이보(Pybo)"의 핵심·확장 기능을 단계별로 구현했다. 특히 맥북 환경에서 데이터베이스 마이그레이션 및 템플릿 로딩 관련 이슈를 겪으며 장고의 설정·디렉토리 구조·앱 등록 메커니즘을 깊이 이해하게 됐고, 이전 LLM/RAG 프로젝트와 달리 즉각적인 UI 피드백이 있는 웹 개발의 재미를 체감한 주였다.
📌 9월 22일 - 장고 개발 환경 구축 및 기본 개념
🎓 01장 장고 개발 준비 (01-02 ~ 01-05)
파이썬 및 가상환경 설정: 파이썬 3.11 설치 확인, 가상환경 생성(python3 -m venv mysite_venv) 및 활성화로 프로젝트별 독립 패키지 관리 환경 구축. 장고 4.2 설치 후 django-admin startproject config . 명령으로 프로젝트 생성, manage.py runserver로 개발 서버 실행해 기본 로켓 페이지 확인. config/settings.py(프로젝트 설정), urls.py(URL 라우팅), manage.py(명령어 인터페이스)로 구성된 장고 프로젝트 구조 파악. VS Code 에디터 설정(Python 확장, 가상환경 인터프리터 지정, .gitignore 추가)으로 개발 환경 완성.
핵심 개념: 가상환경의 필요성(전역 파이썬 오염 방지), 장고 프로젝트와 앱의 차이, manage.py를 통한 명령어 실행 구조.
📌 9월 24일 - MVT 패턴과 데이터베이스 연동
🎓 02장 장고의 기본 요소 (02-01 ~ 02-04)
URL과 뷰 연결: python manage.py startapp pybo 명령으로 앱 생성 후, pybo/views.py에 index 함수 작성(HttpResponse 반환). pybo/urls.py에서 URL 패턴 정의, config/urls.py에 include('pybo.urls')로 연결해 /pybo/ 경로 접근 시 뷰 함수 실행 확인. 장고의 URL 디스패처 구조(메인 urls.py → 앱별 urls.py → 뷰 함수) 이해.
모델 정의 및 마이그레이션: pybo/models.py에 Question(제목·내용·작성일), Answer(질문 외래키·내용·작성일) 모델 클래스 작성. INSTALLED_APPS에 앱 등록 후 makemigrations, migrate 명령으로 SQLite DB 스키마 생성. ORM(Object-Relational Mapping) 개념 학습 - SQL 작성 없이 파이썬 객체로 데이터베이스 조작, ForeignKey로 1:N 관계 정의, on_delete=CASCADE로 연쇄 삭제 설정.
장고 관리자: createsuperuser로 슈퍼유저 생성, pybo/admin.py에 모델 등록 후 /admin/ 접속해 GUI로 질문 데이터 추가. 장고 내장 관리자 인터페이스의 강력함(CRUD 자동 생성) 체감.
조회와 템플릿: Question.objects.order_by('-create_date')로 질문 목록 조회, render() 함수로 컨텍스트 데이터를 템플릿에 전달. pybo/templates/pybo/question_list.html 생성, {% for %}, {{ }} 템플릿 문법으로 동적 HTML 렌더링. 템플릿 디렉토리 구조(앱/templates/앱/파일.html)와 APP_DIRS=True 설정의 중요성 인지.
📌 9월 25일 - 데이터베이스 오류 해결 및 기능 확장
🚨 트러블슈팅: 맥북 환경 데이터베이스 이슈
문제 상황: 모델 필드 추가 후 마이그레이션 실행 시 django.db.utils.OperationalError 발생, 기존 데이터에 대한 기본값 미제공 오류. 또한 템플릿 파일이 존재함에도 TemplateDoesNotExist 에러 반복 발생.
원인 분석:
- 데이터베이스: 이미 레코드가 있는 테이블에 NOT NULL 필드 추가 시, 기존 행에 들어갈 값 미지정
- 템플릿: 맥OS APFS 파일시스템의 대소문자 구분 불일치, templates 디렉토리명 오타, 앱 미등록으로 템플릿 로더 탐색 실패
해결 과정:
- 마이그레이션 충돌: python manage.py makemigrations 실행 시 기본값 입력 프롬프트에서 timezone.now 선택, 또는 모델 필드에 default=timezone.now 추가. 기존 데이터 삭제 후 migrate --run-syncdb로 DB 재동기화 시도.
- 템플릿 경로: pybo/templates/pybo/ 디렉토리 구조 재확인, 오타 수정. settings.py의 INSTALLED_APPS에 'pybo.apps.PyboConfig' 정확히 등록 확인, TEMPLATES의 APP_DIRS=True 설정 검증.
- 캐시 제거: __pycache__, *.pyc 파일 삭제 후 서버 재시작.
학습 포인트: 장고 마이그레이션의 상태 관리 메커니즘(변경 추적·기본값·제약조건 처리), 템플릿 로더가 APP_DIRS 설정으로 각 앱의 templates 하위를 순회하는 원리, 앱 등록의 중요성.
🎓 학습 내용 계속 (02-05 ~ 02-06)
URL 별칭과 네임스페이스: pybo/urls.py에 app_name = 'pybo' 설정, 각 URL 패턴에 name 속성 부여. 템플릿에서 {% url 'pybo:detail' question.id %}로 URL 하드코딩 제거, URL 패턴 변경 시 템플릿 수정 불필요한 유지보수성 확보.
데이터 저장 및 폼 처리: POST 방식 폼에서 {% csrf_token %} 추가, request.POST.get('content')로 입력값 추출. question.answer_set.create()로 답변 생성, timezone.now()로 작성 시각 기록. get_object_or_404()로 존재하지 않는 객체 접근 시 404 자동 반환, redirect()로 답변 등록 후 상세 페이지 이동.
📌 9월 26일 - 스타일링, 인증, 고급 기능
🎓 02장 후반 ~ 03장 파이보 고도화 (02-07장 ~ 03-15장)
스태틱 파일 및 부트스트랩: pybo/static/pybo/style.css 생성, {% load static %}, {% static %} 태그로 템플릿에 CSS 로드. 부트스트랩 CDN 추가, container, table, btn 클래스로 반응형 디자인 적용.
템플릿 상속: base.html에 공통 레이아웃(헤더·푸터·네비게이션) 정의, 자식 템플릿에서 {% extends 'base.html' %}, {% block content %}로 중복 코드 제거.
장고 폼: forms.py에 QuestionForm, AnswerForm 클래스 작성. is_valid()로 유효성 검증, cleaned_data로 정제된 데이터 접근. GET 요청 시 빈 폼 표시, POST 요청 시 데이터 처리 및 저장 패턴 학습.
페이징: Paginator 객체로 질문 목록을 페이지 단위로 분할, 템플릿에서 page_obj.has_previous, page_obj.number 등으로 페이지 네비게이션 구현.
사용자 인증: django.contrib.auth 모듈 활용, UserCreationForm 확장해 회원가입 뷰 작성. LoginView, LogoutView로 로그인·로그아웃 구현, @login_required 데코레이터로 로그인 필수 뷰 보호. 모델에 author = ForeignKey(User) 필드 추가, 마이그레이션 시 기존 데이터 처리(기본 사용자 지정).
권한 및 수정·삭제: 질문·답변 작성자 본인만 수정·삭제 가능하도록 request.user == question.author 조건 체크. 템플릿에서 {% if request.user == question.author %} 분기로 버튼 노출 제어.
추천 기능: ManyToManyField로 voter 필드 추가, 한 사용자가 여러 질문·답변 추천 가능, 한 질문·답변이 여러 사용자에게 추천받는 다대다 관계 구현.
검색 및 정렬: Q 객체로 제목(subject__icontains) 또는 내용(content__icontains) 검색 조건 조합. 조회수 필드 추가, 정렬 기준(최신순·추천순·조회순) 선택 기능 구현.
뷰 파일 분리: views.py를 base_views.py(목록·상세), question_views.py(질문 CRUD), answer_views.py(답변 CRUD)로 모듈화, 관심사 분리로 코드 가독성·유지보수성 향상.
마크다운: django-markdown 또는 markdown 라이브러리 설치, 템플릿 필터로 마크다운 텍스트를 HTML로 변환해 렌더링.
✅ 성과 및 지표
- 기능 구현 완료도: 질문-답변 게시판 핵심 기능(CRUD·인증·권한) 100% 구현, 페이징·검색·추천·마크다운·조회수·정렬 등 15개 확장 기능 추가
- MVT 패턴 이해도: URL-뷰-템플릿-모델의 데이터 흐름과 역할 분리 체득, 각 계층 간 인터페이스(컨텍스트 딕셔너리·템플릿 변수·ORM 쿼리셋) 활용 숙련
- ORM 활용: filter(), order_by(), Q 객체, ForeignKey, ManyToManyField 등으로 복잡한 쿼리·관계 설정 가능, SQL 작성 없이 파이썬 코드만으로 데이터베이스 조작
- 코드 품질: URL 별칭·템플릿 상속·뷰 모듈화로 중복 최소화, 유지보수 용이한 구조 설계
- 트러블슈팅 역량: 맥북 환경의 파일시스템·설정 차이로 인한 이슈를 독립적으로 해결하며 장고 내부 메커니즘(템플릿 로더·마이그레이션 상태 관리·앱 등록 흐름) 이해 심화
✅ 아쉬웠던 점 & 개선 포인트
- 마이그레이션 관리 미흡: 모델 필드 추가·삭제 시 기존 데이터 영향 고려 부족, default 값 사전 설정·더미 데이터 분리·마이그레이션 히스토리 검토 루틴 필요. 충돌 발생 시 --fake, --merge 옵션 학습 및 백업 전략 수립 요구.
- 템플릿 디버깅 시간 소요: 오타·경로 오류로 약 3시간 지연, 템플릿 로더의 탐색 순서(앱별 templates → DIRS 설정)와 INSTALLED_APPS 등록 시점 점검 체크리스트 작성 필요.
- 폼 유효성 검증 단순화: 기본 필드 타입 검증만 사용, 커스텀 clean() 메서드·validators 파라미터 활용한 비즈니스 로직 검증(중복 확인·길이 제한·금지어 필터링) 미구현.
- 테스트 코드 부재: 수동 테스트로만 검증, TestCase 클래스 활용한 유닛·통합 테스트 도입 시 회귀 방지·리팩토링 안정성 확보 가능.
- 보안 심화 부족: CSRF 보호 외 XSS(템플릿 이스케이프 검증), SQL Injection(ORM 안전성 재확인), 세션 관리(타임아웃·쿠키 설정) 점검 필요.
- 성능 최적화 미고려: select_related(), prefetch_related()로 N+1 쿼리 문제 해결, 인덱스 설계, 쿼리 프로파일링(django-debug-toolbar) 도입 여지.
✅ 마무리
이번 주는 "점프 투 장고"를 따라 풀스택 웹 개발의 전체 사이클(환경 구축 → 모델 설계 → URL 라우팅 → 뷰 로직 → 템플릿 렌더링 → 인증·권한 → 확장 기능)을 처음부터 끝까지 경험하며, 이전 LLM/RAG 프로젝트와 달리 내가 만든 기능이 바로 브라우저에 나타나는 즉각적 피드백의 재미를 느낀 시간이었다. 맥북 환경의 마이그레이션·템플릿 로딩 이슈는 답답했지만, 결국 장고의 설정 계층·디렉토리 규칙·앱 등록 메커니즘을 더 깊이 이해하는 계기가 됐다. 지금까지 진행한 수업 중 가장 흥미로웠던 과정으로, URL-뷰-템플릿-모델의 명확한 역할 분리와 ORM의 직관적인 데이터 조작이 인상 깊었다. 다음 주에는 아래를 실행할 예정:
- 장고 심화: 클래스 기반 뷰(CBV) 학습, Django REST Framework로 API 엔드포인트 추가, 비동기 뷰(Async Views) 실험.
- 성능·보안: select_related()/prefetch_related()로 N+1 쿼리 해결, 인덱스 설계, django-debug-toolbar로 쿼리 프로파일링. XSS·세션 관리 점검, django-ratelimit로 API 호출 제한.
'SK네트웍스 Family AI캠프 16기' 카테고리의 다른 글
| [플레이데이터 SK네트웍스 Family AI캠프 16기] 17주차 회고 (0) | 2025.10.21 |
|---|---|
| [플레이데이터 SK네트웍스 Family AI캠프 16기] 16주차 회고 (0) | 2025.10.09 |
| [플레이데이터 SK네트웍스 Family AI캠프 16기] 14주차 회고 (1) | 2025.09.22 |
| [플레이데이터 SK네트웍스 Family AI캠프 16기] 13주차 회고 (0) | 2025.09.15 |
| [플레이데이터 SK네트웍스 Family AI캠프 16기] 12주차 회고 (0) | 2025.09.08 |