maven에는 중앙저장소와 원격저장소라는 개념이 있다. 큰 의미로 보면 중앙저장소도 원격저장소의 중 하나인데 일반적으로 중앙저장소라고 하면 maven central 로 불리며 https://repo.maven.apache.org/maven2 를 의미하고 원격저장소라고 하면 각 조직에서 자체적으로 구축하는 Nexus 등을 의미한다.
Nexus 는 일반적으로 인터넷망에 접속하지 못하는 망분리환경에서 내부적으로 의존성들을 관리하기 위해 사용된다. 물론 굳이 망분리 환경이 아니더라도 매번 외부망에서 의존성을 끌어오지 않고 내부망 Nexus를 proxy(cache)로 사용함으로써 좀 더 빠르게 의존성을 다운로드 할 수 있으며 조직 내부에서만 사용하는 의존성을 배포해서 여러팀간 공유하는 목적으로도 활용된다.
maven 에서 원격 저장소 지정은 settings.xml 또는 pom.xml 파일에 아래와 같이 하면 된다.
<repositories>
<repository>
<id>mypiece-group</id>
<name>Mypiece Group</name>
<url>http://repo.mypiece.io/content/groups/mypiece-group</url>
<releases>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
그런데 만약 Nexus 에 없는데 maven central 에 있는 의존성을 다운로드 해야 할 경우는 어떻게 해야 할까? 나는 Nexus와 maven central 를 별개로 생각해서 위 <repositories> 안에 https://repo.maven.apache.org/maven2 를 별도로 추가해야 한다고 생각했는데 전혀 그럴 필요가 없다.
Nexus 에는 기본적으로 maven central 설정이 되어 있는데 클라이언트가 현재 Nexus에 존재하지 않는 의존성을 요청했을 경우 maven central 에서 의존성을 다운 받아서 Nexus 스토리지에 저장하고 그것을 클라이언트에 서비스 한다. 이에 Nexus를 사용한다면 클라이언트에 maven central 를 저장소를 별도로 설정할 필요는 없다.
물론 클라이언트에서 effective pom을 확인하면 maven central이 기본적으로 설정되어 있지만 Nexus 를 사용할 경우 그게 아니라 Nexus에 설정된 maven central 이 사용된다. 사실 maven의 경우 effective pom에 기본적으로 포함된 maven central 때문에 좀 헷갈릴 수 있는데 gradle 이라면 이게 좀 더 명확해진다.
gradle의 경우 maven의 pom.xml 에 해당하는 build.gradle에 repository로 아무것도 지정하지 않으면 maven 과 달리 어떠한 repository도 기본으로 등록되지 않는다. 그렇기 때문에 그 상태에서 의존성을 구성하면 다운로드시 참조할 저장소가 없다는 에러가 발생하는데 그 상황에서 Nexus 저장소를 설정하면 당장 Nexus 에 없는 의존성이라도 전혀 문제가 되지 않는 것을 확인할 수 있다.
물론 macen central 외에 jcenter 같은 저장소가 필요하다면 추가로 설정을 해줘야 한다. 클라이언트에서 설정하든 Nexus에 설정하든 결과는 같지만 Nexus 에 설정해야 proxy 를 사용하는 장점을 누릴 수 있다.
'Base > CI, CD' 카테고리의 다른 글
Jenkins Kubernetes Plagin 구성시 주의사항 (0) | 2021.06.05 |
---|---|
컨테이너 환경에서 Gradle (0) | 2021.05.26 |
maven 인코딩 설정 (0) | 2021.05.18 |
gradle 에서 maven optional, provided 설정하기 (0) | 2021.05.05 |
maven 커멘트 옵션 정리 (0) | 2021.04.23 |