PHP PHP에서 도메인 주도 설계(DDD) 기초 적용하기
페이지 정보

영삼이
본문
✅ PHP에서 도메인 주도 설계(DDD) 기초 적용하기
**도메인 주도 설계(Domain-Driven Design, DDD)**는 복잡한 비즈니스 로직을 다루는 프로젝트에서 매우 강력한 설계 방식입니다. PHP에서도 프레임워크에 의존하지 않고 DDD의 핵심 개념을 적용할 수 있습니다. 이 글에서는 실무에서 바로 적용할 수 있는 DDD 핵심 구조와 구현 예시를 소개합니다.
📦 DDD 핵심 구성요소
요소 | 설명 |
---|---|
Entity | 고유 식별자를 가진 객체 (변경 가능) |
Value Object | 값으로만 비교되는 객체 (불변) |
Aggregate Root | 연관된 객체들을 하나의 단위로 관리 |
Repository | Aggregate를 저장/조회하는 역할 |
Service | 도메인 로직이 아닌 프로세스 로직 담당 |
Factory | 복잡한 객체 생성을 캡슐화 |
Domain Event | 도메인 내 발생한 사건을 표현 |
🧱 1. Entity 예시: User
[code=php]
namespace Domain;
class User {
public function __construct(
public readonly string $id,
public string $email,
public string $name
) {}
public function changeName(string $newName): void {
$this->name = $newName;
}
}
[/code]
-
id
가 고유 식별자 → 동일성 비교 기준
🧩 2. Value Object 예시: Email
[code=php]
namespace Domain;
class Email {
public function __construct(private string $value) {
if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {
throw new \InvalidArgumentException("잘못된 이메일 형식");
}
}
public function value(): string {
return $this->value;
}
public function equals(Email $other): bool {
return $this->value === $other->value;
}
}
[/code]
-
불변, 동등성 비교 가능,
equals()
메서드 주의
📤 3. Repository 인터페이스
[code=php]
namespace Domain;
interface UserRepository {
public function findById(string $id): ?User;
public function save(User $user): void;
}
[/code]
-
도메인에서는 저장 방식 모름 → 구현은 인프라 계층에서 처리
⚙️ 4. 도메인 서비스 예시
[code=php]
namespace Domain;
class UserRegistrationService {
public function __construct(private UserRepository $repo) {}
public function register(string $id, Email $email, string $name): void {
if ($this->repo->findById($id)) {
throw new \Exception("이미 존재하는 사용자");
}
$user = new User($id, $email->value(), $name);
$this->repo->save($user);
}
}
[/code]
-
도메인 로직이지만 Entity에 넣기 애매한 경우 Service로 분리
📌 DDD의 계층적 구조 (간단 도식)
Presentation (Controller)
↓
Application (UseCase / Service)
↓
Domain (Entity, ValueObject, RepositoryInterface)
↓
Infrastructure (DB, Email, File 등 구현체)
🧠 적용 시 팁
팁 | 설명 |
---|---|
이름 짓기 | User , Order , Product 등 도메인 언어로 명확히 |
Value Object 적극 사용 | Email, Address, Money 등 |
Entity와 Service 구분 | 책임 기준으로 나눌 것 |
Repository는 도메인 기준 | DB 기술은 모름 |
✅ 요약
-
DDD는 복잡한 도메인 모델링을 위한 설계 패턴
-
PHP에서도 Entity, VO, Repository, Service 구조로 적용 가능
-
프레임워크에 종속되지 않고 비즈니스 로직 중심으로 개발 가능
-
코드보다 중요한 건 도메인 언어에 대한 깊은 이해
- 이전글PHP에서 PSR 표준 완벽 이해 및 실무 적용 가이드 25.03.28
- 다음글PHP에서 Hexagonal Architecture (육각형 아키텍처) 적용하기 25.03.28
댓글목록
등록된 댓글이 없습니다.