PHP PHP에서 로직 분리: 서비스 계층 설계 팁
페이지 정보

영삼이
본문
✅ PHP에서 로직 분리: 서비스 계층 설계 팁
컨트롤러에 모든 비즈니스 로직을 몰아넣는 구조는 유지보수와 테스트에 매우 불리합니다. 이를 개선하는 대표적인 방법이 **서비스 계층(Service Layer)**의 도입입니다. 이 글에서는 PHP에서 서비스 계층을 어떻게 설계하고 활용할 수 있는지 실전 예제를 통해 설명합니다.
🧱 기본 구조
Controller → Service → Repository → DB
-
Controller: 요청 처리 및 응답 반환
-
Service: 도메인 로직 처리
-
Repository: DB 접근 추상화
🧩 나쁜 예시: 로직이 컨트롤러에 몰림
[code=php]
function registerUser(Request $request) {
$email = $request->get('email');
$name = $request->get('name');
$db = new PDO(...);
$stmt = $db->prepare('INSERT INTO users ...');
$stmt->execute([$email, $name]);
return new Response('등록 완료');
}
[/code]
-
데이터베이스 접근, 유효성 검사 등 모든 책임이 섞여 있음
-
테스트 및 재사용 어려움
✅ 서비스 계층 도입
UserService.php
[code=php]
class UserService {
public function __construct(private UserRepository $repo) {}
public function register(string $email, string $name): void {
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException('유효하지 않은 이메일');
}
$user = new User($email, $name);
$this->repo->save($user);
}
}
[/code]
Controller
[code=php]
function registerUser(Request $request, UserService $service) {
$service->register(
$request->get('email'),
$request->get('name')
);
return new Response('등록 완료');
}
[/code]
🎯 장점
-
컨트롤러는 입출력에만 집중
-
로직은 서비스 클래스에 분리되어 테스트 가능
-
서비스 재사용 용이 (웹/CLI/Queue 등에서)
🧠 서비스 계층 설계 팁
-
서비스는 비즈니스 규칙 중심으로 구성
-
도메인 모델을 조작하는 책임을 가짐
-
컨트롤러/뷰/프레임워크에 의존하지 않게 설계
🔧 추가 확장 예시
-
회원가입 후 메일 발송:
MailerService
주입하여 호출 -
트랜잭션 처리: 서비스 내부에서 처리
-
로깅, 이벤트 디스패치 등 다양한 책임도 위임 가능
- 이전글PHP에서 REST API Rate Limiting 구현법 25.03.28
- 다음글PHP Enum과 기존 상수 클래스 비교 및 활용법 25.03.28
댓글목록
등록된 댓글이 없습니다.