Python

[python/development] project Lua

2025.11.11
cate-weblab

project Lua 란?

project Lua logo

project Lua 는 번역 시, 표준 문장(국문/영문)이라는 기준이 되는 데이터를 효율적으로 검색 및 관리 하기 위한 툴이다.

사용자가 검색하면 DB화 된 데이터를 자동 완성으로 찾아주고, 유사 문장을 확인하며 번역 매핑을 제공한다. 또한 Ai를 사용하여 문장 자동 분류 및 태그 기능을 학습하고 제공하여 더 정확한 검색에 이용하였다.

프로젝트 기간: 11.10 ~ 개발 진행 중


기본 환경 세팅

파이썬 장고에 기반을 두고 mariaDB로 진행.

검색 속도를 위해 Redis(캐시, 세션, 검색결과 저장), Meilisearch(자동완성, 유사문장 검색), Elasticsearch(대규모 검색/분석) 사용.

구조

project Lua map

기본 설치

# 가상환경
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

back/setting

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',
}

back/urls

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)

web/urls

from django.urls import path
from . import views

app_name = 'web'

urlpatterns = [
    path('', views.index, name='index'),
]

web/views

from django.shortcuts import render

def index(request):
    context = {
        "title": "Lua 표준문장관리시스템",
    }
return render(request, "index.html", context)

DB 생성

마리아 DB 설치 방법: [python/setting] 파이썬 – Django 설치 + 셋팅

CREATE DATABASE lua CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;   # DB 생성
SHOW DATABASES;                                                         # 생성 확인

DB 생성 후

python manage.py migrate

Template 생성

base.html

<!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>

index.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 %}

파이참 세팅

Python All