업무적으로 Azure Eventhub를 연동할 일이 생겼습니다. 공식 사이트에서 API 제공하는 언어를 살펴보니 대표적으로 Python, Java, C(넣기만 가능)가 있습니다.
원래 익숙한 언어는 C 언어였지만 넣기만 가능했고, 그나마도 테스트를 했더니 길이가 긴 텍스트(대용량 텍스트)의 경우 제대로 넣지 못하는 문제를 발견했습니다.
랜덤으로 생성되는 연결문자열에 '/(슬래시)'가 있는 경우 내부적으로 문자열 끝으로 인식하는 것인지 접속할 수 없는 현상이 있었습니다. 그래서 '/(슬래시)'가 없을 때까지 연결문자열을 재생성하여 사용하였습니다.
프로그램 특성 상 네트워크 통신도 필요했고 멀티쓰레드 환경에서 안정적인 성능이 나올 언어로 Java를 선택하였습니다. 너무 오랜만이라 사용하는 클래스도 많이 달라져서 낯설었지만 적응할 시간도 없이 개발을 시작하였습니다. 리눅스 환경에서 Java 구현은 처음이었지만 Eclipse는 친근해서 그나마 다행이었습니다.
아파치 메이븐(Apache Maven)은 자바용 프로젝트 관리 도구이다. 아파치 앤트의 대안으로 만들어졌다. 아파치 라이선스로 배포되는 오픈 소스 소프트웨어이다. - 위키백과 -
이전에 개발한 내용이지만 정리를 위해 Windows에서 다시 실행해보았습니다.
1. JDK(JRE) 설치
2. Maven 설치
group id는 프로젝트를 구현하는 팀의 아이디로 저는 간단히 rnd.dev라고 입력하였습니다.
artifact id는 프로젝트 식별 아이디로 프로젝트 이름이라고 생각하시면 됩니다. 이 이름은 프로젝트 최상위 폴더 이름으로 사용됩니다.
POM(Project Object Model) 파일 내부에 앞으로 Maven Project에서 사용할 라이브러리를 코드로 추가하면 자동으로 프로젝트에 라이브러리 파일을 로드해서 연결해 줍니다. 추가 삭제 또한 모두 이 파일을 수정해서 업데이트만 하면 되므로 관리하기 편합니다.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>rnd.dev</groupId>
<artifactId>eventhub</artifactId>
<version>0.0.1-SNAPSHOT</version>
</project>
Maven Repository에 가서 azure-messaging-eventhubs를 검색했습니다. 원하는 라이브러리가 있다면 모두 검색 가능합니다.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>rnd.dev</groupId>
<artifactId>eventhub</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-messaging-eventhubs</artifactId>
<version>5.11.2</version>
</dependency>
</dependencies>
</project>
그럼 간략히 Main 함수를 정의하여 프로젝트가 실행되는 지 확인해보겠습니다.
package eventhub;
public class EventhubSender {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Hi");
}
}
이렇게 하면 Maven으로 왜 구현했을까 의문이 들 것입니다. Maven으로 실행하기 위해 pom.xml 파일에 추가 작업이 필요합니다.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>rnd.dev</groupId>
<artifactId>eventhub</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-messaging-eventhubs</artifactId>
<version>5.11.2</version>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>eventhub.EventhubSender</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<mainClass>eventhub.EventhubSender</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</project>
<properties> 태그가 추가되었습니다. 그리고 <build> 라는 엄청 긴 태그가 추가되었습니다. 여기에 들어가 있는 plugin 기능들을 이제 Eclipse에서 확인할 수 있습니다.
1.8이라고 되어 있는 부분은 JRE Library 설정에서 제가 선택한 자바 버전입니다. (사용하는 버전에 따라 수정하셔야 합니다.)
<mainClass> 태그는 Maven에게 Main 함수가 있는 클래스를 알려주는 부분이라 패키지명부터 입력하시면 됩니다. (eventhub.EventhubSender 부분 수정 필요합니다.)
clean compile assembly:single
🙅♀️ 주의할 점
빌드 진행 중일 때 target 폴더를 접근하지 않도록 해야 합니다.
cmd를 열어서 바로 실행해야지 하며 해당 경로로 path 지정하여 대기하고 있거나 target 폴더를 파일 탐색기에서 열어 놓은 경우 Maven 빌드를 할 때마다 target 폴더를 재생성하는데 열린 폴더는 삭제를 할 수 없어 자꾸 ERROR가 발생합니다.
Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:3.1.0:clean
java -jar -Dfile.encoding=UTF-8 ./eventhub-0.0.1-SNAPSHOT-jar-with-dependencies.jar
이 과정은 Eclipse와 pom.xml 설정 간에 동기화를 위한 것이므로 Maven을 잘 활용하기 위해서는 염두해두어야 하는 과정입니다.
이제 환경설정을 해놓았으니 Java로 계속 구현하고 배포까지 가능합니다.