maven / / 2023. 11. 12. 20:21

Maven의 snapshot은 무엇인가?

일반적으로 대규모 소프트웨어 애플리케이션에서는 여러 개의 모듈로 구성되어 있고 여러 팀들이 하나의 애플리케이션을 개발하는데 각각 다른 모듈에서 작업을 진행한다.

예를 들어, 하나의 팀이 app-ui 프로젝트(app-ui.jar:1.0)에서 프런트 개발을 진행하고 있고 data-service(data-service.jar:1.0) 프로젝트를 사용하고 있다고 생각해보자.

app-ui (모듈) -> data-service (모듈)

이런 경우 data-service에서 작업하는 팀이 버그 수정을 하거나 빠른 속도로 기능 개선 작업을 한다면 그들은 거의 매일 원격 저장소에 해당 라이브러리를 배포할 것이다.

data-servce 팀이 매일 새 버전을 배포한다면 다음과 같은 문제가 발생할 것이다.

  • data-service 팀이 배포했을 때 코드가 수정되었다고 매번 app-ui 팀에게 말해줘야 한다.
  • app-ui 팀은 수정된 버전을 받기 위해 pom.xml을 업데이트 해야 할 것이다.

이러한 상황을 해결하기 위해서 SNAPSHOT 개념이 나오게 된 것이다.

SNAPSHOT은 무엇인가?

SNAPSHOT은 현재 개발의 복사복을 나타내는 특별한 버전이다. 일반적인 버전과는 다르게 maven은 매번 빌드시 마다 원격 저장소에서 SNAPSHOT 버전을 체크한다.

data-service 팀은 저장소에 매번 수정된 코드의 SNAPSHOT을 배포할 것이고 예전 SNAPSHOT.jar을 바꾸도록 data-service:1.0-SNAPSHOT으로 알려줄 것이다.

Snapshot과 Version

일반적인 버전의 경우, maven은 일단 해당 버전을 다운로드 받았다면, data-service:1.0 버전에서 새로운 1.0을 다운로드 하지 않을 것이다. 수정된 코드를 다운로드 하기 위해서 data-service 버전은 1.1로 변경되어야 한다.

SNAPSHOT의 경우에서 maven은 app-ui 팀이 프로젝트를 빌드할 때마다 가장 최신의 SNAPSHOT(data-service:1.0-SNAPSHOT)을 가져올 것이다.

app-ui pom.xml

app-ui 프로젝트는 data-service 1.0-SNAPSHOT을 사용하고 있다.

<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>app-ui</groupId>
   <artifactId>app-ui</artifactId>
   <version>1.0</version>
   <packaging>jar</packaging>
   <name>health</name>
   <url>http://maven.apache.org</url>
   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   </properties>
   <dependencies>
      <dependency>
      <groupId>data-service</groupId>
         <artifactId>data-service</artifactId>
         <version>1.0-SNAPSHOT</version>
         <scope>test</scope>
      </dependency>
   </dependencies>
</project>

data-service pom.xml

data-service 프로젝트는 매번 변경이 있을 때마다 1.0-SNAPSHOT으로 배포하고 있다.

<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>data-service</groupId>
   <artifactId>data-service</artifactId>
   <version>1.0-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>health</name>
   <url>http://maven.apache.org</url>
   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   </properties>
</project>

SNAPSHOT인 경우에서는, maven은 자동으로 매일 최신 SNAPSHOT을 가져오지만, -U를 사용한 maven 명령어로 최신 snapshot을 강제로 다운로드 할 수 있다.

mvn clean package -U

maven은 data-service의 마지막 SNAPSHOT 다운로드 후에 빌드를 시작할 것이다.

[INFO] Scanning for projects...
[INFO]--------------------------------------------
[INFO] Building consumerBanking
[INFO]    task-segment: [clean, package]
[INFO]--------------------------------------------
[INFO] Downloading data-service:1.0-SNAPSHOT
[INFO] 290K downloaded.
[INFO] [clean:clean {execution: default-clean}]
[INFO] Deleting directory C:\MVN\app-ui\target
[INFO] [resources:resources {execution: default-resources}]

[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
i.e. build is platform dependent!

[INFO] skip non existing resourceDirectory C:\MVN\app-ui\src\main\resources
[INFO] [compiler:compile {execution:default-compile}]
[INFO] Compiling 1 source file to C:\MVN\app-ui\target\classes
[INFO] [resources:testResources {execution: default-testResources}]

[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
i.e. build is platform dependent!

[INFO] skip non existing resourceDirectory C:\MVN\app-ui\src\test\resources
[INFO] [compiler:testCompile {execution: default-testCompile}]
[INFO] Compiling 1 source file to C:\MVN\app-ui\target\test-classes
[INFO] [surefire:test {execution: default-test}]
[INFO] Surefire report directory: C:\MVN\app-ui\target\
surefire-reports

--------------------------------------------------
 T E S T S
--------------------------------------------------

Running com.companyname.bank.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.027 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] [jar:jar {execution: default-jar}]
[INFO] Building jar: C:\MVN\app-ui\target\
app-ui-1.0-SNAPSHOT.jar
[INFO]--------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO]--------------------------------------------------------
[INFO] Total time: 2 seconds
[INFO] Finished at: 2015-09-27T12:30:02+05:30
[INFO] Final Memory: 16M/89M
[INFO]------------------------------------------------------------------------

maven 공식 문서 내용

SNAPSHOT 버전은 무엇인가?

pom.xml의 버전 태그 값이 아래와 같이 -SNAPSHOT으로 끝나는 것을 말한다.

<project xmlns="http://maven.apache.org/POM/4.0.0"
  ...
  <groupId>...</groupId>
  <artifactId>my-app</artifactId>
  ...
  <version>1.0-SNAPSHOT</version>
  <name>Maven Quick Start Archetype</name>
  ...

SNAPSHOT은 개발 브랜치에서 가장 최신 코드를 나타내고 코드가 안정적이거나 변경되지 않는다는 것을 보장하지 않는다. 반대로, release 버전의 코드(SNAPSHOT으로 끝나지 않는 특정 버전)는 변경되지 않는다는 것을 의미한다.

다르게 말하면 SNAPSHOT 버전은 최종 release 버전 전의 개발버전이다. SNAPSHOT은 release보다 오래된 것이다.

릴리스 프로세스에서 x.y-SNAPSHOT은 x.y로 변경된다. 릴리스 프로세스는 또한 개발 버전을 x.(y+1)-SNAPSHOT으로 변경한다. 예를 들어 1.0-SNAPSHOT 버전은 1.0 버전으로 릴리스되고 나면 새 개발 버전은 1.1-SNAPSHOT이 된다.

참고

https://www.tutorialspoint.com/maven/maven_snapshots.htm

https://maven.apache.org/guides/getting-started/index.html#what-is-a-snapshot-version

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유