

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

# 재사용 가능한 패턴 개발
<a name="reusable-patterns-best-practices"></a>

소프트웨어 설계 패턴은 소프트웨어 개발의 일반적인 문제에 대한 재사용 가능한 솔루션입니다. 이는 소프트웨어 엔지니어가 모범 사례를 따르는 제품을 만드는 데 도움이 되는 가이드 또는 패러다임 역할을 합니다. 이 섹션에서는 AWS CDK 코드베이스에서 사용할 수 있는 재사용 가능한 두 가지 패턴인 추상 팩토리 패턴과 책임 체인 패턴에 대한 개요를 제공합니다. 각 패턴을 청사진으로 사용하고 코드의 특정 설계 문제에 맞게 사용자 지정할 수 있습니다. 설계 패턴에 대한 자세한 내용은 Refactoring.Guru 설명서의 [Design Patterns](https://refactoring.guru/design-patterns)를 참조하세요.

## 추상 팩토리
<a name="abstract-factory"></a>

추상 팩토리 패턴은 구체적인 클래스를 지정하지 않고도 관련 객체 또는 종속 객체의 패밀리를 만들 수 있는 인터페이스를 제공합니다. 이 패턴은 다음과 같은 사용 사례에 적용됩니다.
+ 클라이언트가 시스템에서 객체를 생성하고 구성하는 방법과 무관한 경우
+ 시스템이 여러 객체 패밀리로 구성되어 있고 이러한 패밀리가 함께 사용되도록 설계된 경우
+ 특정 종속성을 구성하기 위해 런타임 값이 있어야 하는 경우

추상 팩토리 패턴에 대한 자세한 내용은 Refactoring.Guru 설명서의 [Abstract Factory in TypeScript](https://refactoring.guru/design-patterns/abstract-factory/typescript/example)를 참조하세요.

다음 코드 예제는 Abstract Factory 패턴을 사용하여 Amazon Elastic Block Store(Amazon EBS) 스토리지 팩토리를 구축하는 방법을 보여줍니다.

```
abstract class EBSStorage {
    abstract initialize(): void; 
}

class ProductEbs extends EBSStorage{
    constructor(value: String) {
        super();
        console.log(value);
    }
    initialize(): void {}
}

abstract class AbstractFactory {
    abstract createEbs(): EBSStorage
}

class EbsFactory extends AbstractFactory {
    createEbs(): ProductEbs{
        return new ProductEbs('EBS Created.')
    }
}

const ebs = new EbsFactory();
ebs.createEbs();
```

## 책임 사슬
<a name="chain-responsibility"></a>

책임 사슬은 잠재적 핸들러 중 하나가 요청을 처리할 때까지 잠재적 핸들러 사슬을 따라 요청을 전달할 수 있는 동작 디자인 패턴입니다. 책임 사슬 패턴은 다음 사용 사례에 적용됩니다.
+ 런타임 시 결정된 여러 객체가 요청을 처리할 후보인 경우
+ 코드에서 핸들러를 명시적으로 지정하지 않으려는 경우
+ 수신자를 명시적으로 지정하지 않고 여러 객체 중 하나에 요청을 보내려는 경우

책임 사슬 패턴에 대한 자세한 내용은 Refactoring.Guru 설명서의 [Chain of Responsibility in TypeScript](https://refactoring.guru/design-patterns/chain-of-responsibility/typescript/example)를 참조하세요.

다음 코드는 책임 사슬 패턴을 사용하여 작업을 완료하는 데 필요한 일련의 작업을 구성하는 방법의 예를 보여줍니다.

```
interface Handler {
    setNext(handler: Handler): Handler;
    handle(request: string): string;
}
abstract class AbstractHandler implements Handler
{
    private nextHandler: Handler;
    public setNext(handler: Handler): Handler {
        this.nextHandler = handler;
        return handler;
    }

    public handle(request: string): string {
        if (this.nextHandler) {
            return this.nextHandler.handle(request);
        }
        return '';
    }
}

class KMSHandler extends AbstractHandler {
    public handle(request: string): string {
        return super.handle(request);
    }
}
```