개발 지식

개발 지식

PHP PHP에서 로직 분리: 서비스 계층 설계 팁

페이지 정보

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

본문

✅ 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 주입하여 호출

  • 트랜잭션 처리: 서비스 내부에서 처리

  • 로깅, 이벤트 디스패치 등 다양한 책임도 위임 가능


댓글목록

등록된 댓글이 없습니다.