
Python


Project Amelia2는 내부 팀에서 다른 팀으로 자료, 가이드, 프로그램 업데이트 내용을 전달하기 위해 사용하는 Django 기반 정보 공유 Web Application이다.
2021년에 개발해 운영하던 기존 Amelia 시스템을 서버 교체 시점에 맞춰 정리하면서, 불필요한 기능을 제거하고 개발 환경과 Database 연결 방식을 현대화해 Amelia2로 재구축했다.
개발 기간 : 11월 30일 ~ 12월 13일
| Project | 사내 정보 공유 · 가이드 · 업데이트 관리 시스템 |
| Role | 기획 · UI/UX · DB 이전 설계 · Backend · Frontend · 배포 |
| Backend | Python 3.11 · Django |
| Database | MariaDB · PyMySQL |
| Editor | CKEditor 5 · Image Upload · Table · Rich Text |
| Migration | Python 3.8.10 → 3.11.6 · 기존 DB Custom Migration |
| Result | 기존 시스템 정리 · 콘텐츠 작성 기능 강화 · 가이드 및 업데이트 공유 개선 |
기존 Amelia는 2021년에 제작한 사내 정보 공유 시스템으로, 가이드와 프로그램 업데이트 내용 등을 다른 팀에 전달하는 용도로 사용하고 있었다.
운영 서버를 교체하면서 기존 데이터를 새로운 환경으로 이전해야 했고, 단순히 서버만 옮기기보다는 이 시점에 오래된 개발 환경과 사용하지 않는 기능을 함께 정리하기로 했다.
기존 Amelia
├─ Python 3.8.10
├─ 기존 Database
├─ 기존 게시판 구조
└─ 사용하지 않는 일부 기능
↓
서버 교체
↓
Amelia2
├─ Python 3.11.6
├─ PyMySQL
├─ 필요한 데이터 Custom Migration
├─ 게시판 구조 정리
└─ 콘텐츠 작성 기능 개선기존 시스템 역시 직접 기획·디자인·개발했기 때문에 기존 구조를 파악하는 데 드는 비용은 크지 않았고, Amelia2에서는 운영 중 확인된 불필요한 기능을 덜어내고 실제 사용 목적에 필요한 기능을 강화하는 것에 집중했다.
Amelia2의 주된 목적은 복잡한 협업 시스템을 만드는 것이 아니라, 작성자가 정보를 편하게 정리하고 다른 사용자가 URL을 통해 필요한 내용을 쉽게 확인할 수 있도록 하는 것이었다.
특히 다음과 같은 콘텐츠를 전달하는 업무에 초점을 맞췄다.
작성자 ↓ 가이드 / 업데이트 내용 작성 ↓ 이미지 · 표 · 링크 · 서식 구성 ↓ 게시 ↓ 공유 URL 전달 ↓ 다른 사용자가 Web에서 확인
# 가상환경 D:\Python\python311\python.exe -m venv vAmelia2 # Django pip install django # Database pip install pymysql # CORS pip install django-cors-headers # Image pip install Pillow # IIS pip install wfastcgi # Editor pip install django-ckeditor-5 # HTML Parsing pip install beautifulsoup4 # Project django-admin startproject back .
python manage.py startapp org python manage.py startapp web python manage.py startapp history python manage.py startapp handover python manage.py startapp guide python manage.py startapp setting python manage.py startapp utils
org └─ 사용자 / 조직 정보 web └─ Main UI 및 게시물 history └─ 이력 관리 handover └─ 인수인계 정보 guide └─ Guide 콘텐츠 setting └─ 사용자 / 시스템 설정 utils └─ 공통 기능
CREATE DATABASE amelia2 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
python manage.py makemigrations python manage.py migrate python manage.py createsuperuser
Amelia2에서는 기능 추가뿐 아니라 기존 시스템의 실행 환경도 함께 정리했다.
기존 Python 3.8.10 환경을 Python 3.11.6으로 변경하고, Database 연결 라이브러리도 기존 mysqlclient 대신 PyMySQL을 사용하는 방식으로 전환했다.
Legacy Environment
Python 3.8.10
↓
Python 3.11.6
Database Driver
mysqlclient
↓
PyMySQL운영 중인 시스템을 완전히 새로 만드는 대신, 서버 이전이라는 실제 업무 시점을 활용해 기존 데이터를 유지하면서 실행 환경과 필요한 기능을 함께 개선하는 방식으로 진행했다.
Custom User Model, MariaDB, CKEditor 5, Media Upload 등을 사용할 수 있도록 기본 프로젝트 환경을 구성했다.
아래 코드는 실제 프로젝트 설정 중 공개 포트폴리오에 필요한 부분만 정리한 예시이며, Database 계정 및 환경별 보안 값은 제외했다.
import os
import pymysql
pymysql.install_as_MySQLdb()
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'corsheaders',
'org.apps.OrgConfig',
'web.apps.WebConfig',
'history.apps.HistoryConfig',
'handover.apps.HandoverConfig',
'guide.apps.GuideConfig',
'setting.apps.SettingConfig',
'utils.apps.UtilsConfig',
'django_ckeditor_5',
]
AUTH_USER_MODEL = 'org.User'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'amelia2',
'USER': 'DB_USER',
'PASSWORD': 'DB_PASSWORD',
'HOST': 'DB_HOST',
'PORT': '3306',
}
}
LANGUAGE_CODE = 'ko'
TIME_ZONE = 'Asia/Seoul'
STATIC_URL = '/static/'
MEDIA_URL = '/media/'
LOGIN_URL = '/login/'
LOGIN_REDIRECT_URL = '/'
LOGOUT_REDIRECT_URL = '/login/'from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from web import views
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.index, name='index'),
path('org/', include('org.urls')),
path('web/', include('web.urls')),
path('history/', include('history.urls')),
path('handover/', include('handover.urls')),
path('guide/', include('guide.urls')),
path('setting/', include('setting.urls')),
path('ckeditor5/', include('django_ckeditor_5.urls')),
path(
'ckeditor5/image_upload/',
views.upload_image,
name='upload_image'
),
]
if settings.DEBUG:
urlpatterns += static(
settings.MEDIA_URL,
document_root=settings.MEDIA_ROOT
)Amelia2에서 가장 중요하게 개선한 영역 중 하나는 글쓰기 환경이었다.
실제 사용자는 단순 텍스트 입력이 아니라 블로그를 작성하는 것처럼 이미지와 표를 넣고, 글자 크기와 색상을 조정하며, 내용을 자유롭게 구성할 수 있는 편집 환경을 기대했다.
이를 위해 CKEditor 5를 적용하고 실제 사용에 필요한 기능을 추가하면서 편집 기능을 확장했다.
이미지의 경우 단순 업로드뿐 아니라 편집 화면에서 정렬과 크기 등을 조정할 수 있도록 구성했다.
CKEDITOR_5_CONFIGS = {
'default': {
'toolbar': [
'heading', '|',
'highlight',
'fontColor',
'fontBackgroundColor',
'fontSize', '|',
'insertTable',
'blockQuote',
'link',
'imageUpload',
'mediaEmbed', '|',
'bulletedList',
'numberedList',
'alignment',
'outdent',
'indent', '|',
'bold',
'italic',
'underline',
'strikethrough', '|',
'undo',
'redo',
],
'image': {
'toolbar': [
'imageTextAlternative',
'imageStyle:alignLeft',
'imageStyle:alignCenter',
'imageStyle:alignRight',
],
},
'table': {
'contentToolbar': [
'tableColumn',
'tableRow',
'mergeTableCells'
]
},
'language': 'ko',
}
}Amelia2에서 가장 고민이 많았던 기능은 새롭게 추가한 Tab 기반 콘텐츠 작성 구조였다.
초기에는 사용자가 필요한 만큼 Tab을 자유롭게 추가할 수 있도록 설계하려 했다.
초기 설계 게시물 ├─ Tab 1 ├─ Tab 2 ├─ Tab 3 ├─ Tab 4 └─ ... 사용자가 Tab을 자유롭게 추가
하지만 동적으로 Tab을 추가하면서 Frontend에서 Editor Instance를 생성하는 방식에서는 기존에 사용하던 CKEditor 기능을 동일한 수준으로 제공하기 어려웠다.
특히 이미지를 복사해 붙여넣은 뒤 크기와 스타일을 조정하는 것처럼 실제 사용자가 필요로 하는 편집 기능에서 차이가 발생했다.
Tab 개수를 자유롭게 만드는 것보다 각 Tab에서 충분한 편집 기능을 안정적으로 제공하는 것이 더 중요하다고 판단해 최종적으로 구조를 변경했다.
초기안
Dynamic Tab
+
Frontend Editor 생성
↓
일부 Editor 기능 제약
최종안
고정 3 Tab
+
각 Tab에 Django 기반 Editor 연결
↓
필요한 편집 기능 안정적으로 제공기능의 자유도를 무조건 높이기보다는 실제 사용자에게 중요한 기능과 구현 안정성을 비교해 고정 3개의 Tab에 각각 Editor를 제공하는 방식으로 최종 결정했다.
이 과정은 단순한 구현 문제가 아니라 요구사항의 우선순위를 다시 판단하고, 실제 사용성을 기준으로 설계를 조정한 경험이었다.
Amelia2는 신규 시스템이지만 기존 Amelia에서 사용하던 데이터도 계속 활용해야 했다.
다만 Amelia2에서는 일부 Database 구조와 항목이 변경되었기 때문에 기존 Database 전체를 그대로 복제하는 대신 필요한 데이터를 선택해 새로운 구조에 맞게 수정한 뒤 이전하는 방식을 사용했다.
Amelia 기존 DB
↓
필요한 Table / Data Export
↓
새 Schema에 맞게 SQL 수정
↓
Amelia2 Database Import
↓
Migration 결과 확인기존 데이터 추출에는 HeidiSQL의 SQL Export 기능을 활용했고, 새로운 Database 구조에 맞게 내용을 수정한 뒤 MariaDB Client에서 SQL을 실행했다.
source D:/Develop/D_Amelia2/db/p.sql; source D:/Develop/D_Amelia2/db/m.sql; source D:/Develop/D_Amelia2/db/x.sql;
서버 이전 과정에서 기존 데이터를 보존하면서도 새 시스템의 구조에 맞춰 필요한 데이터만 이전할 수 있도록 처리했다.




Amelia2는 다른 팀과 정보를 공유하는 시스템이라는 사용 목적에 맞춰 콘텐츠 작성 환경과 실제 게시물을 읽는 경험에 중점을 두었다.
작성자는 블로그를 작성하듯 이미지와 표, 링크, 다양한 서식을 이용해 가이드나 업데이트 내용을 정리할 수 있고, 완성된 콘텐츠는 URL을 통해 다른 사용자에게 바로 전달할 수 있도록 구성했다.
또한 서버 이전을 계기로 기존 시스템의 불필요한 기능을 정리하고 Python과 Database 연결 환경을 변경하면서, 기존 데이터를 유지한 상태로 새로운 실행 환경으로 전환했다.
Amelia2는 완전히 새로운 서비스를 처음부터 만드는 프로젝트와 달리, 이미 실제로 사용되고 있는 시스템을 새로운 환경으로 이전하면서 필요한 부분만 개선하는 프로젝트였다.
그 과정에서 기존 데이터를 어떻게 유지할지, 이전 시스템에서 어떤 기능을 제거하고 어떤 기능을 강화할지, 새로운 기능이 실제 사용자 경험에 어떤 영향을 주는지를 함께 고려해야 했다.
특히 Tab과 Editor 기능을 구현하면서 처음 생각한 구조를 그대로 고집하기보다 라이브러리의 제약과 실제 사용자 요구사항을 비교해 최종 구조를 변경했다.
기존 시스템 분석
↓
불필요 기능 정리
↓
개발 환경 Upgrade
↓
Database Custom Migration
↓
콘텐츠 작성 기능 개선
↓
새 기능 구현 및 구조 조정
↓
신규 서버 환경으로 이전Project Amelia2는 Legacy System 분석 → Migration 설계 → 환경 Upgrade → Database 이전 → 기능 개선 → 실제 운영 시스템 재구축까지 경험한 프로젝트라는 점에서 의미가 있다.
기타 프로젝트 : Project 전체 보기
Django : https://www.djangoproject.com/