이 글에서는 Eclipse Java 프로젝트를 Maven 프로젝트로 변환했을 때의 이점과 변환 방법을 소개합니다.
구분
설명
소스 폴더 위치
Eclipse Java 프로젝트
Eclipse에서 File -> New -> Project -> Java -> Java Project 메뉴를 통해서 생성한 프로젝트
src
Maven 프로젝트
Maven을 사용해서 빌드하는 프로젝트 (Eclipse의 File -> New -> Project -> Maven -> Maven Project 메뉴를 통해서 생성할 수도 있음)
src/main/java src/test/java
개발하고 있는 Java 응용프로그램 프로젝트의 규모가 복잡하지 않더라도 그 수가 수십 개에 이르고 IDE와 빌드 도구마저 제각각이라면 이로부터 발생하는 어려움들을 과소평가해서는 안됩니다. 대표적인 어려움 몇 가지를 적어보면 아래와 같습니다.
이 프로젝트의 배포용 실행 파일을 어떻게 만들지?
타겟 클래스 버전은?
어떤 파일들이 실행 파일에 포함되어야 하지?
리소스 파일은 어디에 복사해야 하지?
외부 참조 파일은 어떤 방식으로 포함시키지?
새롭게 빌드한 결과 파일의 크기가 왜 기존의 결과 파일 크기와 다르지?
IDE가 제공하는 자체 빌드 도구를 통해서 위의 어려움들을 어느 정도 완화시킬 수는 있지만 만족스러운 정도는 아니며 모든 개발자들이 동일한 IDE를 쓰도록 유도하는 것도 쉽지는 않습니다. 왜냐하면 각자 IDE를 선택하는 데에는 여러 가지 이유가 있을 것이기 때문입니다. 다행히도 위와 같은 문제를 해결하기 위해 탄생한 빌드 전문 도구인 Maven을 사용하면 프로젝트 정보를 pom.xml 파일에서 지정하고 mvn package 명령을 실행함으로써 배포용 실행 파일을 만들어 낼 수 있습니다.
어찌보면 당연해 보이는 이야기를 굳이 하는 이유는 IDE 제공 빌드 도구를 사용해서 빌드하는 프로젝트들이 생각보다 많기 때문입니다.
2. 변환했을 때의 이점
2.1. 의존성 관리 개선
2.1.1. Eclipse
외부 라이브러리들을 특정 경로에 보관하고 이들을 참조하도록 빌드 구성을 수정합니다.
사용할 라이브러리 버전을 바꾸고자 한다면 새로운 라이브러리 파일을 다운로드해서 저장하고 이 파일을 참조하도록 빌드 구성을 수정합니다.
동일한 프로젝트 소스를 가지고 새로운 PC에서 개발 환경을 구성할 때 라이브러리 파일 저장 경로를 기존과 동일하게 유지하지 않으면 빌드 구성을 수정해 주어야 합니다.
2.1.2. Maven
참조할 외부 라이브러리들에 대한 정보(groupId, artifactId, version)를 pom.xml 파일에서 지정합니다.
사용할 라이브러리 버전을 바꾸고자 한다면 version 값만 수정하면 됩니다.
새로운 PC에 개발 환경을 구성할 때 라이브러리 파일 저장 경로와 관련하여 수정할 사항은 없습니다.
2.2. 단위 테스트 개선
2.2.1. Eclipse
JUnit 라이브러리를 참조하도록 빌드 구성을 변경하고 테스트 코드를 작성하여 실행합니다. 복잡한 편은 아니지만 프로젝트가 많을 때, 사용하는 IDE가 서로 다를 때 불편할 수 있습니다.
2.2.2. Maven
JUnit 의존성을 추가하고 테스트 코드를 작성하여 실행하는 과정이 간편합니다.
2.3. JAR 파일 묶기 개선
2.3.1. Eclipse
Export -> Runnable JAR file 메뉴로 실행 가능한 JAR 파일을 만듭니다. 하나의 프로젝트에 대해 작업을 반복해야 하거나 여러 프로젝트들에 대해서 작업을 수행해야 할 때 매우 번거로운 과정이 될 수 있습니다.
2.3.2. Maven
pom.xml 파일에 shader 플러그인을 추가하고 mvn package 명령으로 실행 가능한 JAR 파일을 만듭니다. 한 줄 명령을 실행하는 것으로 원하는 결과를 얻을 수 있습니다.
3. 변환 방법
3.1. Eclipse에서 변환
Eclipse 내에서 아래의 과정을 수행합니다.
프로젝트를 선택한 상태에서 마우스 오른쪽 버튼을 클릭합니다.
컨텍스트 메뉴 Configure -> Convert to Maven Project를 클릭합니다.
Create new POM 대화상자에서 입력 값을 그대로 두거나 변경한 후 Finish 버튼을 클릭합니다.
Eclipse를 종료합니다.
위 작업의 결과로 Eclipse가 사용하는 .project 파일과 .classpath 파일이 변경되고 Maven이 사용하는 pom.xml 파일이 생성됩니다.
진단 장비의 성능을 파악하기 위하여 질병의 유무를 알고 있는 사람들을 대상으로 진단을 수행하고 아래와 같이 혼동행렬을 작성합니다.
A: 진양성(True Positive) 수
B: 위양성(False Positive) 수
C: 위음성(False Negative) 수
D: 진음성(True Negative) 수
성능 평가
민감도(Sensitivity)
질병이 있는 사람을 양성으로 판정하는 정도를 민감도(sensitivity)라고 하며 아래와 같이 구합니다.
민감도 = A+CA
특이도(Specificity)
질병이 없는 사람을 음성으로 판정하는 정도를 특이도(specificity)라고 하며 아래와 같이 구합니다.
특이도 = B+DD
재현율(Recall)
민감도와 같습니다.
재현율 = A+CA
정밀도(Precision)
정밀도 = A+BA
정확도(Accuracy)
정확도 = A+B+C+DA+D
성능 지표
AUC ROC
양성, 음성 판단 기준을 변경하면 혼동행렬에서 A, B, C, D의 값이 달라지고 이것은 민감도와 특이도가 변한다는 것을 의미합니다. 그래서 양성, 음성 판단 기준을 조정해 가면서 아래와 같은 민감도, 특이도 그래프를 그릴 수 있습니다.
TP 비율(True Positive Rate) = 민감도
FP 비율(False Positive Rate) = 1 - 특이도
그래프 곡선 아래의 면적을 구함으로써 성능 평가 지표인 AUC(Area Under the Curve) ROC(Receiver Operating Characteristic)를 구합니다. 아래 그림의 그래프를 살펴 보면 AUC가 클수록 낮은 FP 비율을 유지하면서도 더 높은 TP 비율을 보여줍니다. 즉 서로 다른 두 장비의 진단 성능을 비교할 때 AUC가 큰 쪽의 진단 성능이 더 좋다고 말할 수 있습니다.
F1 Score
양성, 음성 판단 기준을 변경하면 혼동행렬에서 A, B, C, D의 값이 달라지고 이것은 Recall과 Precision이 변한다는 것을 의미합니다. 위양성과 위음성을 모두 고려하여 성능을 평가할 때 아래와 같이 계산한 F1 Score를 사용할 수 있습니다.