반응형
1. 데코레이터 패턴이란?
데코레이터 패턴은 객체에 추가적인 책임(기능)을 동적으로 부여할 수 있게 해주는 구조 패턴이다. 서브클래싱 없이도 기능을 확장할 수 있으며, 개방-폐쇄 원칙(OCP)을 잘 지킨 설계 방식이다.
특징
- 동적 기능 확장: 런타임에 객체의 기능을 유연하게 추가 가능
- OCP 준수: 기존 코드를 수정하지 않고도 기능을 확장
- 조합성 증가: 다양한 데코레이터를 조합해 기능을 유연하게 구성 가능
2. 데코레이터 패턴의 구조
- Component (컴포넌트): 기본 인터페이스 또는 추상 클래스
- ConcreteComponent (구현체): 실제 기능을 수행하는 클래스
- Decorator (데코레이터): Component를 구현하고 자신 안에 Component 참조
- 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 요소나 요청 흐름 같은 유연한 조합이 필요한 구조에서 매우 유용하며, 유지보수성과 재사용성을 동시에 높일 수 있다.

반응형
'Programming > Design Patterns' 카테고리의 다른 글
| GoF 디자인 패턴 - 브릿지 패턴 (Bridge Pattern) (0) | 2025.04.24 |
|---|---|
| GoF 디자인 패턴 - 어댑터 패턴 (Adapter Pattern) (1) | 2025.04.18 |
| GoF 디자인 패턴 - 프로토타입 패턴 (Prototype Pattern) (0) | 2025.04.10 |
| GoF 디자인 패턴 - 빌더 패턴 (Builder Pattern) (0) | 2025.04.09 |
| GoF 디자인 패턴 - 추상 팩토리 패턴 (Abstract Factory Pattern) (2) | 2025.04.08 |