개발 지식

개발 지식

PHP PHP에서 데코레이터 패턴 실전 적용 팁

페이지 정보

profile_image
영삼이
0건 185회 25-03-28 23:22

본문

✅ PHP에서 데코레이터 패턴 실전 적용 팁

**데코레이터 패턴(Decorator Pattern)**은 기존 객체에 기능을 동적으로 추가하는 구조적 디자인 패턴입니다. PHP에서는 서비스에 공통 기능(예: 로깅, 캐싱, 트랜잭션 등)을 클래스 계층을 변경하지 않고 유연하게 덧붙이는 데 유용합니다.


🧱 기본 구조

구성요소 설명
인터페이스 공통 기능 정의
Concrete 클래스 기본 동작 제공
데코레이터 동일 인터페이스를 구현하면서 기능을 감쌈

🎯 예제: 간단한 Logger

[code=php]
interface Logger {
    public function log(string $message): void;
}
[/code]

---

### 🧩 기본 구현체

```php
[code=php]
class FileLogger implements Logger {
    public function log(string $message): void {
        file_put_contents('log.txt', $message . PHP_EOL, FILE_APPEND);
    }
}
[/code]

🧰 데코레이터 구현

[code=php]
class LoggerDecorator implements Logger {
    protected Logger $logger;

    public function __construct(Logger $logger) {
        $this->logger = $logger;
    }

    public function log(string $message): void {
        $this->logger->log($message);
    }
}
[/code]

🚀 기능 추가: 타임스탬프 붙이기

[code=php]
class TimestampLogger extends LoggerDecorator {
    public function log(string $message): void {
        $timestamped = '[' . date('Y-m-d H:i:s') . '] ' . $message;
        parent::log($timestamped);
    }
}
[/code]

✅ 사용 예시

[code=php]
$logger = new FileLogger();
$logger = new TimestampLogger($logger);

$logger->log("사용자가 로그인함");
[/code]

🧠 실무 확장 아이디어

  • 캐싱 데코레이터: 동일 입력에 대한 출력 캐싱

  • 로깅 데코레이터: 모든 메서드 호출 기록

  • 트랜잭션 데코레이터: 서비스 실행 전/후 DB 트랜잭션 처리

  • 권한 검사 데코레이터: 요청 전에 권한 확인


✅ 장점

항목 설명
OCP 준수 기존 코드 수정 없이 기능 확장
조합 가능 여러 데코레이터를 연결해 중첩 효과
테스트 용이 단일 책임 클래스 테스트 수월
런타임 유연성 실행 시 데코레이터 조합 결정 가능

❌ 주의사항

  • 데코레이터가 깊게 중첩되면 추적이 어려워짐

  • 기능 조합 순서에 따라 결과가 달라질 수 있음

  • 동일한 인터페이스 구현 필수


🧠 요약

  • 데코레이터 패턴은 클래스 상속 없이 기능을 동적으로 추가하는 기법

  • PHP에서도 인터페이스 + 위임 구조로 쉽게 구현 가능

  • 서비스 계층에 트랜잭션, 로깅, 캐싱을 유연하게 삽입하고 싶을 때 매우 유용


댓글목록

등록된 댓글이 없습니다.