본문 바로가기
공부 일지/개인 공부 기록용

에러로그 Laravel 게시판 - 라우트 404에러

by Joshbla 2023. 6. 22.

php7.4
Laravel 8 환경에서


게시판을 만들어보던 중 

web.php 파일

...

Route::group(['as' => 'boards', 'prefix' => 'boards', 'middleware' => 'auth'], static function () {
    Route::get('/', [BoardController::class, 'index'])->name('.index');
    Route::get('/oldest', [BoardController::class, 'oldest'])->name('.oldest');
    Route::get('/create-page', [BoardController::class, 'create_page'])->name('.create_page');
    Route::post('/store', [BoardController::class, 'store'])->name('.store');
    Route::get('/{board}', [BoardController::class, 'detail_page'])->name('.detail_page');
    Route::get('/{board}/edit-page', [BoardController::class, 'edit_page'])->name('.edit_page');
    Route::patch('/{board}', [BoardController::class, 'update'])->name('.update');
    Route::delete('/{board}', [BoardController::class, 'destroy'])->name('.destroy');
    Route::get('/{board}/verify-page', [BoardController::class, 'verify_page'])->name('.verify_page');
    Route::get('/{board}/verify', [BoardController::class, 'verify'])->name('.verify');
    Route::get('/search', [BoardController::class, 'search'])->name('.search');
});

과 같이 작성을 했다.

 

그런데 검색기능을 추가한 후 테스트를 위하여

http://localhost:8000/boards/search?keyword=123 과 같이 검색을 진행해보니

404 에러가 발생하였다.

라우트 캐시 초기화도 해보고 이런저런 방법을 써도 다 안됐다...

 

임시로 group 밖에 작성해보니 이거는 또 된다...

web.php 파일

...

Route::group(['as' => 'boards', 'prefix' => 'boards', 'middleware' => 'auth'], static function () {
    Route::get('/', [BoardController::class, 'index'])->name('.index');
    Route::get('/oldest', [BoardController::class, 'oldest'])->name('.oldest');
    Route::get('/create-page', [BoardController::class, 'create_page'])->name('.create_page');
    Route::post('/store', [BoardController::class, 'store'])->name('.store');
    Route::get('/{board}', [BoardController::class, 'detail_page'])->name('.detail_page');
    Route::get('/{board}/edit-page', [BoardController::class, 'edit_page'])->name('.edit_page');
    Route::patch('/{board}', [BoardController::class, 'update'])->name('.update');
    Route::delete('/{board}', [BoardController::class, 'destroy'])->name('.destroy');
    Route::get('/{board}/verify-page', [BoardController::class, 'verify_page'])->name('.verify_page');
    Route::get('/{board}/verify', [BoardController::class, 'verify'])->name('.verify');
//    Route::get('/search', [BoardController::class, 'search'])->name('.search');
});

Route::get('/search', [BoardController::class, 'search'])->name('search');

http://localhost:8000/search?keyword=123 주소로 접속해보니 잘 됨...

 

원인은 다음과 같았다.

라우트는 작성한 순서대로 위에서 아래로 읽는다.

이름이 같은 라우트가 있으면 해당 라우트를 우선 실행시키게 된다.

그런데 내가 작성한 라우트 중에서 /boards/search 메서드와 비슷한게 있다..

바로 get메서드 /boards/{board} 이다.

 

내가 {board}의 타입을 지정해주지 않았으므로 

/boards/search 에서 search가 {board}의 일종으로 인식된 것이다.

{board} 는 board의 id가 들어오는 부분이므로 타입을 숫자로 지정해줘서 문제를 해결하자

...

Route::get('/{board}', [BoardController::class, 'detail_page'])->where('board','[0-9]+')->name('.detail_page');

...

 

라라벨에서 라우트를 지정하는 방식이 스프링과 달라서 새로운 공부가 되었다.

'공부 일지 > 개인 공부 기록용' 카테고리의 다른 글

세상은 넓고..  (0) 2024.01.18
[JAVA] 이미지 리사이징, 썸네일  (1) 2023.11.27
에러로그 laravel 클론코딩  (0) 2023.06.09
[JPA] N+1 문제  (0) 2023.05.22
에러로그 (mysqladmin flush-hosts)  (0) 2023.05.19