Page tree

가장 기본적인 라우트는 액션과 URL, 클로저로 지정됩니다. 다음은 액션이 GET 요청이고 URL 이 /hello 일 경우 라우트 예제입니다.

Route::get('hello', function() {
    return 'Hello!';
});

독자들이 모두 짐작했듯이 위 설정은 브라우저 화면에 'Hello!' 라는 글자를 출력합니다. 직접 웹 브라우저로 http://homestead.app/hello 에 연결하여 결과를 확인해 봅시다.

 

라우트는 계층 구조를 가질 수 있으며 다음은  http://homestead.app/hello/world 에 대한 라우트입니다.

Route::get('hello/world', function() {
    return 'Hello World';
});

계층적 라우팅

 

라우터는 브라우저의 URL 중 일부를 파라미터로 처리하여 애플리케이션에 전달할 수 있습니다. 파라미터로 처리할 uri 는 { } 로 둘러 싸고 클로져에서 파라미터로 받으면 됩니다.

Route::get('hello/world/{name}', function($name) {
    return 'Hello World ' . $name;
});

이제 브라우저로 http://homestead.app/hello/world/MyName 에 연결하여 결과를 확인해 봅시다. 파라미터로 넘긴 MyName 이 화면에 출력되는 것을 확인할 수 있을 것입니다.

라우팅 파라미터

라우팅에 지정된 파라미터(위 예제에서 name)는 클로저에 변수로 전달되는데 대시 문자(-)를 사용하지 않는게 안전하므로 - 대신 언더바(_) 를 사용하십시요.

 

만약 사용자가 파라미터를 보내지 않았을 경우 어떻게 될까요. 라우트 url 이 'hello/world/{name}' 인 경우 브라우저가 http://homestead.app/hello/world/ 만 호출했을 경우 라우트에 상위 url 등록 여부에 따라 2가지 결과가 있을 수 있습니다.

 

1.라우트에 'hello/world' 가 등록되어 있을 경우 

다음과 같이 라우팅이 정의되어 있을 경우 라라벨의 라우터는 두 가지 라우트중 파라미터가 있는 것을 사용하게 됩니다.

Route::get('hello/world/', function($name) {
    return 'Hello World ' . $name;
});
Route::get('hello/world/{name}', function($name) {
    return 'Hello World ' . $name;
});

그러므로 반드시 파라미터가 와야 하는데 없으므로 다음과 같이 ErrorException 이 발생하고 아규먼트가 없다는 메시지가 출력됩니다.

 

이 화면은 예외가 발생했을 때 라라벨이 출력하는 화면으로 .env 파일내의 APP_DEBUG 항목이 true 로 설정되어 있어야 표시됩니다.

보시다시피 전체 호출 스택이 출력되며 최종 에러가 발생한 파일(routes.php 의 29 번째 줄)이 표시되므로 디버깅할 때 많은 도움이 되는 것을 알 수 있습니다.

HTTP 예외 화면

 

2.라우트에 'hello/world' 가 등록되지 않았을 경우

<?php
Route::get('hello/world/{name}', function($name) {
    return 'Hello World ' . $name;
});

 

상위 url 이 없으므로 라라벨은 'hello/world' 라우트를 찾게 되지만 해당 설정이 없으므로 HTTP 404 에러에 해당하는 NotFoundHttpException 을 발생시킵니다.

NotFoundException 화면

 

2번과 같은 상황을 방지하려면 상위 라우트를 설정해도 되지만 더 좋은 방법은 선택적인 파라미터로 처리하는 것입니다. 선택적인 파라미터는 정규식에서 "0 또는 1회 일치" 의 의미인 ? 를 사용하면 됩니다.

Route::get('hello/world/{name?}', function($name = null) {
    return 'Hello World ' . $name;
});

이제 파라미터가 선택적이므로 $name 이 없어도 정상 동작하는 것을 확인할 수 있습니다. 만약 생략시 기본 값을 설정해야 한다면 클로저의 파라미터에 기본 값을 지정하면 됩니다.

Route::get('hello/world/{name?}', function($name = 'lesstif') {
    return 'Hello World ' . $name;
});

 

이제 사용자의 웹 브라우저로 http://homestead.app/hello/world/myname 에 연결하여 결과를 확인해 봅시다. 그리고 myname 부분을 제거하고 다시 연결해 보면 라우트 설정에 의해 name 이 지정되지 않았을 경우 기본 값으로 'lesstif' 를 설정하는 것을 확인할 수 있습니다. 

기본 라우트 파라미터 설정후

 

 

라우팅은 클라이언트의 요청을 받아서 이를 처리하는 로직과 연결하는 중요한 기능으로  이보다 더욱 많은 기능이 있지만 그 부분은 뒤에서 설명 드리겠습니다.

이제 서버가 처리한 내용을 클라이언트에 전송하는 클래스인 Response 에 대해서 알아 봅시다.