

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Maven 스냅샷 사용
<a name="maven-snapshots"></a>

 Maven **스냅샷은 최신 프로덕션 브랜치 코드를 참조하는 Maven 패키지의 특수 버전입니다. 이 스냅샷은 최종 릴리스 버전보다 앞서는 개발 버전입니다. 패키지 버전에 추가된 접미사 `SNAPSHOT`으로 Maven 패키지의 스냅샷 버전을 식별할 수 있습니다. 예를 들어, 버전 `1.1`의 스냅샷은 `1.1-SNAPSHOT`입니다. 자세한 내용은 Apache Maven 프로젝트 웹사이트에서 [SNAPSHOT 버전이란 무엇입니까?](https://maven.apache.org/guides/getting-started/index.html#What_is_a_SNAPSHOT_version)를 참조하세요.

 AWS CodeArtifact는 Maven 스냅샷 게시 및 사용을 지원합니다. 지원되는 스냅샷은 시간 기반 버전 번호를 사용하는 고유 스냅샷 밖에 없습니다. CodeArtifact는 Maven 2 클라이언트에서 생성된 고유하지 않은 스냅샷을 지원하지 않습니다. 지원되는 Maven 스냅샷을 모든 CodeArtifact 리포지토리에 게시할 수 있습니다.

**Topics**
+ [

## CodeArtifact에서의 스냅샷 게시
](#maven-snapshot-publishing)
+ [

## 스냅샷 버전 사용
](#maven-consuming-snapshot-versions)
+ [

## 스냅샷 버전 삭제
](#maven-deleting-snapshot-versions)
+ [

## curl을 사용한 스냅샷 게시
](#maven-snapshot-publishing-curl)
+ [

## 스냅샷과 외부 연결
](#maven-snapshot-external-connections)
+ [

## 스냅샷 및 업스트림 리포지토리
](#maven-snapshot-upstream-repositories)

## CodeArtifact에서의 스냅샷 게시
<a name="maven-snapshot-publishing"></a>

AWS CodeArtifact는 스냅샷을 게시할 때와 같은 클라이언트가 `mvn`사용하는 요청 패턴을 지원합니다. 따라서 Maven 스냅샷이 게시되는 방식을 자세히 이해하지 못했더라도 빌드 도구 또는 패키지 관리자의 설명서를 따르면 됩니다. 좀 더 복잡한 작업을 수행하는 경우, 이 섹션에서는 CodeArtifact가 스냅샷을 처리하는 방법을 자세히 설명합니다.

 Maven 스냅샷이 CodeArtifact 리포지토리에 게시되면 이전 버전이 빌드라는 새 버전에 보존됩니다. Maven 스냅샷이 게시될 때마다 새 빌드 버전이 생성됩니다. 스냅샷의 모든 이전 버전은 빌드 버전에서 유지 관리됩니다. Maven 스냅샷이 게시되면 패키지 버전 상태가 `Published`로 설정되고 이전 버전이 포함된 빌드의 상태가 `Unlisted`로 설정됩니다. 이 동작은 패키지 버전에 접미사 `-SNAPSHOT`이 있는 Maven 패키지 버전에만 적용됩니다.

예를 들어 `com.mycompany.myapp:pkg-1`이라는 Maven 패키지의 스냅샷 버전이 `my-maven-repo`라는 CodeArtifact 리포지토리에 업로드됩니다. 스냅샷 버전은 `1.0-SNAPSHOT`입니다. 지금까지 게시된 `com.mycompany.myapp:pkg-1`의 버전은 없습니다. 먼저, 초기 빌드의 자산은 다음 경로에 게시됩니다.

```
PUT maven/my-maven-repo/com/mycompany/myapp/pkg-1/1.0-SNAPSHOT/pkg-1-1.0-20210728.194552-1.jar
PUT maven/my-maven-repo/com/mycompany/myapp/pkg-1/1.0-SNAPSHOT/pkg-1-1.0-20210728.194552-1.pom
```

참고로 `20210728.194552-1` 타임스탬프는 스냅샷 빌드를 게시하는 클라이언트에 의해 생성됩니다.

.pom 및 .jar 파일을 업로드한 후 리포지토리에 존재하는 `com.mycompany.myapp:pkg-1`의 유일한 버전은 `1.0-20210728.194552-1`입니다. 이는 이전 경로에 지정된 버전이 `1.0-SNAPSHOT`인 경우에도 발생합니다. 현재 패키지 버전 상태는 `Unfinished`입니다.

```
aws codeartifact list-package-versions --domain my-domain --repository \
  my-maven-repo --package pkg-1 --namespace com.mycompany.myapp --format maven
{
    "versions": [
        {
            "version": "1.0-20210728.194552-1",
            "revision": "GipMW+599JmwTcTLaXo9YvDsVQ2bcrrk/02rWJhoKUU=",
            "status": "Unfinished"
        }
    ],
    "defaultDisplayVersion": null,
    "format": "maven",
    "package": "pkg-1",
    "namespace": "com.mycompany.myapp"
}
```

그런 다음, 클라이언트가 패키지 버전용 `maven-metadata.xml` 파일을 업로드합니다.

```
PUT my-maven-repo/com/mycompany/myapp/pkg-1/1.0-SNAPSHOT/maven-metadata.xml
```

maven-metadata.xml 파일이 성공적으로 업로드되면 CodeArtifact는 `1.0-SNAPSHOT` 패키지 버전을 생성하고 `1.0-20210728.194552-1` 버전을 `Unlisted`로 설정합니다.

```
aws codeartifact list-package-versions --domain my-domain --repository \
  my-maven-repo --package pkg-1 --namespace com.mycompany.myapp --format maven
{
    "versions": [
        {
            "version": "1.0-20210728.194552-1",
            "revision": "GipMW+599JmwTcTLaXo9YvDsVQ2bcrrk/02rWJhoKUU=",
            "status": "Unlisted"
        },
        {
            "version": "1.0-SNAPSHOT",
            "revision": "tWu8n3IX5HR82vzVZQAxlwcvvA4U/+S80edWNAkil24=",
            "status": "Published"
        }
    ],
    "defaultDisplayVersion": "1.0-SNAPSHOT",
    "format": "maven",
    "package": "pkg-1",
    "namespace": "com.mycompany.myapp"
}
```

이제 스냅샷 버전 `1.0-SNAPSHOT`을 빌드에서 사용할 수 있습니다. 리포지토리 `my-maven-repo`에는 두 가지 버전의 `com.mycompany.myapp:pkg-1`이 있지만 두 버전 모두 동일한 자산을 포함하고 있습니다.

```
aws codeartifact list-package-version-assets --domain my-domain --repository \
  my-maven-repo --format maven --namespace com.mycompany.myapp \
 --package pkg-1 --package-version 1.0-SNAPSHOT--query 'assets[*].name'
[ 
     "pkg-1-1.0-20210728.194552-1.jar",
     "pkg-1-1.0-20210728.194552-1.pom"
]
```

`--package-version` 파라미터를 `1.0-20210728.194552-1`로 변경하여 이전에 표시된 것과 동일한 `list-package-version-assets` 명령을 실행하면 동일한 출력이 표시됩니다.

`1.0-SNAPSHOT`의 추가 빌드가 리포지토리에 추가되면 새 빌드마다 새 `Unlisted` 패키지 버전이 생성됩니다. 버전 `1.0-SNAPSHOT`의 자산은 매번 업데이트되므로 버전은 항상 해당 버전의 최신 빌드를 참조합니다. 최신 자산으로 `1.0-SNAPSHOT`을 업데이트하는 절차는 새 빌드용 `maven-metadata.xml` 파일을 업로드하는 것으로 시작됩니다.

## 스냅샷 버전 사용
<a name="maven-consuming-snapshot-versions"></a>

스냅샷을 요청하면 상태 `Published`의 버전이 반환됩니다. 이 버전은 항상 Maven 스냅샷의 최신 버전입니다. URL 경로의 스냅샷 버전(예: `1.0-SNAPSHOT`) 대신 빌드 버전 번호(예: `1.0-20210728.194552-1`)를 사용하여 스냅샷의 특정 빌드를 요청할 수도 있습니다. Maven 스냅샷의 빌드 버전을 보려면 **CodeArtifact API 안내서의 [ListPackageVersions ](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_ListPackageVersions.html) API를 사용하고 상태 파라미터를 `Unlisted`로 설정합니다.

## 스냅샷 버전 삭제
<a name="maven-deleting-snapshot-versions"></a>

Maven 스냅샷의 모든 빌드 버전을 삭제하려면 [DeletePackageVersions](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_DeletePackageVersions.html) API를 사용하여 삭제하려는 버전을 지정합니다.

## curl을 사용한 스냅샷 게시
<a name="maven-snapshot-publishing-curl"></a>

Amazon Simple Storage Service(Amazon S3) 또는 다른 아티팩트 리포지토리 제품에 저장된 기존 스냅샷 버전이 있는 경우 이를 AWS CodeArtifact에 다시 게시할 수 있습니다. CodeArtifact가 Maven 스냅샷을 지원하는 방식 때문에([CodeArtifact에서의 스냅샷 게시](#maven-snapshot-publishing) 참조) 일반 HTTP 클라이언트(예: `curl`)를 사용하여 스냅샷을 게시하는 것은 [curl을 사용한 게시](maven-curl.md)에 설명된 대로 Maven 릴리스 버전을 게시하는 것보다 더 복잡합니다. `mvn` 또는 `gradle` 같은 Maven 클라이언트를 사용하여 스냅샷 버전을 빌드하고 배포하는 경우, 이 섹션은 관련성이 없습니다. Maven 클라이언트에 대한 설명서를 따라야 합니다.

스냅샷 버전을 게시하려면 스냅샷 버전의 빌드를 하나 이상 게시해야 합니다. CodeArtifact에서 스냅샷 버전의 빌드가 **n개 이상 있는 경우, CodeArtifact 버전이 **n\$11개 즉, 상태가 `Unlisted`인 빌드 버전이 **n개, 상태가 `Published`인 스냅샷 버전 하나(가장 최근에 게시된 빌드)가 있습니다. 스냅샷 버전(즉, 버전 문자열에 ‘-SNAPSHOT’이 포함된 버전)에는 최근에 게시된 빌드와 동일한 자산 세트가 포함되어 있습니다. `curl`을 사용하여 이 구조를 생성하는 가장 간단한 방법은 다음과 같습니다.

1. `curl`을 사용하여 모든 빌드의 모든 자산을 게시합니다.

1. `curl`을 사용하여 마지막 빌드의 `maven-metadata.xml` 파일(즉, 가장 최근의 날짜-시간 스탬프가 있는 빌드)을 게시합니다. 그러면 버전 문자열에 ‘`-SNAPSHOT`’ 이 포함되고 올바른 자산 세트가 포함된 버전이 하나 생성됩니다.

1. [UpdatePackageVersionsStatus](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_UpdatePackageVersionsStatus.html) API를 사용하여 최신 버전이 아닌 모든 빌드 버전의 상태를 `Unlisted`로 설정합니다.

 다음 `curl` 명령을 사용하여 패키지 `com.mycompany.app:pkg-1`의 스냅샷 버전 `1.0-SNAPSHOT`에 대한 스냅샷 자산(예: .jar 및 .pom 파일)을 게시하세요.

```
curl --user "aws:$CODEARTIFACT_AUTH_TOKEN" -H "Content-Type: application/octet-stream" \
     -X PUT https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/maven/my_maven_repo/com/mycompany/app/pkg-1/1.0-SNAPSHOT/pkg-1-1.0-20210729.171330-2.jar \
     --data-binary @pkg-1-1.0-20210728.194552-1.jar
```

```
curl --user "aws:$CODEARTIFACT_AUTH_TOKEN" -H "Content-Type: application/octet-stream" \
     -X PUT https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/maven/my_maven_repo/com/mycompany/app/pkg-1/1.0-SNAPSHOT/pkg-1-1.0-20210729.171330-2.pom \
     --data-binary @pkg-1-1.0-20210728.194552-1.pom
```

다음 예제를 사용하는 경우:
+ *my\$1domain*을 CodeArtifact 도메인 이름으로 변경합니다.
+ *111122223333*을 CodeArtifact 도메인 소유자의 AWS 계정 ID로 바꿉니다.
+ *us-west-2*를 CodeArtifact 도메인이 위치한 AWS 리전 로 바꿉니다.
+ *my\$1maven\$1repo*를 CodeArtifact 리포지토리 이름으로 변경합니다.

**중요**  
`--data-binary` 파라미터의 값 앞에 문자 `@`을 붙여야 합니다. 값을 따옴표로 묶을 때는 따옴표 안에 `@`을 포함해야 합니다.

각 빌드에 업로드할 자산이 두 개 이상 존재할 수 있습니다. 예를 들어, 기본 JAR 및 `pom.xml` 외에도 Javadoc 및 소스 JAR 파일이 존재할 수 있습니다. CodeArtifact는 업로드된 각 자산에 대해 체크섬을 자동으로 생성하므로 패키지 버전 자산에 대한 체크섬 파일을 게시할 필요가 없습니다. 자산이 제대로 업로드되었는지 확인하려면 `list-package-version-assets` 명령을 사용하여 생성된 체크섬을 가져와서 원본 체크섬과 비교합니다. CodeArtifact가 Maven 체크섬을 처리하는 방법에 관한 자세한 내용은 [Maven 체크섬 사용](maven-checksums.md) 섹션을 참조하세요.

다음 curl 명령어를 사용하여 최신 빌드 버전용 `maven-metadata.xml` 파일을 게시하세요.

```
curl --user "aws:$CODEARTIFACT_AUTH_TOKEN" -H "Content-Type: application/octet-stream" \
     -X PUT https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/maven/my_maven_repo/com/mycompany/app/pkg-1/1.0-SNAPSHOT/maven-metadata.xml \
     --data-binary @maven-metadata.xml
```

`maven-metadata.xml` 파일은 `<snapshotVersions>` 요소의 최신 빌드 버전에 있는 자산 중 한 가지 이상을 참조해야 합니다. 또한 `<timestamp>` 값이 있어야 하며 이 값은 자산 파일 이름의 타임스탬프와 일치해야 합니다. 예를 들어, 이전에 게시된 `20210729.171330-2` 빌드의 경우 `maven-metadata.xml`의 내용은 다음과 같습니다.

```
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
  <groupId>com.mycompany.app</groupId>
  <artifactId>pkg-1</artifactId>
  <version>1.0-SNAPSHOT</version>
  <versioning>
    <snapshot>
      <timestamp>20210729.171330</timestamp>
      <buildNumber>2</buildNumber>
    </snapshot>
    <lastUpdated>20210729171330</lastUpdated>
    <snapshotVersions>
      <snapshotVersion>
        <extension>jar</extension>
        <value>1.0-20210729.171330-2</value>
        <updated>20210729171330</updated>
      </snapshotVersion>
      <snapshotVersion>
        <extension>pom</extension>
        <value>1.0-20210729.171330-2</value>
        <updated>20210729171330</updated>
      </snapshotVersion>
    </snapshotVersions>
  </versioning>
</metadata>
```

`maven-metadata.xml`이 게시된 후 마지막 단계는 기타 모든 빌드 버전(즉, 최신 빌드를 제외한 모든 빌드 버전)의 패키지 버전 상태를 `Unlisted`로 설정하는 데 그 목적이 있습니다. 예를 들어, `1.0-SNAPSHOT` 버전에 두 개의 빌드가 있고 첫 번째 빌드가 `20210728.194552-1`인 경우 해당 빌드를 `Unlisted`로 설정하는 명령은 다음과 같습니다.

```
aws codeartifact update-package-versions-status --domain my-domain --domain-owner 111122223333 \
   --repository my-maven-repo --format maven --namespace com.mycompany.app --package pkg-1 \
   --versions 1.0-20210728.194552-1 --target-status Unlisted
```

## 스냅샷과 외부 연결
<a name="maven-snapshot-external-connections"></a>

Maven 스냅샷은 외부 연결을 통해 Maven 퍼블릭 리포지토리에서 가져올 수 없습니다. AWS CodeArtifact는 Maven 릴리스 버전 가져오기만 지원합니다.

## 스냅샷 및 업스트림 리포지토리
<a name="maven-snapshot-upstream-repositories"></a>

일반적으로 Maven 스냅샷은 업스트림 리포지토리와 함께 사용할 때 Maven 릴리스 버전과 동일한 방식으로 작동하지만, 업스트림 관계가 있는 두 리포지토리에 동일한 패키지 버전의 스냅샷을 게시하려는 경우 제한이 있습니다. 예를 들어 an AWS CodeArtifact 도메인에 리포지토리가 두 개 `R` 있고`U`, 여기서 `U`는의 업스트림입니다`R`. `R`에 새 빌드를 게시하는 경우 Maven 클라이언트가 해당 스냅샷 버전의 최신 빌드를 요청하면 CodeArtifact는 `U`에서 최신 버전을 반환합니다. 이제 최신 버전이 `U`가 아닌 `R`에 있기 때문에 이로 인해 예기치 않은 상황이 발생할 수 있습니다. 이를 피하는 방법은 두 가지입니다.

1. `U`에 `1.0-SNAPSHOT`이 있는 경우 `R`의 `1.0-SNAPSHOT`과 같은 스냅샷 버전의 빌드를 게시하지 마십시오.

1. CodeArtifact 패키지 원본 제어를 사용하여 `R`에서 해당 패키지의 업스트림을 비활성화합니다. 후자는 `R`에서 `1.0-SNAPSHOT`의 빌드를 게시하도록 허용하지만 `R`이 아직 보존되지 않은 `U`에서 해당 패키지의 다른 버전을 가져오지 못하게 합니다.