

CDK AWS v2 개발자 안내서입니다. 이전 CDK v1은 2022년 6월 1일에 유지 관리에 들어갔으며 2023년 6월 1일에 지원이 종료되었습니다.

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

# AWS CDK 라이브러리 작업
<a name="work-with"></a>

AWS Cloud Development Kit(AWS CDK) 라이브러리를 가져와서 사용하여 [지원되는 프로그래밍 언어](languages.md)로 AWS 클라우드 인프라를 정의합니다.

## AWS CDK Library 가져오기
<a name="work-with-library"></a>

[AWS CDK Library](libraries.md)는 종종 TypeScript 패키지 이름인 `aws-cdk-lib`로 참조됩니다. 실제 패키지 이름은 언어에 따라 다릅니다. 다음은 CDK 라이브러리를 설치하고 가져오는 방법의 예입니다.

**Example**  


|  |  | 
| --- |--- |
|   **설치**   |   `npm install aws-cdk-lib`   | 
|   **가져오기**   |   `import * as cdk from 'aws-cdk-lib';`   | 


|  |  | 
| --- |--- |
|   **설치**   |   `npm install aws-cdk-lib`   | 
|   **가져오기**   |   `const cdk = require('aws-cdk-lib');`   | 


|  |  | 
| --- |--- |
|   **설치**   |   `python -m pip install aws-cdk-lib`   | 
|   **가져오기**   |   `import aws_cdk as cdk`   | 


|  |  | 
| --- |--- |
|   **`pom.xml`에서 추가**   |   `Group software.amazon.awscdk; artifact aws-cdk-lib`   | 
|   **가져오기**   |   `import software.amazon.awscdk.App;`   | 


|  |  | 
| --- |--- |
|   **설치**   |   `dotnet add package Amazon.CDK.Lib`   | 
|   **가져오기**   |   `using Amazon.CDK;`   | 


|  |  | 
| --- |--- |
|   **설치**   |   `go get github.com/aws/aws-cdk-go/awscdk/v2`   | 
|   **가져오기**   |  <pre>import (<br />  "github.com/aws/aws-cdk-go/awscdk/v2"<br />)</pre>  | 

`construct` 기본 클래스 및 지원 코드는 `constructs` 라이브러리에 있습니다. API가 아직 개선 중인 실험 구문은 별도의 모듈로 배포됩니다.

## AWS CDK API 참조 사용
<a name="work-with-library-reference"></a>

AWS CDK로 개발할 때 [AWS CDK API 참조](libraries.md#libraries-reference)를 사용합니다.

각 모듈의 참조 자료는 다음 섹션으로 나뉩니다.
+  *개요*: AWS CDK에서 서비스를 사용하는 데 알아야 할 개념과 예를 포함한 소개 자료입니다.
+  *구문*: 하나 이상의 구체적인 AWS 리소스를 나타내는 라이브러리 클래스입니다. 이는 안전한 기본값이 포함된 상위 수준 인터페이스를 제공하는 ’큐레이팅’(L2) 리소스 또는 패턴(L3 리소스)입니다.
+  *클래스*: 모듈의 구문에서 사용하는 기능을 제공하는 비구문 클래스입니다.
+  *구조체*: 속성(구문의 `props` 인수) 및 옵션과 같은 복합 값의 구조를 정의하는 데이터 구조(속성 번들)입니다.
+  *인터페이스*: 이름이 모두 ’I’로 시작하는 인터페이스는 해당 구문 또는 기타 클래스에 대한 절대 최소 기능을 정의합니다. CDK는 구문 인터페이스를 사용하여 AWS CDK 앱 외부에서 정의되고 `Bucket.fromBucketArn()`와 같은 메서드에 의해 참조되는 AWS 리소스를 나타냅니다.
+  *열거형*: 특정 구문 파라미터를 지정하는 데 사용할 이름이 지정된 값의 컬렉션입니다. 열거형 값을 사용하면 CDK가 합성 중 이러한 값의 유효성을 확인할 수 있습니다.
+  *CloudFormation 리소스*: 이름이 ’Cfn’으로 시작하는 이러한 L1 구문은 CloudFormation 사양에 정의된 리소스를 정확히 나타냅니다. 각 CDK 릴리스에서 해당 사양에서 자동으로 생성됩니다. 각 L2 또는 L3 구문은 하나 이상의 CloudFormation 리소스를 캡슐화합니다.
+  *CloudFormation 속성 유형:* 각 CloudFormation 리소스의 속성을 정의하는 이름이 지정된 값의 컬렉션입니다.

## 구문 클래스와 비교한 인터페이스
<a name="work-with-library-interfaces"></a>

AWS CDK는 인터페이스를 프로그래밍 개념으로 알고 있더라도 명확하지 않을 수 있는 특정 방식으로 인터페이스를 사용합니다.

AWS CDK는 `Bucket.fromBucketArn()`와 같은 방법을 사용하여 CDK 애플리케이션 외부에서 정의된 리소스 사용을 지원합니다. 외부 리소스는 수정할 수 없으며 `Bucket` 클래스를 사용하여 CDK 앱에 정의된 리소스에서 모든 기능을 사용할 수 있는 것은 아닙니다. 그런 다음 인터페이스는 *외부 리소스를 포함하여* 지정된 AWS 리소스 유형에 대해 CDK에서 사용할 수 있는 기본 최소 기능을 나타냅니다.

CDK 앱에서 리소스를 인스턴스화할 때는 항상 `Bucket`과 같은 구체적인 클래스를 사용해야 합니다. 자체 구문 중 하나에서 수락하는 인수 유형을 지정할 때는 외부 리소스를 처리할 준비가 된 경우(즉, 변경할 필요가 없음) `IBucket`과 같은 인터페이스 유형을 사용합니다. CDK 정의 구문이 필요한 경우 사용할 수 있는 가장 일반적인 유형을 지정합니다.

일부 인터페이스는 구문이 아닌 특정 클래스와 연결된 속성 또는 옵션 번들의 최소 버전입니다. 이러한 인터페이스는 상위 클래스에 전달할 인수를 수락하기 위해 서브클래싱할 때 유용할 수 있습니다. 하나 이상의 추가 속성이 필요한 경우 이 인터페이스 또는 보다 구체적인 유형에서 구현하거나 파생해야 합니다.

**참고**  
AWS CDK에서 지원하는 일부 프로그래밍 언어에는 인터페이스 기능이 없습니다. 이러한 언어에서 인터페이스는 일반 클래스에 불과합니다. 첫글자 ‘I’ 뒤에 다른 구문이 오는 패턴(예: `IBucket`)을 따르는 이름으로 인터페이스를 식별할 수 있습니다. 동일한 규칙이 적용됩니다.

## 종속성 관리
<a name="work-with-cdk-dependencies"></a>

AWS CDK 앱 또는 라이브러리의 종속성은 패키지 관리 도구를 사용하여 관리됩니다. 이러한 도구는 대개 프로그래밍 언어와 함께 사용됩니다.

일반적으로 AWS CDK는 언어의 표준 또는 공식 패키지 관리 도구가 있는 경우 이를 지원합니다. 그렇지 않으면 AWS CDK에서 언어의 가장 인기 있거나 널리 지원되는 언어를 지원합니다. 다른 도구를 사용할 수도 있습니다. 특히 지원되는 도구로 작업하는 경우 더욱 그렇습니다. 그러나 다른 도구에 대한 공식 지원은 제한됩니다.

AWS CDK는 다음 패키지 관리자를 지원합니다.


| 언어 | 지원되는 패키지 관리 도구 | 
| --- | --- | 
|  TypeScript/JavaScript  |  NPM(Node Package Manager) 또는 Yarn  | 
|  Python  |  PIP(Python용 패키지 설치 관리자)  | 
|  Java  |  Maven  | 
|  C\$1  |  NuGet  | 
|  Go  |  Go 모듈  | 

AWS CDK CLI `cdk init` 명령을 사용하여 새 프로젝트를 생성하면 CDK 코어 라이브러리와 안정적인 구문에 대한 종속성이 자동으로 지정됩니다.

지원되는 프로그래밍 언어의 종속성 관리에 대한 자세한 내용은 다음을 참조하세요.
+  [TypeScript에서 종속성 관리](work-with-cdk-typescript.md#work-with-cdk-typescript-dependencies).
+  [JavaScript에서 종속성 관리](work-with-cdk-javascript.md#work-with-cdk-javascript-dependencies).
+  [Python에서 종속성 관리](work-with-cdk-python.md#work-with-cdk-python-dependencies).
+  [Java에서 종속성 관리](work-with-cdk-java.md#work-with-cdk-java-dependencies).
+  [C\$1에서 종속성 관리](work-with-cdk-csharp.md#work-with-cdk-csharp-dependencies).
+  [Go에서 종속성 관리](work-with-cdk-go.md#work-with-cdk-go-dependencies).

## TypeScript의 AWS CDK와 다른 언어 비교
<a name="work-with-cdk-compare"></a>

TypeScript는 AWS CDK 애플리케이션 개발에 지원되는 첫 번째 언어입니다. 따라서 상당량의 예제 CDK 코드가 TypeScript로 작성됩니다. 다른 언어로 개발하는 경우 선택한 언어와 비교하여 TypeScript에서 AWS CDK 코드가 구현되는 방법을 비교하는 것이 유용할 수 있습니다. 이렇게 하면 설명서 전체에서 예를 사용하는 데 도움이 될 수 있습니다.

## 모듈 가져오기
<a name="work-with-cdk-compare-import"></a>

**Example**  
TypeScript는 네임스페이스에서 전체 네임스페이스 또는 개별 객체 가져오기를 지원합니다. 각 네임스페이스에는 지정된 AWS 서비스와 함께 사용할 수 있는 구문 및 기타 클래스가 포함되어 있습니다.  

```
// Import main CDK library as cdk
import * as cdk from 'aws-cdk-lib';   // ES6 import preferred in TS
const cdk = require('aws-cdk-lib');   // Node.js require() preferred in JS

// Import specific core CDK classes
import { Stack, App } from 'aws-cdk-lib';
const { Stack, App } = require('aws-cdk-lib');

// Import AWS S3 namespace as s3 into current namespace
import { aws_s3 as s3 } from 'aws-cdk-lib';   // TypeScript
const s3 = require('aws-cdk-lib/aws-s3');     // JavaScript

// Having imported cdk already as above, this is also valid
const s3 = cdk.aws_s3;

// Now use s3 to access the S3 types
const bucket = s3.Bucket(...);

// Selective import of s3.Bucket
import { Bucket } from 'aws-cdk-lib/aws-s3';        // TypeScript
const { Bucket } = require('aws-cdk-lib/aws-s3');   // JavaScript

// Now use Bucket to instantiate an S3 bucket
const bucket = Bucket(...);
```
TypeScript와 마찬가지로 Python은 네임스페이스 모듈 가져오기 및 선택적 가져오기를 지원합니다. Python의 네임스페이스는 **aws\$1cdk.***xxx*와 같습니다. 여기서 *xxx*는 Amazon S3의 **s3**와 같은 AWS 서비스 이름을 나타냅니다. (이 예에서는 Amazon S3를 사용합니다).  

```
# Import main CDK library as cdk
import aws_cdk as cdk

# Selective import of specific core classes
from aws_cdk import Stack, App

# Import entire module as s3 into current namespace
import aws_cdk.aws_s3 as s3

# s3 can now be used to access classes it contains
bucket = s3.Bucket(...)

# Selective import of s3.Bucket into current namespace
from aws_cdk.s3 import Bucket

# Bucket can now be used to instantiate a bucket
bucket = Bucket(...)
```
Java의 가져오기는 TypeScript와 다르게 작동합니다. 각 가져오기 문은 지정된 패키지에서 단일 클래스 이름을 가져오거나 해당 패키지에 정의된 모든 클래스를 가져옵니다(`\*` 사용). 클래스를 가져온 경우 클래스 이름 자체 또는 패키지를 포함한 *적격* 클래스 이름을 사용하여 클래스에 액세스할 수 있습니다.  
AWS Construct Library의 경우 라이브러리 이름은 `software.amazon.awscdk.services.xxx`와 같습니다. 기본 라이브러리는 `software.amazon.awscdk`입니다. AWS CDK 패키지의 Maven 그룹 ID는 `software.amazon.awscdk`입니다.  

```
// Make certain core classes available
import software.amazon.awscdk.Stack;
import software.amazon.awscdk.App;

// Make all Amazon S3 construct library classes available
import software.amazon.awscdk.services.s3.*;

// Make only Bucket and EventType classes available
import software.amazon.awscdk.services.s3.Bucket;
import software.amazon.awscdk.services.s3.EventType;

// An imported class may now be accessed using the simple class name (assuming that name
// does not conflict with another class)
Bucket bucket = Bucket.Builder.create(...).build();

// We can always use the qualified name of a class (including its package) even without an
// import directive
software.amazon.awscdk.services.s3.Bucket bucket =
    software.amazon.awscdk.services.s3.Bucket.Builder.create(...)
        .build();

// Java 10 or later can use var keyword to avoid typing the type twice
var bucket =
    software.amazon.awscdk.services.s3.Bucket.Builder.create(...)
        .build();
```
C\$1에서는 `using` 지시문을 사용하여 유형을 가져옵니다. 두 가지 스타일이 있습니다. 하나는 일반 이름을 사용하여 지정된 네임스페이스의 모든 유형에 액세스할 수 있는 권한을 부여합니다. 다른 별칭을 사용하여 네임스페이스 자체를 참조할 수 있습니다.  
AWS Construct Library 패키지의 경우 패키지 이름은 `Amazon.CDK.AWS.xxx`와 같습니다. 코어 모듈은 `Amazon.CDK`입니다.  

```
// Make CDK base classes available under cdk
using cdk = Amazon.CDK;

// Make all Amazon S3 construct library classes available
using Amazon.CDK.AWS.S3;

// Now we can access any S3 type using its name
var bucket = new Bucket(...);

// Import the S3 namespace under an alias
using s3 = Amazon.CDK.AWS.S3;

// Now we can access an S3 type through the namespace alias
var bucket = new s3.Bucket(...);

// We can always use the qualified name of a type (including its namespace) even without a
// using directive
var bucket = new Amazon.CDK.AWS.S3.Bucket(...);
```
각 AWS Construct Library 모듈은 Go 패키지로 제공됩니다.  

```
import (
    "github.com/aws/aws-cdk-go/awscdk/v2"           // CDK core package
    "github.com/aws/aws-cdk-go/awscdk/v2/awss3"     // AWS S3 construct library module
)

// now instantiate a bucket
bucket := awss3.NewBucket(...)

// use aliases for brevity/clarity
import (
    cdk "github.com/aws/aws-cdk-go/awscdk/v2"           // CDK core package
    s3  "github.com/aws/aws-cdk-go/awscdk/v2/awss3"     // AWS S3 construct library module
)

bucket := s3.NewBucket(...)
```

## 구문 인스턴스화
<a name="work-with-cdk-compare-class"></a>

 AWS CDK 구문 클래스의 이름은 지원되는 모든 언어에서 동일합니다. 대부분의 언어는 `new` 키워드를 사용하여 클래스를 인스턴스화합니다(Python 및 Go는 그렇지 않음). 또한 대부분의 언어에서 키워드 `this`는 현재 인스턴스를 나타냅니다. Python은 규칙에 따라 `self`를 사용합니다. 현재 인스턴스에 대한 참조를 생성한 모든 구문에 `scope` 파라미터로 전달해야 합니다.

AWS CDK 구문에 대한 세 번째 인수는 `props`이며, 구문을 빌드하는 데 필요한 속성을 포함하는 객체입니다. 이 인수는 선택 사항일 수 있지만 필요한 경우 지원되는 언어가 이 인수를 특이한 방식으로 처리합니다. 속성의 이름도 언어의 표준 이름 지정 패턴에 맞게 조정됩니다.

**Example**  

```
// Instantiate default Bucket
const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket');

// Instantiate Bucket with bucketName and versioned properties
const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket', {
  bucketName: 'amzn-s3-demo-bucket',
   versioned: true,
});

// Instantiate Bucket with websiteRedirect, which has its own sub-properties
const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket', {
  websiteRedirect: {host: 'aws.amazon.com'}});
```
Python은 클래스를 인스턴스화할 때 `new` 키워드를 사용하지 않습니다. 속성 인수는 키워드 인수를 사용하여 표시되고 인수는 `snake_case`를 사용하여 이름이 지정됩니다.  
Props 값이 그 자체로 속성 번들인 경우 속성 뒤에 이름이 지정된 클래스로 표시되며, 하위 속성에 대한 키워드 인수를 수락합니다.  
Python에서는 현재 인스턴스가 첫 번째 인수로 메서드에 전달되며, 규칙에 따라 `self`라는 이름이 지정됩니다.  

```
# Instantiate default Bucket
bucket = s3.Bucket(self, "amzn-s3-demo-bucket")

# Instantiate Bucket with bucket_name and versioned properties
bucket = s3.Bucket(self, "amzn-s3-demo-bucket", bucket_name="amzn-s3-demo-bucket", versioned=true)

# Instantiate Bucket with website_redirect, which has its own sub-properties
bucket = s3.Bucket(self, "amzn-s3-demo-bucket", website_redirect=s3.WebsiteRedirect(
            host_name="aws.amazon.com"))
```
Java에서 props 인수는 `XxxxProps`라는 클래스로 표현됩니다(예: `Bucket` 구문의 props의 경우 `BucketProps`). 빌더 패턴을 사용하여 props 인수를 빌드합니다.  
각 `XxxxProps` 클래스에는 빌더가 있습니다. 또한 다음 예와 같이 한 단계로 props와 구문을 빌드하는 각 구문에 대한 편리한 빌더가 있습니다.  
Props의 이름은 `camelCase`를 사용하여 TypeScript에서와 동일합니다.  

```
// Instantiate default Bucket
Bucket bucket = Bucket(self, "amzn-s3-demo-bucket");

// Instantiate Bucket with bucketName and versioned properties
Bucket bucket = Bucket.Builder.create(self, "amzn-s3-demo-bucket")
                      .bucketName("amzn-s3-demo-bucket").versioned(true)
                      .build();

# Instantiate Bucket with websiteRedirect, which has its own sub-properties
Bucket bucket = Bucket.Builder.create(self, "amzn-s3-demo-bucket")
                      .websiteRedirect(new websiteRedirect.Builder()
                          .hostName("aws.amazon.com").build())
                      .build();
```
C\$1에서 props는 객체 이니셜라이저를 사용하여 `XxxxProps`라는 클래스로 지정됩니다(예: `Bucket` 구문의 props의 경우 `BucketProps`).  
Props의 이름은 `PascalCase`를 사용하는 경우를 제외하고 TypeScript와 비슷하게 지정됩니다.  
구문을 인스턴스화할 때 `var` 키워드를 사용하는 것이 편리하므로 클래스 이름을 두 번 입력할 필요가 없습니다. 그러나 로컬 코드 스타일 가이드는 다를 수 있습니다.  

```
// Instantiate default Bucket
var bucket = Bucket(self, "amzn-s3-demo-bucket");

// Instantiate Bucket with BucketName and Versioned properties
var bucket =  Bucket(self, "amzn-s3-demo-bucket", new BucketProps {
                      BucketName = "amzn-s3-demo-bucket",
                      Versioned  = true});

// Instantiate Bucket with WebsiteRedirect, which has its own sub-properties
var bucket = Bucket(self, "amzn-s3-demo-bucket", new BucketProps {
                      WebsiteRedirect = new WebsiteRedirect {
                              HostName = "aws.amazon.com"
                      }});
```
Go에서 구문을 생성하려면 `Xxxxxxx`가 구문의 이름인 함수 `NewXxxxxx`를 직접적으로 호출합니다. 구문의 속성은 구조체로 정의됩니다.  
Go에서 모든 구문 파라미터는 숫자, 부울 및 문자열과 같은 값을 포함한 포인터입니다. `jsii.String`과 같은 편의 함수를 사용하여 이러한 포인터를 생성합니다.  

```
	// Instantiate default Bucket
	bucket := awss3.NewBucket(stack, jsii.String("amzn-s3-demo-bucket"), nil)

	// Instantiate Bucket with BucketName and Versioned properties
	bucket1 := awss3.NewBucket(stack, jsii.String("amzn-s3-demo-bucket"), &awss3.BucketProps{
		BucketName: jsii.String("amzn-s3-demo-bucket"),
		Versioned:  jsii.Bool(true),
	})

	// Instantiate Bucket with WebsiteRedirect, which has its own sub-properties
	bucket2 := awss3.NewBucket(stack, jsii.String("amzn-s3-demo-bucket"), &awss3.BucketProps{
		WebsiteRedirect: &awss3.RedirectTarget{
			HostName: jsii.String("aws.amazon.com"),
		}})
```

## 멤버 액세스
<a name="work-with-cdk-compare-members"></a>

일반적으로 구문 및 기타 AWS CDK 클래스의 속성 또는 속성을 참조하고 이러한 값을 입력으로 사용하여 다른 구문을 빌드합니다. 메서드에 대해 앞서 설명한 이름 지정 차이도 여기에 적용됩니다. 또한 Java에서는 멤버에 직접 액세스할 수 없습니다. 대신 getter 메서드가 제공됩니다.

**Example**  
이름은 `camelCase`입니다.  

```
bucket.bucketArn
```
이름은 `snake_case`입니다.  

```
bucket.bucket_arn
```
각 속성에 대해 getter 메서드가 제공되며, 이러한 이름은 `camelCase`입니다.  

```
bucket.getBucketArn()
```
이름은 `PascalCase`입니다.  

```
bucket.BucketArn
```
이름은 `PascalCase`입니다.  

```
bucket.BucketArn
```

## 열거형 상수
<a name="work-with-cdk-compare-enums"></a>

열거형 상수는 클래스로 범위가 지정되며 모든 언어(때로는 `SCREAMING_SNAKE_CASE`라고도 함)로 밑줄이 그어진 대문자 이름이 있습니다. 클래스 이름도 Go를 제외한 지원되는 모든 언어에서 동일한 케이싱을 사용하므로, 인증된 열거형 이름도 이러한 언어에서 동일합니다.

```
s3.BucketEncryption.KMS_MANAGED
```

Go에서 열거형 상수는 모듈 네임스페이스의 속성이며 다음과 같이 작성됩니다.

```
awss3.BucketEncryption_KMS_MANAGED
```

## 객체 인터페이스
<a name="work-with-cdk-compare-object"></a>

AWS CDK는 TypeScript 객체 인터페이스를 사용하여 클래스가 예상 메서드 및 속성 세트를 구현함을 나타냅니다. 객체 인터페이스의 이름은 `I`로 시작되므로 인식할 수 있습니다. 구체적인 클래스는 `implements` 키워드를 사용하여 구현하는 인터페이스를 나타냅니다.

**Example**  
JavaScript에는 인터페이스 기능이 없습니다. `implements` 키워드와 키워드 뒤에 오는 클래스 이름을 무시할 수 있습니다.

```
import { IAspect, IConstruct } from 'aws-cdk-lib';

class MyAspect implements IAspect {
  public visit(node: IConstruct) {
    console.log('Visited', node.node.path);
  }
}
```
Python에는 인터페이스 기능이 없습니다. 그러나 AWS CDK의 경우 클래스를 `@jsii.implements(interface)`로 장식하여 인터페이스 구현을 표시할 수 있습니다.  

```
from aws_cdk import IAspect, IConstruct
import jsii

@jsii.implements(IAspect)
class MyAspect():
  def visit(self, node: IConstruct) -> None:
    print("Visited", node.node.path)
```

```
import software.amazon.awscdk.IAspect;
import software.amazon.awscdk.IConstruct;

public class MyAspect implements IAspect {
    public void visit(IConstruct node) {
        System.out.format("Visited %s", node.getNode().getPath());
    }
}
```

```
using Amazon.CDK;

public class MyAspect : IAspect
{
    public void Visit(IConstruct node)
    {
        System.Console.WriteLine($"Visited ${node.Node.Path}");
    }
}
```
Go 구조는 구현하는 인터페이스를 명시적으로 선언할 필요가 없습니다. Go 컴파일러는 구조에서 사용할 수 있는 메서드 및 속성을 기반으로 구현을 결정합니다. 예를 들어, 다음 코드에서는 `MyAspect`가 구문을 사용하는 `Visit` 메서드를 제공하기 때문에 `IAspect` 인터페이스를 구현합니다.  

```
type MyAspect struct {
}

func (a MyAspect) Visit(node constructs.IConstruct) {
	fmt.Println("Visited", *node.Node().Path())
}
```

# TypeScript에서 AWS CDK로 작업
<a name="work-with-cdk-typescript"></a>

TypeScript는 AWS Cloud Development Kit(AWS CDK)에 대해 완전히 지원되는 클라이언트 언어이며 안정적인 것으로 간주됩니다. TypeScript에서 AWS CDK를 사용하려면 Microsoft의 TypeScript 컴파일러(`tsc`), [Node.js](https://nodejs.org/), Node Package Manager(`npm`)를 비롯한 익숙한 도구를 사용해야 합니다. 원한다면 [Yarn](https://yarnpkg.com/)을 사용할 수도 있지만 이 가이드의 예에서는 NPM을 사용합니다. AWS Construct Library를 구성하는 모듈은 NPM 리포지토리인 [npmjs.org](https://www.npmjs.com/)를 통해 배포됩니다.

모든 편집기 또는 IDE를 사용할 수 있습니다. 많은 AWS CDK 개발자가 TypeScript에 대한 뛰어난 지원을 제공하는 [Visual Studio Code](https://code.visualstudio.com/) 또는 오픈 소스에 상응하는 [VSCodium](https://vscodium.com/)을 사용합니다.

## TypeScript 시작하기
<a name="typescript-prerequisites"></a>

AWS CDK 작업을 진행하려면 AWS 계정과 자격 증명이 있어야 하며 Node.js와 AWS CDK Toolkit를 설치해야 합니다. [AWS CDK 시작하기](getting-started.md)를 참조하세요.

또한 TypeScript 자체(버전 3.8 이상)가 필요합니다. 아직 설치하지 않은 경우 `npm`를 사용하여 설치할 수 있습니다.

```
$ npm install -g typescript
```

**참고**  
권한 오류가 발생하고 시스템에 관리자 액세스 권한이 있는 경우 `sudo npm install -g typescript`를 시도하세요.

TypeScript를 일반 `npm update -g typescript`로 최신 상태로 유지합니다.

**참고**  
타사 언어 사용 중단: 언어 버전은 공급업체 또는 커뮤니티에서 공유하는 수명 종료(EOL)까지만 지원되며 사전 공지와 함께 변경될 수 있습니다.

## 프로젝트 생성
<a name="typescript-newproject"></a>

빈 디렉터리에서 `cdk init`를 간접적으로 호출하여 새 AWS CDK 프로젝트를 생성합니다. `--language` 옵션을 사용하고 `typescript`를 지정합니다.

```
$ mkdir my-project
$ cd my-project
$ cdk init app --language typescript
```

프로젝트를 생성하면 [https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib-readme.html](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib-readme.html) 모듈과 해당 종속성도 설치됩니다.

 `cdk init`는 프로젝트 폴더의 이름을 사용하여 클래스, 하위 폴더 및 파일을 포함한 프로젝트의 다양한 요소의 이름을 지정합니다. 폴더 이름의 하이픈은 밑줄로 변환됩니다. 하지만 이름은 TypeScript 식별자의 형식을 따라야 합니다. 예를 들어 숫자로 시작하거나 공백을 포함해서는 안 됩니다.

## 로컬 `tsc` 및 `cdk` 사용
<a name="typescript-local"></a>

대부분의 경우 이 안내서에서는 TypeScript 및 CDK Toolkit를 전역적으로(`npm install -g typescript aws-cdk`) 설치한다고 가정하고 제공된 명령 예(`cdk synth` 등)는 이 가정을 따릅니다. 이 접근 방식을 사용하면 두 구성 요소를 모두 최신 상태로 유지하기가 쉬우며, 두 구성 요소 모두 역호환성에 대한 엄격한 접근 방식을 취하므로 항상 최신 버전을 사용하는 데 따르는 위험은 거의 없습니다.

일부 팀은 TypeScript 컴파일러 및 CDK Toolkit와 같은 도구를 포함하여 각 프로젝트 내의 모든 종속성을 지정하는 것을 선호합니다. 이 연습을 통해 이러한 구성 요소를 특정 버전에 고정하고 팀 및 CI/CD 환경의 모든 개발자가 정확히 이러한 버전을 사용하도록 할 수 있습니다. 이렇게 하면 가능한 변경 원인을 제거하여 빌드 및 배포를 더 일관되고 반복 가능하게 만들 수 있습니다.

CDK에는 TypeScript 프로젝트 템플릿의 `package.json`에 TypeScript와 CDK Toolkit에 대한 종속성이 모두 포함되어 있으므로 이 접근 방식을 사용하려면 프로젝트를 변경할 필요가 없습니다. 앱을 빌드하고 명령을 실행하려면 약간 다른 `cdk` 명령을 실행하기만 하면 됩니다.


| 작업 | 글로벌 도구 사용 | 로컬 도구 사용 | 
| --- | --- | --- | 
|   **프로젝트 초기화**   |   `cdk init --language typescript`   |   `npx aws-cdk init --language typescript`   | 
|   **빌드**   |   `tsc`   |   `npm run build`   | 
|   **CDK Toolkit 명령 실행**   |   `cdk …​`   |   `npm run cdk …​`‘or’`npx aws-cdk …​`   | 

 `npx aws-cdk`는 현재 프로젝트에 로컬로 설치된 CDK Toolkit 버전이 있는 경우 해당 버전을 실행하여 글로벌 설치로 돌아갑니다. 글로벌 설치가 없는 경우 `npx`는 CDK Toolkit의 임시 사본을 다운로드하여 실행합니다. `@` 구문을 사용하여 CDK Toolkit의 임의 버전을 지정할 수 있습니다. `npx aws-cdk@2.0 --version`은 `2.0.0`을 출력합니다.

**작은 정보**  
로컬 CDK Toolkit 설치와 함께 `cdk` 명령을 사용할 수 있도록 별칭을 설정합니다.  

```
$ alias cdk="npx aws-cdk"
```

```
doskey cdk=npx aws-cdk $*
```

## AWS Construct Library 모듈 관리
<a name="typescript-managemodules"></a>

Node Package Manager(`npm`)를 사용하여 앱과 필요한 기타 패키지에서 사용할 AWS Construct Library 모듈을 설치하고 업데이트합니다. (원하는 경우 `npm` 대신 `yarn`을 사용할 수 있습니다.) `npm`은 해당 모듈에 대한 종속성을 자동으로 설치합니다.

대부분의 AWS CDK 구문은 `cdk init`으로 생성된 새 프로젝트의 기본 종속성인 `aws-cdk-lib`라는 이름의 기본 CDK 패키지에 있습니다. 상위 수준 구문이 아직 개발되고 있는 ‘실험적’ AWS Construct Library 모듈은 `@aws-cdk/<SERVICE-NAME>-alpha`와 같이 이름이 지정됩니다. 서비스 이름에는 *aws-* 접두사가 있습니다. 모듈 이름을 잘 모르는 경우 [NPM에서 검색하세요](https://www.npmjs.com/search?q=%40aws-cdk).

**참고**  
[CDK API 참조](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-construct-library.html)에는 패키지 이름도 표시됩니다.

예를 들어 아래 명령은 AWS CodeStar 에 대한 실험 모듈을 설치합니다.

```
$ npm install @aws-cdk/aws-codestar-alpha
```

일부 서비스의 Construct Library 지원은 둘 이상의 네임스페이스에 있습니다. 예를 들어, `aws-route53` 외에도 `aws-route53-targets`, `aws-route53-patterns`, `aws-route53resolver`라는 3개의 추가 Amazon Route 53 네임스페이스가 있습니다.

프로젝트의 종속성은 `package.json`에 유지됩니다. 이 파일을 편집하여 종속성의 일부 또는 전부를 특정 버전으로 잠그거나 특정 기준에 따라 최신 버전으로 업데이트할 수 있습니다. `package.json`에 지정한 규칙에 따라 프로젝트의 NPM 종속성을 허용되는 최신 버전으로 업데이트하려면 다음을 수행하세요.

```
$ npm update
```

TypeScript에서 NPM을 사용하여 모듈을 설치하는 데 사용하는 것과 동일한 이름으로 모듈을 코드로 가져옵니다. 애플리케이션에서 AWS CDK 클래스 및 AWS Construct Library 모듈을 가져올 때 다음 방법을 사용하는 것이 좋습니다. 이러한 지침을 따르면 코드를 다른 AWS CDK 애플리케이션과 일치시킬 뿐만 아니라 이해하기도 쉽습니다.
+ `require()`가 아닌 ES6 스타일 `import` 지시문을 사용합니다.
+ 일반적으로 `aws-cdk-lib`에서 개별 클래스를 가져옵니다.

  ```
  import { App, Stack } from 'aws-cdk-lib';
  ```
+ `aws-cdk-lib`에서 여러 클래스가 필요한 경우 개별 클래스를 가져오는 대신 `cdk`의 네임스페이스 별칭을 사용할 수 있습니다. 둘 다 수행하지 마세요.

  ```
  import * as cdk from 'aws-cdk-lib';
  ```
+ 일반적으로 짧은 네임스페이스 별칭을 사용하여 AWS 서비스 구문을 가져옵니다.

  ```
  import { aws_s3 as s3 } from 'aws-cdk-lib';
  ```

## TypeScript에서 종속성 관리
<a name="work-with-cdk-typescript-dependencies"></a>

TypeScript CDK 프로젝트에서는 프로젝트의 메인 디렉터리의 `package.json` 파일에 종속성이 지정됩니다. 코어 AWS CDK 모듈은 `aws-cdk-lib`라는 단일 `NPM` 패키지에 있습니다.

`npm install`을 사용하여 패키지를 설치하면 NPM은 `package.json`에 패키지를 기록합니다.

원하는 경우 NPM 대신 Yarn을 사용할 수 있습니다. 하지만 CDK는 Yarn 2의 기본 모드인 Yarn의 플러그 앤 플레이 모드를 지원하지 않습니다. 프로젝트의 `.yarnrc.yml` 파일에 다음을 추가하여 이 기능을 끕니다.

```
nodeLinker: node-modules
```

### CDK 애플리케이션
<a name="work-with-cdk-typescript-dependencies-apps"></a>

다음은 `cdk init --language typescript` 명령에서 생성된 예제 `package.json` 파일입니다.

```
{
  "name": "my-package",
  "version": "0.1.0",
  "bin": {
    "my-package": "bin/my-package.js"
  },
  "scripts": {
    "build": "tsc",
    "watch": "tsc -w",
    "test": "jest",
    "cdk": "cdk"
  },
  "devDependencies": {
    "@types/jest": "^26.0.10",
    "@types/node": "10.17.27",
    "jest": "^26.4.2",
    "ts-jest": "^26.2.0",
    "aws-cdk": "2.16.0",
    "ts-node": "^9.0.0",
    "typescript": "~3.9.7"
  },
  "dependencies": {
    "aws-cdk-lib": "2.16.0",
    "constructs": "^10.0.0",
    "source-map-support": "^0.5.16"
  }
}
```

배포 가능한 CDK 앱의 경우 `package.json`의 `dependencies` 섹션에 `aws-cdk-lib`를 지정해야 합니다. 캐럿(^) 버전 번호 지정자를 사용하여 동일한 메이저 버전 내에 있는 한 지정된 버전보다 이후 버전을 수락할 것임을 표시할 수 있습니다.

실험 구문의 경우 변경될 수 있는 API가 있는 알파 construct 라이브러리 모듈의 정확한 버전을 지정합니다. ^ 또는 \$1를 사용하지 마세요. 이러한 모듈의 이후 버전에서는 API가 변경되어 앱이 중단될 수 있습니다.

`package.json`의 `devDependencies` 섹션에서 앱을 테스트하는 데 필요한 라이브러리 및 도구의 버전(예: `jest` 테스트 프레임워크)을 지정합니다. 선택적으로 ^를 사용하여 이후 호환 버전을 허용하도록 지정할 수 있습니다.

### 타사 construct 라이브러리
<a name="work-with-cdk-typescript-dependencies-libraries"></a>

Construct 라이브러리를 개발하는 경우 다음 예제 `package.json` 파일에 표시된 대로 `peerDependencies` 및 `devDependencies` 섹션의 조합을 사용하여 종속성을 지정합니다.

```
{
  "name": "my-package",
  "version": "0.0.1",
  "peerDependencies": {
    "aws-cdk-lib": "^2.14.0",
    "@aws-cdk/aws-appsync-alpha": "2.10.0-alpha",
    "constructs": "^10.0.0"
  },
  "devDependencies": {
    "aws-cdk-lib": "2.14.0",
    "@aws-cdk/aws-appsync-alpha": "2.10.0-alpha",
    "constructs": "10.0.0",
    "jsii": "^1.50.0",
    "aws-cdk": "^2.14.0"
  }
}
```

`peerDependencies`에서 캐럿(^)을 사용하여 라이브러리가 작동하는 `aws-cdk-lib`의 최저 버전을 지정합니다. 이렇게 하면 라이브러리와 다양한 CDK 버전의 호환성이 극대화됩니다. 변경될 수 있는 API가 있는 알파 construct 라이브러리 모듈의 정확한 버전을 지정합니다. `peerDependencies`를 사용하면 `node_modules` 트리에 모든 CDK 라이브러리의 복사본이 하나만 있는지 확인합니다.

`devDependencies`에서 테스트에 필요한 도구 및 라이브러리를 지정합니다. 필요에 따라 ^를 사용하여 이후 호환 버전이 허용됨을 나타냅니다. 라이브러리를 광고하는 `aws-cdk-lib` 및 기타 CDK 패키지의 가장 낮은 버전을 정확히(^ 또는 \$1 제외) 지정합니다. 이 연습을 통해 테스트가 해당 버전에서 실행되는지 확인합니다. 이렇게 하면 새 버전에서만 발견된 기능을 실수로 사용하면 테스트가 이를 포착할 수 있습니다.

**주의**  
 `peerDependencies`는 NPM 7 이상에서만 자동으로 설치됩니다. NPM 6 이하를 사용하거나 Yarn을 사용하는 경우 `devDependencies`에 종속성의 종속성을 포함해야 합니다. 그렇지 않으면 설치되지 않으며 해결되지 않은 피어 종속성에 대한 경고가 표시됩니다.

### 종속성 설치 및 업데이트
<a name="work-with-cdk-typescript-dependencies-install"></a>

다음 명령을 실행하여 프로젝트의 종속성을 설치하세요.

**Example**  

```
# Install the latest version of everything that matches the ranges in 'package.json'
npm install

# Install the same exact dependency versions as recorded in 'package-lock.json'
npm ci
```

```
# Install the latest version of everything that matches the ranges in 'package.json'
$ yarn upgrade

# Install the same exact dependency versions as recorded in 'yarn.lock'
$ yarn install --frozen-lockfile
```

설치된 모듈을 업데이트하기 위해 이전 `npm install` 및 `yarn upgrade` 명령을 사용할 수 있습니다. 두 명령 모두 `package.json`의 규칙을 충족하는 최신 버전으로 `node_modules`의 패키지를 업데이트합니다. 그러나 새 최소 버전을 설정하기 위해 할 수 있는 `package.json` 자체 업데이트는 없습니다. GitHub 에서 패키지를 호스팅하는 경우 `package.json`을 자동으로 업데이트하도록 [Dependabot 버전 업데이트](https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuring-dependabot-version-updates)를 구성할 수 있습니다. 또는 [npm-check-updates](https://www.npmjs.com/package/npm-check-updates)를 사용합니다.

**중요**  
설계상 종속성을 설치하거나 업데이트할 때 NPM 및 Yarn은 `package.json`에 지정된 요구 사항을 충족하는 모든 패키지의 최신 버전을 선택합니다. 이러한 버전이 (우연히 또는 의도적으로) 파손될 위험이 항상 있습니다. 프로젝트 종속성을 업데이트한 후 철저히 테스트합니다.

## TypeScript의 AWS CDK 관용구
<a name="typescript-cdk-idioms"></a>

### Props
<a name="typescript-props"></a>

모든 AWS Construct Library 클래스는 구문이 정의되는 *scope*(구문 트리에서 상위), *id*, *props*라는 세 가지 인수를 사용하여 인스턴스화됩니다. 인수 *props*는 구문이 생성하는 AWS 리소스를 구성하는 데 사용하는 키/값 페어의 번들입니다. 다른 클래스 및 메서드도 인수에 ‘속성 번들‘ 패턴을 사용합니다.

TypeScript에서 `props`의 형태는 필수 및 선택 인수와 해당 유형을 알려주는 인터페이스를 사용하여 정의됩니다. 이러한 인터페이스는 각 종류의 `props` 인수에 대해 정의되며, 일반적으로 단일 구문 또는 메서드에 한정됩니다. 예를 들어 [https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.Bucket.html](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.Bucket.html) 구문(`aws-cdk-lib/aws-s3` 모듈)은 [https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.BucketProps.html](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.BucketProps.html) 인터페이스에 부합하는 `props` 인수를 지정합니다.

속성 자체가 객체인 경우, 예를 들어 `BucketProps`의 [https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.BucketProps.html#websiteredirect](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.BucketProps.html#websiteredirect) 속성은 해당 객체의 모양이 일치해야 하는 자체 인터페이스를 갖게 되며, 이 경우 [https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.RedirectTarget.html](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.RedirectTarget.html)입니다.

AWS Construct Library 클래스를 하위 클래스로 분류하는 경우(또는 props와 유사한 인수를 사용하는 메서드를 재정의하는 경우) 기존 인터페이스에서 상속하여 코드에 필요한 새 props를 지정하는 새 인터페이스를 생성할 수 있습니다. 상위 클래스 또는 기본 메서드를 직접적으로 호출할 때 객체에 제공되었지만 인터페이스에 지정되지 않은 속성은 무시되므로 일반적으로 받은 전체 props 인수를 전달할 수 있습니다.

AWS CDK의 향후 릴리스에서는 사용자 소유의 속성에 사용한 이름과 함께 새 속성을 동시에 추가할 수 있습니다. 상속 체인에 수신한 값을 전달하면 예기치 않은 동작이 발생할 수 있습니다. 속성을 제거하거나 `undefined`로 설정한 상태에서 수신한 props의 단순 복사본을 전달하는 것이 더 안전합니다. 예:

```
super(scope, name, {...props, encryptionKeys: undefined});
```

또는 구문에 속해 있는지 명확히 알 수 있도록 속성 이름을 지정합니다. 이렇게 하면 향후 AWS CDK 릴리스에서 속성과 충돌할 가능성이 거의 없습니다. 이러한 객체가 많은 경우 적절한 이름의 객체 하나를 사용하여 객체를 고정합니다.

### 누락된 값
<a name="typescript-missing-values"></a>

TypeScript에서 객체(props 등)에 누락된 값은 `undefined` 값을 갖습니다. 언어 버전 3.7에는 이러한 값 작업을 간소화하는 연산자가 도입되어 정의되지 않은 값에 도달하면 기본값과 ‘단락‘ 체인을 더 쉽게 지정할 수 있습니다. 이러한 기능에 대한 자세한 내용은 [TypeScript 3.7 릴리스 정보](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html), 특히 처음 두 가지 기능인 선택적 체인 및 Nullish 코어레싱을 참조하세요.

## CDK 앱 빌드 및 실행
<a name="typescript-running"></a>

일반적으로 애플리케이션을 빌드하고 실행할 때는 프로젝트의 루트 디렉터리에 있어야 합니다.

Node.js는 TypeScript를 직접 실행할 수 없습니다. 대신 TypeScript 컴파일러인 `tsc`를 사용하여 애플리케이션이 JavaScript로 변환됩니다. 그러면 결과 JavaScript 코드가 실행됩니다.

AWS CDK는 앱을 실행해야 할 때마다 자동으로 이 작업을 수행합니다. 그러나 오류를 확인하고 테스트를 실행하기 위해 수동으로 컴파일하는 것이 유용할 수 있습니다. TypeScript 앱을 수동으로 컴파일하려면 `npm run build`를 실행합니다. 또한 소스 파일에 변경 사항을 저장할 때마다 TypeScript 컴파일러가 자동으로 앱을 다시 빌드하는 감시 모드로 들어가도록 `npm run watch`를 실행할 수도 있습니다.

# JavaScript에서 AWS CDK 작업
<a name="work-with-cdk-javascript"></a>

JavaScript는 AWS CDK에서 완벽하게 지원되는 클라이언트 언어이며 안정적인 것으로 간주됩니다. JavaScript의 AWS 클라우드 개발 키트(AWS CDK) 작업은 [Node.js](https://nodejs.org/) 및 Node Package Manager()를 비롯한 친숙한 도구를 사용합니다`npm`. 원한다면 [Yarn](https://yarnpkg.com/)을 사용할 수도 있지만 이 가이드의 예에서는 NPM을 사용합니다. AWS Construct Library를 구성하는 모듈은 NPM 리포지토리 [npmjs.org](https://www.npmjs.com/) 통해 배포됩니다.

모든 편집기 또는 IDE를 사용할 수 있습니다. 많은 AWS CDK 개발자는 JavaScript를 잘 지원하는 [Visual Studio Code](https://code.visualstudio.com/)(또는 이에 상응하는 오픈 소스 [VSCodium](https://vscodium.com/))를 사용합니다.

## JavaScript 시작하기
<a name="javascript-prerequisites"></a>

 AWS CDK로 작업하려면 AWS 계정과 자격 증명이 있어야 하며 Node.js와 AWS CDK 도구 키트를 설치해야 합니다. [AWS CDK 시작하기를](getting-started.md) 참조하세요.

JavaScript AWS CDK 애플리케이션에는이 외에 추가 사전 조건이 필요하지 않습니다.

**참고**  
타사 언어 사용 중단: 언어 버전은 공급업체 또는 커뮤니티에서 공유하는 수명 종료(EOL)까지만 지원되며 사전 공지와 함께 변경될 수 있습니다.

## 프로젝트 생성
<a name="javascript-newproject"></a>

빈 디렉터리`cdk init`에서 호출하여 새 AWS CDK 프로젝트를 생성합니다. `--language` 옵션을 사용하고 `javascript`를 지정합니다

```
$ mkdir my-project
$ cd my-project
$ cdk init app --language javascript
```

프로젝트를 생성하면 [aws-cdk-lib](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib-readme.html) 모듈과 해당 종속성도 설치됩니다.

 `cdk init`는 프로젝트 폴더의 이름을 사용하여 클래스, 하위 폴더 및 파일을 포함한 프로젝트의 다양한 요소의 이름을 지정합니다. 폴더 이름의 하이픈은 밑줄로 변환됩니다. 하지만 이름은 JavaScript 식별자의 형식을 따라야 합니다. 예를 들어 숫자로 시작하거나 공백을 포함해서는 안 됩니다.

## 로컬 `cdk` 사용
<a name="javascript-local"></a>

대부분의 경우 이 안내서에서는 CDK Toolkit를 전역적으로 설치한다고 가정하고(`npm install -g aws-cdk`) 제공된 명령 예(예: `cdk synth`)는 이 가정을 따릅니다. 이 접근 방식을 사용하면 CDK Toolkit를 쉽게 최신 상태로 유지할 수 있으며 CDK는 역호환성에 대한 엄격한 접근 방식을 취하므로 항상 최신 버전을 사용할 때 일반적으로 위험이 거의 없습니다.

일부 팀은 CDK Toolkit와 같은 도구를 포함하여 각 프로젝트 내에서 모든 종속성을 지정하는 것을 선호합니다. 이 연습을 통해 이러한 구성 요소를 특정 버전에 고정하고 팀(및 CI/CD 환경)의 모든 개발자가 정확히 해당 버전을 사용하도록 할 수 있습니다. 이렇게 하면 가능한 변경 원인을 제거하여 빌드 및 배포를 더 일관되고 반복 가능하게 만들 수 있습니다.

CDK는 JavaScript 프로젝트 템플릿의 `package.json`에 CDK Toolkit에 대한 종속성을 포함하므로 이 접근 방식을 사용하려면 프로젝트를 변경할 필요가 없습니다. 앱을 빌드하고 명령을 실행하려면 약간 다른 `cdk` 명령을 실행하기만 하면 됩니다.


| 연산 | 글로벌 도구 사용 | 로컬 도구 사용 | 
| --- | --- | --- | 
|   **프로젝트 초기화**   |   `cdk init --language javascript`   |   `npx aws-cdk init --language javascript`   | 
|   **CDK Toolkit 명령 실행**   |   `cdk …​`   |   `npm run cdk …​` 또는 `npx aws-cdk …​`   | 

 `npx aws-cdk`는 현재 프로젝트에 로컬로 설치된 CDK Toolkit 버전이 있는 경우 해당 버전을 실행하여 글로벌 설치로 돌아갑니다. 글로벌 설치가 없는 경우 `npx`는 CDK Toolkit의 임시 사본을 다운로드하여 실행합니다. `@` 구문을 사용하여 CDK Toolkit의 임의 버전을 지정할 수 있습니다. `npx aws-cdk@1.120 --version`은 `1.120.0`을 출력합니다.

**작은 정보**  
로컬 CDK Toolkit 설치와 함께 `cdk` 명령을 사용할 수 있도록 별칭을 설정합니다.  

```
$ alias cdk="npx aws-cdk"
```

```
doskey cdk=npx aws-cdk $*
```

## AWS Construct Library 모듈 관리
<a name="javascript-managemodules"></a>

노드 패키지 관리자(`npm`)를 사용하여 앱과 필요한 기타 패키지에 사용할 AWS Construct Library 모듈을 설치하고 업데이트합니다. (원하는 경우 `npm` 대신 `yarn`을 사용할 수 있습니다.) `npm`은 해당 모듈에 대한 종속성을 자동으로 설치합니다.

대부분의 AWS CDK 구문은 라는 기본 CDK 패키지에 있으며`aws-cdk-lib`, 이는에서 생성한 새 프로젝트의 기본 종속성입니다`cdk init`. 상위 수준 구문이 아직 개발 중인 "실험" AWS 건설 라이브러리 모듈의 이름은와 같습니다`aws-cdk-lib/<SERVICE-NAME>-alpha`. 서비스 이름에는 *aws-* 접두사가 있습니다. 모듈 이름을 잘 모르는 경우 [NPM에서 검색하세요](https://www.npmjs.com/search?q=%40aws-cdk).

**참고**  
[CDK API 참조](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-construct-library.html)에는 패키지 이름도 표시됩니다.

예를 들어 아래 명령은 for AWS CodeStar 실험 모듈을 설치합니다.

```
npm install @aws-cdk/aws-codestar-alpha
```

일부 서비스의 Construct Library 지원은 둘 이상의 네임스페이스에 있습니다. 예를 들어, `aws-route53` 외에도 `aws-route53-targets`, `aws-route53-patterns`, `aws-route53resolver`라는 3개의 추가 Amazon Route 53 네임스페이스가 있습니다.

프로젝트의 종속성은 `package.json`에 유지됩니다. 이 파일을 편집하여 종속성의 일부 또는 전부를 특정 버전으로 잠그거나 특정 기준에 따라 최신 버전으로 업데이트할 수 있습니다. `package.json`에 지정한 규칙에 따라 프로젝트의 NPM 종속성을 허용되는 최신 버전으로 업데이트하려면 다음을 수행하세요.

```
npm update
```

JavaScript에서 NPM을 사용하여 모듈을 설치하는 데 사용하는 것과 동일한 이름으로 모듈을 코드로 가져옵니다. 애플리케이션에서 AWS CDK 클래스 및 AWS Construct Library 모듈을 가져올 때 다음 방법을 사용하는 것이 좋습니다. 이러한 지침을 따르면 코드를 다른 AWS CDK 애플리케이션과 일치시킬 뿐만 아니라 더 쉽게 이해할 수 있습니다.
+ ES6 스타일 `import` 지시문이 아닌 `require()`를 사용합니다. 이전 버전의 Node.js는 ES6 가져오기를 지원하지 않으므로 이전 구문을 사용하는 것이 더 널리 호환됩니다. (ES6 가져오기를 사용하려는 경우 [esm](https://www.npmjs.com/package/esm)을 사용하여 프로젝트가 지원되는 모든 Node.js 버전과 호환되는지 확인합니다.)
+ 일반적으로 `aws-cdk-lib`에서 개별 클래스를 가져옵니다.

  ```
  const { App, Stack } = require('aws-cdk-lib');
  ```
+ `aws-cdk-lib`에서 여러 클래스가 필요한 경우 개별 클래스를 가져오는 대신 `cdk`의 네임스페이스 별칭을 사용할 수 있습니다. 둘 다 수행하지 마세요.

  ```
  const cdk = require('aws-cdk-lib');
  ```
+ 일반적으로 짧은 네임스페이스 별칭을 사용하여 AWS 구문 라이브러리를 가져옵니다.

  ```
  const { s3 } = require('aws-cdk-lib/aws-s3');
  ```

## JavaScript에서 종속성 관리
<a name="work-with-cdk-javascript-dependencies"></a>

JavaScript CDK 프로젝트에서는 프로젝트의 메인 디렉터리의 `package.json` 파일에 종속성이 지정됩니다. 코어 AWS CDK 모듈은 라는 단일 `NPM` 패키지에 있습니다`aws-cdk-lib`.

`npm install`을 사용하여 패키지를 설치하면 NPM은 `package.json`에 패키지를 기록합니다.

원하는 경우 NPM 대신 Yarn을 사용할 수 있습니다. 하지만 CDK는 Yarn 2의 기본 모드인 Yarn의 플러그 앤 플레이 모드를 지원하지 않습니다. 프로젝트의 `.yarnrc.yml` 파일에 다음을 추가하여 이 기능을 끕니다.

```
nodeLinker: node-modules
```

### CDK 애플리케이션
<a name="work-with-cdk-javascript-dependencies-apps"></a>

다음은 `cdk init --language typescript` 명령에서 생성된 예제 `package.json` 파일입니다. JavaScript용으로 생성된 파일은 TypeScript 관련 항목이 없는 경우에만 유사합니다.

```
{
  "name": "my-package",
  "version": "0.1.0",
  "bin": {
    "my-package": "bin/my-package.js"
  },
  "scripts": {
    "build": "tsc",
    "watch": "tsc -w",
    "test": "jest",
    "cdk": "cdk"
  },
  "devDependencies": {
    "@types/jest": "^26.0.10",
    "@types/node": "10.17.27",
    "jest": "^26.4.2",
    "ts-jest": "^26.2.0",
    "aws-cdk": "2.16.0",
    "ts-node": "^9.0.0",
    "typescript": "~3.9.7"
  },
  "dependencies": {
    "aws-cdk-lib": "2.16.0",
    "constructs": "^10.0.0",
    "source-map-support": "^0.5.16"
  }
}
```

배포 가능한 CDK 앱의 경우 `package.json`의 `dependencies` 섹션에 `aws-cdk-lib`를 지정해야 합니다. 캐럿(^) 버전 번호 지정자를 사용하여 동일한 메이저 버전 내에 있는 한 지정된 버전보다 이후 버전을 수락할 것임을 표시할 수 있습니다.

실험 구문의 경우 변경될 수 있는 API가 있는 알파 construct 라이브러리 모듈의 정확한 버전을 지정합니다. ^ 또는 \$1를 사용하지 마세요. 이러한 모듈의 이후 버전에서는 API가 변경되어 앱이 중단될 수 있습니다.

`package.json`의 `devDependencies` 섹션에서 앱을 테스트하는 데 필요한 라이브러리 및 도구의 버전(예: `jest` 테스트 프레임워크)을 지정합니다. 선택적으로 ^를 사용하여 이후 호환 버전을 허용하도록 지정할 수 있습니다.

### 타사 construct 라이브러리
<a name="work-with-cdk-javascript-dependencies-libraries"></a>

Construct 라이브러리를 개발하는 경우 다음 예제 `package.json` 파일에 표시된 대로 `peerDependencies` 및 `devDependencies` 섹션의 조합을 사용하여 종속성을 지정합니다.

```
{
  "name": "my-package",
  "version": "0.0.1",
  "peerDependencies": {
    "aws-cdk-lib": "^2.14.0",
    "@aws-cdk/aws-appsync-alpha": "2.10.0-alpha",
    "constructs": "^10.0.0"
  },
  "devDependencies": {
    "aws-cdk-lib": "2.14.0",
    "@aws-cdk/aws-appsync-alpha": "2.10.0-alpha",
    "constructs": "10.0.0",
    "jsii": "^1.50.0",
    "aws-cdk": "^2.14.0"
  }
}
```

`peerDependencies`에서 캐럿(^)을 사용하여 라이브러리가 작동하는 `aws-cdk-lib`의 최저 버전을 지정합니다. 이렇게 하면 라이브러리와 다양한 CDK 버전의 호환성이 극대화됩니다. 변경될 수 있는 API가 있는 알파 construct 라이브러리 모듈의 정확한 버전을 지정합니다. `peerDependencies`를 사용하면 `node_modules` 트리에 모든 CDK 라이브러리의 복사본이 하나만 있는지 확인합니다.

`devDependencies`에서 테스트에 필요한 도구 및 라이브러리를 지정합니다. 필요에 따라 ^를 사용하여 이후 호환 버전이 허용됨을 나타냅니다. 라이브러리를 광고하는 `aws-cdk-lib` 및 기타 CDK 패키지의 가장 낮은 버전을 정확히(^ 또는 \$1 제외) 지정합니다. 이 연습을 통해 테스트가 해당 버전에서 실행되는지 확인합니다. 이렇게 하면 새 버전에서만 발견된 기능을 실수로 사용하면 테스트가 이를 포착할 수 있습니다.

**주의**  
 `peerDependencies`는 NPM 7 이상에서만 자동으로 설치됩니다. NPM 6 이하를 사용하거나 Yarn을 사용하는 경우 `devDependencies`에 종속성의 종속성을 포함해야 합니다. 그렇지 않으면 설치되지 않으며 해결되지 않은 피어 종속성에 대한 경고가 표시됩니다.

### 종속성 설치 및 업데이트
<a name="work-with-cdk-javascript-dependencies-install"></a>

다음 명령을 실행하여 프로젝트의 종속성을 설치하세요.

**Example**  

```
# Install the latest version of everything that matches the ranges in 'package.json'
npm install

# Install the same exact dependency versions as recorded in 'package-lock.json'
npm ci
```

```
# Install the latest version of everything that matches the ranges in 'package.json'
yarn upgrade

# Install the same exact dependency versions as recorded in 'yarn.lock'
yarn install --frozen-lockfile
```

설치된 모듈을 업데이트하기 위해 이전 `npm install` 및 `yarn upgrade` 명령을 사용할 수 있습니다. 두 명령 모두 `package.json`의 규칙을 충족하는 최신 버전으로 `node_modules`의 패키지를 업데이트합니다. 그러나 새 최소 버전을 설정하기 위해 할 수 있는 `package.json` 자체 업데이트는 없습니다. GitHub 에서 패키지를 호스팅하는 경우 `package.json`을 자동으로 업데이트하도록 [Dependabot 버전 업데이트](https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuring-dependabot-version-updates)를 구성할 수 있습니다. 또는 [npm-check-updates](https://www.npmjs.com/package/npm-check-updates)를 사용합니다.

**중요**  
설계상 종속성을 설치하거나 업데이트할 때 NPM 및 Yarn은 `package.json`에 지정된 요구 사항을 충족하는 모든 패키지의 최신 버전을 선택합니다. 이러한 버전이 (우연히 또는 의도적으로) 파손될 위험이 항상 있습니다. 프로젝트 종속성을 업데이트한 후 철저히 테스트합니다.

## AWS JavaScript의 CDK 관용구
<a name="javascript-cdk-idioms"></a>

### Props
<a name="javascript-props"></a>

모든 AWS Construct Library 클래스는 구문이 정의되는 *범위*(구성 트리의 상위), 구문이 생성하는 AWS 리소스를 구성하는 데 사용하는 키/값 페어 번들인 *id* 및 *props*의 세 가지 인수를 사용하여 인스턴스화됩니다. 다른 클래스 및 메서드도 인수에 ‘속성 번들’ 패턴을 사용합니다.

JavaScript 자동 완성이 양호한 IDE 또는 편집기를 사용하면 속성 이름의 철자가 틀리지 않도록 하는 데 도움이 됩니다. 구문에서 `encryptionKeys` 속성을 예상하고 `encryptionkeys`의 철자를 지정하는 경우 구문을 인스턴스화할 때 의도한 값을 전달하지 않은 것입니다. 이로 인해 속성이 필요한 경우 합성 시 오류가 발생하거나 선택 사항인 경우 속성이 자동으로 무시될 수 있습니다. 후자의 경우 재정의하려는 기본 동작을 얻을 수 있습니다. 여기에서 특히 주의해야 합니다.

 AWS Construct Library 클래스를 하위 클래스로 분류할 때(또는 props와 유사한 인수를 사용하는 메서드를 재정의할 때) 자체 사용을 위해 추가 속성을 수락할 수 있습니다. 이러한 값은 상위 클래스 또는 재정의된 메서드에서 무시됩니다. 해당 코드에서 액세스할 수 없으므로 일반적으로 받은 모든 props를 전달할 수 있습니다.

 AWS CDK의 향후 릴리스에서는 자체 속성에 사용한 이름과 함께 새 속성을 추가할 수 있습니다. 상속 체인에 수신한 값을 전달하면 예기치 않은 동작이 발생할 수 있습니다. 속성을 제거하거나 `undefined`로 설정한 상태에서 수신한 props의 단순 복사본을 전달하는 것이 더 안전합니다. 예제:

```
super(scope, name, {...props, encryptionKeys: undefined});
```

또는 구문에 속해 있는지 명확히 알 수 있도록 속성 이름을 지정합니다. 이렇게 하면 향후 AWS CDK 릴리스에서 속성과 충돌할 가능성이 거의 없습니다. 이러한 객체가 많은 경우 적절한 이름의 객체 하나를 사용하여 객체를 고정합니다.

### 누락된 값
<a name="javascript-missing-values"></a>

객체의 누락된 값(예: `props`)은 JavaScript의 `undefined` 값을 갖습니다. 이러한 문제를 처리하는 데는 일반적인 기법이 적용됩니다. 예를 들어 정의되지 않은 값의 속성에 액세스하기 위한 일반적인 관용구는 다음과 같습니다.

```
// a may be undefined, but if it is not, it may have an attribute b
// c is undefined if a is undefined, OR if a doesn't have an attribute b
let c = a && a.b;
```

그러나 `a`에 `undefined` 외에 다른 ‘falsy’ 값이 있는 경우 테스트를 더 명시적으로 만드는 것이 좋습니다. 여기에서는 `null` 및 `undefined`가 두 가지를 동시에 테스트하는 것과 동일하다는 사실을 활용할 것입니다.

```
let c = a == null ? a : a.b;
```

**작은 정보**  
Node.js 14.0 이상은 정의되지 않은 값의 처리를 단순화할 수 있는 새 연산자를 지원합니다. 자세한 내용은 [선택적 체이닝](https://github.com/tc39/proposal-optional-chaining/blob/master/README.md) 및 [nullish 병합](https://github.com/tc39/proposal-nullish-coalescing/blob/master/README.md) 제안을 참조하세요.

## JavaScript로 TypeScript 예제 사용
<a name="javascript-using-typescript-examples"></a>

 [TypeScript](https://www.typescriptlang.org/)는 AWS CDK 개발에 사용하는 언어이며 애플리케이션 개발에 지원되는 첫 번째 언어이므로 사용 가능한 많은 AWS CDK 코드 예제가 TypeScript로 작성됩니다. 이러한 코드 예제는 JavaScript 개발자에게 좋은 리소스일 수 있습니다. 코드의 TypeScript 관련 부분을 제거하면 됩니다.

TypeScript 스니펫은 최신 ECMAScript `import` 및 `export` 키워드를 사용하여 다른 모듈에서 객체를 가져오고 현재 모듈 외부에서 사용할 수 있도록 객체를 선언하는 경우가 많습니다. Node.js는 최신 릴리스에서 이러한 키워드를 지원하기 시작했습니다. 사용 중인 또는 지원하려는 Node.js 버전에 따라 이전 구문을 사용하도록 가져오기 및 내보내기를 다시 작성할 수 있습니다.

가져오기는 `require()` 함수에 대한 직접 호출로 대체할 수 있습니다.

**Example**  

```
import * as cdk from 'aws-cdk-lib';
import { Bucket, BucketPolicy } from 'aws-cdk-lib/aws-s3';
```

```
const cdk = require('aws-cdk-lib');
const { Bucket, BucketPolicy } = require('aws-cdk-lib/aws-s3');
```

내보내기를 `module.exports` 객체에 할당할 수 있습니다.

**Example**  

```
export class Stack1 extends cdk.Stack {
  // ...
}

export class Stack2 extends cdk.Stack {
  // ...
}
```

```
class Stack1 extends cdk.Stack {
  // ...
}

class Stack2 extends cdk.Stack {
  // ...
}

module.exports = { Stack1, Stack2 }
```

**참고**  
이전 스타일의 가져오기 및 내보내기를 사용하는 대신 [esm](https://www.npmjs.com/package/esm) 모듈을 사용하는 것이 좋습니다.

가져오기 및 내보내기가 정렬되면 실제 코드를 파고들 수 있습니다. 일반적으로 사용되는 다음과 같은 TypeScript 기능을 실행할 수 있습니다.
+ 주석 입력
+ 인터페이스 정의
+ 유형 변환/캐스트
+ 액세스 한정자

변수, 클래스 멤버, 함수 파라미터 및 함수 반환 유형에 유형 주석을 제공할 수 있습니다. 변수, 파라미터 및 멤버의 경우 유형은 콜론과 유형이 있는 식별자를 따라 지정됩니다. 함수 반환 값은 함수 서명을 따르며 콜론과 유형으로 구성됩니다.

형식 주석이 달린 코드를 JavaScript로 변환하려면 콜론과 유형을 제거합니다. 클래스 멤버는 JavaScript의 일부 값이 있어야 합니다. TypeScript의 유형 주석만 있는 경우 `undefined`로 설정합니다.

**Example**  

```
var encrypted: boolean = true;

class myStack extends cdk.Stack {
    bucket: s3.Bucket;
    // ...
}

function makeEnv(account: string, region: string) : object {
    // ...
}
```

```
var encrypted = true;

class myStack extends cdk.Stack {
    bucket = undefined;
    // ...
}

function makeEnv(account, region) {
    // ...
}
```
TypeScript에서 인터페이스는 필수 및 선택적 속성의 번들과 해당 유형, 이름을 제공하는 데 사용됩니다. 그런 다음 인터페이스 이름을 유형 주석으로 사용할 수 있습니다. TypeScript는 함수에 대한 인수와 같이 사용하는 객체에 올바른 유형의 필수 속성이 있는지 확인합니다.  

```
interface myFuncProps {
    code: lambda.Code,
    handler?: string
}
```

JavaScript에는 인터페이스 기능이 없으므로 유형 주석을 제거한 후에는 인터페이스 선언을 완전히 삭제합니다.

함수 또는 메서드가 범용 유형(예: `object`)을 반환하지만 해당 값을 보다 구체적인 하위 유형으로 취급하여 보다 일반적인 유형의 인터페이스에 속하지 않는 속성 또는 메서드에 액세스하려는 경우 TypeScript를 사용하면 `as`를 사용하여 값을 *캐스팅*한 다음 유형 또는 인터페이스 이름을 지정할 수 있습니다. JavaScript는 이를 지원하거나 필요로 하지 않으므로 `as`와 다음 식별자를 제거하면 됩니다. 덜 일반적인 캐스트 구문은 `<LikeThis>`와 같이 괄호 안에 형식 이름을 사용하는 것입니다. 이러한 캐스트도 제거해야 합니다.

마지막으로 TypeScript는 클래스 멤버에 대한 액세스 수정자 `public`, `protected` 및 `private`를 지원합니다. JavaScript의 모든 클래스 멤버는 퍼블릭입니다. 이러한 수정자를 볼 수 있는 모든 곳에서 제거하면 됩니다.

이러한 TypeScript 기능을 식별하고 제거하는 방법을 아는 것은 짧은 TypeScript 스니펫을 JavaScript에 적응시키는 데 큰 도움이 됩니다. 그러나 다른 TypeScript 기능을 사용할 가능성이 더 높기 때문에 이러한 방식으로 더 긴 TypeScript 예를 변환하는 것은 실용적이지 않을 수 있습니다. 이러한 상황에서는 [Sucrase](https://github.com/alangpierce/sucrase)를 사용하는 것이 좋습니다. Sucrase는 코드가 정의되지 않은 변수를 사용하는 경우, 예를 들어 `tsc` 그와 같이 불평하지 않습니다. 구문적으로 유효한 경우 몇 가지 예외를 제외하고 Sucrase는 이를 JavaScript로 변환할 수 있습니다. 따라서 자체적으로 실행할 수 없는 스니펫을 변환하는 데 특히 유용합니다.

## TypeScript로 마이그레이션
<a name="javascript-to-typescript"></a>

많은 JavaScript 개발자는 프로젝트가 점점 더 커지고 복잡해짐에 따라 [TypeScript](https://www.typescriptlang.org/)로 이동합니다. TypeScript는 JavaScript의 상위 집합으로, 모든 JavaScript 코드는 유효한 TypeScript 코드이므로 코드를 변경할 필요가 없으며 지원되는 AWS CDK 언어이기도 합니다. 유형 주석 및 기타 TypeScript 기능은 선택 사항이며 값을 찾을 때 AWS CDK 앱에 추가할 수 있습니다. 또한 TypeScript를 사용하면 Node.js를 업그레이드할 필요 없이 완료되기 전에 선택적 체인 및 nullish 코어레싱과 같은 새로운 JavaScript 기능에 조기에 액세스할 수 있습니다.

객체 내에서 필수 및 선택적 속성(및 유형)의 번들을 정의하는 TypeScript의 ‘모양 기반‘ 인터페이스는 코드를 작성하는 동안 일반적인 실수를 저지르도록 허용하고 IDE가 강력한 자동 완성 및 기타 실시간 코딩 조언을 더 쉽게 제공할 수 있도록 합니다.

TypeScript의 코딩에는 TypeScript 컴파일러 `tsc`를 사용하여 앱을 컴파일하는 추가 단계가 포함됩니다. 일반적인 AWS CDK 앱의 경우 컴파일에는 최대 몇 초가 걸립니다.

기존 JavaScript AWS CDK 앱을 TypeScript로 마이그레이션하는 가장 쉬운 방법은를 사용하여 새 TypeScript 프로젝트를 생성한 `cdk init app --language typescript`다음 소스 파일(및 AWS Lambda 함수 소스 코드와 같은 자산과 같은 기타 필요한 파일)을 새 프로젝트에 복사하는 것입니다. JavaScript 파일 이름을 `.ts`로 바꾸고 TypeScript로 개발을 시작하세요.

# Python에서 AWS CDK 작업
<a name="work-with-cdk-python"></a>

Python은 AWS 클라우드 개발 키트(AWS CDK)에 대해 완벽하게 지원되는 클라이언트 언어이며 안정적인 것으로 간주됩니다. Python에서 AWS CDK로 작업할 때는 표준 Python 구현(CPython),를 사용한 가상 환경`virtualenv`, Python 패키지 설치 관리자 등 익숙한 도구를 사용합니다`pip`. AWS Construct Library를 구성하는 모듈은 [pypi.org](https://pypi.org/search/?q=aws-cdk) 통해 배포됩니다. AWS CDK의 Python 버전은 Python 스타일 식별자(예: `snake_case` 메서드 이름)도 사용합니다.

모든 편집기 또는 IDE를 사용할 수 있습니다. 많은 AWS CDK 개발자는 [공식 확장](https://marketplace.visualstudio.com/items?itemName=ms-python.python)을 통해 Python을 잘 지원하는 [Visual Studio Code](https://code.visualstudio.com/)(또는 이에 상응하는 오픈 소스 [VSCodium](https://vscodium.com/))를 사용합니다. Python에 포함된 IDLE 편집기로 시작하기에 충분합니다. AWS CDK용 Python 모듈에는 유형 검증을 지원하는 린팅 도구 또는 IDE에 유용한 유형 힌트가 있습니다.

## Python 시작하기
<a name="python-prerequisites"></a>

 AWS CDK로 작업하려면 AWS 계정과 자격 증명이 있어야 하며 Node.js와 AWS CDK 도구 키트를 설치해야 합니다. [AWS CDK 시작하기를 참조하세요](getting-started.md).

Python AWS CDK 애플리케이션에는 Python 3.9 이상이 필요합니다. 아직 설치하지 않았다면 [python.org](https://www.python.org/)에서 운영 체제와 [호환되는 버전을 다운로드](https://www.python.org/downloads/)하세요. Linux를 실행하는 경우 시스템에 호환 버전이 제공되었거나 Distro의 패키지 관리자(`yum`, `apt` 등)를 사용하여 설치할 수 있습니다. Mac 사용자는 macOS용 Linux 스타일 패키지 관리자인 [Homebrew](https://brew.sh/)에 관심이 있을 수 있습니다.

**참고**  
타사 언어 사용 중단: 언어 버전은 공급업체 또는 커뮤니티에서 공유하는 수명 종료(EOL)까지만 지원되며 사전 공지와 함께 변경될 수 있습니다.

Python 패키지 설치 관리자, `pip` 및 가상 환경 관리자, `virtualenv`도 필요합니다. 호환되는 Python 버전의 Windows 설치에는 이러한 도구가 포함됩니다. Linux에서 `pip` 및 `virtualenv`는 패키지 관리자에서 별도의 패키지로 제공될 수 있습니다. 또는 다음 명령을 사용하여 설치할 수 있습니다.

```
python -m ensurepip --upgrade
python -m pip install --upgrade pip
python -m pip install --upgrade virtualenv
```

권한 오류가 발생하면 `--user` 플래그로 위 명령을 실행하여 모듈이 사용자 디렉터리에 설치되도록 하거나 `sudo`를 사용하여 시스템 전체에 모듈을 설치할 수 있는 권한을 얻습니다.

**참고**  
Linux 배포판에서는 Python 3.x의 실행 파일 이름인 `python3`을 사용하고, `python`을 Python 2.x 설치를 나타내는 것으로 사용하는 것이 일반적입니다. 일부 Distro에는 `python` 명령이 Python 3을 참조하도록 설치할 수 있는 선택적 패키지가 있습니다. 이렇게 하지 않으면 프로젝트의 기본 디렉터리에서 `cdk.json`을 편집하여 애플리케이션을 실행하는 데 사용되는 명령을 조정할 수 있습니다.

**참고**  
Windows에서는 `py` 실행 파일인 [Windows용 Python 시작 관리자](https://docs.python.org/3/using/windows.html#launcher)를 사용하여 Python과 `pip`를 호출할 수 있습니다. 무엇보다도 런처를 사용하면 사용할 Python의 설치된 버전을 쉽게 지정할 수 있습니다.  
명령줄에 `python`을 입력하면 Windows 버전의 Python을 설치한 후에도 Windows 스토어에서 Python 설치에 대한 메시지가 표시되면 Windows의 Manage App Execution Aliases 설정 패널을 열고 Python에 대한 2개의 App Installer 항목을 끕니다.

## 프로젝트 생성
<a name="python-newproject"></a>

빈 디렉터리`cdk init`에서 호출하여 새 AWS CDK 프로젝트를 생성합니다. `--language` 옵션을 사용하고 `python`를 지정합니다.

```
$ mkdir my-project
$ cd my-project
$ cdk init app --language python
```

 `cdk init`는 프로젝트 폴더의 이름을 사용하여 클래스, 하위 폴더 및 파일을 포함한 프로젝트의 다양한 요소의 이름을 지정합니다. 폴더 이름의 하이픈은 밑줄로 변환됩니다. 하지만 이름은 Python 식별자의 형식을 따라야 합니다. 예를 들어 숫자로 시작하거나 공백을 포함해서는 안 됩니다.

새 프로젝트를 사용하려면 해당 가상 환경을 활성화하세요. 이렇게 하면 프로젝트의 종속성을 전역적으로 설치하는 대신 프로젝트 폴더에 로컬로 설치할 수 있습니다.

```
$ source .venv/bin/activate
```

**참고**  
이를 Mac/Linux 명령으로 인식하여 가상 환경을 활성화할 수 있습니다. Python 템플릿에는 Windows에서 동일한 명령을 사용할 수 있도록 하는 배치 파일인 `source.bat`가 포함되어 있습니다. 기존 Windows 명령인 `.\venv\Scripts\activate`도 작동합니다.  
 AWS CDK Toolkit v1.70.0 이하를 사용하여 CDK 프로젝트를 초기화한 경우 가상 환경은 대신 `.env` 디렉터리에 있습니다`.venv`.

**중요**  
프로젝트 작업을 시작할 때마다 프로젝트의 가상 환경을 활성화합니다. 그렇지 않으면 설치된 모듈에 액세스할 수 없으며, 설치한 모듈은 Python 글로벌 모듈 디렉터리로 이동합니다(또는 권한 오류가 발생합니다).

가상 환경을 처음 활성화한 후 앱의 표준 종속성을 설치합니다.

```
$ python -m pip install -r requirements.txt
```

## AWS Construct Library 모듈 관리
<a name="python-managemodules"></a>

Python 패키지 설치 관리자인 `pip`를 사용하여 앱과 필요한 기타 패키지에 사용할 AWS Construct Library 모듈을 설치하고 업데이트합니다. `pip` 또한는 해당 모듈에 대한 종속성을 자동으로 설치합니다. 시스템이 독립 실행형 명령으로 `pip`를 인식하지 못하는 경우 다음과 같이 Python 모듈로 `pip`를 간접적으로 호출합니다.

```
$ python -m pip <PIP-COMMAND>
```

대부분의 AWS CDK 구문은에 있습니다`aws-cdk-lib`. 실험 모듈은 `aws-cdk.<SERVICE-NAME>.alpha`와 같이 이름이 지정된 별도의 모듈로 구성됩니다. 서비스 이름에는 *aws* 접두사가 포함됩니다. 모듈 이름을 잘 모르는 경우 [PyPI에서 검색하세요](https://pypi.org/search/?q=aws-cdk). 예를 들어 아래 명령은 AWS CodeStar 라이브러리를 설치합니다.

```
$ python -m pip install aws-cdk.aws-codestar-alpha
```

일부 서비스의 구문은 둘 이상의 네임스페이스에 있습니다. 예를 들어, `aws-cdk.aws-route53` 외에도 `aws-route53-targets`, `aws-route53-patterns`, `aws-route53resolver`라는 3개의 추가 Amazon Route 53 네임스페이스가 있습니다.

**참고**  
[CDK API 참조의 Python 에디션](https://docs.aws.amazon.com/cdk/api/v2/python/index.html)에는 패키지 이름도 표시됩니다.

Python 코드로 AWS Construct Library 모듈을 가져오는 데 사용되는 이름은 다음과 같습니다.

```
import aws_cdk.aws_s3 as s3
import aws_cdk.aws_lambda as lambda_
```

애플리케이션에서 AWS CDK 클래스 및 AWS Construct Library 모듈을 가져올 때 다음 방법을 사용하는 것이 좋습니다. 이러한 지침을 따르면 코드를 다른 AWS CDK 애플리케이션과 일치시킬 뿐만 아니라 더 쉽게 이해할 수 있습니다.
+ 일반적으로 최상위 `aws_cdk`에서 개별 클래스를 가져옵니다.

  ```
  from aws_cdk import App, Construct
  ```
+ `aws_cdk`에서 여러 클래스가 필요한 경우 개별 클래스를 가져오는 대신 `cdk`의 네임스페이스 별칭을 사용할 수 있습니다. 둘 다 수행하지 마세요.

  ```
  import aws_cdk as cdk
  ```
+ 일반적으로 짧은 네임스페이스 별칭을 사용하여 AWS 구문 라이브러리를 가져옵니다.

  ```
  import aws_cdk.aws_s3 as s3
  ```

모듈을 설치한 후 프로젝트의 종속성을 나열하는 프로젝트의 `requirements.txt` 파일을 업데이트합니다. `pip freeze`를 사용하는 대신 이 작업을 수동으로 수행하는 것이 가장 좋습니다. `pip freeze`는 Python 가상 환경에 설치된 모든 모듈의 현재 버전을 캡처합니다. 이는 다른 곳에서 실행할 프로젝트를 번들링할 때 유용할 수 있습니다.

하지만 일반적으로 `requirements.txt`는 최상위 종속성(앱이 직접 의존하는 모듈)만 나열해야 하며 해당 라이브러리의 종속성은 나열하지 않아야 합니다. 이 전략을 사용하면 종속성을 더 간단하게 업데이트할 수 있습니다.

`requirements.txt`를 편집하여 업그레이드를 허용할 수 있습니다. 버전 번호 앞의 `==`를 `~=`로 바꿔서 더 높은 호환 ​​버전으로 업그레이드하거나, 버전 요구 사항을 완전히 제거해서 모듈의 최신 사용 가능한 버전을 지정합니다.

`requirements.txt`를 적절히 편집하여 업그레이드를 허용한 후, 이 명령을 실행하면 언제든지 프로젝트에 설치된 모듈을 업그레이드할 수 있습니다.

```
$ pip install --upgrade -r requirements.txt
```

## Python에서 종속성 관리하기
<a name="work-with-cdk-python-dependencies"></a>

Python에서는 애플리케이션의 경우 `requirements.txt`에, construct 라이브러리의 경우 `setup.py`에 종속성을 넣어 지정합니다. 그런 다음 PIP 도구를 사용하여 종속성을 관리합니다. PIP는 다음 방법 중 하나로 간접적으로 호출됩니다.

```
pip <command options>
python -m pip <command options>
```

`python -m pip` 간접 호출은 대부분의 시스템에서 작동합니다. `pip`를 사용하려면 PIP 실행 파일이 시스템 경로에 있어야 합니다. `pip`가 작동하지 않는 경우 `python -m pip`로 교체해 보세요.

`cdk init --language python` 명령은 새 프로젝트의 가상 환경을 생성합니다. 이렇게 하면 각 프로젝트에 고유한 버전의 종속성과 기본 `requirements.txt` 파일이 있습니다. 프로젝트 작업을 시작할 때마다 `source .venv/bin/activate`를 실행하여 이 가상 환경을 활성화해야 합니다. Windows에서 대신 `.\venv\Scripts\activate`를 실행합니다.

### CDK 애플리케이션
<a name="work-with-cdk-python-dependencies-apps"></a>

다음은 예 `requirements.txt` 파일입니다. PIP에는 종속성 잠금 기능이 없으므로 == 연산자를 사용하여 여기 표시된 대로 모든 종속성에 대해 정확한 버전을 지정하는 것이 좋습니다.

```
aws-cdk-lib==2.14.0
aws-cdk.aws-appsync-alpha==2.10.0a0
```

`pip install`를 사용하여 모듈을 설치해도 `requirements.txt`에 자동으로 추가되지는 않습니다. 직접 해야 합니다. 종속 항목의 최신 버전으로 업그레이드하려면 `requirements.txt`에서 버전 번호를 편집합니다.

`requirements.txt` 생성 또는 편집 후 프로젝트의 종속성을 설치하거나 업데이트하려면 다음을 실행합니다.

```
python -m pip install -r requirements.txt
```

**작은 정보**  
`pip freeze` 명령은 텍스트 파일에 쓸 수 있는 형식으로 설치된 모든 종속성의 버전을 출력합니다. 이는 `pip install -r`의 요구 사항 파일로 사용할 수 있습니다. 이 파일은 테스트한 정확한 버전에 모든 종속성(전이성 종속성 포함)을 고정할 때 편리합니다. 나중에 패키지를 업그레이드할 때 문제가 발생하는 것을 방지하려면 `freeze.txt`(`requirements.txt` 아님)와 같이 별도의 파일을 사용하세요. 그런 다음 프로젝트의 종속성을 업그레이드할 때 다시 생성합니다.

### 타사 construct 라이브러리
<a name="work-with-cdk-python-dependencies-libraries"></a>

라이브러리에서 종속성은 `setup.py`에 지정되므로 애플리케이션에서 패키지를 사용할 때 전이 종속성이 자동으로 다운로드됩니다. 그렇지 않으면 패키지를 사용하려는 모든 애플리케이션이 종속성을 `requirements.txt`에 복사해야 합니다. 다음은 `setup.py`의 예입니다.

```
from setuptools import setup

setup(
  name='my-package',
  version='0.0.1',
  install_requires=[
    'aws-cdk-lib==2.14.0',
  ],
  ...
)
```

개발을 위해 패키지에서 작업하려면 가상 환경을 생성하거나 활성화한 후 다음 명령을 실행합니다.

```
python -m pip install -e .
```

PIP는 전이 종속성을 자동으로 설치하지만 패키지 하나에는 하나의 복사본만 설치할 수 있습니다. 종속성 트리에서 가장 높게 지정된 버전이 선택됩니다. 애플리케이션에는 항상 설치할 패키지 버전에 마지막 단어가 있습니다.

## AWS Python의 CDK 관용구
<a name="python-cdk-idioms"></a>

### 언어 충돌
<a name="python-keywords"></a>

Python에서 `lambda`는 언어 키워드이므로 AWS Lambda 구문 라이브러리 모듈 또는 Lambda 함수의 이름으로 사용할 수 없습니다. 이러한 충돌에 대한 Python 규칙은 변수 이름에서 `lambda_`와 같이 후행 밑줄을 사용하는 것입니다.

일반적으로 AWS CDK 구문에 대한 두 번째 인수의 이름은 입니다`id`. 스택과 구문을 직접 작성할 때 파라미터 `id`를 직접적으로 호출하면 객체의 고유 식별자를 반환하는 Python 기본 제공 함수 `id()`가 ‘가려집니다’. 이 함수는 자주 사용되지 않지만 구문에 필요한 경우 와 같이 인수의 이름을 변경합니다(예: `construct_id`).

### 인수 및 속성
<a name="python-props"></a>

모든 AWS Construct Library 클래스는 구문이 정의되는 *범위*(구성 트리의 상위), 구문이 생성하는 리소스를 구성하는 데 사용하는 키/값 페어 번들인 *id* 및 *props*의 세 가지 인수를 사용하여 인스턴스화됩니다. 다른 클래스 및 메서드도 인수에 ‘속성 번들’ 패턴을 사용합니다.

 *scope*와 *id*는 항상 키워드 인수가 아닌 위치 인수로 전달되어야 합니다. 구문이 *scope*나 *id*라는 이름의 속성을 수락하는 경우 해당 이름이 변경되기 때문입니다.

Python에서는 props가 키워드 인수로 표현됩니다. 인수에 중첩된 데이터 구조가 포함된 경우 인스턴스화 시 자체 키워드 인수를 사용하는 클래스를 사용하여 표현됩니다. 구조화된 인수를 사용하는 다른 메서드 직접 호출에도 동일한 패턴이 적용됩니다.

예를 들어 Amazon S3 버킷의 `add_lifecycle_rule` 메서드에서 `transitions` 속성은 `Transition` 인스턴스 목록입니다.

```
bucket.add_lifecycle_rule(
  transitions=[
    Transition(
      storage_class=StorageClass.GLACIER,
      transition_after=Duration.days(10)
    )
  ]
)
```

클래스를 확장하거나 메서드를 재정의할 때 상위 클래스에서 이해하지 못하는 추가 인수를 자체 목적으로 수락할 수 있습니다. 이 경우 \$1\$1kwargs 관용구 사용에 관심이 없는 인수를 수락하고 키워드 전용 인수를 사용하여 관심 있는 인수를 수락해야 합니다. 상위의 생성자 또는 재정의된 메서드를 직접적으로 호출할 때 예상하는 인수만 전달합니다(종종 \$1\$1kwargs만). 상위 클래스 또는 메서드가 예상하지 않는 인수를 전달하면 오류가 발생합니다.

```
class MyConstruct(Construct):
    def __init__(self, id, *, MyProperty=42, **kwargs):
        super().__init__(self, id, **kwargs)
        # ...
```

 AWS CDK의 향후 릴리스에서는 자체 속성에 사용한 이름과 함께 새 속성을 추가할 수 있습니다. 이렇게 해도 속성이 ‘체인 위’로는 전달되지 않으므로 상위 클래스나 재정의된 메서드는 기본값을 사용할 것이기 때문에 구문 또는 메서드의 사용자에게 기술적 문제가 발생하지는 않지만 혼동을 일으킬 수 있습니다. 이러한 잠재적인 문제를 피하려면 속성의 이름을 지정하여 구문에 명확하게 속하도록 해야 합니다. 새 속성이 많은 경우 이름을 적절하게 지정한 클래스로 번들링하고 이를 단일 키워드 인수로 전달합니다.

### 누락된 값
<a name="python-missing-values"></a>

 AWS CDK는 `None`를 사용하여 누락되거나 정의되지 않은 값을 나타냅니다. \$1\$1kwargs로 작업할 때는 속성을 제공하지 않는 경우 사전의 `get()` 메서드를 사용하여 기본값을 제공합니다. 누락된 값에 대해 `KeyError`가 발생하므로 `kwargs[…​]` 사용을 피하세요.

```
encrypted = kwargs.get("encrypted")         # None if no property "encrypted" exists
encrypted = kwargs.get("encrypted", False)  # specify default of False if property is missing
```

일부 AWS CDK 메서드(예: 런타임 컨텍스트 값 `tryGetContext()` 가져오기)는를 반환할 수 있으며`None`, 이를 명시적으로 확인해야 합니다.

### 인터페이스 사용
<a name="python-interfaces"></a>

Python에는 일부 다른 언어와 마찬가지로 인터페이스 기능이 없지만 유사한 [추상적 기본 클래스](https://docs.python.org/3/library/abc.html)가 있습니다. (인터페이스에 익숙하지 않은 경우 Wikipedia가 [좋은 소개](https://en.wikipedia.org/wiki/Interface_(computing)#In_object-oriented_languages)를 합니다.) AWS CDK가 구현되는 언어인 TypeScript는 인터페이스를 제공하며, 구문 및 기타 AWS CDK 객체에는 특정 클래스에서 상속하는 대신 특정 인터페이스를 준수하는 객체가 필요한 경우가 많습니다. 따라서 AWS CDK는 [JSII](https://github.com/aws/jsii) 계층의 일부로 자체 인터페이스 기능을 제공합니다.

클래스가 특정 인터페이스를 구현함을 나타내려면 `@jsii.implements` 데코레이터를 사용할 수 있습니다.

```
from aws_cdk import IAspect, IConstruct
import jsii

@jsii.implements(IAspect)
class MyAspect():
    def visit(self, node: IConstruct) -> None:
        print("Visited", node.node.path)
```

### 유형 위험
<a name="python-type-pitfalls"></a>

Python은 동적 입력을 사용하며, 여기서 모든 변수는 모든 유형의 값을 참조할 수 있습니다. 파라미터 및 반환 값은 유형으로 주석을 달 수 있지만 ‘힌트‘이며 적용되지 않습니다. 즉, Python에서는 잘못된 유형의 값을 AWS CDK 구문에 쉽게 전달할 수 있습니다. JSII 계층(Python과 AWS CDK의 TypeScript 코어 간에 변환됨)이 예상치 못한 유형을 처리할 수 없는 경우 빌드 중에 유형 오류가 발생하는 대신 정적 유형 언어에서와 같이 런타임 오류가 발생할 수 있습니다.

경험상 Python 프로그래머의 유형 오류는 이러한 범주에 속하는 경향이 있습니다.
+ 구문에서 컨테이너(Python 목록 또는 사전)를 예상하거나 그 반대인 단일 값을 전달합니다.
+ 계층 1(`CfnXxxxxx`) 구문과 연결된 유형의 값을 L2 또는 L3 구문에 전달하거나 그 반대의 경우도 마찬가지입니다.

## 유형 오류 방지
<a name="_preventing_type_errors"></a>

AWS CDK Python 모듈에는 유형 주석이 포함되어 있으므로 배포 전에 이를 지원하는 도구를 사용하여 유형 오류를 포착할 수 있습니다.

### IDE 통합(권장)
<a name="_ide_integration_recommended"></a>

Visual Studio Code with Pylance는 코드를 작성할 때 실시간 유형 확인을 제공합니다.

1. [Pylance 확장](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance) 프로그램 설치 

1. 에서 엄격한 유형 확인을 구성합니다`.vscode/settings.json`.

   ```
   {
     "python.languageServer": "Pylance",
     "python.analysis.typeCheckingMode": "strict"
   }
   ```

1. 유형 오류는 이제 빨간색 기울임 및 자세한 오류 메시지와 함께 즉시 나타납니다.

 또한 [PyCharm](https://www.jetbrains.com/pycharm/)은 유사한 기능을 갖춘 기본 제공 유형 확인을 제공합니다.

### 명령줄 유형 확인
<a name="_command_line_type_checking"></a>

CI/CD 파이프라인 또는 사전 커밋 검증의 경우 다음 유형 검사기 중 하나를 사용합니다.

 **MyPy(Python 기반):** 

```
pip install mypy
mypy app.py
```

 **Pyright(더 빠른 JavaScript 기반, Pylance와 동일한 엔진):** 

```
npm install -g pyright
pyright app.py
```

### 권장 워크플로우
<a name="_recommended_workflow"></a>

1. 개발 중: Pyright 또는 Pylance를 사용하여 즉각적인 피드백 제공

1. 커밋 전: `mypy app.py` 또는 실행 `pyright app.py` 

1. CI/CD: 배포 전에 유형 확인 필수 단계 만들기

# Java에서 AWS CDK 작업
<a name="work-with-cdk-java"></a>

Java는 AWS CDK에서 완벽하게 지원되는 클라이언트 언어이며 안정적인 것으로 간주됩니다. JDK(Oracle의 또는 Amazon Corretto와 같은 OpenJDK 배포) 및 Apache Maven을 비롯한 친숙한 도구를 사용하여 Java에서 AWS CDK 애플리케이션을 개발할 수 있습니다.

 AWS CDK는 Java 8 이상을 지원합니다. 그러나 최신 버전의 언어에는 AWS CDK 애플리케이션 개발에 특히 편리한 개선 사항이 포함되어 있으므로 가능한 최신 버전을 사용하는 것이 좋습니다. 예를 들어 Java 9는 `Map.of()` 메서드(TypeScript의 객체 리터럴로 쓰일 해시맵을 선언하는 편리한 방법)를 도입합니다. Java 10은 `var` 키워드를 사용하여 로컬 유형 추론을 도입합니다.

**참고**  
이 개발자 안내서의 대부분의 코드 예제는 Java 8에서 작동합니다. 몇 가지 예에서는 `Map.of()`를 사용합니다. 이러한 예에는 Java 9이 필요하다는 주석이 포함되어 있습니다.

모든 텍스트 편집기 또는 Maven 프로젝트를 읽을 수 있는 Java IDE를 사용하여 AWS CDK 앱에서 작업할 수 있습니다. 이 가이드에서는 [Eclipse](https://www.eclipse.org/downloads/) 힌트를 제공하지만 IntelliJ IDEA, NetBeans 및 기타 IDEs Maven 프로젝트를 가져올 수 있으며 Java에서 AWS CDK 애플리케이션을 개발하는 데 사용할 수 있습니다.

Java 이외의 JVM 호스팅 언어(예: Kotlin, Groovy, Clojure 또는 Scala)로 AWS CDK 애플리케이션을 작성할 수 있지만 경험은 특별히 관용적이지 않을 수 있으며 이러한 언어에 대한 지원을 제공할 수 없습니다.

## Java 시작하기
<a name="java-prerequisites"></a>

 AWS CDK로 작업하려면 AWS 계정과 자격 증명이 있어야 하며 Node.js와 AWS CDK 도구 키트를 설치해야 합니다. [AWS CDK 시작하기를](getting-started.md) 참조하세요.

Java AWS CDK 애플리케이션에는 Java 8(v1.8) 이상이 필요합니다. [Amazon Corretto](https://aws.amazon.com/corretto/)를 권장하지만 OpenJDK 배포 또는 [Oracle의 JDK](https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)를 사용할 수 있습니다. 또한 [Apache Maven](https://maven.apache.org/download.cgi) 3.5 이상이 필요합니다. Gradle과 같은 도구를 사용할 수도 있지만 AWS CDK Toolkit에서 생성된 애플리케이션 스켈레톤은 Maven 프로젝트입니다.

**참고**  
타사 언어 사용 중단: 언어 버전은 공급업체 또는 커뮤니티에서 공유하는 수명 종료(EOL)까지만 지원되며 사전 공지와 함께 변경될 수 있습니다.

## 프로젝트 생성
<a name="java-newproject"></a>

빈 디렉터리`cdk init`에서 호출하여 새 AWS CDK 프로젝트를 생성합니다. `--language` 옵션을 사용하고 `java`를 지정합니다.

```
$ mkdir my-project
$ cd my-project
$ cdk init app --language java
```

 `cdk init`는 프로젝트 폴더의 이름을 사용하여 클래스, 하위 폴더 및 파일을 포함한 프로젝트의 다양한 요소의 이름을 지정합니다. 폴더 이름의 하이픈은 밑줄로 변환됩니다. 하지만 이름은 Java 식별자의 형식을 따라야 합니다. 예를 들어 숫자로 시작하거나 공백을 포함해서는 안 됩니다.

결과 프로젝트에는 `software.amazon.awscdk` Maven 패키지에 대한 참조가 포함됩니다. Maven에서 자동으로 설치됩니다.

IDE를 사용하는 경우 이제 프로젝트를 열거나 가져올 수 있습니다. 예를 들어 Eclipse에서 **파일** > **가져오기** > **Maven** > **기존 Maven 프로젝트**를 선택합니다. 프로젝트 설정이 Java 8(1.8)을 사용하도록 설정되어 있는지 확인합니다.

## AWS Construct Library 모듈 관리
<a name="java-managemodules"></a>

Maven을 사용하여 그룹에 있는 AWS Construct Library 패키지를 설치합니다`software.amazon.awscdk`. 대부분의 구문은 기본적으로 새 Java 프로젝트에 추가되는 아티팩트 `aws-cdk-lib`에 있습니다. 상위 수준의 CDK 지원이 아직 개발 중인 서비스에 대한 모듈은 서비스 이름의 짧은 버전(또는 AWS Amazon 접두사 없음)으로 이름이 지정된 별도의 '실험적' 패키지에 있습니다. [Maven Central Repository를 검색](https://search.maven.org/search?q=software.amazon.awscdk)하여 모든 AWS CDK 및 AWS Construct Module 라이브러리의 이름을 찾습니다.

**참고**  
[CDK API 참조의 Java 에디션](https://docs.aws.amazon.com/cdk/api/v2/java/index.html)에는 패키지 이름도 표시됩니다.

일부 서비스의 AWS Construct Library 지원은 둘 이상의 네임스페이스에 있습니다. 예를 들어 Amazon Route 53의 기능은 `software.amazon.awscdk.route53`, `route53-patterns`, `route53resolver`, `route53-targets`로 구분됩니다.

기본 AWS CDK 패키지는 Java 코드에서 로 가져옵니다`software.amazon.awscdk`. AWS Construct Library의 다양한 서비스에 대한 모듈은에 있으며 Maven 패키지 이름과 비슷하게 이름이 지정`software.amazon.awscdk.services`됩니다. 예를 들어 Amazon S3 모듈의 네임스페이스는 `software.amazon.awscdk.services.s3`입니다.

각 Java 소스 파일에서 사용하는 각 AWS Construct Library 클래스에 대해 별도의 Java `import` 문을 작성하고 와일드카드를 가져오지 않는 것이 좋습니다. `import` 문 없이 항상 유형의 정규화된 이름(네임스페이스 포함)을 사용할 수 있습니다.

애플리케이션이 실험 패키지에 의존하는 경우 프로젝트의 `pom.xml`을 편집하고 `<dependencies>` 컨테이너에 새 `<dependency>` 요소를 추가합니다. 예를 들어 다음 `<dependency>` 요소는 CodeStar 실험 construct 라이브러리 모듈을 지정합니다.

```
<dependency>
    <groupId>software.amazon.awscdk</groupId>
    <artifactId>codestar-alpha</artifactId>
    <version>2.0.0-alpha.10</version>
</dependency>
```

**작은 정보**  
Java IDE를 사용하는 경우 Maven 종속성을 관리하는 기능이 있을 수 있습니다. 하지만 IDE의 기능이 직접 수행하는 작업과 일치하는지 완전히 확신하지 않는 한 `pom.xml`을 직접 편집하는 것이 좋습니다.

## Java에서 종속성 관리
<a name="work-with-cdk-java-dependencies"></a>

Java에서 종속성은 `pom.xml`에 지정되고 Maven을 사용하여 설치됩니다. `<dependencies>` 컨테이너에는 각 패키지에 대한 `<dependency>` 요소가 포함되어 있습니다. 다음은 일반적인 CDK Java 앱에 대한 `pom.xml`의 섹션입니다.

```
<dependencies>
    <dependency>
        <groupId>software.amazon.awscdk</groupId>
        <artifactId>aws-cdk-lib</artifactId>
        <version>2.14.0</version>
    </dependency>
    <dependency>
        <groupId>software.amazon.awscdk</groupId>
        <artifactId>appsync-alpha</artifactId>
        <version>2.10.0-alpha.0</version>
    </dependency>
</dependencies>
```

**작은 정보**  
많은 Java IDE에는 Maven 지원 및 시각적 `pom.xml` 편집기가 통합되어 있어 종속성을 편리하게 관리할 수 있습니다.

Maven은 종속성 잠금을 지원하지 않습니다. `pom.xml`에서 버전 범위를 지정할 수 있지만 빌드를 반복 가능하게 유지하려면 항상 정확한 버전을 사용하는 것이 좋습니다.

Maven은 전이 종속성을 자동으로 설치하지만 각 패키지의 복사본은 하나만 설치할 수 있습니다. POM 트리에서 가장 높게 지정된 버전이 선택됩니다. 애플리케이션에는 항상 설치할 패키지 버전에 마지막 단어가 있습니다.

Maven은 프로젝트를 빌드(`mvn compile`)하거나 패키징(`mvn package`)할 때마다 종속성을 자동으로 설치하거나 업데이트합니다. CDK Toolkit는 실행할 때마다 자동으로 이 작업을 수행하므로 일반적으로 Maven을 수동으로 간접적으로 호출할 필요가 없습니다.

## AWS Java의 CDK 관용구
<a name="java-cdk-idioms"></a>

### Props
<a name="java-props"></a>

모든 AWS Construct Library 클래스는 구문이 정의되는 *범위*(구성 트리의 상위), 구문이 생성하는 리소스를 구성하는 데 사용하는 키/값 페어 번들인 *id* 및 *props*의 세 가지 인수를 사용하여 인스턴스화됩니다. 다른 클래스 및 메서드도 인수에 ‘속성 번들’ 패턴을 사용합니다.

Java에서 props는 [Builder 패턴](https://en.wikipedia.org/wiki/Builder_pattern)을 사용하여 표현됩니다. 각 구문 유형에는 해당하는 props 유형이 있습니다. 예를 들어, `Bucket` 구문(Amazon S3 버킷을 나타냄)은 `BucketProps`의 인스턴스를 props로 사용합니다.

`BucketProps` 클래스(예: 모든 AWS Construct Library props 클래스)에는 라는 내부 클래스가 있습니다`Builder`. `BucketProps.Builder` 유형은 `BucketProps` 인스턴스의 다양한 속성을 설정하는 방법을 제공합니다. 각 메서드는 `Builder` 인스턴스를 반환하므로 메서드 직접 호출을 연결하여 여러 속성을 설정할 수 있습니다. 체인이 끝날 때 `build()`를 직접적으로 호출하여 실제로 `BucketProps` 객체를 생성합니다.

```
Bucket bucket = new Bucket(this, "amzn-s3-demo-bucket", new BucketProps.Builder()
                           .versioned(true)
                           .encryption(BucketEncryption.KMS_MANAGED)
                           .build());
```

Props와 같은 객체를 최종 인수로 사용하는 구문 및 기타 클래스는 바로 가기를 제공합니다. 클래스에는 클래스와 해당 props 객체를 한 번에 인스턴스화하는 자체 `Builder`가 있습니다. 이렇게 하면 `BucketProps` 및 `Bucket`을 모두 명시적으로 인스턴스화할 필요가 없으며 props 유형에 대한 가져오기가 필요하지 않습니다.

```
Bucket bucket = Bucket.Builder.create(this, "amzn-s3-demo-bucket")
                           .versioned(true)
                           .encryption(BucketEncryption.KMS_MANAGED)
                           .build();
```

기존 구문에서 자체 구문을 파생할 때 추가 속성을 수락할 수 있습니다. 이러한 빌더 패턴을 따르는 것이 좋습니다. 하지만 이는 구문 클래스를 하위 클래스로 분류하는 것만큼 간단한 것은 아닙니다. 2개의 새 `Builder` 클래스의 이동 부분을 직접 제공해야 합니다. 구문이 하나 이상의 추가 인수를 수락하도록 하는 것이 좋습니다. 인수가 선택 사항인 경우 추가 생성자를 제공해야 합니다.

### 일반 구조
<a name="java-generic-structures"></a>

일부 APIs에서 AWS CDK는 JavaScript 배열 또는 입력되지 않은 객체를 메서드에 대한 입력으로 사용합니다. (예: AWS CodeBuild의 [https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_codebuild.BuildSpec.html#static-fromwbrobjectvalue](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_codebuild.BuildSpec.html#static-fromwbrobjectvalue) 메서드 참조) Java에서 이러한 객체는 `java.util.Map<String, Object>`로 표현됩니다. 값이 모두 문자열인 경우 `Map<String, String>`를 사용할 수 있습니다.

Java는 일부 다른 언어와 마찬가지로 이러한 컨테이너에 대한 리터럴을 작성하는 방법을 제공하지 않습니다. Java 9 이상에서는 [https://docs.oracle.com/javase/9/docs/api/java/util/Map.html#ofEntries-java.util.Map.Entry…​-](https://docs.oracle.com/javase/9/docs/api/java/util/Map.html#ofEntries-java.util.Map.Entry…​-)를 사용하여 이러한 직접 호출 중 하나와 일치하는 최대 10개의 항목 맵을 편리하게 정의할 수 있습니다.

```
java.util.Map.of(
    "base-directory", "dist",
    "files", "LambdaStack.template.json"
 )
```

항목이 10개 이상인 맵을 생성하려면 [https://docs.oracle.com/javase/9/docs/api/java/util/Map.html#ofEntries-java.util.Map.Entry…​-](https://docs.oracle.com/javase/9/docs/api/java/util/Map.html#ofEntries-java.util.Map.Entry…​-)를 사용합니다.

Java 8을 사용하는 경우 이와 유사한 자체 메서드를 제공할 수 있습니다.

JavaScript 배열은 Java에서 `List<Object>` 또는 `List<String>`로 표현됩니다. `java.util.Arrays.asList` 메서드는 짧은 `List`를 정의하는 데 편리합니다.

```
List<String> cmds = Arrays.asList("cd lambda", "npm install", "npm install typescript")
```

### 누락된 값
<a name="java-missing-values"></a>

Java에서는 props와 같은 AWS CDK 객체의 누락된 값이 로 표시됩니다`null`. `null`일 수 있는 값은 명시적으로 테스트하여 값이 포함되었는지 확인한 후 작업을 수행해야 합니다. Java에는 다른 언어와 마찬가지로 null 값을 처리하는 데 도움이 되는 ‘동기 설탕’이 없습니다. Apache ObjectUtil의 [https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/ObjectUtils.html#defaultIfNull-T-T-](https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/ObjectUtils.html#defaultIfNull-T-T-) 및 [https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/ObjectUtils.html#firstNonNull-T…​-](https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/ObjectUtils.html#firstNonNull-T…​-)이 일부 상황에서 유용할 수 있습니다. 또는 자체 정적 도우미 메서드를 작성하여 잠재적으로 null인 값을 더 쉽게 처리하고 코드를 더 쉽게 읽을 수 있도록 합니다.

## CDK 애플리케이션 빌드 및 실행
<a name="java-running"></a>

 AWS CDK는 앱을 실행하기 전에 자동으로 컴파일합니다. 그러나 오류를 확인하고 테스트를 실행하기 위해 앱을 수동으로 빌드하는 것이 유용할 수 있습니다. IDE(예: Eclipse에서 Control-B 누르기)에서 또는 프로젝트의 루트 디렉터리에 있는 동안 명령 프롬프트에서 `mvn compile`을 실행하여 이 작업을 수행할 수 있습니다.

명령 프롬프트에서 `mvn test`를 실행하여 작성한 테스트를 실행합니다.

# C\$1에서 AWS CDK 작업
<a name="work-with-cdk-csharp"></a>

.NET은 AWS CDK에서 완벽하게 지원되는 클라이언트 언어이며 안정적인 것으로 간주됩니다. C\$1은 예와 지원을 제공하는 기본 .NET 언어입니다. Visual Basic 또는 F\$1과 같은 다른 .NET 언어로 AWS CDK 애플리케이션을 작성하도록 선택할 수 있지만는 CDK에서 이러한 언어를 사용할 수 있는 제한된 지원을 AWS 제공합니다.

Visual Studio, Visual Studio Code, `dotnet` 명령, NuGet 패키지 관리자 등 익숙한 도구를 사용하여 C\$1에서 AWS CDK 애플리케이션을 개발할 수 있습니다. AWS Construct Library를 구성하는 모듈은 [nuget.org](https://www.nuget.org/packages?q=amazon.cdk.aws) 통해 배포됩니다.

C\$1에서 AWS CDK 앱을 개발하려면 Windows에서 [Visual Studio 2019](https://visualstudio.microsoft.com/downloads/)(모든 에디션)를 사용하는 것이 좋습니다.

## C\$1 시작하기
<a name="csharp-prerequisites"></a>

 AWS CDK로 작업하려면 AWS 계정과 자격 증명이 있어야 하며 Node.js와 AWS CDK 도구 키트를 설치해야 합니다. [AWS CDK 시작하기를 참조하세요](getting-started.md).

C\$1 AWS CDK 애플리케이션에는 [여기에서](https://dotnet.microsoft.com/en-us/download/dotnet) 사용할 수 있는 .NET 8.0 이상이 필요합니다.

**참고**  
타사 언어 사용 중단: 언어 버전은 공급업체 또는 커뮤니티에서 공유하는 수명 종료(EOL)까지만 지원되며 사전 공지와 함께 변경될 수 있습니다.

.NET 도구 체인에는 .NET 애플리케이션을 빌드 및 실행하고 NuGet 패키지를 관리하기 위한 명령줄 도구인 `dotnet`이 포함되어 있습니다. 주로 Visual Studio에서 작업하더라도이 명령은 배치 작업 및 AWS Construct Library 패키지 설치에 유용할 수 있습니다.

## 프로젝트 생성
<a name="csharp-newproject"></a>

빈 디렉터리`cdk init`에서 호출하여 새 AWS CDK 프로젝트를 생성합니다. `--language` 옵션을 사용하고 `csharp`를 지정합니다.

```
mkdir my-project
cd my-project
cdk init app --language csharp
```

 `cdk init`는 프로젝트 폴더의 이름을 사용하여 클래스, 하위 폴더 및 파일을 포함한 프로젝트의 다양한 요소의 이름을 지정합니다. 폴더 이름의 하이픈은 밑줄로 변환됩니다. 하지만 이름은 C\$1 식별자의 형식을 따라야 합니다. 예를 들어, 숫자로 시작하거나 공백을 포함해서는 안 됩니다.

결과 프로젝트에는 `Amazon.CDK.Lib` NuGet 패키지에 대한 참조가 포함됩니다. NuGet에서 해당 종속 항목을 자동으로 설치합니다.

## AWS Construct Library 모듈 관리
<a name="csharp-managemodules"></a>

.NET 에코시스템은 NuGet 패키지 관리자를 사용합니다. 코어 클래스와 모든 안정된 서비스 구문이 포함된 기본 CDK 패키지는 `Amazon.CDK.Lib`입니다. 새 기능이 활성 개발 중인 실험 모듈의 이름은와 같으며`Amazon.CDK.AWS.<SERVICE-NAME>.Alpha`, 여기서 서비스 이름은 AWS 또는 Amazon 접두사가 없는 짧은 이름입니다. 예를 들어 AWS IoT 모듈의 NuGet 패키지 이름은 입니다`Amazon.CDK.AWS.IoT.Alpha`. 원하는 패키지를 찾을 수 없는 경우 [Nuget.org를 검색](https://www.nuget.org/packages?q=amazon.cdk.aws)하세요.

**참고**  
[CDK API 참조의 .NET 에디션](https://docs.aws.amazon.com/cdk/api/latest/dotnet/api/index.html)에는 패키지 이름도 표시됩니다.

일부 서비스의 AWS Construct Library 지원은 둘 이상의 모듈에 있습니다. 예를 들어 AWS IoT에는 라는 두 번째 모듈이 있습니다`Amazon.CDK.AWS.IoT.Actions.Alpha`.

대부분의 AWS CDK 앱에서 필요한 AWS CDK의 기본 모듈은 C\$1 코드에서 로 가져옵니다`Amazon.CDK`. AWS Construct Library의 다양한 서비스에 대한 모듈은 아래에 있습니다`Amazon.CDK.AWS `. 예를 들어 Amazon S3 모듈의 네임스페이스는 `Amazon.CDK.AWS.S3`입니다.

CDK 코어 구성 및 각 C\$1 소스 파일에서 사용하는 각 AWS 서비스에 대해 C\$1 `using` 지시문을 작성하는 것이 좋습니다. 이름 충돌을 해결하는 데 도움이 되도록 네임스페이스 또는 유형에 별칭을 사용하는 것이 편리할 수 있습니다. `using` 문 없이 항상 유형의 정규화된 이름(네임스페이스 포함)을 사용할 수 있습니다.

## C\$1에서 종속성 관리
<a name="work-with-cdk-csharp-dependencies"></a>

C\$1 AWS CDK 앱에서는 NuGet을 사용하여 종속성을 관리합니다. NuGet에는 4개의 표준 인터페이스가 있으며 대부분 동등합니다. 요구 사항과 작업 스타일에 맞는 를 사용합니다. 또한 [Paket](https://fsprojects.github.io/Paket/) 또는 [MyGet](https://www.myget.org/)과 같은 호환 도구를 사용하거나 `.csproj` 파일을 직접 편집할 수도 있습니다.

NuGet에서는 종속성에 대한 버전 범위를 지정할 수 없습니다. 모든 종속성은 특정 버전에 고정됩니다.

종속성을 업데이트한 후 Visual Studio는 NuGet을 사용하여 다음에 빌드할 때 각 패키지의 지정된 버전을 검색합니다. Visual Studio를 사용하지 않는 경우 `dotnet restore` 명령을 사용하여 종속성을 업데이트합니다.

### 직접 프로젝트 파일 편집
<a name="manage-dependencies-csharp-direct-edit"></a>

프로젝트 `.csproj` 파일에는 종속성을 `<PackageReference` 요소로 나열하는 `<ItemGroup>` 컨테이너가 포함되어 있습니다.

```
<ItemGroup>
    <PackageReference Include="Amazon.CDK.Lib" Version="2.14.0" />
    <PackageReference Include="Constructs" Version="%constructs-version%" />
</ItemGroup>
```

### Visual Studio NuGet GUI
<a name="manage-dependencies-csharp-vs-nuget-gui"></a>

Visual Studio의 NuGet 도구는 **도구** > **NuGet Package Manager** > **NuGet Packages for Solution 관리**에서 액세스할 수 있습니다. **찾아보**기 탭을 사용하여 설치할 AWS Construct Library 패키지를 찾습니다. 모듈의 사전 릴리스 버전을 포함하여 원하는 버전을 선택하고 열려 있는 프로젝트에 추가할 수 있습니다.

**참고**  
'실험적'으로 간주되는 모든 AWS Construct Library 모듈([AWS CDK 버전 관리](versioning.md) 참조)은 NuGet에서 사전 릴리스로 플래그가 지정되고 `alpha` 이름 접미사가 있습니다.

![\[다양한 서비스에 대한 Amazon CDK<shared id="AWS"/> 알파 패키지를 보여주는 NuGet 패키지 관리자입니다.\]](http://docs.aws.amazon.com/ko_kr/cdk/v2/guide/images/visual-studio-nuget.png)


**업데이트** 페이지에서 패키지의 새 버전을 설치합니다.

### NuGet 콘솔
<a name="manage-dependencies-csharp-vs-nuget-console"></a>

NuGet 콘솔은 Visual Studio 프로젝트의 컨텍스트에서 작동하는 NuGet에 대한 PowerShell 기반 인터페이스입니다. **도구** > **NuGet 패키지 관리자** > **패키지 관리자 콘솔**을 선택하여 Visual Studio에서 열 수 있습니다. 이 도구 사용에 대한 자세한 내용은 [Visual Studio의 Package Manager 콘솔을 사용하여 패키지 설치 및 관리](https://docs.microsoft.com/en-us/nuget/consume-packages/install-use-packages-powershell)를 참조하세요.

### `dotnet` 명령
<a name="manage-dependencies-csharp-vs-dotnet-command"></a>

`dotnet` 명령은 Visual Studio C\$1 프로젝트 작업을 위한 기본 명령줄 도구입니다. Windows 명령 프롬프트에서 간접적으로 호출할 수 있습니다. 여러 기능 중에서 `dotnet`은 Visual Studio 프로젝트에 NuGet 종속성을 추가할 수 있습니다.

Visual Studio 프로젝트(`.csproj`) 파일과 동일한 디렉터리에 있다고 가정하면 다음과 같은 명령을 실행하여 패키지를 설치합니다. 프로젝트를 생성할 때 기본 CDK 라이브러리가 포함되므로 실험 모듈만 명시적으로 설치하면 됩니다. 실험 모듈에서는 명시적 버전 번호를 지정해야 합니다.

```
dotnet add package Amazon.CDK.AWS.IoT.Alpha -v <VERSION-NUMBER>
```

다른 디렉터리에서 명령을 실행할 수 있습니다. 이렇게 하려면 `add` 키워드 뒤에 프로젝트 파일의 경로 또는 프로젝트 파일이 포함된 디렉터리의 경로를 포함합니다. 다음 예제에서는 CDK AWS 프로젝트의 기본 디렉터리에 있다고 가정합니다.

```
dotnet add src/<PROJECT-DIR> package Amazon.CDK.AWS.IoT.Alpha -v <VERSION-NUMBER>
```

패키지의 특정 버전을 설치하려면 `-v` 플래그와 원하는 버전을 포함합니다.

패키지를 업데이트하려면 패키지를 설치하는 데 사용한 것과 동일한 `dotnet add` 명령을 실행합니다. 실험 모듈의 경우 다시 명시적 버전 번호를 지정해야 합니다.

`dotnet` 명령을 사용하여 패키지를 관리하는 방법에 대한 자세한 내용은 [dotnet CLI를 사용하여 NuGet 패키지 설치 및 관리](https://docs.microsoft.com/en-us/nuget/consume-packages/install-use-packages-dotnet-cli)를 참조하세요.

### `nuget` 명령
<a name="manage-dependencies-csharp-vs-nuget-command"></a>

`nuget` 명령줄 도구는 NuGet 패키지를 설치하고 업데이트할 수 있습니다. 하지만 `cdk init`에서 프로젝트를 설정하는 방식과는 다르게 Visual Studio 프로젝트를 설정해야 합니다. (기술적 세부 사항: `nuget`은 `Packages.config` 프로젝트에서 작동하는 반면, `cdk init`는 새로운 스타일의 `PackageReference` 프로젝트를 생성합니다.)

에서 생성한 AWS CDK 프로젝트에서는 `nuget` 도구를 사용하지 않는 것이 좋습니다`cdk init`. 다른 유형의 프로젝트를 사용 중이고 `nuget`을 사용하려는 경우 [NuGet CLI 참조](https://docs.microsoft.com/en-us/nuget/reference/nuget-exe-cli-reference)를 확인하세요.

## AWS C\$1의 CDK 관용구
<a name="csharp-cdk-idioms"></a>

### Props
<a name="csharp-props"></a>

모든 AWS Construct Library 클래스는 구문이 정의되는 *범위*(구성 트리의 상위), 구문이 생성하는 리소스를 구성하는 데 사용하는 키/값 페어 번들인 *id* 및 *props*의 세 가지 인수를 사용하여 인스턴스화됩니다. 다른 클래스 및 메서드도 인수에 ‘속성 번들’ 패턴을 사용합니다.

C\$1에서 props는 props 유형을 사용하여 표현됩니다. 색다른 C\$1 방식으로 객체 이니셜라이저를 사용하여 다양한 속성을 설정할 수 있습니다. 여기서는 `Bucket` 구문을 사용하여 Amazon S3 버킷을 생성합니다. 해당하는 props 유형은 `BucketProps`입니다.

```
var bucket = new Bucket(this, "amzn-s3-demo-bucket", new BucketProps {
    Versioned = true
});
```

**작은 정보**  
프로젝트에 `Amazon.JSII.Analyzers` 패키지를 추가하여 Visual Studio 내에서 props 정의를 필수 값으로 확인합니다.

클래스를 확장하거나 메서드를 재정의할 때 상위 클래스에서 이해하지 못하는 추가 props를 자신의 용도로 수락할 수 있습니다. 이렇게 하려면 적절한 props 유형을 하위 클래스로 분류하고 새 속성을 추가합니다.

```
// extend BucketProps for use with MimeBucket
class MimeBucketProps : BucketProps {
    public string MimeType { get; set; }
}

// hypothetical bucket that enforces MIME type of objects inside it
class MimeBucket : Bucket {
     public MimeBucket( readonly Construct scope, readonly string id, readonly MimeBucketProps props=null) : base(scope, id, props) {
         // ...
     }
}

// instantiate our MimeBucket class
var bucket = new MimeBucket(this, "amzn-s3-demo-bucket", new MimeBucketProps {
    Versioned = true,
    MimeType = "image/jpeg"
});
```

상위 클래스의 이니셜라이저 또는 재정의된 메서드를 직접적으로 호출할 때 일반적으로 받은 props를 전달할 수 있습니다. 새 유형은 상위 유형과 호환되며 추가한 추가 props는 무시됩니다.

 AWS CDK의 향후 릴리스에서는 자체 속성에 사용한 이름과 함께 새 속성을 추가할 수 있습니다. 이렇게 해도 속성이 ‘체인 위’로는 전달되지 않으므로 상위 클래스나 재정의된 메서드는 기본값을 사용할 것이기 때문에 구문 또는 메서드를 사용하는 데 있어 기술적 문제가 발생하지는 않지만 구문의 사용자에게 혼동을 일으킬 수 있습니다. 이러한 잠재적인 문제를 피하려면 속성의 이름을 지정하여 구문에 명확하게 속하도록 해야 합니다. 새 속성이 많은 경우 이름을 적절하게 지정한 클래스로 번들링하고 단일 속성으로 전달합니다.

### 일반 구조
<a name="csharp-generic-structures"></a>

일부 APIs에서 AWS CDK는 JavaScript 배열 또는 입력되지 않은 객체를 메서드에 대한 입력으로 사용합니다. (예: AWS CodeBuild의 [https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_codebuild.BuildSpec.html](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_codebuild.BuildSpec.html) 메서드 참조) C\$1에서 이러한 객체는 `System.Collections.Generic.Dictionary<String, Object>`로 표현됩니다. 값이 모두 문자열인 경우 `Dictionary<String, String>`를 사용할 수 있습니다. JavaScript 배열은 C\$1에서 `object[]` 또는 `string[]` 배열 유형으로 표시됩니다.

**작은 정보**  
이러한 특정 사전 유형을 더 쉽게 사용할 수 있도록 짧은 별칭을 정의할 수 있습니다.  

```
using StringDict = System.Collections.Generic.Dictionary<string, string>;
using ObjectDict = System.Collections.Generic.Dictionary<string, object>;
```

### 누락된 값
<a name="csharp-missing-values"></a>

C\$1에서 props와 같은 AWS CDK 객체의 누락된 값은 로 표시됩니다`null`. null 조건부 멤버 액세스 연산자 `?.`와 null 코어레싱 연산자 `??`는 이러한 값을 사용하기에 편리합니다.

```
// mimeType is null if props is null or if props.MimeType is null
string mimeType = props?.MimeType;

// mimeType defaults to text/plain. either props or props.MimeType can be null
string MimeType = props?.MimeType ?? "text/plain";
```

## CDK 애플리케이션 빌드 및 실행
<a name="csharp-running"></a>

 AWS CDK는 앱을 실행하기 전에 자동으로 컴파일합니다. 하지만 오류를 확인하고 테스트를 실행하기 위해 앱을 수동으로 빌드하는 것이 유용할 수 있습니다. Visual Studio에서 F6을 누르거나 명령줄에서 `dotnet build src`를 실행하여 이 작업을 수행할 수 있습니다. 여기서 `src`는 Visual Studio 솔루션(`.sln`) 파일이 포함된 프로젝트 디렉터리의 디렉터리입니다.

# 에서 AWS CDK 작업 Go
<a name="work-with-cdk-go"></a>

 Go는 AWS 클라우드 개발 키트(AWS CDK)에 대해 완벽하게 지원되는 클라이언트 언어이며 안정적인 것으로 간주됩니다. AWS CDK in Go 작업은 익숙한 도구를 사용합니다. AWS CDK의 Go 버전은 Go 스타일 식별자도 사용합니다.

CDK가 지원하는 다른 언어와 달리 Go는 기존의 객체 지향 프로그래밍 언어가 아닙니다. Go는 다른 언어가 종종 상속을 활용하는 구성을 사용합니다. 가능한 한 관용적 Go 접근 방식을 사용하려고 시도했지만 CDK가 다를 수 있는 장소가 있습니다.

이 주제에서는에서 AWS CDK로 작업할 때 지침을 제공합니다Go. AWS CDK용 간단한 Go 프로젝트에 대한 안내는 [공지 블로그 게시물](https://aws.amazon.com/blogs/developer/getting-started-with-the-aws-cloud-development-kit-and-go/)을 참조하세요.

## Go 시작하기
<a name="go-prerequisites"></a>

 AWS CDK로 작업하려면 AWS 계정과 자격 증명이 있어야 하며 Node.js와 AWS CDK 도구 키트를 설치해야 합니다. [AWS CDK 시작하기를](getting-started.md) 참조하세요.

 AWS CDK의 Go 바인딩은 표준 [Go 도구 체인](https://golang.org/dl/) v1.23 이상을 사용합니다. 원하는 편집기를 사용할 수 있습니다.

**참고**  
타사 언어 사용 중단: 언어 버전은 공급업체 또는 커뮤니티에서 공유하는 수명 종료(EOL)까지만 지원되며 사전 공지와 함께 변경될 수 있습니다.

## 프로젝트 생성
<a name="go-newproject"></a>

빈 디렉터리`cdk init`에서 호출하여 새 AWS CDK 프로젝트를 생성합니다. `--language` 옵션을 사용하고 `go`를 지정합니다.

```
mkdir my-project
cd my-project
cdk init app --language go
```

 `cdk init`는 프로젝트 폴더의 이름을 사용하여 클래스, 하위 폴더 및 파일을 포함한 프로젝트의 다양한 요소의 이름을 지정합니다. 폴더 이름의 하이픈은 밑줄로 변환됩니다. 하지만 이름은 Go 식별자의 형식을 따라야 합니다. 예를 들어 숫자로 시작하거나 공백을 포함해서는 안 됩니다.

결과 프로젝트에는의 핵심 AWS CDK Go 모듈에 대한 참조가 포함되어 `github.com/aws/aws-cdk-go/awscdk/v2`있습니다`go.mod`. 이 모듈과 다른 필수 모듈을 설치하려면 `go get`을 실행하세요.

## AWS Construct Library 모듈 관리
<a name="go-managemodules"></a>

대부분의 AWS CDK 설명서 및 예제에서 "module"이라는 단어는 용어의 관용적 Go 사용과 다른 AWS 서비스당 하나 이상의 AWS Construct Library 모듈을 참조하는 데 자주 사용됩니다. CDK Construct Library는 Go 모듈 내에서 Go 패키지로 제공되는 다양한 AWS 서비스를 지원하는 개별 Construct Library 모듈과 함께 하나의 모듈로 제공됩니다.

일부 서비스의 AWS Construct Library 지원은 두 개 이상의 Construct Library 모듈(Go 패키지)에 있습니다. 예를 들어, Amazon Route 53에는 기본 `awsroute53` 패키지 외에도 `awsroute53patterns`, `awsroute53resolver`, `awsroute53targets`라는 3개의 Construct Library 모듈이 있습니다.

대부분의 AWS CDK 앱에서 필요한 AWS CDK의 코어 패키지는 Go 코드로 로 가져옵니다`github.com/aws/aws-cdk-go/awscdk/v2`. AWS Construct Library의 다양한 서비스에 대한 패키지는 아래에 있습니다`github.com/aws/aws-cdk-go/awscdk/v2`. 예를 들어 Amazon S3 모듈의 네임스페이스는 `github.com/aws/aws-cdk-go/awscdk/v2/awss3`입니다.

```
import (
        "github.com/aws/aws-cdk-go/awscdk/v2/awss3"
        // ...
)
```

앱에서 사용하려는 서비스에 대한 Construct Library 모듈(Go 패키지)을 가져온 후에는 `awss3.Bucket` 등을 사용하여 해당 모듈의 구문에 액세스합니다.

## Go에서 종속성 관리
<a name="work-with-cdk-go-dependencies"></a>

Go에서 종속성 버전은 `go.mod`에 정의되어 있습니다. 기본 `go.mod`는 여기에 표시된 것과 유사합니다.

```
module my-package

go 1.16

require (
  github.com/aws/aws-cdk-go/awscdk/v2 v2.16.0
  github.com/aws/constructs-go/constructs/v10 v10.0.5
  github.com/aws/jsii-runtime-go v1.29.0
)
```

패키지 이름(Go parlance: 모듈)은 필요한 버전 번호가 추가된 URL로 지정됩니다. Go의 모듈 시스템은 버전 범위를 지원하지 않습니다.

`go get` 명령을 실행하여 필요한 모든 모듈을 설치하고 `go.mod`를 업데이트합니다. 종속성에 사용 가능한 업데이트 목록을 보려면 `go list -m -u all`을 실행합니다.

## AWS 의 CDK 관용구 Go
<a name="go-cdk-idioms"></a>

### 필드 및 메서드 이름
<a name="go-naming"></a>

필드와 메서드 이름은 CDK의 원어인 TypeScript로 캐멀 대소문자(`likeThis`)를 사용합니다. Go에서는 Go 규칙을 따르며, 파스칼 대소문자(`LikeThis`)도 마찬가지입니다.

### 정리
<a name="go-cdk-jsii-close"></a>

`main` 메서드에서 `defer jsii.Close()`를 사용하여 CDK 앱이 자체적으로 정리되는지 확인합니다.

### 누락된 값 및 포인터 변환
<a name="go-missing-values"></a>

에서 속성 번들과 같은 AWS CDK 객체의 Go누락된 값은 로 표시됩니다`nil`. 에는 null 가능한 유형이 Go 없습니다.를 포함할 수 있는 유일한 유형은 포인터`nil`입니다. 값을 선택 사항으로 허용하기 위해 모든 CDK 속성, 인수 및 반환 값은 기본 유형에 대해서도 포인터입니다. 이는 필수 값과 선택적 값에도 적용되므로 나중 필수 값이 선택 사항이 되는 경우 유형을 크게 변경할 필요가 없습니다.

리터럴 값 또는 표현식을 전달할 때 다음 도우미 함수를 사용하여 값에 대한 포인터를 생성합니다.
+  `jsii.String` 
+  `jsii.Number` 
+  `jsii.Bool` 
+  `jsii.Time` 

일관성을 위해, 예를 들어 문자열에 대한 포인터보다 문자열로 구문의 `id`를 받는 것이 더 편리해 보이더라도 구문을 직접 정의할 때 포인터를 비슷한 방식으로 사용하는 것이 좋습니다.

기본 값 및 복잡한 유형을 포함한 선택적 AWS CDK 값을 처리할 때 포인터를 명시적으로 테스트하여 포인터로 아무 작업`nil`도 하지 않는지 확인해야 합니다. Go에는 일부 다른 언어와 마찬가지로 비어 있거나 누락된 값을 처리하는 데 도움이 되는 ‘동기 설탕‘이 없습니다. 그러나 속성 번들과 비슷한 구조에 필요한 값은 반드시 존재한다는 점이 보장됩니다. 그렇지 않으면 구성이 실패합니다. 따라서 이러한 값은 `nil` 검사가 필요 없습니다.

### 구문 및 Props
<a name="go-props"></a>

하나 이상의 AWS 리소스와 관련 속성을 나타내는 구문은에서 인터페이스Go로 표시됩니다. 예를 들어 `awss3.Bucket`은 인터페이스입니다. 모든 구문에는 해당 인터페이스를 구현하는 구조체를 반환하는 `awss3.NewBucket`과 같은 팩토리 함수가 있습니다.

모든 팩토리 함수는 구문이 정의되는 `scope`(구문 트리에서 상위), `id`, 구문이 생성하는 리소스를 구성하는 데 사용하는 키/값 페어의 번들인 `props`라는 세 가지 인수를 사용합니다. "속성 번들" 패턴은 AWS CDK의 다른 곳에서도 사용됩니다.

Go에서 props는 각 구문에 대한 특정 구조체 유형으로 표현됩니다. 예를 들어 `awss3.Bucket`은 `awss3.BucketProps` 유형의 props 인수를 사용합니다. 구조체 리터럴을 사용하여 props 인수를 작성합니다.

```
var bucket = awss3.NewBucket(stack, jsii.String("amzn-s3-demo-bucket"), &awss3.BucketProps{
    Versioned: jsii.Bool(true),
})
```

### 일반 구조
<a name="go-generic-structures"></a>

경우에 따라 AWS CDK는 JavaScript 배열 또는 입력되지 않은 객체를 메서드에 대한 입력으로 사용합니다. (예: AWS CodeBuild의 [https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_codebuild.BuildSpec.html#static-fromwbrobjectvalue](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_codebuild.BuildSpec.html#static-fromwbrobjectvalue) 메서드 참조) Go에서 이러한 객체는 각각 슬라이스 및 빈 인터페이스로 표시됩니다.

CDK는 기본 유형을 포함하는 슬라이스를 작성하기 위한 `jsii.Strings`와 같은 가변형 도우미 함수를 제공합니다.

```
jsii.Strings("One", "Two", "Three")
```

### 임의의 조각 작업
<a name="go-any-slice"></a>

특정 구문은 여러 유형의 목록인 속성(TypeScript의 통합 유형)을 예상합니다. Go에서는 임의(`*[]any`)의 조각이 됩니다. `any`는 컴파일러가 다른 유형의 할당을 허용하도록 합니다. 허용되는 유형이 무엇인지 알아보려면 ` [AWS CDK Go package](https://pkg.go.dev/github.com/aws/aws-cdk-go/awscdk/v2) `의 설명서를 참조하세요.

이러한 속성을 사용하려면 `jsii`에서 제공하는 헬퍼 함수를 사용하여 다양한 유형의 조각을 생성합니다.
+  `jsii.AnySlice` 
+  `jsii.AnyStrings` 
+  `jsii.AnyNumbers` 

예제:

```
func Arns() *[]*string {
a := "arn:aws:s3:::bucket1"
b := "arn:aws:s3:::bucket2"
return &[]*string{&a, &b}
}

awsiam.NewCfnUser(stack, jsii.String("User"), &awsiam.CfnUserProps{
	ManagedPolicyArns: jsii.AnySlice(Arns())
  // or
	ManagedPolicyArns: jsii.AnyStrings("arn:aws:s3:::bucket1", "arn:aws:s3:::bucket2")
  // or
  ManagedPolicyArns: &[]interface{}{
    jsii.String("arn:aws:s3:::bucket1"),
    jsii.String("arn:aws:s3:::bucket2"),
  }
})
```

이 접근 방식을 사용하면 CDK에서 슬라이스를 올바르게 해석하여 스택을 배포하거나 합성할 때 역직렬화 오류를 방지할 수 있습니다.

### 사용자 지정 구문 개발
<a name="go-writing-constructs"></a>

Go에서는 기존 구문을 확장하는 것보다 새 구문을 작성하는 것이 일반적으로 더 간단합니다. 먼저 익스텐션과 같은 의미 체계가 필요한 경우 하나 이상의 기존 유형을 익명으로 내장하여 새 구조체 유형을 정의합니다. 추가하려는 새 기능에 대한 메서드와 필요한 데이터를 보관하는 데 필요한 필드를 작성합니다. 구문에 필요한 경우 props 인터페이스를 정의합니다. 마지막으로, 구문의 인스턴스를 반환하는 팩토리 함수 `NewMyConstruct()`를 작성합니다.

기존 구문에서 일부 기본값을 변경하거나 인스턴스화 시 간단한 동작을 추가하는 경우 해당 배관이 모두 필요하지는 않습니다. 대신 ‘확장’하는 구문의 팩토리 함수를 직접적으로 호출하는 팩토리 함수를 작성합니다. 예를 들어 다른 CDK 언어에서는 `s3.Bucket` 유형을 재정의하고 새 유형의 이니셜라이저에서 지정된 파일 이름 확장자만 버킷에 추가하도록 허용하는 버킷 정책을 추가하여 Amazon S3 버킷의 객체 유형을 시행하는 `TypedBucket` 구문을 생성할 수 있습니다. Go에서는 적절한 버킷 정책을 추가한 `s3.Bucket`(`s3.NewBucket`을 사용하여 인스턴스화)을 반환하는 `NewTypedBucket`을 작성하는 것이 더 쉽습니다. 새로운 구문 유형은 필요하지 않습니다. 해당 기능은 이미 표준 버킷 구문에서 사용할 수 있기 때문입니다. 새로운 ‘구문’은 이를 구성하는 더 간단한 방법을 제공할 뿐입니다.

## 빌드, 합성 및 배포
<a name="go-running"></a>

 AWS CDK는 앱을 실행하기 전에 자동으로 컴파일합니다. 그러나 오류를 확인하고 테스트를 실행하기 위해 앱을 수동으로 빌드하는 것이 유용할 수 있습니다. 프로젝트의 루트 디렉터리에 있는 동안 명령 프롬프트에서 `go build`를 실행하여 이 작업을 수행할 수 있습니다.

명령 프롬프트에서 `go test`를 실행하여 작성한 테스트를 실행합니다.

## 문제 해결
<a name="go-troubleshooting"></a>

다음과 같은 컴파일러 오류가 발생하면 문자열 조각이 임의의 조각을 예상하는 속성으로 직접 전달되었음을 의미합니다.

```
Cannot use 'jsii.Strings("arn:aws:s3:::bucket1", "arn:aws:s3:::bucket2")' (type *[]*string) as the type *[]interface{}
```

이 오류를 해결하려면 `jsii.Strings()`을 `jsii.AnyStrings()`으로 바꿉니다. 추가 컨텍스트 및 추가 솔루션은 이 ` [CDK GitHub issue](https://github.com/aws/aws-cdk/issues/35630) ` 섹션을 참조하세요.