본문으로 건너뛰기

Laravel Routing - 그룹화

2023년 2월 11일에 작성되었고, 블로그를 이전하며 옮겨온 포스트입니다.
여기에서 원본을 확인할 수 있습니다.

문제 상황

Laravel에서 간단한 프로젝트를 만들던 도중, web.php에 라우팅된 여러가지 것들이 있는데, 중복되는 부분이 많아 그룹화 할 수 있는 방법이 없을까라는 의문이 생겼다. 문제의 부분은 아래와 같다.

(web.php 일부)
Route::get('/upload', [ExpressController::class, 'upload'])->name('upload.view');
Route::post('/upload', [ExpressController::class, 'post'])->name('upload');
Route::get('/{name}', [ExpressController::class, 'view'])->name('view');
Route::get('/', [ExpressController::class, 'view'])->name('view');
Route::get('/view/{postId}', [ExpressController::class, 'detail'])->name('detail');

위와 같이 내가 사용하는 ExpressController에 포함된 get, post들이 4개 정도인데, [ExpressController::class, 'className']이 중복으로 계속 사용되는 것을 볼 수 있다.

 

해결하기

위와 같은 문제를 해결하기 위해 Laravel 공식 문서를 찾아보았는데, Routing - Laravel 의 Route Groups 부분에 필자가 찾던 부분이 명시되어 있었다.

위 문서를 보면, 모든 라우팅된 부분에 같은 컨트롤러를 사용한다면, 그룹화 할 수 있다는 내용이었다. 이 글의 처음 부분에 필자의 코드를 위 내용과 예제 코드를 토대로 정리한다면, 아래와 같이 정리할 수 있었다.

Route::controller(ExpressController::class)->group(function () {
    Route::post('/upload', 'post')->name('upload');
    Route::get('/upload', 'upload')->name('upload.view');
    Route::post('/upload', 'upload')->name('upload');
    Route::get('/{name}', 'view')->name('view');
    Route::get('/', 'view')->name('view');
    Route::get('/view/{postId}', 'detail')->name('detail');
});

 

마무리

정리하자면, Laravel에서 라우팅을 하기 위해서는 web.php에 컨트롤러 등 여러가지 정의를 해 주어야 한다. 페이지 1개, 2개 정도를 컨트롤러를 포함해 라우팅할 때에는 그룹화를 굳이 하지 않아도 되지만, N개로 늘어난다면 그룹화를 통해 사용하는 컨트롤러에 따라 묶어주는 것이 유지보수에 편리하다. 예를 들자면, 저렇게 하나의 컨트롤러에 묶인 라우트의 개수가 10개 정도인데, 컨트롤러 이름이 바뀌는 상황이 된다면, 하나하나 바꿔줄 필요 없이, 그룹에 사용되는 컨트롤러의 이름 하나만 변경하면 되는 것이다. 또, 혼자 만드는 프로젝트가 아닌 불특정 다수와 협업하는 프로젝트라면 어떤 부분이 어떤 컨트롤러를 사용하는 지도 쉽게 파악할 수 있다.