개발 지식

개발 지식

PHP PHP에서 클린 아키텍처 적용하기

페이지 정보

profile_image
영삼이
0건 192회 25-03-28 22:48

본문

✅ PHP에서 클린 아키텍처 적용하기

**클린 아키텍처(Clean Architecture)**는 의존성의 방향을 명확히 하고, 유지보수성과 테스트 용이성을 높이기 위한 소프트웨어 설계 원칙입니다. PHP에서도 충분히 적용 가능하며, 프레임워크에 종속되지 않는 구조를 만들 수 있습니다.


🧱 기본 계층 구조

Entities        (도메인 모델, 비즈니스 규칙)
Use Cases       (애플리케이션 규칙)
Interface Adapters (Controller, Presenter, Gateway)
Frameworks & Drivers (웹 프레임워크, DB, UI)

의존성 방향은 안쪽을 향해야만 합니다.


📁 디렉토리 예시

project/
├── src/
│   ├── Domain/         # Entity, Value Object
│   ├── Application/    # UseCase
│   ├── Infrastructure/ # DB, API 연동
│   └── Interface/      # Controller, View

🧩 예제: 사용자 등록 로직

Entity

[code=php]
namespace App\Domain;

class User {
    public function __construct(
        public string $email,
        public string $name
    ) {}
}
[/code]

Use Case

[code=php]
namespace App\Application;

use App\Domain\User;
use App\Domain\UserRepository;

class RegisterUser {
    public function __construct(private UserRepository $repo) {}

    public function execute(string $email, string $name): void {
        $user = new User($email, $name);
        $this->repo->save($user);
    }
}
[/code]

Interface (웹 요청 처리)

[code=php]
namespace App\Interface;

use App\Application\RegisterUser;
use App\Infrastructure\DbUserRepository;

$repo = new DbUserRepository();
$useCase = new RegisterUser($repo);

$useCase->execute($_POST['email'], $_POST['name']);
[/code]

Repository 인터페이스

[code=php]
namespace App\Domain;

interface UserRepository {
    public function save(User $user): void;
}
[/code]

DB 구현체

[code=php]
namespace App\Infrastructure;

use App\Domain\User;
use App\Domain\UserRepository;

class DbUserRepository implements UserRepository {
    public function save(User $user): void {
        // DB 저장 로직
    }
}
[/code]

💡 핵심 설계 포인트

  • 도메인 계층은 어떤 외부 기술에도 의존하지 않음

  • UseCase는 도메인과 상호작용하며 외부 인프라에 의존하지 않음

  • 인프라(DB, 프레임워크)는 가장 바깥에서 동작


🧠 요약

  • 클린 아키텍처는 비즈니스 로직을 중심으로 계층을 나누는 설계 방식

  • PHP에서도 명확하게 계층 분리를 통해 테스트 가능한 구조 구현 가능

  • 프레임워크에 덜 의존하고, 유연한 구조를 원할 때 매우 유용


댓글목록

등록된 댓글이 없습니다.