Nexus Repository 유형 및 Spring Boot 연동
Nexus에 Proxy, Hosted, Group이라는 저장소 유형이 있는데, 각각 왜 존재하고 Spring Boot에서는 어떤 URL을 써야 할까요?
Nexus Repository 는 용도별로 네 가지 유형(Proxy, Hosted, Group, Virtual)을 제공합니다. 이 유형들을 이해해야 pom.xml과 settings.xml을 올바르게 설정할 수 있습니다.
Repository 유형
| 유형 | 역할 | 실제 사용 예시 |
|---|---|---|
| Proxy | 외부 저장소를 캐싱하는 중계 역할 | Maven Central, JCenter 등의 미러 |
| Hosted | 내부 아티팩트를 저장하는 사설 저장소 | 사내 공통 라이브러리 배포 |
| Group | 여러 저장소를 하나의 URL로 묶는 역할 | Proxy + Hosted를 단일 엔드포인트로 제공 |
| Virtual | 서로 다른 포맷 간 연결 (레거시) | Maven 1 ↔ Maven 2 변환 (현재 거의 사용하지 않음) |
Proxy Repository
Proxy Repository는 Maven Central 같은 ** 외부 공개 저장소의 캐싱 프록시** 역할을 합니다.
개발자가 외부 라이브러리를 요청하면, Nexus가 먼저 캐시에서 확인하고, 없으면 외부 저장소에서 다운로드하여 캐시에 저장한 뒤 응답합니다. 이후 동일한 라이브러리 요청은 캐시에서 바로 제공됩니다.
Proxy Repository를 사용하면 외부 저장소 장애나 네트워크 불안정 상황에서도 이미 캐싱된 라이브러리는 정상적으로 사용할 수 있습니다. 또한 개발 서버가 외부망에 접근할 수 없는 폐쇄망 환경에서 필수적입니다.
Hosted Repository
Hosted Repository는 ** 팀에서 직접 개발한 아티팩트를 저장하고 배포하는 사설 저장소 **입니다. Version Policy에 따라 Release용과 Snapshot용으로 분리하여 운영합니다.
Version Policy
| 정책 | 설명 | 특징 |
|---|---|---|
| Release | 안정적으로 배포 및 사용되는 확정 버전 | 한 번 배포한 아티팩트는 변경 불가. 수정이 필요하면 버전 번호를 올려야 합니다 (예: 1.0.0 → 1.0.1) |
| Snapshot | 개발 중인 미확정 버전 | 동일 버전으로 수시 업데이트 가능. 버전에 타임스탬프 기반 UUID가 자동으로 붙습니다 (예: 1.0.0-20250101.120000-1) |
| Mixed | Release와 Snapshot 구분 없이 저장 | 소규모 프로젝트에서 저장소를 하나로 관리할 때 사용. 단, 버전 관리가 느슨해질 수 있으므로 권장하지 않습니다 |
Release와 Snapshot을 분리하는 이유는 명확합니다. Release 저장소에는 검증이 완료된 안정 버전만 올라가므로, 운영 환경에서 실수로 개발 중인 불안정한 버전을 참조하는 사고를 방지할 수 있습니다.
Group Repository
Group Repository는 Proxy와 Hosted 저장소를 하나의 URL로 묶어주는 가상 저장소 입니다.
Group이 없다면, 개발자는 pom.xml에 외부 라이브러리를 받기 위한 Proxy URL과 내부 라이브러리를 받기 위한 Hosted URL을 각각 등록해야 합니다. Group Repository를 사용하면 하나의 URL만 등록하면 됩니다.
[개발자의 Maven 요청]
│
▼
┌─────────────┐
│ Group Repo │ ← 단일 URL로 접근
│ (maven- │
│ public) │
└──────┬──────┘
│
┌────┴─────┐
▼ ▼
┌────────┐ ┌────────┐
│ Proxy │ │ Hosted │
│ (Maven │ │(Release│
│Central)│ │/Snap) │
└────────┘ └────────┘
Nexus 설치 시 기본 생성되는
maven-public이 바로 Group Repository입니다. 일반적으로 이 URL 하나만pom.xml에 등록하면 됩니다.
Virtual Repository
Virtual Repository는 Maven 1 형식과 Maven 2 형식 간의 변환을 위해 존재했던 레거시 유형입니다. 현재는 Maven 2(및 3) 형식이 표준이므로, 새로운 환경에서는 사용할 일이 거의 없습니다.
Spring Boot와 Nexus 연동
Nexus 연동은 크게 두 가지 흐름으로 나뉩니다.
- 라이브러리를 받으려면 →
settings.xml(인증) +pom.xml의<repositories>(저장소 URL) - ** 내부 라이브러리를 배포하려면** →
pom.xml의<distributionManagement>(배포 대상 URL)
1단계: Maven settings.xml에 인증 정보 등록
Nexus 저장소에 접근하려면 인증이 필요합니다. 인증 정보는 프로젝트 파일(pom.xml)이 아닌 ** 로컬 Maven 설정 파일 **에 작성하여 보안을 유지합니다.
<!-- ~/.m2/settings.xml -->
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
<!-- Nexus 서버 인증 정보 -->
<server>
<id>nexus-releases</id> <!-- pom.xml의 repository id와 반드시 일치해야 함 -->
<username>deployer</username> <!-- Nexus 계정 -->
<password>deployer123</password><!-- Nexus 비밀번호 -->
</server>
<server>
<id>nexus-snapshots</id>
<username>deployer</username>
<password>deployer123</password>
</server>
</servers>
</settings>
<server>의<id>값은 이후pom.xml에서 사용하는<repository>의<id>와 정확히 일치해야 합니다. 이 값이 다르면 Maven이 인증 정보를 찾지 못해401 Unauthorized오류가 발생합니다.
설정 후, IntelliJ에서 Settings → Build, Execution, Deployment → Build Tools → Maven → User settings file 경로를 ~/.m2/settings.xml로 지정합니다.
2단계: pom.xml에 저장소 URL 등록 (라이브러리 다운로드)
Nexus에서 라이브러리를 받아오려면 <repositories>에 저장소 URL을 등록합니다.
<!-- pom.xml -->
<repositories>
<!-- Nexus Group Repository (Proxy + Hosted를 포함하는 단일 URL) -->
<repository>
<id>nexus-releases</id>
<name>Nexus Release Repository</name>
<url>https://nexus.example.com/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
Group Repository URL을 사용하면, Maven이 하나의 URL로 외부 라이브러리(Proxy)와 내부 라이브러리(Hosted) 모두를 받아올 수 있습니다.
3단계: pom.xml에 배포 설정 추가 (내부 라이브러리 배포)
팀에서 개발한 라이브러리를 Nexus에 배포하려면 <distributionManagement>를 설정합니다. mvn deploy 명령 실행 시 이 설정에 따라 아티팩트가 업로드됩니다.
<!-- pom.xml -->
<distributionManagement>
<!-- Release 버전 배포 저장소 -->
<repository>
<id>nexus-releases</id> <!-- settings.xml의 server id와 매칭 -->
<url>https://nexus.example.com/repository/maven-releases/</url>
</repository>
<!-- Snapshot 버전 배포 저장소 -->
<snapshotRepository>
<id>nexus-snapshots</id> <!-- settings.xml의 server id와 매칭 -->
<url>https://nexus.example.com/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
Maven은 pom.xml의 <version> 값에 -SNAPSHOT 접미사가 있으면 <snapshotRepository>로, 없으면 <repository>로 배포합니다.
# 배포 실행
mvn deploy
연동 시 자주 발생하는 문제
| 증상 | 원인 | 해결 방법 |
|---|---|---|
401 Unauthorized | settings.xml의 <server> id와 pom.xml의 <repository> id 불일치 | 두 파일의 id 값을 동일하게 맞춥니다 |
405 Method Not Allowed | Hosted Repository에 이미 동일 버전의 Release 아티팩트가 존재 | 버전을 올리거나, Nexus 관리 화면에서 기존 아티팩트를 삭제합니다 |
Could not transfer artifact | Nexus URL이 잘못되었거나, 네트워크 접근이 차단됨 | URL 확인 및 방화벽/프록시 설정을 점검합니다 |
PKIX path building failed | HTTPS 인증서를 신뢰하지 못함 (사설 인증서 사용 시) | JVM의 truststore에 Nexus의 SSL 인증서를 등록합니다 |
주의할 점
settings.xml과 pom.xml의 id 불일치
가장 흔한 실수입니다. settings.xml의 <server><id>와 pom.xml의 <repository><id>가 한 글자라도 다르면 Maven이 인증 정보를 찾지 못해 401 Unauthorized가 발생합니다. 복붙할 때 공백이 포함되지 않았는지 확인합니다.
Release 저장소에 동일 버전 재배포
Release 저장소는 한 번 배포한 아티팩트를 덮어쓸 수 없습니다. 동일 버전(1.0.0)을 다시 배포하면 405 Method Not Allowed가 발생합니다. 수정이 필요하면 반드시 버전 번호를 올려야 합니다.
정리
| 항목 | 설명 |
|---|---|
| Proxy | 외부 저장소 캐싱 (Maven Central 미러) |
| Hosted | 내부 아티팩트 저장 (Release / Snapshot 분리) |
| Group | Proxy + Hosted를 단일 URL로 묶음 |
| 라이브러리 다운로드 | pom.xml의 <repositories> + settings.xml의 인증 |
| 라이브러리 배포 | pom.xml의 <distributionManagement> → mvn deploy |
| id 매칭 | settings.xml과 pom.xml의 id가 반드시 일치해야 함 |