티스토리 뷰

728x90
반응형

 포스팅은 RHAMT를 활용한 Application 마이그레이션 가이드입니다.


application 고도화 또는 as-is 기반으로 신규 application을 개발하고자 할때 해당 application이 어떠한 기술을 사용했고, 어떠한 요구조건이 수렴되어 있으며, 이후 어떻게 변경해 나가야 할지 파악해 내는 것은 정말 어려운 일입니다.

물론 개발 초창기부터 리딩해온 개발자가 여전히 개발에 참여하고 있거나, 다양한 분야의 전문지식을 갖추고 있는 아키텍처들이 명확히 구분되어 있을 경우라 하더라도 웹어플리케이션 하나 분석하는데 많은 시간이 요소됨은 자명한 일입니다.

따라서 이를 보다 손쉽게 분석하고 파악할 수 있도록 하는 마이그레이션 툴의 사용은 필수적인 요소라 할 수 있습니다.


오늘은 RedHat Applicatino Migration Toolkit(이하 RHAMT)을 활용하여 application 분석을 보다 효율적으로 수행하기 위한 방법에 대해 알아보고자 합니다.


1. RHAMT 설치

설치 방법은 매우 간단합니다. 하단의 URL을 통해 다운로드 받을 수 있습니다.


https://developers.redhat.com/products/rhamt/download/


- 다운로드를 클릭하여 설치파일을 다운로드합니다. (물론 로그인은 수행되어야 합니다.)



- 다운로드 받은 파일을 압축해제 하면 다음과 같은 구조를 확인할 수 있습니다.



- bin directory에 들어가 rhamt-cli.bat를 수행합니다. 이때 jdk 1.8을 기준으로 JAVA_HOME이 셋팅되어 있어야 합니다.


2. RHAMT 실행 방법

rhamt-cli.bat --input C:\rhamt-cli-4.2.0.Final\test.ear --output C:\rhamt-cli-4.2.0.Final\result --source java --target eap:7 --packages *


rhamt-cli.bat : windows의 경우 bat, linux/unix의 경우 rhamt-cli를 실행

--input : 분석할 application 소스

--output : 보고서를 생성할 디렉터리 지정

--source : 마이그레이션 원본의 구현방식 결정

--target : 적용할 JBoss 버전 지정

--packages : 분석할 패키지 지정 (Package 중 일부만 분석을 원할 경우 사용하며, 지정하지 않을 경우 전체 분석)


스크립트를 수행했을 경우 아래와 같이 마이그레이션이 진행됩니다.


C:\rhamt-cli-4.2.0.Final\bin>rhamt-cli.bat --input C:\rhamt-cli-4.2.0.Final\test.ear --output C:\rhamt-cli-4.2.0.Final\result --source java --target eap:7 --packages *

Using RHAMT at C:\rhamt-cli-4.2.0.Final\bin\..

Using Java at C:\Program Files\Java\jdk1.8.0_202

> Red Hat Application Migration Toolkit (RHAMT) CLI, version 4.2.0.Final.



Red Hat Application Migration Toolkit (RHAMT) CLI, version [  ] - by Red Hat, Inc. [ https://developers.redhat.com/products/rhamt/overview/ ]



Input Application:C:\rhamt-cli-4.2.0.Final\test.ear

Output Path:C:\rhamt-cli-4.2.0.Final\result


Using user rules dir: C:\rhamt-cli-4.2.0.Final\bin\..\rules

Using user rules dir: C:\Users\S-Core\.rhamt\rules

2019-01-10 16:20 [0/870] Executing RHAMT

2019-01-10 16:20 [1/870] InitializationPhase - LoadIssueCategoriesRuleProvider - LoadIssueCategoriesRuleProvider_attachToGraph

2019-01-10 16:20 [2/870] InitializationPhase - RegisterApiPackagesInTypeInterestFactoryRuleProvider - RegisterApiPackagesInTypeInterestFactoryRuleProvider_1

2019-01-10 16:20 [3/870] InitializationPhase - RegisterApiPackagesInTypeInterestFactoryRuleProvider - RegisterApiPackagesInTypeInterestFactoryRuleProvider_2

2019-01-10 16:20 [4/870] InitializationPhase - CopyJavaConfigToGraphRuleProvider - CopyJavaConfigToGraphRuleProvider_1

2019-01-10 16:20 [5/870] InitializationPhase - IgnoredArchivesConfigLoadingRuleProvider - IgnoredArchivesConfigLoadingRuleProvider_1

2019-01-10 16:20 [6/870] InitializationPhase - ArchiveIdentificationConfigLoadingRuleProvider - ArchiveIdentificationConfigLoadingRuleProvider_1

2019-01-10 16:20 [7/870] InitializationPhase - ArchiveIdentificationConfigLoadingRuleProvider - ArchiveIdentificationConfigLoadingRuleProvider_2

2019-01-10 16:20 [8/870] InitializationPhase - GatherIgnoredFileNamesRuleProvider - GatherIgnoredFileNamesRuleProvider_1

2019-01-10 16:20 [9/870] DiscoveryPhase - DiscoverFilesAndTypesRuleProvider - DiscoverFilesAndTypesRuleProvider_1

2019-01-10 16:20 [10/870] DiscoveryPhase - DiscoverFilesAndTypesRuleProvider - DiscoverFilesAndTypesRuleProvider_2

2019-01-10 16:20 [11/870] ArchiveExtractionPhase - UnzipArchivesToOutputRuleProvider - UnzipArchivesToOutputRuleProvider_1

2019-01-10 16:20 [12/870] ArchiveExtractionPhase - UnzipArchivesToOutputRuleProvider - UnzipArchivesToOutputRuleProvider_2

2019-01-10 16:20 [13/870] ArchiveMetadataExtractionPhase - DiscoverArchiveTypesRuleProvider - DiscoverArchiveTypesRuleProvider_1

2019-01-10 16:20 [14/870] ArchiveMetadataExtractionPhase - DiscoverArchiveManifestFilesRuleProvider - DiscoverArchiveManifestFilesRuleProvider_1

...

...

...

2019-01-10 16:20 [831/870] DependentPhase - FindUnboundJavaReferencesRuleProvider - FindUnboundJavaReferencesRuleProvider

2019-01-10 16:20 [832/870] PostMigrationRulesPhase - DiscoverRemoteEjbRuleProvider - DiscoverRemoteEjbRuleProvider_1

2019-01-10 16:20 [833/870] PreReportGenerationPhase - RenderTagsJavaScriptRuleProvider - RenderTagsJavaScriptRuleProvider_1

2019-01-10 16:20 [834/870] PreReportGenerationPhase - CreateApplicationReportIndexRuleProvider - CreateApplicationReportIndexRuleProvider_1

2019-01-10 16:20 [835/870] PreReportGenerationPhase - Resolve Links to Server Documentation - Resolve Links to Server Documentation_1

2019-01-10 16:20 [836/870] ReportGenerationPhase - CreateFreeMarkerMethodReportRuleProvider - CreateWindupFreeMarkerFunctionReport

2019-01-10 16:20 [837/870] ReportGenerationPhase - ExportCSVFileRuleProvider - ExportCSVFileRuleProvider_1

2019-01-10 16:20 [838/870] ReportGenerationPhase - CreateMigrationIssuesReportRuleProvider - CreateMigrationIssuesReportRuleProvider_1

2019-01-10 16:20 [839/870] ReportGenerationPhase - CreateTechReportRuleProvider - feedTagsToGraph

2019-01-10 16:20 [840/870] ReportGenerationPhase - CreateTechReportRuleProvider - createTechReport

2019-01-10 16:20 [841/870] ReportGenerationPhase - CreateUnparsableFilesReportRuleProvider - CreateUnparsableFilesReportRuleProvider_1

2019-01-10 16:20 [842/870] ReportGenerationPhase - CreateAboutWindupReportRuleProvider - CreateAboutWindupReportRuleProvider_1

2019-01-10 16:20 [843/870] ReportGenerationPhase - CreateDependencyGraphReportRuleProvider - CreateDependencyGraphReportRuleProvider_1

2019-01-10 16:20 [844/870] ReportGenerationPhase - Create Java Dependency Report - Create Java Dependency Report_1

2019-01-10 16:20 [845/870] ReportGenerationPhase - CreateJavaApplicationOverviewReportRuleProvider - CreateJavaApplicationOverviewReportRuleProvider_1

2019-01-10 16:20 [846/870] ReportGenerationPhase - CreateCompatibleFileReportRuleProvider - CreateCompatibleFileReportRuleProvider_1

2019-01-10 16:20 [847/870] ReportGenerationPhase - CreateHardcodedIPAddressReportRuleProvider - CreateHardcodedIPAddressReportRuleProvider_1

2019-01-10 16:20 [848/870] ReportGenerationPhase - CreateJavaIgnoredFilesReportRuleProvider - CreateJavaIgnoredFilesReportRuleProvider_1

2019-01-10 16:20 [849/870] ReportGenerationPhase - CreateReportIndexRuleProvider - CreateReportIndexRuleProvider_1

2019-01-10 16:20 [850/870] ReportGenerationPhase - Create Spring Bean Report - Create Spring Bean Report_1

2019-01-10 16:20 [851/870] ReportGenerationPhase - Create JPA Report - Create JPA Report_1

2019-01-10 16:20 [852/870] ReportGenerationPhase - Create JBPM Report - Create JBPM Report_1

2019-01-10 16:20 [853/870] ReportGenerationPhase - Create Remote Services Report - Create Remote Services Report_1

2019-01-10 16:20 [854/870] ReportGenerationPhase - Create Server Resources Report - Create Server Resources Report_1

2019-01-10 16:20 [855/870] ReportGenerationPhase - Create Hibernate Report - Create Hibernate Report_1

2019-01-10 16:20 [856/870] ReportGenerationPhase - Create EJB Report - Create EJB Report_1

2019-01-10 16:20 [857/870] PostReportGenerationPhase - CreateApplicationListReportRuleProvider - CreateApplicationListReportRuleProvider_1

2019-01-10 16:20 [858/870] PostReportGenerationPhase - CreateSourceReportRuleProvider - CreateSourceReportRuleProvider_1

2019-01-10 16:20 [859/870] PostReportGenerationPhase - AttachApplicationReportsToIndexRuleProvider - AttachApplicationReportsToIndexRuleProvider_1

2019-01-10 16:20 [860/870] ReportRenderingPhase - CssJsResourceRenderingRuleProvider - CssJsResourceRenderingRuleProvider_1

2019-01-10 16:20 [861/870] ReportRenderingPhase - RenderReportRuleProvider - RenderReportRuleProvider_1

2019-01-10 16:20 [862/870] ReportRenderingPhase - RenderReportRuleProvider - RenderReportRuleProvider_2

2019-01-10 16:20 [863/870] ReportRenderingPhase - CreateIssueSummaryDataRuleProvider - CreateIssueSummaryDataRuleProvider_1

2019-01-10 16:20 [864/870] ReportRenderingPhase - CreateDependencyGraphDataRuleProvider - CreateDependencyGraphDataRuleProvider_1

2019-01-10 16:20 [865/870] FinalizePhase - CacheFileModelPrettyPathRuleProvider - CacheFileModelPrettyPathRuleProvider_1

2019-01-10 16:20 [866/870] PostFinalizePhase - ExecutionTimeReportRuleProvider - ExecutionTimeReportRuleProvider_1

2019-01-10 16:20 [867/870] PostFinalizePhase - CreateRuleProviderReportRuleProvider - CreateRuleProviderReportRuleProvider_1

2019-01-10 16:20 [868/870] PostFinalizePhase - RenderRuleProviderReportRuleProvider - RenderRuleProviderReportRuleProvider_1

2019-01-10 16:20 [869/870] PostFinalizePhase - DeleteWorkDirsAtTheEndRuleProvider - DeleteWorkDirsAtTheEndRuleProvider_1

2019-01-10 16:20 [870/870] PostFinalizePhase - DeleteWorkDirsAtTheEndRuleProvider - DeleteWorkDirsAtTheEndRuleProvider_2

Report created: C:\rhamt-cli-4.2.0.Final\result\index.html

              Access it at this URL: file:///C:/rhamt-cli-4.2.0.Final/result/index.html


C:\rhamt-cli-4.2.0.Final\bin>


- 마이그레이션이 위와 같이 정상적으로 완료되면 output으로 지정된 경로에 분석 리포트가 생성됩니다.




3. RHAMT 분석결과 확인

- index.html을 호출하면 다음과 같은 기본 화면을 볼 수 있습니다.



- 분석에 진행된 application list를 확인할 수 있으며, 상단의 Technologies를 클릭합니다.

해당 화면에서는 분석이 진행된 application에 포함된 모듈 정보를 확인할 수 있습니다.



Web, EJB로 구성되어 있는 test.ear 모듈임을 한번에 알아 볼 수 있습니다.

- 다시 메인화면 index.html로 돌아와 test.ear 모듈을 클릭합니다.

이동 된 화면을 보면 다양한 정보가 Dashboard 형태로 출력되는 것을 볼 수 있습니다.



기서 왼쪽 첫번째 항목에 표기된 Incidents / Total Story Points가 마이그레이션 기간을 산정하는데 중요한 정보를 제공합니다.

일반적으로 Agile 방법론의 Story Point 1당 개발자 1인 수정 시 2시간의 시간 소요가 발생 할 것이라 예상하며, 공수 산정에 도움이 되는 정보를 제공합니다.

특히 Mandatory 정보의 경우 반드시 수정되어야 하는 주요 요건으로 Optional 등의 요건을 제한 Mandatory Incidents에 대한 정보만 별도로 하단에 보여주는 이유입니다.

본 test.ear application의 경우 Information 성 Incidents만 3개 확인이 되었으며, Mandatory 요소는 발생하지 않았습니다.

실제 개발 소스를 공개할 수는 없기에 타 사이트 마이그레이션에 사용한 결과만 간단히 확인해 보자면



위와 같이 Mandatory Incidents만 41개에 Story Points만 61 즉 122시간의 개발 공수가 들어간다는 것을 알 수 있습니다.

물론 이는 Mandatory만 산정한 값으로 cloud-mandatory의 요소 역시 클라우드를 고려하는 사이트에서는 반드시 수정되어야 할 포인트가 되겠습니다.

사실 test.ear의 기본 application을 가지고 분석을 진행하고자 했으나, Incidents가 너무 안잡혀서 위 hrp.war의 결과를 기준으로 몇몇 추가 확인해 볼 포인트를 알아보도록 하겠습니다.

- 다음으로 알아볼 내용은 Issues입니다.

Issues에서는 위에서 살펴본 Incidents들의 상세 내용이 출력됩니다.



확인하고자 하는 내용을 클릭해보면 (하단의 이미지는 Call of JNDI lookup에 대한 내용으로 JDBC Lookup에 사용되는 ContextFactory에 대한 가이드입니다.)



Weblogic이 사용하는 ContextFactory와 변경되어야 할 ContextFactory가 코드레벨까지 가이드가 되어져 나옵니다.

정말 편리하네요.



각 모듈을 클릭하면 위와같이 코드 라인까지 수정 포인트를 가이드하고, 어떻게 변경하는 것이 옳바른지에 대한 명확한 설명까지 덭붙여집니다.

이 툴이 오픈소스라는게 정말 다행이라고 생각되네요.

하드코딩되어 있는 경로나 IP등을 찾는데도 유용하게 사용할 수 있습니다.

항목별 구분 및 소스 영향도 그리고 xml 레벨까지 모두 체크해줍니다.

- 다음으로 Application Details입니다.

위 Story Points 들을 모두 상세하게 보여주는 화면으로 다음과 같이 확인할 수 있습니다.



Incidents를 발생 시킨 archive 단위로 표기되며, 일반적으로 war, jar 단위로 구분하여 보여주며



이슈 리스트가 한눈도록 노력한 흔적이 보이네요.

대부분이 Weblogic을 타 와스로 변경하는 도중 발생하게 되는 이슈 + Hard-coded IP address 이슈들로 확인됩니다.

- 그밖에 Unparsable Files Issue, Dependencies에 대한 분석도 가능합니다.


Unparsable Files의 경우 일반적으로 한글 깨짐등의 이유로 발생한 xml 파일측에 발생하는 경우가 대다수

Dependencies의 경우 Library 종속 관계는 물론 현재 application이 참고하고 있는 library 리스트 역시 확인 가능하니 유용하게 사용 가능


- 마지막으로 Information 성으로 Remote Services, Server Resources, Hibernate, Spring Beans, Hard-coded IP Address, Ignored Files, EJBs 정보들 역시 제공합니다. Remote Services를 판단하는건 개인적으로 봤을 때 RHAMT의 가장 큰 기능 중 하나라고 생각이 들 정도이며, Hard-coded IP Address 역시 손쉽게 파악할 수 있습니다.


RHAMT 4.2 다운로드 - https://developers.redhat.com/products/rhamt/download/

Red Hat Migration Tool Kit Menual - https://access.redhat.com/documentation/en-us/red_hat_application_migration_toolkit/4.2/

728x90
반응형