Repository Pattern(3)

Jimin·2023년 6월 8일
0

RepositoryPattern

목록 보기
3/3
post-thumbnail

이전에 각 계층간의 공통으로 사용해야 되는 법을 알아봤으니 이제 유저를 조회하는 쿼리는 어디에 어떤 식으로
작성하는지를 알아보려 한다.

파일 경로는 아래와 같이 생성했다.

app
 ㄴ Http
 	 ㄴ Controllers
       ㄴ User
         ㄴ UserController.php
 ㄴ Models
     ㄴ User
       ㄴ User.php
 ㄴ Services
     ㄴ User
       ㄴ UserService.php
 ㄴ Repositoies
     ㄴ User
       ㄴ UserRepository.php
     ㄴ BaseRepository.php
 ㄴ Interfaces
     ㄴ User
       ㄴ UserInterface.php
     ㄴ BaseInterface.php

작업은 가장 먼저 UserInterface를 만들 예정이다.

UserInterface

BaseInterface를 상속받고 있으므로 처음 추상화 시켰던 매서드들은 그대로 사용할 수 있다.
그러므로 만약 전체를 조회하는 쿼리만 사용한다면 UserInterface 안에는 따로 작성하지 않아도 된다.
하지만 BaseInterface에서 선언한 매서드 외에 특정 조건의 쿼리를 추가로 사용한다면 아래와 같이 추가해주자.
예를 들어 권한이 Admin인 회원들을 찾아오는 쿼리를 작성해보자.

app/Interfaces/User/UserInterface.php

<?php

namespace App\Interfaces\User;

use App\Interfaces\BaseInterface;

interface UserInterface extends BaseInterface
{
	/**
     * @return LengthAwarePaginator
     */
    public function getAdmin(): \Illuminate\Database\Eloquent\Collection
}

인터페이스를 다 작성했으면 구현 클래스를 작성해야 한다.

UserRepository

app/Repositories/User/UserRepository.php

<?php

namespace App\Repositories\User;

use App\Models\User;
use App\Repositories\BaseRepository;
use App\Interfaces\User\UserInterface;
use Illuminate\Database\Eloquent\Collection;

class UserRepository extends BaseRepository implements UserInterface
{
    protected $model;
    public function __construct(User $model)
    {
        parent::__construct($model);
        $this->model = $model;
    }

	/**
     * @return Collection
     */
    public function getAdmin(): Collection
    {
        return $this->model->where('qualification', 'admin')->get();
    }


}

BaseRepostory를 extends하고 있어서 다른 매서드들은 그대로 사용할 수 있지만 UserInterface는 implements이기 때문에 선언해놓은 매서드들을 반드시 override해야 한다.

UserService

다음은 간단한 쿼리를 가지고 오는 비즈니스 로직이다.
앞에 Repository에 작성한 매서드를과는 달리 좀 더 비즈니스적인 작명을 해준다.

app/Service/UserService.php

<?php

namespace App\Services\User;

use App\Interfaces\Users\UserInterface;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;

class UserService
{
    private $repository;
    public function __construct(UserInterface $repository)
    {
        $this->repository = $repository;
    }
    
    /**
     * @return Collection
     */
    public function getUserList(): Collection
    {
        return $this->repository->all();
    }
    
    /**
     * @return Model
     */
    public function getUser($id): Model
    {
        return $this->repository->findId($id);
    }

	/**
     * @return Collection
     */
    public function getAdminUsers(): Collection
    {
        return $this->repository->getAdmin();
    }
}

UserController

app/http/Controller/User/UserController.php

<?php

namespace App\Http\User\Controllers;

use App\Interfaces\User\UserInterface;
use App\Services\User\UserService;
use Illuminate\Http\Request;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;

class UserController extends Controller
{
    private $userService;
    public function __construct(UserService $userService){
        $this->userService = $userService;
    }
    
    /**
     * @return Collection
     */
    public function list(): Collection
    {
    	return $this->userService->getUserList();
    }
    
    public function find($id): Model
    {
    	return $this->userService->findId($id);
    }
    
    public function findAdmin(): Collection
    {
    	return $this->userService->getAdminUsers();
    }

}

마지막으로 컨트롤러에서 Service에 있는 비즈니스 로직을 가져오면 작업이 마무리된다.
컨트롤러에서 return은 예시일뿐 실제로는 Response등등으로 대체된다.

이상 Repository Pattern 포스팅을 마친다.

profile
도전을 좋아하는 개발자

0개의 댓글