[Laravel 기본] 11. Controller

Laravel Controller

Laravel Controller 의 역할은 라우트로 들어온 Closure의 로직을 처리하는 역할을 합니다. 연관된 요청 처리 로직별로 묶어서 하나의 Single Controller Class로 만들어 사용합니다. Laravel 의 Controller 들은 app/Http/Controllers 디렉토리 아래 정의되어 있습니다.

여기서 생각해볼만한 점은 내 라라벨 어플리케이션은 비즈니스 로직을 어디에 두고 사용할 것인가? 입니다. Controller, Model 에 비즈니스 로직을 처리할 수 도 있으며 Service 또는 Repository 같은 레이아웃 계층을 추가하여 사용할 수 도 있습니다. 책임을 어디에 부여할것인가? 생산성은 어느 정도 나올 것인가? 어플리케이션 사이즈를 고려하여 자유롭게 사용하시면 됩니다.

1. Basic Usage

기본적은 Controller 사용법에 대해 익혀 보겠습니다. 생성이 간편한 Artisan 을 사용하여 Controller를 만들어 보겠습니다.

php artisan make:controller ProfileController

app/Http/Controllers 디렉토리 아래 ProfileController가 생성됩니다. 생성된 컨트롤러를 보면 Controller 라는 클래스를 상속 구현하고 있습니다. 이 Controller 를 구현하는 경우 validate, middleware, dispatch 같은 메소드를 사용하기 편하게 합니다.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ProfileController extends Controller
{
    
    public function index()
    {
        return view('profile');
    }
}

생성된 Controller에 메소드를 작성하고 Route에 아래 처럼 작성하여 사용합니다. RouteServiceProvider 에 루트 디렉토리로 app/Http/Controllers가 등록되어 있으므로 Route 디렉토리 아래 파일에선 namespace 생략이 가능합니다.

// Controller @ Method 형태의 문자열로 사용한다.
// RouteServiceProvider에 $namespace로 app/Http/Controllers 루트 디렉토리로 등록되어있다.
Route::get('/', 'ProfileController@index');

2. Controller Middleware

Controller 에서 미들웨어를 사용하고 싶은 경우에는 두 가지로 사용할 수 있습니다.

2-1. Route 파일에서 미들웨어 사용

Route::get('/', 'HomeController@index')->middleware('middlewareName');

2-2. Controller 생성자에서 미들웨어 사용

Controller 생성자에서도 미들웨어를 사용할 수 있습니다. Controller 를 상속 구현 하고 있기때문에 middleware 에 쉽게 접근이 가능합니다. 일반적인 미들웨어는 라우트 단계에서 그룹화해서 사용하는 것이 효과적이지만 특정한 미들웨어를 특정한 컨트롤러에 사용해야하는 경우에는 다음과 같이 생성자에 등록하고 사용합니다.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ProfileController extends Controller
{
    
    public function __construct()
    {
        $this->middleware('profileAuth');
        $this->middleware('specificMiddleware');
    }
}

3. Resource Controller

라라벨은 REST 아키텍쳐 맞는 메소드를 미리 제공합니다

라라벨은 Resource 중심의 REST 아키텍쳐 어플리케이션을 구현을 편리하게 해줍니다. ( REST 한계를 느끼고 GraphqL 등 대체할 방안들이 등장하고 있는 시점이지만 아직 REST 를 선호하는 개발자가 많습니다. ) Resource 중심의 컨트롤러를 Artisan 을 이용해 생성해보겠습니다.

php artisan make:controller BuildingController --resource
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class BuildingController extends Controller
{
    public function index()
    {
        //
    }
    public function create()
    {
        //
    }
    public function store(Request $request)
    {
        //
    }
    public function show($id)
    {
        //
    }
    public function edit($id)
    {
        //
    }
    public function update(Request $request, $id)
    {
        //
    }
    public function destroy($id)
    {
        //
    }
}

위의 소스 코드처럼 REST 아키텍쳐 CRUD에 맞는 메소드를 미리 정의해줍니다. 이제 라우트에 Resource 메소드를 사용하여 해당 메소드들을 매칭시킵니다.

 Route::resource('buildings', 'BuildingController');

4. Controller Dependecy Injection

라라벨 Service Container는 컨트롤러에 Type-Hinting을 이용한 Resolving으로 의존성 주입을 수행합니다. 컨트롤러는 생성자와 메소드에서 의존성 주입을 받을 수 있습니다.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Repositories\ProfileRepository;

class ProfileController extends Controller
{
    // 생성자를 통한 Injection
    public function __construct(ProfileRepository $repository)
    {
    }
    
    // 메소드를 통한 Injection
    // url => /profiles/{id}
    public function show(Request $request, $id)
    {
    }
}

TL;DR

  • 라라벨에서 Controller 는 route의 Closure 부분을 담당한다.
  • app/Http/Controller 를 구현함으로써 middleware, validate 등 기능을 쉽게 사용 가능하다.
  • REST 아키텍쳐 구현이 쉽도록 Resource Controller 기능을 제공한다.
  • Laravel 컨트롤러는 Type Hinting 를 통해 생성자와 메소드에서 의존성 주입을 받는다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다