본문 바로가기

SW 아키텍처 이야기

오픈소스 라이브러리 Maven Central Repository에 배포하기 (#1)

오픈소스로 개발된 라이브러리를 다른 프로젝트에서 활용하게 하려면 Maven의 Central Repository 등과 같은 public repository에 배포를 해야 한다. 하지만, 배포를 위해 준비해야 할 것들이 생각보다 많다. 이에 대한 얘기를 SOSCON(Samsung Open Source Conference, 2019)에서 발표한 것이 있는데, 여기서 다시 정리해 보고자 한다.

Maven Central Repository?

무엇보다도 Maven의 repository와 Maven Central Repository, 그리고 이에 대한 운영 방식을 먼저 이해해야 한다.

Maven Repositories

Maven은 Java 애플리케이션 빌드를 지원하는 도구로서 라이브러리에 대한 의존성 관리 메커니즘을 제공하는데, 로컬이 아닌 원격에 있는 라이브러리 저장소(repository)로부터 필요한 정보들을 가져와 사용한다. 이를 Remote Maven Repository라고 하는데, 크게 인터넷 상에 공개되어 있는 Public Maven Repositories와 기업 내부에서만 사용하는 Private Maven Repositories로 구분된다. Public은 다시 Maven에서 공식적으로 사용하는 Maven Central Repository와 JBoss, Google, Oralce 등과 같은 기업에 제공하는 3rd Party Maven Repositories로 구분된다.

Central Repository는 별도 설정이 없어도 Maven이나 sbt와 같은 빌드 툴에서 바로 사용할 수 있고, 3rd Party Repository들은 URL을 알고 추가로 지정만 하면 바로 사용할 수 있다. 하지만 Private Maven Repositories들은 기업 내부 네트워크나 방화벽에 의해 통제가 되는 것이 일반적이고 인증을 거쳐야지만 사용할 수 있는 것이 대부분이다. 

물론 여기서 사용할 수 있다는 것은 등록되어 있는 artifacts를 depenency 지정을 통해 사용할 수 있다는 것이고, 해당 Repository에 직접 artifacts를 등록(deploy)할 수는 없다. 그러면 내가 만든 오픈소스 라이브러리를 등록하려면 어떻게 해야 할까? 이를 위해 Maven Central Repository의 구성을 좀 더 살펴보자.

Maven Central Repository

Maven Central Repository는 단독으로 구성되지 않고 다음과 같은 3가지 repositories 유형과 동기화 방식으로 구성된다.

  • 특정 프로젝트에 소속된 repositories와 rsync로 양방향 동기화를 통해 연결되어 있으나, 2010년부터는 사용되지 않는다. rsync 양방향으로 문제가 좀 있었다고 한다.
  • Apache 재단 등과 같은 승인된 호스팅 repositories로부터 단방향(push) 연동을 지원한다. 현재는 Apache, FuseSource, Nuiton.org 3개의 사이트가 있지만 시기에 따라 다르고, 언제든 협의를 통해 등록되거나 제외될 수 있다.
  • 이와는 별도로 Sonatype이라는 회사에서 운영하고 있는 OSSRH(OSS Repository Hosting)도 단방향(push) 연동이 된다.

그리고 이와같이 연동된 정보들은 CDN으로 배되거나 ibiblio와 google 미러(mirror) 사이트로 배포된다. 여기서 CDN은 https://repo1.maven.org/maven2/ URL을 갖고 있으며 현재 2010년 11월 기준으로 578만 GAV, 36만 GA artifacts를 가지고 있다. (GAV는 GroupId/ArtifactId/Version, GA는 GroupId/ArtifactId으로 각각 버전을 포함한 artifact와 버전을 포함하지 않은 artifact를 뜻함)

아울러, 위 Central Repository 주소로 들어가면 디렉토리 리스트만을 볼 수 있고, 몇 개 디렉토리를 선택해 들어가야지만 의존성 관련 파일들(*.pom, *.jar 등)을 확인할 수 있다. 이는 사람이 보기 위한 정보가 아니라 Maven과 같은 툴이 사용하는 형태라 그렇고, 우리가 Maven Central Reposiotry에서 정보를 찾으려면 https://search.maven.org/ URL을 통해 가능하다. 

그외 MvnRepository(https://mvnrepository.com/) 사이트와 같이 1200개 이상의 repositories를 통합 검색해 주고, 다양한 부가 정보를 제공하는 사이트도 있다.

 

 

 

 

 

여기서 좀 의아한 점은 공식 검색 사이트(https://search.maven.org)를 들어가 보면 상단 로고에 Maven이 아닌 "sonatype"이라는 로고를 볼 수 있다는 것이다. 이 회사는 Apache Maven 프로젝트 핵심 Contributor로 Repository Manager 소프트웨어인 Nexus를 만들고 있다. 그리고 OSSRH 서비스도 제공하고 있다는 것이다. 즉, OSSRH는 공식적으로 Maven에 라이브러리를 배포할 수 있는 채널인 것이다.

OSSRH(Open Source Software Repository Hosting)

Apache 재단이 아닌 일반적인 개인이나 회사의 경우는 sonatype에서 운영하는 OSSRH 서비스를 통해 라이브러리를 Maven Central Repository에 배포할 수 있다. 그리고 현재 다음과 같은 요구사항들이 모두 충족되어야 Central Repository로 배포가 가능하다.

  • Releases : 릴리즈 버전만 배포 가능하다. 이는 릴리즈에 특별한 의미가 있다기 보다는 한 번 등록된 버전은 삭제 및 변경이 불가능하다.
  • Javadoc & sources : IDE에서 바로 해당 라이브러리의 javadoc이나 소스를 바로 확인할 수 있도록 *.jar뿐만 아니라 *-javadoc.jar와 *-sources.jar가 같이 배포되어야 한다.
  • PGP signature : 변조 방지를 위해 PGP 전자서명도 같이 제공되어야 한다.
  • Minimum POM information : pom.xml에는 라이선스, 개발자 등의 최소 정보(license, developers, scm )를 포함해야 한다.
  • Coordinates 정책 준수 : groupId 정책으로 groupId에 대한 정보는 domain 소유자만이 등록 가능하다.
    • groupId 가이드라인 eg) samsungsds.com -> com.samsungsds, github.com/username -> io.github.username
    • artifactId 가이드라인 eg) maven-core, commons-math
    • version 가이드 : Semantic Versioning (참고 : https://semver.org/lang/ko/)

지금까지 Maven Repository와 Central Repository, 그리고 OSSRH에 대해 간단히 알아봤다. 다음에는 OSSRH를 사용하는 본격적인 절차에 대해 알아보자. (다음 블로그에서)

Written with by Vincent Han