728x90
SMALL
- 오늘은 e-learning 플랫폼을 Django로 구축하면서 알아두면 유용할 주요 개념들을 정리해보겠습니다.
💎 e-learning 플랫폼 구축을 위한 8가지 핵심 개념
🔑 1. CMS(Content Management System)
- CMS는 콘텐츠를 쉽고 효율적으로 관리할 수 있게 해주는 시스템을 말해요.
💡 주요 역할
- 강의 자료, 공지사항, 사용자 관리 등 e-learning 플랫폼의 '콘텐츠'를 통합 관리
- 비개발자(강사, 운영자)가 UI를 통해 손쉽게 추가/수정/삭제 가능
💡 실제 사례
- 강의 PDF, 동영상 업로드 및 버전 관리
- 수강생 리뷰/댓글 관리
- 배너, 이벤트 페이지 등 자유 게시판 기능
django CMS - Enterprise Content Management with Django - django CMS
www.django-cms.org
👉 Django 기반이라면 Django CMS 또는 직접 만든 Admin을 활용해 볼 수 있어요.
🧩 2. 모델의 픽스처(fixtures)
- 픽스처(fixtures)는 '테스트'나 '첫 배포 시 데이터 시딩(Data seeding)'을 위해 미리 정의해 둔 샘플 데이터셋이에요.
💡 언제 쓸까요?
- 자동화된 테스트
- 같은 초기 상태에서 테스트를 반복 실행
- 예를 들어 게시글 수정 기능 테스트 전, 미리 10개의 게시글 로드하는 경우
- 초기 운영 데이터 로딩
- 관리자 계정, 카테고리 목록, 기본 설정값 등 필수 데이터 자동 삽입
💡 장점
- 일관성 있는 데이터 상태 보장
- 수동 입력 없이 빠른 개발과 테스트 환경 구성
- Git으로 형상 관리 가능
💡 파일 형식
- YAML, JSON, XML 등으로 작성
python manage.py loaddata fixtures/initial_data.json
🔄 3. 다형성 콘텐츠 (Polymorphic Content)
- '다형성'이란 하나의 인터페이스로 다양한 형태의 객체를 다루는 것을 뜻해요.
💡 DB 설계 관점
- 댓글(Comment)이 게시글(Post)에도, 사진(Photo)에도 달릴 수 있을 때
- commentable_type + commentable_id 두 컬럼으로 연결 부모 구분
💡 다양한 포맷 제공
- 하나의 기사에서 웹, PDF, 오디오를 제공하는 것처럼 !
- 또는 동일 데이터를 표, 그래프, 지도 등으로 시각화할 때처럼 !
💡 반응형 콘텐츠
- 화면 크기/테마/언어에 따라 레이아웃과 스타일이 자동 변경
🔌 4. 믹스인(Mixin)
- Django의 클래스 기반 뷰(CBV)에서 흔히 쓰는 패턴이에요.
- 문제: 여러 뷰(View)에 중복되는 로직(인증, 권한 검사, 로깅 등)을 매번 복붙하기
- 해결: 기능 단위로 작은 클래스를 만들어, 뷰에서 다중 상속으로 재사용
class LoginRequiredMixin:
def dispatch(self, request, *args, **kwargs):
if not request.user.is_authenticated:
return redirect('login')
return super().dispatch(request, *args, **kwargs)
class MyView(LoginRequiredMixin, DetailView):
model = Course
template_name = 'course/detail.html'
💡 장점
- 코드 중복 ↓, 재사용 ↑
- 기능별 모듈화로 가독성/유지보수성 ↑
⚡ 5. Memcached
- 고성능 분산 인메모리 캐시 시스템이에요.
- 캐싱을 하는 이유는 DB 쿼리나 무거운 API 호출 결과를 메모리에 저장해 두고 같은 요청이 들어오면 빠르게 응답하기 위해서 입니다.
- 강의 목록 페이지를 캐싱하거나 인기 강의 통계 데이터를 캐싱하는 등에 사용합니다.
💡 특징
- 키-값 형태, 메모리 상 저장 → 읽기/쓰기 속도 상승
- 영속성 없음(서버 재시작 시 데이터 증발)
- LRU(Least Recently Used) 정책으로 오래된 데이터 자동 삭제
- Django에서는 요렇게 사용합니다.
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': ['127.0.0.1:11211'], } }
🌐 6. RESTful API
- 웹 서비스를 리소스(Resource) 중심으로 설계하는 아키텍처 스타일이에요.
💡 핵심 제약 조건 6가지
- Client-Server: 클라이언트와 서버 역할 분리
- Stateless: 요청 간 서버에 상태 저장 금지
- Cacheable: 응답 캐시 가능 여부 명시
- Uniform Interface: 일관된 URI와 메서드 사용
- Layered System: 중간 계층(프록시, 로드밸런서) 허용
- Code on Demand(선택): JS 등 코드 전송 가능
💡 HTTP 메서드 활용
- GET /courses/ → 강의 목록 조회
- POST /courses/ → 새 강의 생성
- PUT /courses/123/ → 강의 전체 수정
- PATCH /courses/123/ → 강의 일부 수정
- DELETE /courses/123/ → 강의 삭제
📺 7. Django Channels
- Django에 웹소켓, 비동기 프로토콜을 추가해 주는 확장입니다.
- 비동기 서버 인터페이스로 불리는 ASGI 기반 구조입니다.
💡 주요 구성
- Consumer: 뷰(View)처럼 이벤트(웹소켓 메시지 등) 처리
- Channel Layer: 인스턴스 간 메시지 브로커(Redis 등)
- Routing: URL마다 어떤 Consumer를 쓸지 매핑
💡 실시간 예시
- 사용자 A가 채팅방에 접속 → connect() 호출
- 메시지 발송 → receive()에서 처리 후, 그룹 브로드캐스트
- 다른 사용자들 receive()로 메시지 수신
🔗 8. 웹소켓(WebSocket)
- HTTP의 요청-응답 한계를 넘어서는 양방향/지속 연결 프로토콜입니다.
💡 특징
- Full-Duplex: 클라이언트 ↔ 서버 자유 통신
- Persistent Connection: 명시적 종료 전까지 연결 유지
- 낮은 오버헤드: 핸드셰이크 후엔 간단한 프레임만 주고받음
💡 핸드셰이크 과정
- HTTP로 Upgrade: websocket 요청
- 서버 수락 후 프로토콜 전환
- 이후 TCP 연결로 메시지 주고받기
📚 부록: 주요 네트워킹 용어
- 폴링(Polling): 일정 주기로 서버에 "새 데이터가 있나요?"라는 질문을 요청
- 오버헤드(Overhead): 실제 작업 외에 드는 부가 비용
- 핸드셰이크(Handshake): 통신 초기 설정 과정 (3-way TCP, SSL/TLS 등)
🤔 67일차 회고
- 오늘은 Django 기반 e-learning 플랫폼 설계에 꼭 필요한 8가지 핵심 개념을 차례로 정리해보았습니다.
- CMS를 통해 비개발자도 강의나 콘텐츠를 손쉽게 관리하는 방법을 이해했고,
- 픽스처(fixtures)로 개발/테스트 초기 상태를 일관되게 세팅하는 중요성을 체감했고,
- 다형성 콘텐츠 설계를 통해 댓글이나 자료가 여러 모델에 유연하게 연결되는 구조를 떠올릴 수 있었습니다.
- Mixin을 활용하면 CBV에서 중복 로직을 깔끔히 재사용할 수 있음을 확인했고,
- Memcached 캐시 설정으로 빈번한 DB 조회를 줄여 성능을 향상시키는 팁도 얻게 되었습니다.
- RESTful API의 6대 제약 조건을 정리하며 리소스 중심 설계의 일관성과 확장성을 머리에 새겼고,
- Django Channels를 통해 웹소켓 환경에서 비동기/실시간 기능을 어떻게 구성할지 구체적으로 그려보았으며,
- 마지막으로 WebSocket 핸드셰이크와 Full-Duplex 통신 방식을 떠올리며 실시간 알림이나 채팅 서버 설계에 대한 감을 잡았습니다.
- 위처럼 각각의 개념을 하나하나 연결해 보니, 단순 지식 정리를 넘어 "내가 만든 플랫폼이 어떤 구조 위에서 어떻게 동작할까?"를 머릿속에 선명하게 그릴 수 있게 되었습니다 !
728x90
LIST
'부트캠프 > LG U+' 카테고리의 다른 글
🤔 드쟝고라고 했었던 Django에 관하여 (0) | 2025.04.29 |
---|---|
🤔 해도 해도 끝이 없는 AWS (0) | 2025.04.18 |
🤔 Flask를 어떻게 배포할까? (0) | 2025.04.07 |
🤔 Flask에 스타일 입혀주기 (1) | 2025.04.01 |
🤔 이게 Flask였던가... (0) | 2025.03.31 |