개발 지식

개발 지식

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

페이지 정보

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

본문

✅ 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 중에서 **가장 실천하기 쉬운 원칙** 중 하나

---

댓글목록

등록된 댓글이 없습니다.