API Laravel 배우기: 문제에서 솔루션까지!
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는 frontend와 backend 사이의 다리입니다.
- 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 테스트하기
| Method | Endpoint | 기능 | 예시 요청 본문 | 예시 응답 |
|---|---|---|---|---|
| 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 Code | Meaning |
|---|---|
| 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)를 제안해 주세요.
follow와 share를 잊지 말고 이 글을 다른 학습자와 공유하세요!
Source: …
기사 구조 개요
- 일반적인 초보자 문제
- 우리가 만들 프로젝트
- Laravel API 워크플로우
- 빠른 설정
- 단계별 CRUD API
- API 테스트
- 흔히 하는 실수
- 다음 단계 향상
참고 자료