정적 페이지

참고

이 튜토리얼은 여러분이 CodeIgniter를 다운로드하고 개발 환경에 프레임워크를 설치했다고 가정합니다.

가장 먼저 할 일은 정적 페이지를 처리하기 위한 라우팅 규칙을 설정하는 것입니다.

라우팅 규칙 설정

라우팅은 URI를 컨트롤러의 메서드와 연결합니다. 컨트롤러는 단순히 작업을 위임하는 데 도움이 되는 클래스입니다. 컨트롤러는 나중에 만들겠습니다.

라우팅 규칙을 설정해 봅시다. app/Config/Routes.php에 있는 라우팅 파일을 엽니다.

처음 시작할 때 유일한 라우트 지침은 다음과 같아야 합니다:

<?php

use CodeIgniter\Router\RouteCollection;

/** @var RouteCollection $routes */
$routes->get('/', 'Home::index');

이 지침은 아무런 내용이 지정되지 않은 모든 들어오는 요청을 Home 컨트롤러 내의 index() 메서드에서 처리해야 함을 의미합니다.

'/'에 대한 라우트 지침 뒤에 다음 라인들을 추가합니다.

use App\Controllers\Pages;

$routes->get('pages', [Pages::class, 'index']);
$routes->get('(:segment)', [Pages::class, 'view']);

CodeIgniter는 라우팅 규칙을 위에서 아래로 읽으며 첫 번째로 일치하는 규칙으로 요청을 보냅니다. 각 규칙은 컨트롤러 및 메서드 이름(오른쪽)에 매핑된 정규 표현식(왼쪽)입니다. 요청이 들어오면 CodeIgniter는 첫 번째 일치 항목을 찾아 적절한 컨트롤러와 메서드를 호출하며, 필요한 경우 인수를 함께 전달합니다.

라우팅에 대한 더 자세한 정보는 URI 라우팅에서 확인할 수 있습니다.

여기서 $routes 객체의 두 번째 규칙은 URI 경로 /pages에 대한 GET 요청과 일치하며, 이를 Pages 클래스의 index() 메서드에 매핑합니다.

$routes 객체의 세 번째 규칙은 자리표시자 (:segment)를 사용하는 URI 세그먼트에 대한 GET 요청과 일치하며, 해당 매개변수를 Pages 클래스의 view() 메서드에 전달합니다.

첫 번째 컨트롤러 만들기

다음으로 할 일은 정적 페이지를 처리할 컨트롤러를 설정하는 것입니다. 컨트롤러는 단순히 작업을 위임하는 데 도움이 되는 클래스입니다. 이는 웹 애플리케이션의 접착제와 같습니다.

Pages 컨트롤러 생성

다음 코드를 사용하여 app/Controllers/Pages.php에 파일을 생성합니다.

중요

파일 이름의 대소문자에 항상 주의해야 합니다. 많은 개발자가 Windows나 macOS의 대소문자를 구분하지 않는 파일 시스템에서 개발합니다. 그러나 대부분의 서버 환경은 대소문자를 구분하는 파일 시스템을 사용합니다. 파일 이름의 대소문자가 틀리면 로컬에서 작동하는 코드가 서버에서는 작동하지 않습니다.

<?php

namespace App\Controllers;

class Pages extends BaseController
{
    public function index()
    {
        return view('welcome_message');
    }

    public function view(string $page = 'home')
    {
        // ...
    }
}

$page라는 이름의 인수를 하나 받는 view() 메서드를 가진 Pages라는 클래스를 만들었습니다. 또한 app/Controllers/Home.php에 있는 기본 컨트롤러와 동일한 index() 메서드도 포함하고 있습니다. 이 메서드는 CodeIgniter 환영 페이지를 표시합니다.

참고

이 튜토리얼에는 두 가지 view() 함수가 언급됩니다. 하나는 public function view($page = 'home')으로 생성된 클래스 메서드이고, 다른 하나는 뷰를 표시하기 위한 return view('welcome_message')입니다. 둘 다 기술적으로 함수입니다. 하지만 클래스 내에 함수를 만들면 이를 메서드라고 부릅니다.

Pages 클래스는 CodeIgniter\Controller 클래스를 상속받는 BaseController 클래스를 확장합니다. 이는 새로운 Pages 클래스가 CodeIgniter\Controller 클래스(system/Controller.php)에 정의된 메서드와 속성에 접근할 수 있음을 의미합니다.

컨트롤러는 웹 애플리케이션에 대한 모든 요청의 중심이 됩니다. 다른 PHP 클래스와 마찬가지로 컨트롤러 내에서는 $this로 이를 참조합니다.

뷰 생성

첫 번째 메서드를 만들었으니 이제 기본적인 페이지 템플릿을 만들 차례입니다. 페이지의 푸터(footer)와 헤더(header) 역할을 할 두 개의 “뷰”(페이지 템플릿)를 만들겠습니다.

app/Views/templates/header.php에 헤더를 만들고 다음 코드를 추가합니다:

<!doctype html>
<html>
<head>
    <title>CodeIgniter Tutorial</title>
</head>
<body>

    <h1><?= esc($title) ?></h1>

헤더에는 메인 뷰를 로드하기 전에 표시할 기본적인 HTML 코드와 제목(heading)이 포함되어 있습니다. 또한 나중에 컨트롤러에서 정의할 $title 변수도 출력합니다. 이제 app/Views/templates/footer.php에 다음 코드를 포함하는 푸터를 만듭니다:

    <em>&copy; 2022</em>
</body>
</html>

참고

header.php 템플릿을 자세히 보면 esc() 함수를 사용하고 있습니다. 이는 XSS 공격을 방지하는 데 도움을 주기 위해 CodeIgniter에서 제공하는 글로벌 함수입니다. 이에 대한 자세한 내용은 전역 함수 및 상수에서 읽어볼 수 있습니다.

컨트롤러에 로직 추가하기

home.php 및 about.php 생성

앞서 view() 메서드를 가진 컨트롤러를 설정했습니다. 이 메서드는 로드할 페이지의 이름인 매개변수 하나를 받습니다.

정적 페이지 본문은 app/Views/pages 디렉토리에 위치합니다.

해당 디렉토리에 home.phpabout.php라는 이름의 파일 두 개를 만듭니다. 이 파일들 안에 원하는 텍스트를 입력하고 저장합니다. 딱히 떠오르는 것이 없다면 “Hello World!”라고 입력해 보세요.

Pages::view() 메서드 완성하기

해당 페이지들을 로드하기 위해 요청된 페이지가 실제로 존재하는지 확인해야 합니다. 위에서 만든 Pages 컨트롤러의 view() 메서드 본문은 다음과 같습니다:

<?php

namespace App\Controllers;

// Add this line to import the class.
use CodeIgniter\Exceptions\PageNotFoundException;

class Pages extends BaseController
{
    // ...

    public function view(string $page = 'home')
    {
        if (! is_file(APPPATH . 'Views/pages/' . $page . '.php')) {
            // Whoops, we don't have a page for that!
            throw new PageNotFoundException($page);
        }

        $data['title'] = ucfirst($page); // Capitalize the first letter

        return view('templates/header', $data)
            . view('pages/' . $page)
            . view('templates/footer');
    }
}

그리고 PageNotFoundException 클래스를 임포트하기 위해 namespace 라인 뒤에 use CodeIgniter\Exceptions\PageNotFoundException;을 추가합니다.

이제 요청된 페이지가 존재하면 헤더와 푸터를 포함하여 로드되고 사용자에게 반환됩니다. 컨트롤러가 문자열을 반환하면 사용자에게 표시됩니다.

참고

컨트롤러는 문자열 또는 응답(Response) 객체를 반환해야 합니다.

요청된 페이지가 존재하지 않으면 “404 Page not found” 에러가 표시됩니다.

이 메서드의 첫 번째 라인은 페이지가 실제로 존재하는지 확인합니다. PHP의 내장 함수인 is_file()을 사용하여 파일이 예상되는 위치에 있는지 확인합니다. PageNotFoundException은 404 Page Not Found 에러 페이지를 표시하게 하는 CodeIgniter 예외입니다.

헤더 템플릿에서는 페이지 제목을 커스텀하기 위해 $title 변수를 사용했습니다. 제목 값은 이 메서드에서 정의되지만, 값을 변수에 직접 할당하는 대신 $data 배열의 title 요소에 할당합니다.

마지막으로 할 일은 뷰가 표시되어야 할 순서대로 로드하는 것입니다. 이를 위해 CodeIgniter에 내장된 view() 함수를 사용합니다. view() 함수의 두 번째 매개변수는 뷰에 값을 전달하는 데 사용됩니다. $data 배열의 각 값은 키의 이름과 동일한 변수에 할당됩니다. 따라서 컨트롤러의 $data['title'] 값은 뷰의 $title과 동일합니다.

참고

view() 함수에 전달되는 모든 파일 및 디렉토리 이름은 실제 디렉토리 및 파일 자체의 대소문자와 반드시 일치해야 합니다. 그렇지 않으면 대소문자를 구분하는 플랫폼에서 시스템 에러가 발생합니다. 이에 대한 자세한 내용은 뷰(Views)에서 읽어볼 수 있습니다.

앱 실행하기

테스트할 준비가 되셨나요? PHP의 내장 서버를 직접 사용하여 앱을 실행할 수는 없습니다. 왜냐하면 public에 제공되어 URL의 일부로 “index.php/”를 지정할 필요가 없게 해주는 .htaccess 규칙을 제대로 처리하지 못하기 때문입니다. 하지만 대신 사용할 수 있는 CodeIgniter 전용 명령이 있습니다.

프로젝트 루트의 명령줄에서 다음을 입력하세요:

php spark serve

그러면 8080 포트에서 접근 가능한 웹 서버가 시작됩니다. 브라우저의 주소창에 localhost:8080을 입력하면 CodeIgniter 환영 페이지가 보일 것입니다.

이제 localhost:8080/home에 접속해 보세요. Pages 컨트롤러의 view() 메서드로 제대로 라우팅되었나요? 멋지네요!

다음과 같은 화면이 나타날 것입니다:

../../_images/tutorial1.png

이제 브라우저 주소창에 여러 URL을 입력하여 위에서 만든 Pages 컨트롤러가 무엇을 생성하는지 확인해 볼 수 있습니다…

URL

표시 내용

localhost:8080/

CodeIgniter “환영” 페이지. Home 컨트롤러 내의 index() 메서드 결과가 표시됩니다.

localhost:8080/pages

Pages 컨트롤러 내의 index() 메서드 결과로, CodeIgniter “환영” 페이지가 표시됩니다.

localhost:8080/home

우리가 명시적으로 요청했으므로 위에서 만든 “home” 페이지가 표시됩니다. Pages 컨트롤러 내의 view() 메서드 결과입니다.

localhost:8080/about

우리가 명시적으로 요청했으므로 위에서 만든 “about” 페이지가 표시됩니다.

localhost:8080/shop

app/Views/pages/shop.php가 없으므로 “404 - File Not Found” 에러 페이지가 표시됩니다.