PHP PHP에서 데코레이터 패턴 실전 적용 팁
페이지 정보

영삼이
본문
✅ 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에서도 인터페이스 + 위임 구조로 쉽게 구현 가능
-
서비스 계층에 트랜잭션, 로깅, 캐싱을 유연하게 삽입하고 싶을 때 매우 유용
- 이전글PHP에서 빠르게 로그 시스템 구현하기 (Monolog 활용 X) 25.03.28
- 다음글PHP에서 커맨드 패턴 활용하여 서비스 분리하기 25.03.28
댓글목록
등록된 댓글이 없습니다.