Loading...
Skip to Content

Our Products

Legacy Modernizer

AI 기반 레거시 모더나이저 도구는 기존의 복잡한 스토어드 프로시저를 현대적이고 클린한 자바 아키텍처로 변환하도록 설계되었습니다. 이 도구는 단순한 표면적 변환을 넘어, 구조적이고 문법적인 변화를 포함하여 공유 데이터베이스 절차 방식에서 견고한 객체 지향 모델로의 전환을 지원합니다.

핵심 변환 과정에서는 비즈니스 로직이 포함된 난해한 PL/SQL 코드를 도메인 전문가와 개발자가 쉽게 협업하고 유지할 수 있도록 유비쿼터스 언어를 사용하여 보다 접근하기 쉬운 형태로 전환합니다. 이를 통해 코드의 이해도와 유지보수성을 크게 향상시킵니다.

사람에 의한 직접 전환 AI 기반 자동화 전환
개발 과정 복잡하고 전문가의 개입 필요 AI가 자동으로 복잡성 해결
인건비 전문가 집중으로 비용 상승 자동화로 인건비 절감
유지보수 코드 이해 및 수정 어려움 클린 아키텍처로 유지보수 용이
오류 가능성 수동 개입으로 오류 발생 가능 AI 정확도로 오류 최소화
협업 효율 제한적 커뮤니케이션 유비쿼터스 언어로 커뮤니케이션 강화
이와 같이, 자바로 전환 시 AI 기반 자동화 전환과 사람이 직접 전환했을 때의 차이는 여러 측면에서 나타납니다. AI 기반 자동화 전환은 시간과 비용을 절감하고, 오류를 최소화하여, 효율을 높일 수 있는 반면, 사람이 직접 전환할 때는 깊은 이해와 경험이 필요하며, 추가적인 최적화 작업과 테스트가 요구됩니다.

Our Values

Legacy Code 2 Clean Code 동작 세부 구조

Image Description

Flowchart

  1. 구문 분석: 스토어드 프로시저 파일의 내용 전체를 LLM (Large Language Model)에게 전달하게 되면, 최대 토큰 수를 넘어가기 때문에, LLM (Large Language Model)에 데이터를 전달할 때, 토큰 제한과 문맥 유지를 고려하여 의미적으로 연결된 덩어리로 쪼개서 전달하는 것이 중요합니다. 
      예를 들어 코드 내에서 각 블록(예: IF 문, SELECT 문, DECLARE)은 중간에서 잘라 전달하지 않고, 의미적으로 완전한 단위로 나누어 전달하게 되면, 문맥을 유지되고, 모델이 데이터를 정확하게 이해하고 처리할 수 있게 됩니다. 이를 위해 ANTLR (ANother Tool for Language Recognition) 같은 파싱 도구를 사용하여 코드의 구조를 파악하고, 이를 트리 구조로 변환하는 과정이 필요합니다. 레거시 시스템에서 모더나이제이션으로 변환: 헌집다오 새집줄게
  2. 그래프 시각화: 레거시 코드(스토어드 프로시저)의 복잡한 구조를 관계형 그래프로 시각화하여 이해하기 쉽게 만듭니다. Antlr로 생성된 구문 트리를 기반으로 프로시저의 구조를 분석하고, 수집된 토큰들을 LLM을 통해 의미론적 정보로 추출하여 그래프 데이터베이스에 노드와 관계를 구성합니다. 이렇게 시각화된 그래프는 프로시저 간의 상호작용과 데이터 흐름을 명확히 보여주어, 개발자와 도메인 전문가가 코드의 구조와 의도를 쉽게 이해하고 문제점을 빠르게 식별하여 효율적으로 리팩토링할 수 있게 합니다.

    《 벡터 DB와 그래프 DB를 이용한 RAG 기법의 차이 》

    측면 벡터 데이터베이스 그래프 데이터베이스 (KG)
    자료 구조 레거시 모더나이저-벡터 데이터베이스 레거시 모더나이저-그래프 데이터베이스
    데이터 유형 텍스트, 이미지, 오디오와 같은 대량의 비구조화된 데이터 관리에 이상적입니다. 복잡한 관계를 가진 엔터티 간의 구조화된 데이터에 적합합니다.
    도메인 적합성 ML 모델과 데이터 유형의 다양성이 필요한 애플리케이션에서 자주 사용됩니다. 특정 도메인에 대한 깊이 있는, 전문화된 지식이 요구되는 애플리케이션에 매우 효과적입니다.
    설명 가능성 KG보다는 투명성이 떨어지며, 명확한 경로보다는 유사성 점수에 초점을 맞춥니다. 명확한 추론 경로를 제공하여 설명 가능성이 높습니다.
    데이터 무결성 데이터 모델링의 유연성이 때때로 엄격한 데이터 일관성을 저해할 수 있습니다. 데이터 무결성과 일관성을 유지하며, 신뢰할 수 있는 데이터 표현에 필수적입니다.
    하이브리드 사용 사례 KG와 결합되어 구조화된 데이터와 비구조화된 데이터를 모두 효과적으로 처리할 수 있습니다. 구조화된 지식과 ML 기능을 활용하기 위해 벡터 데이터베이스와 결합할 수 있습니다.

    Source: RAG: Vector Databases vs Knowledge Graphs? | by Ahmed Behairy | Medium

  3. 자바로 전환: 그래프 데이터베이스에 저장된 구조화된 정보를 기반으로 LLM AI 기술을 활용하여 Java 코드로의 자동 변환이 이루어집니다. PL/SQL의 테이블 구조는 Java의 엔티티 클래스로 매핑되며, SELECT, INSERT와 같은 데이터 조작 구문은 JPA 리포지토리 인터페이스로 변환됩니다. AI는 복잡한 비즈니스 로직을 정확하게 해석하여 서비스 클래스로 구현하며, 이를 통해 개발자와 도메인 전문가가 쉽게 이해하고 유지할 수 있는 현대적이고 클린한 계층화된 Java 애플리케이션 구조를 형성합니다. 레거시 시스템에서 모더나이제이션으로 변환: 헌집다오 새집줄게
  4. 결과 검증 테스트: 변환된 Java 코드의 정확성 검증을 위해 AI 기반의 JUnit 테스트 자동 생성 시스템을 구현했습니다. 사용자는 테스트에 필요한 초기 데이터(Given)와 검증하고자 하는 프로시저(When)를 선택할 수 있으며, 테스팅 AI가 이를 기반으로 적절한 테스트 케이스를 자동으로 생성하고 실행합니다. 이를 통해 PL/SQL에서 Java로 전환된 코드가 기존 레거시 시스템의 비즈니스 로직을 정확하게 구현하는지 실시간으로 검증할 수 있으며, 기존 시스템의 기능적 완전성을 유지하면서도 새로운 아키텍처로의 전환이 원활하게 진행될 수 있도록 보장합니다. 레거시 시스템에서 모더나이제이션으로 변환: 헌집다오 새집줄게

'스토어드 프로시저'에서 '자바 클린 아키텍처'로 전환할 때의 이점

레거시 시스템에서 모더나이제이션으로 변환: 헌집다오 새집줄게

  • 유지보수성 향상: 스토어드 프로시저는 데이터베이스 시스템에 종속적이어서, 변경이 필요할 때마다 데이터베이스 전문가의 개입이 필요합니다. 이는 유지보수 과정에서 특정 전문 지식을 요구하며, 접근성이 제한됩니다. 반면, 자바와 같은 범용 프로그래밍 언어로 로직을 이전하면, 더 넓은 범위의 개발자가 시스템을 이해하고 수정할 수 있어 유지보수성이 크게 향상됩니다. 이는 자바가 제공하는 풍부한 문서와 커뮤니티 지원 덕분에 가능하며, 시스템의 유연성과 접근성을 높여줍니다.
  • 테스트와 디버깅 용이성: 스토어드 프로시저는 데이터베이스 내부에서 실행되기 때문에 테스트와 디버깅이 복잡하고 어려운 반면, 자바로 로직을 이전하면 모던 개발 환경에서 제공하는 다양한 테스트 및 디버깅 도구를 활용할 수 있습니다. 자바 환경은 단위 테스트, 통합 테스트 등을 쉽게 구현할 수 있으며, 디버깅 시 시각적 도구와 로깅 기능을 통해 문제를 빠르고 정확하게 식별할 수 있습니다.
  • 확장성 및 유연성: 자바와 같은 범용 프로그래밍 언어로 작성된 코드는 플랫폼 독립적이며, 다양한 운영 체제와 환경에서 실행될 수 있습니다. 이는 클라우드 기반 아키텍처와 같은 현대적인 인프라에 쉽게 통합되어 시스템의 확장성과 유연성을 크게 향상시킵니다. 반면, 스토어드 프로시저는 특정 데이터베이스 시스템에 종속되어 있어, 다른 환경으로의 이전이나 확장이 어렵습니다. 이로 인해 클라우드와 같은 새로운 기술 환경에 적응하는 데 제한이 있으며, 시스템의 확장성과 유연성이 자바에 비해 상대적으로 낮습니다.
  • 개발 효율성 증가: 자바는 강력한 라이브러리와 프레임워크를 지원하며, 전 세계적으로 활발한 개발자 커뮤니티가 있어 다양한 개발 리소스와 지원을 받을 수 있습니다. 이는 개발 속도와 효율성을 크게 향상시키는 요소입니다. 반면, 스토어드 프로시저는 특정 데이터베이스 시스템에 종속되어 있으며, 사용할 수 있는 라이브러리나 도구가 제한적이고, 개발자 커뮤니티도 자바만큼 크지 않습니다. 이로 인해 개발과 유지보수 과정에서 자바에 비해 상대적으로 더 적은 지원을 받게 되며, 개발의 유연성과 속도가 제한될 수 있습니다.
  • 시스템의 안정성 및 보안 강화: 자바는 가비지 컬렉션을 통한 자동 메모리 관리와 구조화된 예외 처리 메커니즘을 제공하여 메모리 누수와 예외 상황을 효과적으로 관리합니다. 반면, 스토어드 프로시저는 데이터베이스 엔진에 의존한 메모리 관리와 더 제한적인 예외 처리 기능을 가지고 있어, 자바만큼 세밀한 제어가 어렵습니다. 또한, 자바는 다양한 보안 프레임워크와 라이브러리를 통해 강력한 보안 기능을 제공하는 반면, 스토어드 프로시저는 이러한 보안 기능을 내장하고 있지 않아 보안 측면에서 유연성과 확장성이 제한됩니다.

HOW TO USE

[기능 적용 사례 : 근태 관리 시스템 자바 코드 전환]

1. TPX_UPDATE_SALARY (프로시저)

  • 주요 기능: 직원의 급여 정보를 갱신하는 메인 프로시저
  • 요구사항 정의:
    • 직원이 존재하지 않을 경우 신규 직원으로 등록
    • 해당 급여 기간에 대한 급여 정보가 없을 경우 신규 등록
    • 결근 일수에 따른 급여 차감 처리
    • 모든 오류 상황에 대한 예외 처리

2. TPX_EMPLOYEE (패키지)

  • 주요 기능: 직원 정보 관리를 위한 패키지
  • 요구사항 정의:
    • 직원 등록 (INS_EMPLOYEE)
    • 신규 직원 정보 등록
    • 중복 직원 검증
    • 직원 존재 확인 (EXISTS_EMPLOYEE)
    • 직원키를 통한 존재 여부 확인
    • 정규직 여부 확인 (IS_REGULAR_EMPLOYEE)

3. TPX_SALARY (패키지)

  • 주요 기능: 급여 관리를 위한 패키지
  • 요구사항 정의:
    • 급여 등록 (INS_SALARY)
    • 신규 급여 정보 등록
    • 결근에 따른 급여 수정 (UPD_SALARY_BY_ABSENT)
    • 정규직: 결근당 10만원 차감
    • 비정규직: 결근당 20만원 차감
    • 급여 조회 (GET_SALARY)
    • 특정 직원의 특정 급여일자 기준 급여 조회
    • 특정 직원의 특정 급여일자 기준 급여 정보 존재 여부 확인

4. TPX_ATTENDANCE (패키지)

  • 주요 기능: 출퇴근 관리를 위한 패키지
  • 요구사항 정의:
    • 출퇴근 등록 (INS_ATTENDANCE)
    • 일일 출퇴근 정보 등록
    • 직원 존재 여부 검증
    • 출퇴근 상태 코드 관리
    • 결근 일수 조회 (GET_ABSENT_DAYS)
    • 특정 기간 동안의 결근 일수 계산
    • 직원 존재 여부 검증
    • 'AB' 상태코드로 결근 여부 판단
Image Description

1. PL/SQL 코드를 자바로 변환하기 위해 먼저 변환할 파일을 Legacy-modernizer에 업로드하고, 분석 과정을 통해 데이터를 처리하게 됩니다.

- 변환 시 직면하는 주요 도전 중 하나인 LLM 문자열 크기 제한을 해결하기 위해 PL/SQL 코드를 여러 단위로 분할하여 전달합니다.
- Antlr와 같은 파싱 도구를 활용하여 구문 구조를 파악하고, 의미 있는 문맥을 유지하며 문을 분할하여 분석에 활용합니다.
- 원본 코드도 확인 가능하며, 직원 존재 여부 확인, 정규직 여부 확인 함수는 전달된 직원키를 사용하여 확인할 수 있습니다.
- 이미 존재하는 직원인지 확인하는 함수를 호출하여 존재하지 않다면 인서트문을 실행합니다.
Image Description

2. 해당 파일을 분석해서 그래프 형태로 시각화 합니다.

- 업로드한 PL/SQL 파일 단위과 같이 4개의 최상위 노드가 구성되고, 각각 해당되는 구성을 하나씩 펼쳐서 볼 수 있습니다.
- 직원 정보의 유무를 확인하며, 특정 테이블에서 레코드를 조회하는 셀렉트 문이 포함되어 있습니다.
- 함수의 입력 매개변수와 지역 변수를 설명하는 스펙이 있으며, 비즈니스 로직을 나타내는 노드가 존재합니다.
- 세부 노드는 각각 summary가 존재하여, 무슨 역할을 하는지 파악할 수 있습니다.
Image Description

3. 그래프 시각화에서 각 노드를 클릭하면, 해당 노드에 관련된 정보를 확인할 수 있습니다.

- 셀렉트, DML (Data Manipulation Language) 노드는 테이블과 연관이 되어있으며, 셀렉트는 FROM으로 인서트, 딜리트, 업데이트는 NEXT로 연결되어 있습니다.
- 테이블을 클릭하면 필드 정보와 NULL 여부를 확인할 수 있고, 같은 테이블이기 때문에 클릭시 하이라이트로 표시가 됩니다.
- 함수를 클릭할때도 하이라이트가 표시되어 어떤 함수가 호출되는지 쉽게 파악할 수 있으며, 다양한 프로시저와 패키지가 구성되어 있습니다.
- 출퇴근 관리 패키지도 똑같은 구조로 되어있으며, 이러한 그래프 정보들을 활용하여 자바로 변환하게 됩니다.
Image Description

4. CONVERT SPRING-BOOT PROJECT 버튼을 누르면 변환이 시작되며, 그래프 정보를 단계별로 사용하여 필요한 자바 클래스 파일을 생성합니다.

- 각 업로드된 파일에 따라 어떤 패키지 파일과 어떤 프로시저가 컨버팅되는지를 표시합니다.
- 자바로 전환된 결과는 유저의 특정 경로에 target이라는 폴더로 자동 완성되며, zip 형태로 다운로드를 받을수도 있습니다.
- 변환된 자바 프로젝트는 커맨드, 컨트롤러, 엔티티, 리포지토리, 서비스로 구분되어 각 메서드가 실제 로직을 실행하는 구조로 되어 있습니다.
- 예를들어, INS_EMPLOYEE는 직원을 등록하는 프로시저로, '직원키', '직원이름', '부서코드', '정규직 여부' 정보를 받게되어 관련 메서드를 호출하여 해당 직원 정보를 생성하고 저장합니다.
Image Description

5. 자바로 변환된 결과가 제대로 되었는지 확인하기 위해 특정 프로시저를 실행할 수 있으며, 추가로 파라미터와 필요한 초기 데이터를 입력할 수 있습니다.

- 직원, 급여, 결근여부 등 입력된 정보는 자동으로 테스트 케이스를 생성하는 데 사용됩니다.
- 여러 케이스를 추가하여 다양한 상황을 테스트하고, 정직원 여부에 따른 급여 변화 등을 확인합니다.
- 테스트 결과는 화면에 반영되며, 테스트를 수행한 뒤의 데이터와 입력한 프로시저 정보를 통해 검증됩니다.
Image Description

6. 테스트가 성공하면 Given-When-Then 로직이 제대로 실행된 것을 확인할 수 있습니다.

- 실제 테스트 시행 시 트랜지션 로그가 생성되어 보여집니다.
- Given은 입력한 정보를, When은 프로시저 호출, 파라미터 정보, Then은 호출 결과를 보여줍니다.
- test폴더에 파일이 생성되고, CASE 1 에 입력한 값과 정보가 동일하며 정규직의 경우 한 번 결근시 10만원 감소하여, 총 90만원으로 변환되는 로직을 확인할 수 있습니다.
Image Description
- CASE 2 도 마찬가지로 입력 값과 정보가 동일하며, 정규직이 아닐 경우 한 번 결근시 20만원 감소하여, 80만원에서 60만원으로 변동된 결과가 나타납니다.
- CASE 2 에 입력한 데이터를 기반으로 java에서도 초기 데이터를 등록하게 되고 Given-When-Then 로직이 제대로 실행된 것을 확인할 수 있습니다.
- 만일 테스트가 실패하면, 피드백 루프를 통해 계속 코드를 수정하며 같은 결과를 도출하게 됩니다.