개요
오프라인 환경(==망분리, 폐쇄망, 내부망, 인트라넷)에서 gradle 프로젝트를 빌드하기 위한 환경 세팅 방법에 대해 작성합니다.
서론
인터넷에 연결되지 않은 환경에서 개발하는 경우가 있습니다.
인터넷 환경에서 spring boot 프로젝트를 구축하는 경우 maven/gradle을 통해 빌드에 필요한 dependency 작성만 하면, 관련된 파일을 받아와서 사용할 수 있습니다.
하지만 폐쇄망에서는 maven repository에 연결할 수 없어서 dependency를 받아올 수 없습니다.
이 문제를 해결하는 방법은 여러 가지가 있습니다.
큰 범위에서 작은 범위 순서로 작성한 해결방법은 아래와 같습니다.
해결방법
1. 외부망과 연결될 수 있도록 해결하기
외부망과 단절된 이유를 찾아서 해결하는 방법입니다.
예를 들어 방화벽으로 단절되어있다면, 특정 maven repository 경로만 연결할 수 있도록 방화벽에 예외를 추가하는 것과 같습니다.
- 장점
- 사내에 신규 프로젝트가 많고 개발이 많은 경우라면 미래를 위해 고려할 수 있습니다.
- 단점
- 정책적인 문제라서 적용하기 어렵습니다.
2. 인트라넷에 maven repository 구축
인트라넷에 자체적으로 maven repository 서버를 구축하는 방법입니다.
구축 방법은 여러가지가 있지만 nexus repository manager 2가 대표적입니다.
- 장점
- 폐쇄망을 유지할 수 있는 좋은 방법입니다.
- 사내에서 개발된 repository를 공유할 수 있는 생태계가 될 수 있습니다.
- 단점
- 서버를 관리하고 repository를 운영해야 할 인력이 필요합니다.
3. local에 repository 추가하기
여기서부턴 서버가 없습니다.
인터넷 환경에선 필요한 dependency로 생성된 local repository를 폐쇄망에 가져와서 빌드 환경에 이용하는 것입니다.
- 장점
- 인터넷 연결된 PC와 망분리 PC만 있으면 되기 때문에 가장 쉽게 시도해볼 수 있습니다.
- 단점
- 개발환경을 생성할 때 마다 dependency를 local repository에 추가해야 합니다.
- 여러 명이 개발할 때 repository 일치에 시간이 소요됩니다.
cache를 local repository로 사용하기
가장 간단한 방법인 gradle/maven dependency cache를 local repository로 쉽게 이용할 수 있습니다.
gradle과 maven은 빌드할 때마다 라이브러리를 인터넷에서 다운로드하지 않고, 최초 1회 다운로드한 파일을 계속 사용할 수 있게 cache directory를 사용합니다.
cache 위치는 home directory(cd ~)에서 .gradle(gradle), .m2(maven)가 cache directory입니다.
해당 directory를 폐쇄망에 가져와서 동일한 위치에 두면 빌드할 때 해당 cache directory를 이용합니다.
gradle 자체가 없어서 build가 불가한 경우
/gradle/wrapper/ 에 gradle bin 파일을 넣습니다. https://gradle.org/releases/
/gradle/wrapper/gradle-wrapper.properties의 distributionUrl을 다음과 같이 변경합니다.
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=gradle-7.1.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
결론
local repository 구성 방법은 cache를 이용하는 것 말고도 다양합니다.
필요에 따라 다양한 방법을 적용할 수 있겠지만, 개발을 1회만 하고 끝내야 하는 것이 아니라면 개인적으로는 인트라넷에 maven repository를 구축하는 것이 장기적으로 좋은 방법이라고 생각합니다.
reference
'Backend > spring' 카테고리의 다른 글
[spring] spring boot에서 SQLite를 JPA로 사용하기 (0) | 2021.09.13 |
---|---|
[spring] spring boot에서 actuator 사용하기 (0) | 2021.07.12 |
[JPA] N+1 문제와 그 해결법 (0) | 2021.07.10 |
[spring, logback] 비동기식 로깅 - AsyncAppender - 2 (0) | 2021.07.08 |
[spring, logback] 비동기식 로깅 - AsyncAppender - 1 (0) | 2021.07.07 |