본문 바로가기
개발/아키텍처

Nexus Repository

by Devsong26 2023. 12. 8.

Nexus Repository는 소프트웨어 개발에서 중요한 역할을 하는 아티팩트 저장소 관리 도구입니다. 이 도구는 개발자들이 라이브러리, 프레임워크, 다양한 소프트웨어 패키지를 중앙 집중식으로 관리할 수 있게 해주며, 소프트웨어 빌드 및 배포 과정을 효율화하는 데 도움을 줍니다. Nexus Repository는 Sonatype사에 의해 개발되었습니다.

 

 

주요 특징

  • 중앙 집중식 저장소 관리
    • Nexus Repository는 Maven, NuGet, npm, RubyGems 등 다양한 패키지 포맷을 지원합니다. 이를 통해 여러 언어와 프레임워크에 걸쳐 아티팩트를 중앙 집중식으로 관리할 수 있습니다.
  • 버전 관리 및 배포 지원
    • 소프트웨어 아티팩트의 버전 관리를 지원하며, CI/CD 파이프라인과 통합하여 자동화된 빌드와 배포가 가능합니다.
  • 보안 및 액세스 관리
    • Nexus는 보안 규칙, 액세스 제어, LDAP 통합 등을 통해 저장소의 보안을 강화합니다. 사용자와 그룹에 대한 권한 관리를 통해 누가 어떤 아티팩트에 접근할 수 있는지 제어할 수 있습니다.
  • 프록시 저장소 기능
    • 외부 저장소(예: Maven Central)에 있는 아티팩트를 프록시할 수 있어, 외부 저장소에 직접 접근하지 않고도 필요한 아티팩트를 사용할 수 있습니다.
  • 캐싱 및 네트워크 최적화
    • 외부 저장소로부터 다운로드한 아티팩트를 로컬에 캐싱하여, 동일한 아티팩트에 대한 반복적인 다운로드 요청을 줄여 네트워크 트래픽과 빌드 시간을 줄일 수 있습니다.
  • 다양한 배포 옵션
    • Nexus Repository는 오픈 소스 버전과 상업적인 버전(Nexus Repository Pro)으로 제공됩니다. 상업적 버전에는 추가 기능이 포함되어 있습니다.

 


활용 사례

  • 의존성 관리
    • 프로젝트에서 필요한 라이브러리와 프레임워크를 효율적으로 관리할 수 있습니다.
  • 소프트웨어 배포
    • 빌드된 소프트웨어 패키지를 안정적으로 배포하고 공유할 수 있습니다.
  • 팀 및 조직 간 협업
    • 아티팩트를 중앙화된 위치에서 관리함으로써 팀 내외부의 협업을 용이하게 합니다.



Nexus Repository는 소프트웨어 개발 및 배포의 복잡성을 줄이고, 효율성을 높이며, 다양한 언어와 환경에서의 협업을 지원하는 강력한 도구입니다.

 

 


 

실습

자바 공통 모듈을 넥서스에 업로드하고 빌드 시 다운로드 받도록 하겠습니다.

 

 

Nexus 셋팅

  • 계정을 생성합니다.
  • 생성된 계정에 아래 권한을 등록합니다.
  • 파일 업로드 
    • Create (nx-repository-view-*-create): 새로운 Artifact를 저장소에 추가할 수 있는 권한입니다
    • Update (nx-repository-view-*-edit): 기존 Artifact를 수정하거나 업데이트할 수 있는 권한입니다.
    • Read (nx-repository-view-*-read): Artifact 및 저장소의 메타데이터를 읽을 수 있는 권한입니다. 업로드 프로세스 중에 필요할 수 있습니다.
  • 파일 다운로드
    • Read (nx-repository-view-*-read): 저장소에서 Artifact를 읽고 다운로드할 수 있는 권한입니다

 

 

환경

  • gradle: 7.4
  • java: 17

 

 

공통 모듈 디렉터리 구조

root-project\
|
| ---- sub-project\
|         |
|         | ---- src\
|         | ---- build.gradle
|
| ---- .gitignore
| ---- build.gradle
| ---- gradlew
| ---- gradlew.bat
| ---- settings.gradle

 

 

root-project settings

 

settings.gradle

rootProject.name = 'root-project'
include 'sub-project'

 

build.gradle

allprojects{
	repositories {
		mavenCentral()
	}
}

subprojects{
	apply plugin: 'java'

	dependencies {
		// 공통 의존성
		testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.2'
		testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
	}
}

 

 

sub-project settings

plugins {
	id 'java'
	id 'maven-publish'
}

group = '#{group}'
version = '#{SNAPSHOT}'

java {
	sourceCompatibility = '17'
}

tasks.named('test') {
    useJUnitPlatform()
}

tasks.withType(JavaCompile) {
	options.encoding = 'UTF-8'
}

publishing {
	publications {
		mavenJava(MavenPublication) {
			from components.java
		}
	}

	repositories {
		maven {
			// SNAPSHOT 버전의 경우
			url "{#nexus_domain}/repository/maven-snapshots/"

			// RELEASE 버전의 경우
//			url "{#nexus_domain}/repository/maven-releases/" // 여기에 Nexus 저장소 URL을 입력하세요
			allowInsecureProtocol = true
			credentials {
				username '#{username}' // Nexus 사용자 이름
				password '#{password}' // Nexus 비밀번호
			}
		}
	}
}
  • nexus_domain이 https가 아닐 경우 allowInsecureProtocol = true 설정을 해야합니다.
  • gradle 6 버전 이상부터는 기본설정이 https입니다.
  • 설정이 완료되면 publish task를 이용하여 넥서스에 업로드합니다.

 

 

다운받는 프로젝트의 build.gradle 셋팅

repositories {
	// 기존 Maven Central이나 jcenter와 같은 기본 저장소
	mavenCentral()

	// Nexus 스냅샷 저장소
	maven {
		url '#{nexus_domain}/repository/maven-snapshots/'
		allowInsecureProtocol = true
		credentials {
			username '#{username}' // Nexus 사용자 이름
			password '#{password}' // Nexus 비밀번호
		}
	}
}

dependencies {
	
    // nexus repository
    implementation '#{group}:#{sub-project}:#{snapshot}'
    
}

'개발 > 아키텍처' 카테고리의 다른 글

logback  (0) 2023.12.26
트랜잭션 스크립트 패턴  (0) 2023.12.19
Flagger  (0) 2023.12.05
Hystrix  (0) 2023.11.30
Kafka Connector  (0) 2023.11.30