| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| Invoke | /serverpod:endpoint |
| Category | kobic-workflow |
| Complexity | moderate |
| MCP Servers | serena, context7 |
/serverpod:endpoint โ ์๋ฒ API ์ฐฝ๊ตฌ ์๋ ์์ฑ๊ธฐ#
ํ๋ง๋๋ก#
์ฑ์ด ์๋ฒ์ "๋ฐ์ดํฐ ์ข ์ค", "์ด๊ฑฐ ์ ์ฅํด ์ค"๋ผ๊ณ ์์ฒญํ๋ ์ฐฝ๊ตฌ(API)๋ฅผ ์๋์ผ๋ก ๋ง๋ค์ด ์ฃผ๋ ๋ช ๋ น์ ๋๋ค. ์๋น์ ๋น์ ํ๋ฉด, ์๋(์ฑ) ์ฃผ๋ฌธ์ ๋ฐ๋ ์ฃผ๋ฌธ๋์ ์ฃผ๋ฐฉ(์ฒ๋ฆฌ ๋ก์ง)์ ํ ๋ฒ์ ์ฐจ๋ ค ์ฃผ๋ ๋๊ตฌ์์.
๋๊ฐยท์ธ์ ์ฐ๋์#
- ์๋ก์ด ์๋ฒ API ์ฐฝ๊ตฌ๊ฐ ํ์ํ ๋ (์: ๋ฐฐ๋ ๋ชฉ๋ก ๋ถ๋ฌ์ค๊ธฐ, ์ฑ ์ ๋ณด ์ ์ฅํ๊ธฐ)
- ๋ฐฑ์๋์์ ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ก์ง์ ์ง์ผ ํ ๋
- ์ ์ฒด ๊ธฐ๋ฅ์ ํ ๋ฒ์ ๋ง๋๋
/feature:create์์ ์ 2๋ฒ์งธ ๋จ๊ณ๋ก ์๋ ํธ์ถ๋ ๋
๋ฌด์์ ํด์ฃผ๋์#
๊ธฐ๋ฅ ํด๋ ์์ ์๋ ๊ฐ์ ์ค์ ์ฝ๋ ํ์ผ๋ค์ ๋ง๋ค์ด ์ค๋๋ค.
{๊ธฐ๋ฅ์ด๋ฆ}_endpoint.dartโ ์ฑ์ด ์ฐ๋ ์ผ๋ฐ ์ฐฝ๊ตฌ (๋ก๊ทธ์ธํ ์ฌ์ฉ์์ฉ){๊ธฐ๋ฅ์ด๋ฆ}_console_endpoint.dartโ ๊ด๋ฆฌ์ ์ฝ์์ฉ ์ฐฝ๊ตฌ (๊ด๋ฆฌ์ ์ ์ฉ, ์ ํ){๊ธฐ๋ฅ์ด๋ฆ}_service.dartโ ์ค์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ก์ง(์ฃผ๋ฐฉ){๊ธฐ๋ฅ์ด๋ฆ}_validator.dartโ ์ ๋ ฅ๊ฐ ๊ฒ์ฌ (์ ํ)
๋ชฉ๋ก ์กฐํ, ๋จ๊ฑด ์กฐํ, ์์ฑ, ์์ , ์ญ์ ๊ฐ์ ๊ธฐ๋ณธ ๋์์ด ๋ค์ด๊ฐ๊ณ , ๊ถํ ์ฒดํฌยท์๋ฌ ๊ธฐ๋กยท์ญ์ ํ์(soft delete) ๊ฐ์ ์์ ์ฅ์น๋ ๊ท์น๋๋ก ํจ๊ป ๋ค์ด๊ฐ๋๋ค.
์ด๋ป๊ฒ ์ฐ๋์#
# ๋ฐฐ๋์ฉ ์ฐฝ๊ตฌ ๋ง๋ค๊ธฐ (์ผ๋ฐ + ๊ด๋ฆฌ์ ๋ ๋ค)
/serverpod:endpoint banner Banner --type both
# ์ฑ
์ฉ ์ฐฝ๊ตฌ ๋ง๋ค๊ธฐ (์ฑ์ฉ๋ง, ์ํ๋ ๋์๋ง ๊ณจ๋ผ์)
/serverpod:endpoint books Book --type app
--methods " getBooks, getBook, createBook "
# ๊ด๋ฆฌ์ ๋์๋ณด๋ ์ฐฝ๊ตฌ ๋ง๋ค๊ธฐ
/serverpod:endpoint dashboard Stats --type console
--methods " getOverview, getUserStats, getContentStats "
-
์ฒซ ๋ฒ์งธ ๊ฐ(
banner)์ ๊ธฐ๋ฅ ์ด๋ฆ, ๋ ๋ฒ์งธ ๊ฐ(Banner)์ ๋ฐ์ดํฐ ์ด๋ฆ์ ๋๋ค. (๋ ๋ค ํ์) -
--type์ผ๋ก ์ฐฝ๊ตฌ ์ข ๋ฅ๋ฅผ ๊ณ ๋ฆ ๋๋ค:app(์ฑ์ฉยท๊ธฐ๋ณธ๊ฐ) /console(๊ด๋ฆฌ์์ฉ) /both(๋ ๋ค). --methods๋ก ๋ง๋ค๊ณ ์ถ์ ๋์๋ง ๊ณจ๋ผ์ ์ง์ ํ ์ ์์ต๋๋ค.
์์์ ๋ฌด์จ ์ผ์ด ๋ฒ์ด์ง๋์#
- ๊ธฐ์กด ๋ฐฉ์ ์ดํด๋ณด๊ธฐ โ ์ด๋ฏธ ๋ง๋ค์ด์ง ๋น์ทํ ์ฐฝ๊ตฌ ์ฝ๋๋ฅผ ๋ถ์ํด ๊ฐ์ ์คํ์ผ์ ๋ฐ๋ฆ ๋๋ค.
- ์ฐฝ๊ตฌ ์ฝ๋ ๋ง๋ค๊ธฐ โ ์ฑ์ฉ ์ฐฝ๊ตฌ์ (ํ์ ์) ๊ด๋ฆฌ์์ฉ ์ฐฝ๊ตฌ๋ฅผ ์ ํด์ง ๊ท์น๋๋ก ์์ฑํฉ๋๋ค.
- ์ฒ๋ฆฌ ๋ก์ง ๋ง๋ค๊ธฐ โ ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํยท์ ์ฅํ๋ service ์ฝ๋๋ฅผ ๋ถ๋ฆฌํด์ ๋ง๋ญ๋๋ค.
-
๋ง๋ฌด๋ฆฌ ๋ฑ๋ก โ ๋ง๋ ์ฐฝ๊ตฌ๋ฅผ ์๋ฒ๊ฐ ์ธ์ํ๋๋ก ์ฝ๋ ์์ฑ ๋ช
๋ น(
melos run backend:pod:generate)์ ๋๋ฆฝ๋๋ค.
โ๏ธ ์์ธ ์ต์ ยท์คํ ๋ช ์ธ (๊ฐ๋ฐ์ / AI ์์ด์ ํธ์ฉ)
Triggers#
- When a new Serverpod API endpoint is needed
- When backend business logic implementation is needed
- Called in Step 2 of
/feature:createorchestration
Context Trigger Pattern#
/serverpod:endpoint {feature_name} {entity_name} [--options]Parameters#
| Parameter | Required | Description | Example |
|---|---|---|---|
feature_name | โ | Feature module name (snake_case) | banner, books |
entity_name | โ | Entity name (PascalCase) | Banner, Book |
--type | โ | Endpoint type | app, console, both (default: app) |
--methods | โ | Methods to generate | "getList, get, create, update, delete" |
Behavioral Flow#
1. Analyze Existing Patterns#
Use Serena MCP to analyze existing endpoint patterns:
- backend/kobic_server/lib/src/feature/banner/endpoint/banners_endpoint.dart
- backend/kobic_server/lib/src/feature/banner/service/banner_service.dart2. Follow Import Order (Required)#
// 1. Serverpod framework
import 'package:serverpod/server.dart';
// 2. Generated protocol (models)
import 'package:kobic_server/src/generated/protocol.dart';
// 3. Feature internal services
import 'package:kobic_server/src/feature/{feature}/service/{feature}_service.dart';
// 4. Common utilities
import 'package:kobic_server/src/common/authenticated_mixin.dart';
3. Generate Endpoint Classes#
App Endpoint ({feature}_endpoint.dart):
/// {Feature} endpoint
///
/// - Provides list, single, create, update, delete functionality
/// - Accessible only to authenticated users
class {Feature}Endpoint extends Endpoint with AuthenticatedMixin {
/// Retrieves the {entity} list.
Future<{Entity}ListResponse> get{Entity}s(
Session session, {
int? limit,
int? offset,
{Entity}Category? category,
}) async {
return {Feature}Service.get{Entity}s(
session,
limit: limit ?? 20,
offset: offset ?? 0,
category: category,
);
}
/// Creates a {entity}.
Future<{Entity}> create{Entity}(
Session session,
{Entity}CreateRequest request,
) async {
final user = await requireCurrentUserInfo(session);
return {Feature}Service.create{Entity}(session, request, user.id!);
}
// ... remaining CRUD methods
}
Console Endpoint ({feature}_console_endpoint.dart):
/// {Feature} console endpoint (admin only)
class {Feature}ConsoleEndpoint extends Endpoint {
@override
bool get requireLogin => true;
@override
Set<Scope> get requiredScopes => {Scope.admin};
/// Retrieves the full {entity} list (admin only).
Future<List<{Entity}>> getAll{Entity}s(
Session session, {
int? limit,
int? offset,
bool includeDeleted = false,
}) async {
return {Feature}Service.getAll{Entity}sForAdmin(
session,
limit: limit,
offset: offset,
includeDeleted: includeDeleted,
);
}
}
4. Generate Service Class#
/// {Feature} business logic service
class {Feature}Service {
/// Retrieves the {entity} list.
static Future<{Entity}ListResponse> get{Entity}s(
Session session, {
required int limit,
required int offset,
{Entity}Category? category,
}) async {
try {
final entities = await {Entity}.db.find(
session,
where: (t) {
var condition = t.isDeleted.equals(false);
if (category != null) {
condition = condition & t.category.equals(category);
}
return condition;
},
orderBy: (t) => t.createdAt,
orderDescending: true,
limit: limit,
offset: offset,
);
final total = await {Entity}.db.count(session, where: ...);
return {Entity}ListResponse(
items: entities,
total: total,
hasMore: offset + entities.length < total,
);
} on Exception catch (error, stackTrace) {
session.log(
'{Feature} list query failed: $error',
exception: error,
level: LogLevel.error,
stackTrace: stackTrace,
);
rethrow;
}
}
// ... remaining business logic
}
Output Files#
backend/kobic_server/lib/src/feature/{feature_name}/
โโโ endpoint/
โ โโโ {feature_name}_endpoint.dart # App endpoint
โ โโโ {feature_name}_console_endpoint.dart # Console endpoint (optional)
โโโ service/
โ โโโ {feature_name}_service.dart # Business logic
โโโ validation/
โโโ {feature_name}_validator.dart # Input validation (optional)Post-Generation Commands#
# Code generation (endpoint registration)
melos run backend:pod:generateMCP Integration#
- Serena: Analyze existing endpoint patterns, symbol search
- Context7: Serverpod endpoint documentation reference
Examples#
Create banner endpoint#
/serverpod:endpoint banner Banner --type bothCreate book endpoint#
/serverpod:endpoint books Book --type app
--methods " getBooks, getBook, createBook "Create admin dashboard endpoint#
/serverpod:endpoint dashboard Stats --type console
--methods " getOverview, getUserStats, getContentStats "Reference Agent#
See ${CLAUDE_PLUGIN_ROOT}/commands/agents/backend/serverpod-endpoint-agent.md for detailed implementation rules
Core Rules Summary#
- Follow import order (Serverpod โ Protocol โ Feature โ Utils)
- Use AuthenticatedMixin (for authenticated methods)
- Set permissions on Console endpoints (
requireLogin,requiredScopes) - Separate business logic into Services
- Error handling and logging (
session.log) - Apply soft delete pattern