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}'
}
'[개발] Info > 용어' 카테고리의 다른 글
[Network] Socket (0) | 2023.12.12 |
---|---|
전통적인 MVC (0) | 2023.12.12 |
분산 락(Distributed Lock) (1) | 2023.12.06 |
Kafka Connector (0) | 2023.11.30 |
Debezium (0) | 2023.11.30 |