자동 라우팅과 첫 번째 엔드포인트

이 섹션에서는 CodeIgniter의 개선된 자동 라우팅 기능을 활성화하고, 모든 설정이 올바르게 연결되었는지 확인하기 위한 간단한 JSON 엔드포인트를 만듭니다.

자동 라우팅을 사용하는 이유?

app/Config/Routes.php 에서 경로를 수동으로 정의하는 방법은 이전 튜토리얼에서 다뤘습니다. 강력하고 유연하지만, 공통 패턴을 따르는 엔드포인트가 많은 RESTful API에서는 번거로울 수 있습니다. 자동 라우팅은 규칙에 따라 URL 패턴을 컨트롤러 클래스와 메서드에 매핑하여 이를 단순화하며, HTTP 동사 중심의 방식은 RESTful API와 잘 어울립니다.

개선된 자동 라우팅 활성화

기본적으로 자동 라우팅은 꺼져 있습니다. 컨트롤러가 REST 스타일 메서드를 자동으로 처리하도록 활성화합니다.

app/Config/Feature.php 를 열고 이 플래그가 true 인지 확인합니다(기본값입니다):

public bool $autoRoutesImproved = true;

“Improved” 자동 라우터는 기존 버전보다 더 안전하고 안정적이므로, 새 프로젝트에는 이를 사용하는 것이 권장됩니다.

그다음 app/Config/Routing.php 에서 자동 라우팅이 활성화되어 있는지 확인합니다:

public bool $autoRoute = true;

이것만으로 CodeIgniter가 컨트롤러 클래스를 GET /api/ping 또는 POST /api/ping 같은 URI에 자동으로 매핑할 수 있습니다.

Ping 컨트롤러 생성

기본 API 엔드포인트가 어떻게 동작하는지 이해하기 위해, 첫 번째 API 엔드포인트가 될 컨트롤러를 생성해 봅시다. 이를 통해 간단한 “ping” 응답을 제공하고 설정이 올바른지 확인할 수 있습니다.

php spark make:controller Api/Ping

이 명령은 app/Controllers/Api/Ping.php 를 생성합니다.

파일을 다음과 같이 수정합니다:

<?php

namespace App\Controllers\Api;

use App\Controllers\BaseController;
use CodeIgniter\API\ResponseTrait;
use CodeIgniter\HTTP\ResponseInterface;

class Ping extends BaseController
{
    use ResponseTrait;

    public function getIndex(): ResponseInterface
    {
        return $this->respond(['status' => 'ok'], 200);
    }
}

여기서는 다음을 수행합니다:

  • respond() 같은 REST 도우미와 적절한 상태 코드를 이미 포함하는 ResponseTrait 를 사용합니다.

  • getIndex() 메서드를 정의합니다. get 접두사는 GET 요청에 응답함을 뜻하고, Index 이름은 기본 URI (/api/ping)와 일치함을 뜻합니다.

경로 테스트

개발 서버가 실행 중이 아니면 시작합니다:

php spark serve

이제 다음 주소로 접속합니다:

  • 브라우저: http://localhost:8080/api/ping

  • cURL: curl http://localhost:8080/api/ping

예상 응답:

{
    "status": "ok"
}

축하합니다 — 이것이 첫 번째로 동작하는 JSON 엔드포인트입니다!

동작 방식 이해하기

/api/ping 을 요청하면:

  1. 개선된 자동 라우터App\Controllers\Api\Ping 클래스를 찾습니다.

  2. HTTP 동사 (GET) 를 감지합니다.

  3. 해당 메서드 이름인 getIndex() 를 호출합니다.

  4. ResponseTrait 는 일관된 출력을 생성하는 도우미 메서드를 제공합니다.

나중에 다른 동사를 추가하면 다음과 같이 매핑됩니다:

HTTP 동사

메서드 이름

GET /api/ping POST /api/ping DELETE /api/ping

getIndex() postIndex() deleteIndex()

Format 클래스를 사용한 콘텐츠 협상

기본적으로 CodeIgniter는 CodeIgniter\Format\Format 클래스를 사용하여 응답 형식을 자동으로 협상합니다. 클라이언트 요청에 따라 JSON 또는 XML 응답을 반환할 수 있습니다.

ResponseTrait 는 기본적으로 형식을 JSON으로 설정합니다. 필요하다면 XML로 바꿀 수 있지만, 이 튜토리얼은 JSON 응답에 중점을 둡니다.

<?php

namespace App\Controllers\Api;

use App\Controllers\BaseController;
use CodeIgniter\API\ResponseTrait;
use CodeIgniter\HTTP\ResponseInterface;

class Ping extends BaseController
{
    use ResponseTrait;

    public function getIndex(): ResponseInterface
    {
        return $this->respond(['status' => 'ok'], 200);
    }
}

선택 사항: 더 많은 데이터 반환

respond() 메서드는 추가 데이터를 반환할 수 있습니다:

<?php

namespace App\Controllers\Api;

use App\Controllers\BaseController;
use CodeIgniter\API\ResponseTrait;
use CodeIgniter\CodeIgniter;
use CodeIgniter\HTTP\ResponseInterface;

class Ping extends BaseController
{
    use ResponseTrait;

    public function getIndex(): ResponseInterface
    {
        return $this->respond([
            'status'  => 'ok',
            'time'    => date('c'),
            'version' => CodeIgniter::CI_VERSION,
        ]);
    }
}

이제 브라우저와 cURL 모두에서 테스트한 동작하는 엔드포인트가 준비되었습니다. 다음 섹션에서는 첫 번째 실제 데이터베이스 리소스를 만들겠습니다. API의 CRUD 엔드포인트를 뒷받침하는 간단한 books 테이블을 위해 마이그레이션, 시더, 모델 을 정의합니다.