[c#] 데코레이터를 이용한 데이터 변환 전략

데이터 변환은 소프트웨어 시스템에서 흔히 발생하는 작업 중 하나입니다. 데이터 변환 로직은 종종 변경되어야 하거나 유연하게 적용되어야 할 수도 있습니다. 이를 처리하기 위해 데코레이터 패턴을 사용하여 데이터 변환 전략을 동적으로 선택할 수 있습니다.

데코레이터 디자인 패턴

데코레이터 패턴은 객체에 추가적인 기능을 동적으로 부여하는 패턴입니다. 이 패턴을 이용하면 원본 객체의 기능을 유지한 채, 동적으로 추가적인 기능을 부여할 수 있습니다. 데이터 변환에서는 변환 전략을 동적으로 선택해야 하기 때문에 이 패턴이 적합합니다.

데이터 변환 전략

데이터 변환 전략은 데코레이터 인터페이스를 구현하는 클래스입니다. 각 변환 전략은 다양한 데이터 형식에 대한 변환을 처리합니다. 예를 들어, JSON 데이터를 XML로 변환하거나, CSV 데이터를 JSON으로 변환하는 전략이 있을 수 있습니다.

public interface IDataTransformer
{
    string Transform(string data);
}

public class JsonTransformer : IDataTransformer
{
    public string Transform(string data)
    {
        // JSON to XML transformation logic
    }
}

public class CsvTransformer : IDataTransformer
{
    public string Transform(string data)
    {
        // CSV to JSON transformation logic
    }
}

데코레이터 구현

각 데이터 변환 전략을 구현한 후, 이를 데코레이터 클래스에 주입하여 추가적인 기능을 부여할 수 있습니다. 예를 들어, 변환된 데이터를 로깅하거나 에러 처리를 추가할 수 있습니다.

public abstract class DataTransformerDecorator : IDataTransformer
{
    private readonly IDataTransformer _dataTransformer;

    protected DataTransformerDecorator(IDataTransformer dataTransformer)
    {
        _dataTransformer = dataTransformer;
    }

    public virtual string Transform(string data)
    {
        return _dataTransformer.Transform(data);
    }
}

public class LoggingDecorator : DataTransformerDecorator
{
    public LoggingDecorator(IDataTransformer dataTransformer) : base(dataTransformer)
    {
    }

    public override string Transform(string data)
    {
        // Logging logic
        return base.Transform(data);
    }
}

사용 예시

사용 예시를 보면, 변환 전략에 로깅 기능을 추가한 경우입니다.

IDataTransformer transformer = new JsonTransformer();
IDataTransformer loggingTransformer = new LoggingDecorator(transformer);

string originalData = "{...}";
string transformedData = loggingTransformer.Transform(originalData);

결론

데코레이터 패턴을 사용하여 데이터 변환 전략을 동적으로 선택하고 확장하는 방법을 살펴보았습니다. 이를 통해 데이터 변환 로직을 유연하게 구현하고 필요에 따라 변환 과정에 추가 기능을 동적으로 부여할 수 있게 되었습니다.

참고문헌: