PHP PHP에서 인터페이스 분리 원칙(ISP) 실전 적용하기
페이지 정보

영삼이
본문
✅ PHP에서 인터페이스 분리 원칙(ISP) 실전 적용하기
**ISP(Interface Segregation Principle, 인터페이스 분리 원칙)**는 SOLID 원칙 중 하나로,
“클라이언트는 자신이 사용하지 않는 메서드에 의존하지 않아야 한다”
는 원칙입니다.
PHP 프로젝트에서도 너무 많은 기능을 가진 인터페이스를 작게 나누는 것만으로도 유지보수성과 테스트 편의성이 극적으로 향상됩니다.
❌ 잘못된 예: 거대한 인터페이스
[code=php]
interface Worker {
public function work(): void;
public function eat(): void;
}
[/code]
```php
[code=php]
class HumanWorker implements Worker {
public function work(): void { echo "작업 중...\n"; }
public function eat(): void { echo "식사 중...\n"; }
}
class RobotWorker implements Worker {
public function work(): void { echo "로봇 작업 중...\n"; }
public function eat(): void {
// 로봇은 먹지 않음, 하지만 구현해야 함
throw new \Exception("로봇은 식사하지 않음");
}
}
[/code]
-
RobotWorker는 불필요한 메서드에 의존하게 됨
-
테스트나 확장 시에도 계속 문제가 됨
✅ 개선 예: 인터페이스 분리
[code=php]
interface Workable {
public function work(): void;
}
interface Eatable {
public function eat(): void;
}
[/code]
```php
[code=php]
class HumanWorker implements Workable, Eatable {
public function work(): void { echo "사람 작업 중\n"; }
public function eat(): void { echo "사람 식사 중\n"; }
}
class RobotWorker implements Workable {
public function work(): void { echo "로봇 작업 중\n"; }
}
[/code]
-
각 클래스는 필요한 기능만 구현
-
인터페이스 단위로 테스트 가능
🎯 실무 예시: 파일 저장기
나쁜 구조
[code=php]
interface Storage {
public function save(string $filename): void;
public function delete(string $filename): void;
public function move(string $src, string $dst): void;
}
[/code]
→ 어떤 구현은 `move()`를 지원하지 않을 수도 있음
---
**좋은 구조**
```php
[code=php]
interface Saver {
public function save(string $filename): void;
}
interface Deleter {
public function delete(string $filename): void;
}
interface Mover {
public function move(string $src, string $dst): void;
}
[/code]
→ 필요한 조합으로 의존성 주입 가능
---
### ✅ ISP 실천 팁
| 상황 | 분리 기준 |
|------|------------|
| 다양한 구현체가 있는 경우 | 공통된 최소 메서드만 추출 |
| 일부 구현체가 특정 기능만 제공 | 인터페이스를 더 작게 나눔 |
| 테스트가 어려울 때 | Mock 가능한 최소 단위로 분리 |
---
### 🧠 요약
- ISP는 “필요한 만큼만 의존하라”는 원칙
- 거대한 인터페이스를 쪼개면 유연한 구조, 테스트 쉬운 구조가 됨
- SOLID 중에서 **가장 실천하기 쉬운 원칙** 중 하나
---
- 이전글✅ PHP에서 유닛 테스트 가능한 아키텍처 구성법 25.03.28
- 다음글PHP로 간단한 의존성 주입 컨테이너 직접 만들어보기 25.03.28
댓글목록
등록된 댓글이 없습니다.