# 로컬 Nexus 테스트 환경 구성 가이드 Docker를 사용하여 로컬에서 Nexus Repository Manager를 실행하고 테스트하는 가이드입니다. ## 사전 요구사항 - Docker Desktop (Windows/Mac) 또는 Docker Engine (Linux) - Docker Compose ## 1단계: Docker Compose로 Nexus 실행 ### 1-1. Nexus 및 MariaDB 시작 ```bash # Nexus와 MariaDB 동시 실행 docker-compose -f docker-compose-nexus.yml up -d # 로그 확인 docker-compose -f docker-compose-nexus.yml logs -f nexus ``` ### 1-2. Nexus 초기 비밀번호 확인 Nexus가 처음 시작될 때 임시 비밀번호가 생성됩니다 (~2-3분 소요): ```bash # Windows (PowerShell) docker exec nexus cat /nexus-data/admin.password # Linux/Mac docker exec nexus cat /nexus-data/admin.password ``` **출력 예:** ``` a4b7c2d9-e3f1-4a5b-8c6d-1e2f3a4b5c6d ``` ## 2단계: Nexus 웹 접속 및 초기 설정 ### 2-1. 웹 브라우저 접속 ``` http://localhost:8081 ``` ### 2-2. 로그인 - Username: `admin` - Password: `(1단계에서 확인한 임시 비밀번호)` ### 2-3. 초기 설정 마법사 1. **새 비밀번호 설정**: `admin123` (또는 원하는 비밀번호) 2. **Anonymous Access**: `Enable anonymous access` 선택 3. **Finish** 클릭 ## 3단계: Maven Repository 설정 ### 3-1. Maven Central Proxy 확인 기본적으로 다음 Repository들이 생성되어 있습니다: - **maven-central**: Maven Central Proxy - **maven-releases**: Hosted Repository (Release) - **maven-snapshots**: Hosted Repository (Snapshot) - **maven-public**: Group Repository (위 3개 통합) ### 3-2. Repository 접근 확인 웹 UI에서: 1. 좌측 메뉴 → **Browse** 2. **maven-public** 선택 3. 라이브러리 검색 테스트 ## 4단계: 프로젝트 설정 ### 4-1. gradle.properties 생성 ```properties # Nexus 로컬 설정 nexusUrl=http://localhost:8081 nexusUsername=admin nexusPassword=admin123 # Repository URLs nexusMavenPublic=${nexusUrl}/repository/maven-public/ ``` ### 4-2. build.gradle 수정 ```gradle repositories { maven { url = "${nexusUrl}/repository/maven-public/" credentials { username = "${nexusUsername}" password = "${nexusPassword}" } allowInsecureProtocol = true // HTTP 사용 } } ``` ### 4-3. settings.gradle 수정 (선택사항) ```gradle pluginManagement { repositories { maven { url = "http://localhost:8081/repository/maven-public/" credentials { username = "admin" password = "admin123" } allowInsecureProtocol = true } } } ``` ## 5단계: 빌드 테스트 ```bash # 캐시 정리 gradlew.bat clean # 빌드 (의존성 다운로드) gradlew.bat build --refresh-dependencies ``` 첫 빌드 시 Nexus가 Maven Central에서 라이브러리를 다운로드하여 캐싱합니다. ## 6단계: Nexus에서 캐시 확인 ### 6-1. 웹 UI에서 확인 1. Browse → **maven-central** 2. 다운로드된 라이브러리 확인 (예: org/springframework/boot/) ### 6-2. 캐시 통계 확인 - **Administration** → **System** → **Nodes** - Blob Stores 크기 확인 ## 7단계: 내부 라이브러리 배포 (선택사항) ### 7-1. build.gradle에 배포 설정 추가 ```gradle publishing { publications { maven(MavenPublication) { from components.java groupId = 'com.example' artifactId = 'springbatch-test' version = '1.0.0' } } repositories { maven { name = 'nexus' url = "${nexusUrl}/repository/maven-releases/" credentials { username = "${nexusUsername}" password = "${nexusPassword}" } allowInsecureProtocol = true } } } ``` ### 7-2. 배포 실행 ```bash gradlew.bat publish ``` ### 7-3. Nexus에서 확인 Browse → **maven-releases** → com/example/springbatch-test ## Docker 명령어 모음 ### Nexus 관리 ```bash # 시작 docker-compose -f docker-compose-nexus.yml up -d # 중지 docker-compose -f docker-compose-nexus.yml stop # 재시작 docker-compose -f docker-compose-nexus.yml restart nexus # 로그 확인 docker-compose -f docker-compose-nexus.yml logs -f nexus # 완전 삭제 (데이터 포함) docker-compose -f docker-compose-nexus.yml down -v ``` ### MariaDB 관리 ```bash # MariaDB 접속 docker exec -it batch-mariadb mysql -u batch_user -p # 데이터베이스 확인 docker exec batch-mariadb mysql -u batch_user -pbatch_password -e "SHOW DATABASES;" ``` ## 테스트 시나리오 ### 시나리오 1: 의존성 다운로드 캐싱 1. 프로젝트 처음 빌드 2. Nexus 웹에서 maven-central 확인 3. 캐시된 라이브러리 확인 4. 두 번째 빌드 시 속도 향상 확인 ### 시나리오 2: 폐쇄망 시뮬레이션 1. 첫 번째 빌드로 의존성 캐싱 2. 인터넷 연결 끊기 (Wi-Fi OFF) 3. 프로젝트 clean 4. 다시 빌드 → Nexus 캐시로 성공해야 함 ### 시나리오 3: 내부 라이브러리 배포 1. 프로젝트 빌드 2. Nexus에 배포 3. 다른 프로젝트에서 의존성 추가 4. 정상 다운로드 확인 ## 리소스 사용량 ### 기본 메모리 할당 - Nexus: 2GB (1GB heap + 2GB direct memory) - MariaDB: 256MB ### 메모리 증가 (필요시) docker-compose-nexus.yml 수정: ```yaml environment: - INSTALL4J_ADD_VM_PARAMS=-Xms2g -Xmx2g -XX:MaxDirectMemorySize=4g ``` ## 트러블슈팅 ### Nexus 시작 안 됨 ```bash # 로그 확인 docker logs nexus # 포트 충돌 확인 netstat -ano | findstr :8081 # 재시작 docker-compose -f docker-compose-nexus.yml restart nexus ``` ### 비밀번호 초기화 ```bash # 컨테이너 중지 docker-compose -f docker-compose-nexus.yml stop nexus # 데이터 볼륨 삭제 (모든 데이터 손실!) docker volume rm springbatch-test_nexus-data # 재시작 docker-compose -f docker-compose-nexus.yml up -d nexus ``` ### 빌드 실패 ```bash # Gradle 캐시 정리 gradlew.bat clean --no-daemon rm -rf %USERPROFILE%\.gradle\caches # 의존성 새로고침 gradlew.bat build --refresh-dependencies ``` ## Nexus 고급 설정 ### 1. Gradle Plugin Portal Proxy **Administration → Repository → Repositories → Create repository** - Type: `maven2 (proxy)` - Name: `gradle-plugins` - Remote storage: `https://plugins.gradle.org/m2/` ### 2. 디스크 Cleanup **Administration → Tasks → Create task** - Type: `Admin - Compact blob store` - Blob store: `default` - Schedule: Daily ### 3. 익명 접근 비활성화 **Administration → Security → Anonymous Access** - `Allow anonymous users to access the server` 체크 해제 ## 프로덕션 환경으로 마이그레이션 로컬 테스트 완료 후 실제 Nexus 서버로 전환: ### gradle.properties 수정 ```properties # 로컬 Nexus (개발/테스트) # nexusUrl=http://localhost:8081 # 실제 Nexus (프로덕션) nexusUrl=http://nexus.company.com:8081 nexusUsername=your-username nexusPassword=your-password ``` ### HTTPS 사용 ```gradle maven { url = "https://nexus.company.com/repository/maven-public/" credentials { username = "${nexusUsername}" password = "${nexusPassword}" } // allowInsecureProtocol = false (기본값) } ``` ## 참고 자료 - [Nexus Repository Manager Documentation](https://help.sonatype.com/repomanager3) - [Docker Hub - Sonatype Nexus3](https://hub.docker.com/r/sonatype/nexus3) ## 다음 단계 1. [ ] Docker로 Nexus 실행 2. [ ] Nexus 웹 UI 접속 및 초기 설정 3. [ ] 프로젝트 빌드 테스트 4. [ ] 의존성 캐싱 확인 5. [ ] 내부 라이브러리 배포 테스트 6. [ ] 실제 Nexus 서버로 마이그레이션