본문 바로가기

Programming/Design Patterns

GoF 디자인 패턴 - 데코레이터 패턴 (Decorator Pattern)

반응형

1. 데코레이터 패턴이란?

데코레이터 패턴은 객체에 추가적인 책임(기능)을 동적으로 부여할 수 있게 해주는 구조 패턴이다. 서브클래싱 없이도 기능을 확장할 수 있으며, 개방-폐쇄 원칙(OCP)을 잘 지킨 설계 방식이다.

특징

  • 동적 기능 확장: 런타임에 객체의 기능을 유연하게 추가 가능
  • OCP 준수: 기존 코드를 수정하지 않고도 기능을 확장
  • 조합성 증가: 다양한 데코레이터를 조합해 기능을 유연하게 구성 가능

 

2. 데코레이터 패턴의 구조

  1. Component (컴포넌트): 기본 인터페이스 또는 추상 클래스
  2. ConcreteComponent (구현체): 실제 기능을 수행하는 클래스
  3. Decorator (데코레이터): Component를 구현하고 자신 안에 Component 참조
  4. ConcreteDecorator (구체 데코레이터): 기능을 확장하는 클래스

 

3. 데코레이터 패턴 구현 예제

예제: 웹 페이지 콘텐츠에 기능을 데코레이팅하기 (스크롤, 보더 등)

// 기본 컴포넌트 인터페이스
interface Page {
    String render();
}

// 기본 기능을 제공하는 컴포넌트
class BasicPage implements Page {
    public String render() {
        return "기본 페이지";
    }
}

// 데코레이터 추상 클래스
abstract class PageDecorator implements Page {
    protected Page page;

    public PageDecorator(Page page) {
        this.page = page;
    }

    public String render() {
        return page.render();
    }
}

// 스크롤 기능 추가 데코레이터
class ScrollDecorator extends PageDecorator {
    public ScrollDecorator(Page page) {
        super(page);
    }

    public String render() {
        return super.render() + " + 스크롤 기능";
    }
}

// 보더 기능 추가 데코레이터
class BorderDecorator extends PageDecorator {
    public BorderDecorator(Page page) {
        super(page);
    }

    public String render() {
        return super.render() + " + 보더 기능";
    }
}

// 클라이언트 코드
public class DecoratorExample {
    public static void main(String[] args) {
        Page basic = new BasicPage();
        Page scrollPage = new ScrollDecorator(basic); // 기본 + 스크롤
        Page borderedPage = new BorderDecorator(scrollPage); // 기본 + 스크롤 + 보더

        System.out.println(borderedPage.render());
        // 출력: 기본 페이지 + 스크롤 기능 + 보더 기능
    }
}

데코레이터를 조합함으로써 객체의 책임을 유연하게 확장할 수 있고, 새로운 클래스를 만들지 않고 다양한 기능 조합이 가능하다.


 

4. 데코레이터 패턴의 장점과 단점

장점

  • 객체 기능의 유연한 확장
  • 상속 없이 기능 추가 가능 (조합을 통해 해결)
  • OCP와 SRP(단일 책임 원칙) 잘 지킴

단점

  • 너무 많은 데코레이터가 생기면 코드 구조가 복잡해질 수 있음
  • 디버깅이 어려워질 수 있음 (중첩 구조)

 

5. 활용 사례 (웹 개발 관련)

1) 미들웨어 체인 구성 (예: Express.js)

요청 처리 시, 여러 기능을 체인으로 연결하여 동작시키는 구조에서 데코레이터 패턴이 적용됨

2) HTML 컴포넌트 스타일 확장

기본 컴포넌트에 그림자, 보더, 애니메이션 등 스타일을 데코레이팅하여 재사용 가능하게 함

3) Spring AOP (관점 지향 프로그래밍)

실제 로직을 수정하지 않고 트랜잭션, 로깅, 보안 기능을 주입하는 구조에서 활용됨


 

 

데코레이터 패턴은 기존 클래스를 수정하지 않고도 기능을 확장할 수 있는 강력한 구조 패턴이다. 특히 UI 요소나 요청 흐름 같은 유연한 조합이 필요한 구조에서 매우 유용하며, 유지보수성과 재사용성을 동시에 높일 수 있다.

 

반응형