
Python


project Lua 는 번역 시, 표준 문장(국문/영문)이라는 기준이 되는 데이터를 효율적으로 검색 및 관리 하기 위한 툴이다.
사용자가 검색하면 DB화 된 데이터를 자동 완성으로 찾아주고, 유사 문장을 확인하며 번역 매핑을 제공한다. 또한 Ai를 사용하여 문장 자동 분류 및 태그 기능을 학습하고 제공하여 더 정확한 검색에 이용하였다.
프로젝트 기간: 11.10 ~ 개발 진행 중
파이썬 장고에 기반을 두고 mariaDB로 진행.
검색 속도를 위해 Redis(캐시, 세션, 검색결과 저장), Meilisearch(자동완성, 유사문장 검색), Elasticsearch(대규모 검색/분석) 사용.

# 가상환경 D:\Python\python311\python.exe -m venv vLua # 장고 pip install django # MySQL DB pip install pymysql # 장고 CORS pip install django-cors-headers # iis 세팅용 pip install wfastcgi # 엑셀 다운로드 pip install openpyxl # 이미지 필드 사용을 위해서 pip install Pillow # 캐시, 세션, 검색결과 저장 pip install redis # 자동완성, 유사문장 검색 엔진 pip install meilisearch # AI 모델 학습 및 분류 pip install scikit-learn pandas numpy # 기본 프로젝트 django-admin startproject back . # 앱 python manage.py startapp web
import os
import pymysql
from pathlib import Path
from django.contrib.messages import constants as messages
pymysql.install_as_MySQLdb()
BASE_DIR = Path(__file__).resolve().parent.parent
SECRET_KEY = 'django-insecure-eza=p$-v)681^=xk5b!+ox9f9vpb9f*cvvnxt1x((ta_l2v=)6'
DEBUG = True
ALLOWED_HOSTS = ["*"]
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'corsheaders', # CORS 허용
'web.apps.WebConfig', # web app
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware', # CORS 맨 위
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'back.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates'], # 전역 템플릿
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'back.wsgi.application'
# MariaDB 설정
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'lua',
'USER': 'root',
'PASSWORD': '0000',
'HOST': 'localhost',
'PORT': '3306',
'OPTIONS': {'charset': 'utf8mb4'},
}
}
# CORS 허용
CORS_ALLOW_ALL_ORIGINS = True
CORS_ALLOW_CREDENTIALS = True
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'OPTIONS': {'min_length': 4},
},
]
LANGUAGE_CODE = 'ko'
TIME_ZONE = 'Asia/Seoul'
USE_I18N = True
USE_TZ = True
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
STATIC_URL = '/static/'
STATICFILES_DIRS = [BASE_DIR / 'static']
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
MESSAGE_TAGS = {
messages.DEBUG: 'debug',
messages.INFO: 'info',
messages.SUCCESS: 'success',
messages.WARNING: 'warning',
messages.ERROR: 'danger',
}
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('web.urls')), # ✅ web 앱으로 라우팅
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)from django.urls import path
from . import views
app_name = 'web'
urlpatterns = [
path('', views.index, name='index'),
]from django.shortcuts import render
def index(request):
context = {
"title": "Lua 표준문장관리시스템",
}
return render(request, "index.html", context)마리아 DB 설치 방법: [python/setting] 파이썬 – Django 설치 + 셋팅
CREATE DATABASE lua CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; # DB 생성 SHOW DATABASES; # 생성 확인
DB 생성 후
python manage.py migrate
<!DOCTYPE html>
{% load static %}
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>{{ title }}</title>
<link rel="icon" href="{% static 'img/logo.ico' %}" />
<link rel="apple-touch-icon" href="{% static 'img/logo.ico' %}" />
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<link rel="stylesheet" href="{% static 'css/reset.css' %}">
<link rel="stylesheet" href="{% static 'css/common.css' %}">
<script src="{% static 'js/common.js' %}"></script>
</head>
<body>
<header>
<div class="wrap">
<div class="header-top">
<h1>
<img class="logo" src="{% static 'img/logo.png' %}" alt="표준문장관리툴">
</h1>
<div class="select-wrap">
<select name="chapter" id="chapter">
<option value="">챕터 선택</option>
</select>
<select name="cat1" id="cat1">
<option value="">분류1 선택</option>
</select>
<select name="cat2" id="cat2">
<option value="">분류2 선택</option>
</select>
<select name="cat3" id="cat3">
<option value="">분류3 선택</option>
</select>
</div>
</div>
<div class="header-bottom">
<div class="search-wrap">
<input type="text" placeholder="검색어를 입력하세요..." id="searchInput" class="search-input">
<button class="btn-clear">×</button>
</div>
</div>
</div>
</header>
<main>
{% block content %}{% endblock %}
</main>
<footer>
<div class="wrap">
<p>© 2025 Lua – 표준문장관리시스템</p>
</div>
</footer>
</body>
</html>{% extends 'base.html' %}
{% block content %}
<div class="wrap">
<section>
<div class="section-wrap">
<h2>검색 결과</h2>
<div class="result-wrap">
</div>
</div>
</section>
<aside>
<div class="aside-wrap">
<h2>keyword - <span class="keyword">Test</span></h2>
<div class="dic-wrap">
</div>
</div>
</aside>
</div>
{% endblock %}
