API Laravel 배우기: 문제에서 솔루션까지!

발행: (2026년 1월 11일 오후 11:24 GMT+9)
9 min read
원문: Dev.to

I’m happy to translate the article for you, but I need the full text you’d like translated. Could you please paste the content (excluding the source line) here? Once I have it, I’ll provide a Korean translation while keeping the source link and all formatting intact.

API가 왜 중요한가?

  • API는 frontendbackend 사이의 다리입니다.
  • Single Page Application (SPA)mobile 애플리케이션에 필수적입니다.
  • API가 없으면 데이터가 사용자에게 표시될 수 없습니다.

Laravel API 예제: CRUD 기사

다음 기사에서는 API 기사(CRUD)를 Laravel을 사용해 만들 것입니다.
간단하지만 블로그, 뉴스, 혹은 연습 프로젝트에 매우 유용합니다.

Laravel API 작업 흐름

코드를 작성하기 전에 흐름을 이해하세요:

Client (Postman / Frontend)
   → Request HTTP
   → Route API
   → Controller
   → Model
   → Database
   → Response JSON

각 클라이언트가 데이터를 요청할 때마다, 요청은 라우트를 거쳐 컨트롤러에서 처리되고, 모델/데이터베이스에서 데이터를 가져와 JSON 응답을 반환합니다.

Step 1: Laravel 프로젝트 설정

  • Laravel 최신 버전 (예: 10.x)
  • Composer가 설치되어 있는지 확인하세요
composer create-project --prefer-dist laravel/laravel belajar-api

.env에서 데이터베이스 설정

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=belajar_api
DB_USERNAME=root
DB_PASSWORD=

Step 2: 모델 및 마이그레이션 만들기

-m 옵션을 사용하나요?

-m은 마이그레이션 파일을 자동으로 생성해 주므로 수동으로 만들 필요가 없습니다.

php artisan make:model Article -m

마이그레이션 수정

database/migrations/..._create_articles_table.php 파일을 열고 up() 메소드를 다음과 같이 바꾸세요:

public function up()
{
    Schema::create('articles', function (Blueprint $table) {
        $table->id();
        $table->string('title');
        $table->text('content');
        $table->timestamps();
    });
}

마이그레이션 실행

php artisan migrate

$fillable의 중요성

모델 파일 app/Models/Article.php에 다음을 추가하세요:

protected $fillable = ['title', 'content'];

왜 채워야 하나요?
채우지 않으면 Laravel이 mass assignment 보호 때문에 데이터를 저장할 수 없습니다. 이는 허용된 컬럼만 삽입·수정될 수 있도록 하는 보안 기능입니다.

Step 3: API 기사 컨트롤러 만들기

리소스 컨트롤러 생성:

php artisan make:controller Api/ArticleController --resource

주요 기능 설명

Method기능
index()모든 기사를 가져와 JSON 형태로 반환
store()새 기사 저장 (검증 → 생성)
show($id)ID 기반으로 기사 상세 조회
update($id)특정 기사 데이터 수정
destroy($id)기사 삭제

구현 예시 (간단히)

public function store(Request $request)
{
    $validated = $request->validate([
        'title'   => 'required',
        'content' => 'required',
    ]);

    $article = Article::create($validated);
    return response()->json($article, 201);
}

public function show($id)
{
    return Article::findOrFail($id);
}

public function update(Request $request, $id)
{
    $article = Article::findOrFail($id);
    $article->update($request->all());
    return response()->json($article);
}

public function destroy($id)
{
    Article::destroy($id);
    return response()->json(null, 204);
}

4단계: API 라우트 추가

파일 routes/api.php를 편집합니다:

use App\Http\Controllers\Api\ArticleController;

Route::apiResource('articles', ArticleController::class);

Postman (또는 cURL)으로 API 테스트하기

MethodEndpoint기능예시 요청 본문예시 응답
GET/api/articles모든 기사 목록[{...}]
POST/api/articles새 기사 저장{ "title": "Belajar Laravel API", "content": "Tutorial lengkap & mudah!" }{ "id": 1, ... }
GET/api/articles/{id}기사 상세{ "id": 1, ... }
PUT/api/articles/{id}기사 업데이트{ "title": "Update", "content": "Edit konten" }{ "id": 1, ... }
DELETE/api/articles/{id}기사 삭제null

전체 요청 및 응답 예시

POST 요청

POST /api/articles HTTP/1.1
Content-Type: application/json

{
    "title": "Belajar Laravel API",
    "content": "Tutorial lengkap & mudah!"
}

응답 201 Created

{
    "id": 1,
    "title": "Belajar Laravel API",
    "content": "Tutorial lengkap & mudah!",
    "created_at": "2026-01-10T12:34:56.000000Z",
    "updated_at": "2026-01-10T12:34:56.000000Z"
}

GET 요청

GET /api/articles/1 HTTP/1.1

응답 200 OK

{
    "id": 1,
    "title": "Belajar Laravel API",
    "content": "Tutorial lengkap & mudah!",
    "created_at": "2026-01-10T12:34:56.000000Z",
    "updated_at": "2026-01-10T12:34:56.000000Z"
}

PUT 요청

PUT /api/articles/1 HTTP/1.1
Content-Type: application/json

{
    "title": "Update Judul",
    "content": "Konten sudah diupdate!"
}

응답 200 OK

{
    "id": 1,
    "title": "Update Judul",
    "content": "Konten sudah diupdate!",
    "created_at": "2026-01-10T12:34:56.000000Z",
    "updated_at": "2026-01-11T08:15:30.000000Z"
}

DELETE 요청

DELETE /api/articles/1 HTTP/1.1

응답 204 No Content

No body returned. (본문이 반환되지 않음.)

마무리

위의 단계들을 따라 하면, 이제 기사 CRUD 작업을 위한 완전한 API Laravel을 갖추게 됩니다. 이제 프론트엔드 React(또는 다른 애플리케이션)가 백엔드와 문제 없이 통신할 수 있습니다—Postman에서 더 이상 “돌아다니는” 상황이 없습니다! 시도해 보시고 성공하시길 바랍니다. 🚀

Source:

API Laravel CRUD 예제

요청 및 응답 샘플

GET All Articles

요청

GET /api/articles

응답 200 OK

[
    {
        "id": 1,
        "title": "First Article",
        "content": "Lorem ipsum..."
    },
    {
        "id": 2,
        "title": "Second Article",
        "content": "Dolor sit amet..."
    }
]

GET Single Article

요청

GET /api/articles/1

응답 200 OK

{
    "id": 1,
    "title": "First Article",
    "content": "Lorem ipsum..."
}

POST Create Article

요청

POST /api/articles
Content-Type: application/json

{
    "title": "New Article",
    "content": "Content here..."
}

응답 201 Created

{
    "id": 3,
    "title": "New Article",
    "content": "Content here..."
}

PUT Update Article

요청

PUT /api/articles/1
Content-Type: application/json

{
    "title": "Updated Title",
    "content": "Updated content..."
}

응답 200 OK

{
    "id": 1,
    "title": "Updated Title",
    "content": "Updated content..."
}

DELETE Article

요청

DELETE /api/articles/1

응답 204 No Content

null

Laravel에서 오류 처리 및 상태 코드

Laravel은 적절한 HTTP 상태 코드를 자동으로 반환합니다:

Status CodeMeaning
200 OK데이터가 성공적으로 조회/업데이트되었습니다
201 Created데이터가 성공적으로 생성되었습니다
204 No Content데이터가 성공적으로 삭제되었습니다
404 Not Found리소스를 찾을 수 없습니다
422 Unprocessable Entity유효성 검사에 실패했습니다
500 Internal Server Error서버 오류

오류 응답 예시

{
    "message": "No query results for model [App\\Models\\Article] 99"
}

Tip: 컨트롤러에서 findOrFail()을 사용하면 모델을 찾지 못했을 때 자동으로 404를 반환합니다.

일반 초보자 실수

  • 모델에 $fillable (또는 $guarded)를 추가하는 것을 잊어, mass‑assignment 오류 발생.
  • 리소스를 만들 때 POST 대신 GET 사용.
  • 입력 검증을 생략하여 더러운 데이터가 생성됨.
  • 필터 없이 모든 컬럼을 노출 (API Resources 사용 안 함).
  • .env 파일 설정 오류 (DB 자격증명, 포트 등).
  • API 라우트를 api.php가 아니라 web.php에 배치.
  • 설정 파일을 변경한 후 서버를 재시작하지 않음.

팁:
• 오류 메시지를 위해 항상 응답을 확인하세요.
• HTTP 메서드와 필드 이름이 정확한지 확인하세요.
• 환경 설정을 다시 한 번 확인하세요.

다음 단계: API 레벨업

기본 CRUD에 머무르지 말고 다음 Laravel 기능을 탐색하세요:

  • Laravel Sanctum / Passport – 인증으로 API를 보호하세요.
  • API Resources – JSON 응답을 깔끔하게 변환하고 포맷하세요.
  • Pagination – 대용량 데이터셋을 효율적으로 처리하세요.
  • Rate Limiting – API를 오용으로부터 보호하세요.

위 주제들을 다루는 후속 기사를 기대해 주세요!

🚀 토론하고 공유합시다!

어떤 단계에서든 막히면 아래에 댓글을 남겨 주세요. Laravel API 경험을 공유하거나 다음 글 주제(예: 인증, resources, pagination)를 제안해 주세요.

followshare를 잊지 말고 이 글을 다른 학습자와 공유하세요!

Source:

기사 구조 개요

  1. 일반적인 초보자 문제
  2. 우리가 만들 프로젝트
  3. Laravel API 워크플로우
  4. 빠른 설정
  5. 단계별 CRUD API
  6. API 테스트
  7. 흔히 하는 실수
  8. 다음 단계 향상

참고 자료

Back to Blog

관련 글

더 보기 »

REST API와 일반적인 HTTP 메서드

REST API는 어디에나 있습니다 — 웹 앱부터 모바일 앱, 마이크로서비스까지. 백엔드 또는 프론트엔드 개발을 배우고 있다면, REST API와 HTTP를 이해하는 것이 필수입니다.