Claude Code로 REST API 백엔드 구축하는 방법: 단계별 가이드 (2026)
Claude Code로 REST API 백엔드를 구축하려면 7단계를 거쳐요. 엔드포인트와 스키마를 설계하고, 프로젝트와 데이터 계층을 스캐폴딩하고, CRUD를 리소스별로 하나씩 만들고, 인증과 검증을 추가하고, 테스트하고, 프로덕션용으로 견고하게 다듬은 뒤 배포해요. Claude Code는 반복적인 보일러플레이트(스캐폴딩, 모델, 마이그레이션, 테스트)를 맡고, 인증과 보안 검토는 여러분이 책임져요. 기본적인 CRUD API는 대략 30~60분 정도 걸려요. 이 가이드는 Express + Prisma + PostgreSQL 위에 실제 「tasks」 API를 실행 가능한 코드와 실제 JSON 응답과 함께 만들어요.
글쓴이: Jasmine, Claude Code로 매일 백엔드를 배포하는 개발자.
왜 Claude Code로 REST API 백엔드를 구축할까요?
Claude Code는 에이전트형 CLI예요. 저장소 전체를 읽고, 여러 파일을 한 번에 생성한 다음, 명령과 테스트를 실행해 스스로 결과물을 검증해요(Anthropic 공식 문서 기준, 2026년 업데이트). 바로 이 특성 때문에, 코드를 붙여넣기만 하는 챗봇보다 백엔드 작업에 더 잘 맞아요. REST API는 본질적으로 반복적인 보일러플레이트의 더미예요. 모델, 마이그레이션, CRUD 컨트롤러, 검증, 테스트, 문서. 시간이 많이 들고 창의성이 낮은 작업이며, 바로 여기서 AI가 가장 크게 속도를 높여줘요.
가장 큰 이점은 스캐폴딩 속도예요. 거의 똑같은 엔드포인트 여섯 개를 손으로 치는 대신, 리소스를 한 번만 설명하면 Claude Code가 데이터 계층과 REST 계층을 모두 생성하고 그대로 실행해요. 모델에 맞는 Zod나 Pydantic 스키마를 작성하거나, 각 라우트의 테스트 스위트를 세우는 「지루한」 부분에도 능숙해요.
하지만 스스로 챙겨야 할 부분이 있어요. 여러분은 여전히 검토자예요. Claude Code는 여러분의 보안 맥락을 이해하지 못해서, 느슨한 기본값(라우트의 인가 누락, 코드 속 비밀 값, 보여주기식 검증)을 내놓는 경향이 있어요. 돈이나 권한이 걸린 것이라면 AI가 만들어 낸 것은 강력한 초안일 뿐이에요. 이 도구가 처음이라면, 백엔드 작업을 맡기기 전에 먼저 Claude Code가 무엇인지 읽고 작동 방식을 파악하세요.
시작하기 전에 준비할 것
Claude Code를 열기 전에 훑어볼 체크리스트예요. 이것들을 갖춰 두면 세션 전체가 매끄럽게 흘러가요.
- Claude Code 설치 완료 및 터미널에서 동작. 아직 설정하지 않았다면 Claude Code 설치 가이드를 참고하세요.
- 런타임: Node 20+(Express용) 또는 Python 3.11+(FastAPI용).
- 데이터베이스: PostgreSQL(프로덕션급) 또는 SQLite(서버 없이 빠른 개발).
- Git 저장소를
git init으로 이미 초기화. 각 diff를 검토하고 필요할 때 되돌릴 수 있어요. - 프로젝트 규약을 명시한
CLAUDE.md파일. 깔끔한 출력과 엉망인 출력을 가르는 가장 큰 차이예요.
CLAUDE.md를 저장소 루트에 두면 Claude Code가 매 세션 자동으로 읽어요. 백엔드라면 계층 규약, 검증, 에러 형태를 먼저 명시해 두어 같은 말을 되풀이하지 않도록 하세요.
# CLAUDE.md - backend conventions
## Architecture
- Three layers: routes -> controllers -> services. No DB queries in controllers.
- ORM: Prisma. All queries go through a service; no raw SQL unless required.
## Validation & errors
- Validate input with Zod at the top of every handler.
- Errors return JSON: { "error": { "code": string, "message": string } }
- Status codes: 200/201 success, 400 validation, 401 unauthenticated,
403 forbidden, 404 not found, 500 server error.
## Security (REQUIRED, do not skip)
- NEVER hardcode secrets. Read them from process.env.
- Every write/update/delete route must pass through auth middleware.
- Never return sensitive fields (passwordHash) in a response.
## Tests
- Every endpoint has at least 1 happy-path test + 1 error test (Jest + Supertest).
이 파일 하나로 Claude Code 생성물의 품질이 한 단계 뛰어올라요. 여러분의 스타일을 추측하는 대신 따라야 할 「계약」을 갖게 되니까요.
스택 선택 — Node/Express냐 Python/FastAPI냐?
단 하나의 「정답」 스택은 없지만, Claude Code가 일하는 방식에 더 잘 맞는 것도 있어요. 인기 있는 네 가지 선택지를 간단히 비교해요.
| 스택 | 스캐폴딩 속도 | 타입 안전성 | 생태계 | Claude Code와의 궁합 |
|---|---|---|---|---|
| Express + Prisma | 매우 빠름 | 준수함(TS + Prisma 경유) | 거대함(JS) | 높음 — 익숙한 패턴이 풍부 |
| FastAPI + SQLAlchemy | 빠름 | 높음(Pydantic 타입 힌트) | 큼(Python) | 매우 높음 — 타입 힌트가 환각을 줄임 |
| NestJS | 중간 | 매우 높음 | 큼 | 중간 — 무거운 보일러플레이트와 데코레이터 |
| Django REST | 중간 | 중간 | 거대함(Python) | 준수함 — 엄격한 규약, 유연성은 낮음 |
이 가이드 전체에서는 Express + Prisma + PostgreSQL로 진행해요. JS 우선에 널리 쓰이고, Prisma가 NestJS만큼 무겁지 않으면서도 충분한 타입 안전성을 줘요. 팀이 Python이라면 FastAPI + SQLAlchemy도 훌륭해요. Pydantic의 타입 힌트는 실제로 Claude Code의 타입 오류를 줄여줘요. 핵심은 스택 하나를 고르고 빌드 전체에서 그것을 고수하는 것이에요. Claude Code가 프로젝트 도중에 「스스로 고르게」 하지 마세요. 그건 아무도 유지보수하고 싶지 않은 잡탕을 만드는 지름길이에요.
1단계 — Claude Code로 엔드포인트와 스키마 설계하기
Claude Code에게 「API 만들어 줘」라고 하고 바로 코딩하게 두지 마세요. 설계부터 시작해요. 리소스, 엔드포인트, DB 스키마를 먼저 브레인스토밍하게 해서, 코드가 한 줄이라도 생기기 전에 설계를 승인할 수 있게 해요. 복사·붙여넣기용 프롬프트:
I want to build a REST API for managing "tasks" with Express + Prisma + PostgreSQL.
Before writing code, propose:
1. The endpoint list (method + path + description) for tasks CRUD.
2. The Task table schema (fields, types, constraints).
3. A sample response shape for each endpoint.
Present it as a table. DO NOT code yet - I want to review first.
Claude Code는 여러분이 승인할 수 있도록 다음과 같은 엔드포인트 표를 돌려줘요.
| 메서드 | 경로 | 설명 |
|---|---|---|
| GET | /tasks | 태스크 목록(페이지네이션 포함) |
| GET | /tasks/:id | 단일 태스크 조회 |
| POST | /tasks | 태스크 생성 |
| PATCH | /tasks/:id | 부분 수정 |
| DELETE | /tasks/:id | 태스크 삭제 |
여기서 꼼꼼히 검토하세요. 필드가 완전한지, status enum이 필요한지, 페이지네이션이 커서 방식인지 오프셋 방식인지. 설계를 말로 고치는 편이 생성된 코드를 고치는 것보다 훨씬 저렴해요. 이 대목이 바로 Claude Code로 코드 전에 설계하는 사고방식이 빛을 발하는 지점이에요.
2단계 — 프로젝트와 데이터 계층 스캐폴딩하기
설계가 확정되면 이제 Claude Code에게 스캐폴딩을 맡겨요. 프롬프트:
Scaffold an Express + TypeScript project per the plan we just approved:
- Install express, prisma, @prisma/client, zod, dotenv.
- Create the Prisma schema for the Task model as designed.
- Generate the first migration and a seed file with 3 sample tasks.
- Folder structure: src/routes, src/controllers, src/services, src/lib.
After creating it, STOP so I can read the migration before it runs.
생성되는 Prisma 스키마는 다음과 같아야 해요.
// prisma/schema.prisma
model Task {
id String @id @default(uuid())
title String
detail String?
status Status @default(TODO)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
enum Status {
TODO
DOING
DONE
}
마이그레이션은 실행하기 전에 읽으세요 — 이건 형식적인 조언이 아니에요. Claude Code는 가끔 여분의 컬럼을 추가하거나, 잘못된 기본값을 설정하거나, 필요한 인덱스를 건너뛰어요. npx prisma migrate dev --name init는 diff를 이해한 뒤에만 한 번 실행하세요. 이 부분을 더 깊이 파고들고 싶다면 Claude Code를 데이터베이스와 함께 쓰기를 보세요.
3단계 — CRUD 엔드포인트를 리소스별로 하나씩 만들기
황금률은 「한꺼번에 다 만들기」가 아니라 한 번에 엔드포인트 하나예요. Claude Code에게 라우트 다섯 개를 한 방에 요청하면 표류하기 쉽고 검토도 힘들어요. 하나 만들고, 검토하고, 커밋한 뒤 다음으로 넘어가세요. POST와 GET부터 시작해요.
// src/controllers/task.controller.ts
import { Request, Response } from "express";
import { z } from "zod";
import * as taskService from "../services/task.service";
const createSchema = z.object({
title: z.string().min(1).max(200),
detail: z.string().max(2000).optional(),
status: z.enum(["TODO", "DOING", "DONE"]).optional(),
});
export async function createTask(req: Request, res: Response) {
const parsed = createSchema.safeParse(req.body);
if (!parsed.success) {
return res.status(400).json({
error: { code: "VALIDATION_ERROR", message: parsed.error.message },
});
}
const task = await taskService.create(parsed.data);
return res.status(201).json(task);
}
export async function listTasks(req: Request, res: Response) {
const tasks = await taskService.findAll();
return res.status(200).json(tasks);
}
검토에서 확인할 두 가지. 응답 형태가 CLAUDE.md와 맞는지(에러 객체 형태가 올바른지), 그리고 상태 코드가 의미상 맞는지(생성은 200이 아니라 201). 여기가 Claude Code가 허술해지는 지점이라, 명시하지 않으면 대개 뭐든 200을 돌려줘요.
Claude Code는 이런 패턴을 스킬로 표준화해요. 그러니 자신만의 백엔드 스킬이 있다면 맨몸 프롬프트보다 훨씬 일관된 출력을 얻어요.
4단계 — 인증과 검증(JWT 또는 API 키)
대부분의 튜토리얼은 「필요하면 JWT 추가」에서 멈춰요. 충분치 않아요. 쓰기/수정/삭제 라우트를 보호하는 실제 JWT 미들웨어예요.
// src/lib/auth.ts
import { Request, Response, NextFunction } from "express";
import jwt from "jsonwebtoken";
export function requireAuth(req: Request, res: Response, next: NextFunction) {
const header = req.headers.authorization;
if (!header?.startsWith("Bearer ")) {
return res.status(401).json({
error: { code: "UNAUTHORIZED", message: "Missing token" },
});
}
try {
const payload = jwt.verify(header.slice(7), process.env.JWT_SECRET!);
(req as any).user = payload;
next();
} catch {
return res.status(401).json({
error: { code: "INVALID_TOKEN", message: "Invalid token" },
});
}
}
쓰기 라우트에 붙이세요: router.post("/tasks", requireAuth, createTask). 단순한 내부 API라면 상수 API 키를 대조하는 것으로도 충분하지만, 맨 ===가 아니라 반드시 타이밍 안전 함수로 비교하세요.
수동 검토 필수: Claude Code는 약한 기본값을 내놓는 경향이 있어요. 올바른 라우트에
requireAuth붙이는 걸 잊거나,JWT_SECRET이 하드코딩된 문자열로 폴백되게 두거나, 소유권 확인을 건너뛰거나(사용자 A가 사용자 B의 태스크를 수정 가능). AI가 미들웨어를 생성한 뒤에는 손으로 다시 훑으세요. 모든 민감한 라우트에 인증이 있는지, 비밀 값은env에서 읽는지, 그리고 (인증뿐 아니라) 인가가 실제로 올바른지.
5단계 — API 테스트하기(TDD와 AI 짝짓기)
Claude Code는 테스트를 쓰기만 하는 게 아니라 테스트와 curl을 스스로 실행해 검증해요. 이게 진짜 에이전트다운 강점이에요. 프롬프트: 「POST /tasks와 GET /tasks에 대해 해피 패스와 검증 오류 케이스를 아우르는 Jest + Supertest 테스트를 작성한 다음 실행해.」 샘플 테스트:
// tests/task.test.ts
import request from "supertest";
import app from "../src/app";
describe("POST /tasks", () => {
it("creates a valid task and returns 201", async () => {
const res = await request(app)
.post("/tasks")
.set("Authorization", `Bearer ${process.env.TEST_TOKEN}`)
.send({ title: "Write post F1" });
expect(res.status).toBe(201);
expect(res.body.title).toBe("Write post F1");
});
it("returns 400 when title is missing", async () => {
const res = await request(app)
.post("/tasks")
.set("Authorization", `Bearer ${process.env.TEST_TOKEN}`)
.send({});
expect(res.status).toBe(400);
});
});
curl로 직접 검증해 실제 JSON 응답을 확인해요.
$ curl -s -X POST http://localhost:3000/tasks \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"title":"Write post F1","status":"DOING"}'
{
"id": "a3f1c9e2-...-8b71",
"title": "Write post F1",
"detail": null,
"status": "DOING",
"createdAt": "2026-08-09T04:12:30.882Z",
"updatedAt": "2026-08-09T04:12:30.882Z"
}
Claude Code가 구현 전에 테스트를 쓰게 하는 것이 AI와 함께하는 TDD를 실천하는 효과적인 방법이에요. 테스트가 「계약」 역할을 하고, AI는 그게 초록불이 될 때까지 코드를 써요.
6단계 — 프로덕션 보안과 에러 처리
여기가 경쟁 글들이 거의 비워 두는 부분이에요. API를 인터넷에 노출하기 전에, Claude Code에게 다음 계층들을 추가하게 하세요. 단, 체크리스트는 직접 검토하세요.
- 속도 제한:
express-rate-limit로 무차별 대입과 남용을 막아요(예: 100 req/분/IP). - CORS: 특정 오리진을 화이트리스트로. 인증이 걸린 API에서
origin: "*"를 그대로 두지 마세요. - 환경 변수/비밀 값: 모든 키는
.env를 통해,.env를.gitignore에 추가,.env.example템플릿을 함께 제공해요. - 입력 검증: 각 핸들러에서 Zod로 이미 처리됨 — 클라이언트 데이터를 절대 믿지 마세요.
- 중앙 에러 핸들러: 모든 에러를 잡고 프로덕션 응답에서 스택 트레이스를 흘리지 않는 마지막 미들웨어.
- Helmet: 기본 HTTP 보안 헤더를 설정해요.
훑어볼 짧은 OWASP 체크리스트: 인젝션은 없는지(Prisma는 파라미터화 쿼리로 SQLi를 막아요), 접근 제어가 깨진 곳은 없는지(각 라우트의 인가 확인), 민감 데이터 노출은 없는지(여분 필드를 반환하지 않기). Claude Code가 스스로 구멍을 훑게 하고 싶다면 Claude Code로 보안 감사 실행하기를 보세요.
7단계 — API를 실제 URL에 배포하기
이 데모에서는 Railway를 써요. Postgres를 기본 제공하고 Git에서 몇 분 만에 배포하거든요. 단계:
- 저장소를 GitHub에 푸시해요.
- Railway에서 저장소로 프로젝트를 만들고 PostgreSQL 서비스를 추가해요 —
DATABASE_URL이 자동 생성돼요. - 프로덕션 환경 변수를 설정해요:
JWT_SECRET,DATABASE_URL,NODE_ENV=production. - 빌드 명령을
npx prisma migrate deploy && npm run build, 시작 명령을npm start로 설정해요.
더 이식성 있게(Render, Fly.io, VPS에서도 실행 가능하게) 하려면 최소한의 Dockerfile을 추가하세요.
# Dockerfile
FROM node:20-slim
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npx prisma generate && npm run build
EXPOSE 3000
CMD ["npm", "start"]
배포 후, 라이브 URL로 엔드포인트를 호출해 마이그레이션이 돌았는지, 환경이 올바른지 확인해요. 플랫폼별 세부 사항은 Claude Code로 앱 배포하기 가이드에 있어요.
더 빠르게: AgentKit이 ak-backend-development 스킬을 제공
혼동을 피하기 위한 한마디: 여기서 AgentKit은 Claude Code용 키트 번들(agentkit.best, ak CLI)이지, OpenAI의 AgentKit(Agent Builder/ChatKit, 2025-10-06 출시)이 아니에요. 이름은 같아도 완전히 다른 것들이에요.
위의 7단계는 모두 CLAUDE.md에 규약을 선언하고 매 세션 패턴을 다시 진술하도록 요구해요. Claude Code용 AgentKit(링크로 20% 할인)은 ak-backend-development 스킬을 묶어 두는데, 소개에 따르면 Node/Python/Go(NestJS, FastAPI, Django), OAuth/JWT 인증, OWASP 보안 체크리스트, Docker/K8s를 지원해요. 다시 말해 Claude Code가 이 똑같은 7단계를 기성 표준 규약에 대고 돌리니, 프로젝트마다 「계약」을 처음부터 다시 짜지 않아도 돼요.
솔직한 견해: 키트는 필수가 아니에요 — 전부 손으로 할 수 있고, 이 글이 그걸 증명했어요. 키트가 아껴 주는 건 설정 수고뿐이고, 백엔드를 자주 만드는 경우에만 이득이에요. Engineer Kit은 $99(사이트에 정기 요금 언급은 없어요)이고 「환불 보장」과 「평생 업데이트」가 붙어요. 사기 전에 저울질하려면 AgentKit Engineer Kit의 구성을 보세요.
실제 한계와 손으로 반드시 검토해야 할 때
이건 어떤 경쟁 글도 갖지 못한 섹션이고, 가장 중요한 부분이에요. Claude Code로 많은 백엔드 프로젝트를 거치며 제가 계속 잡아내야 했던 실패 유형은 이것들이에요.
- 잘못된 임포트/ORM 호출: 존재하지 않는 Prisma 메서드를 호출하거나, 잘못된 버전의 패키지를 임포트해요 — 코드는 맞아 보이지만 런타임에 실패해요.
- 라우트의 인가 누락: 인증(당신이 누구인지)은 있지만 인가(당신이 해도 되는지)를 건너뛰어요 — 사용자가 남의 데이터를 수정해요.
- 느슨한 검증: 제목은 검증하지만 길이 제한을 잊고, 새니타이즈를 잊고, 이상한 데이터 타입을 통과시켜요.
- N+1 쿼리: 쿼리 한 번이면 될 것을 항목마다 DB를 때리는 루프 — 개발에선 괜찮지만 프로덕션에서 무너져요.
- 하드코딩된 비밀 값:
JWT_SECRET이나 접속 문자열을 폴백으로 코드에 곧장 박아 넣어요. - 「돌아가는 것처럼 보이지만」 비즈니스 로직이 틀림: 컴파일되고 해피 패스 테스트도 초록불이지만, 계산이나 상태 로직이 틀려요 — 도메인을 아는 사람만 잡아내요.
제 규칙: 보일러플레이트는 Claude Code, 인증·보안·돈 로직은 사람이 검토. AI가 전체 분량의 80%를 몇 배 빠르게 생성해요. 남은 20% — 바로 그 고위험 부분 — 은 손을 뗄 수 없어요. 그건 도구의 약점이 아니라 올바르게 쓰는 방법이에요.
자주 묻는 질문(FAQ)
Claude Code는 백엔드에서 프로덕션 준비가 되어 있나요?
완전 자동은 아니에요. Claude Code는 실제로 동작하고 잘 구조화된 코드를 생성하지만, 인증, 권한, 보안, 비즈니스 로직은 프로덕션 전에 사람의 꼼꼼한 검토가 필요해요. 출력은 고품질 초안으로 다루고 최종본으로 여기지 마세요.
코딩을 알아야 하나요, 아니면 초보자도 할 수 있나요?
출력을 검토하려면 코드를 읽을 줄 알고 HTTP/REST와 데이터베이스를 기본 수준으로 이해해야 해요. 초보자도 동작하는 API는 얻을 수 있지만, Claude Code가 끼워 넣는 보안이나 로직 버그를 잡아내는 데는 애를 먹어요 — 그러니 통째로 맡기지 말고 함께 배우며 진행하세요.
GraphQL이나 gRPC도 만들 수 있나요?
네. 이 가이드는 가장 흔하기에 REST를 시연하지만, Claude Code는 GraphQL(Apollo)과 gRPC도 만들 수 있어요. 원칙은 똑같아요. 스키마를 먼저 설계하고, 조각내어 만들고, 인증/보안은 직접 검토하세요.
Claude Code에 가장 잘 맞는 스택은?
Express + Prisma(JS)와 FastAPI + SQLAlchemy(Python)가 두 최고의 짝이에요 — 익숙한 패턴이 많고 환각을 줄일 만큼의 타입 안전성이 있어요. FastAPI는 타입 힌트가 타입 오류를 줄여 주어 한발 앞서요.
Claude Code가 생성하는 코드는 안전한가요?
기본값으로는 아니에요. Claude Code는 느슨한 기본값(인가 누락, 코드 속 비밀 값, 얇은 검증)을 내놓는 경향이 있어요. 보안 체크리스트(속도 제한, CORS, 환경 변수, OWASP)는 직접 실행하고, 배포 전에 모든 민감한 라우트를 검토해야 해요.
기본 CRUD API는 얼마나 걸리나요?
기본 인증과 테스트를 포함한 완전한 CRUD REST API가 검토 시간까지 대략 30~60분이에요. 스캐폴딩과 보일러플레이트는 빠르고, 실제 시간은 인증, 보안 검토와 비즈니스 로직 조정에 들어가요.
정리와 다음 단계
7단계 복습: 엔드포인트와 스키마 설계 → 프로젝트와 데이터 계층 스캐폴딩 → CRUD를 리소스별로 하나씩 → 인증/검증 추가 → 테스트 → 프로덕션용 견고화 → 배포. Claude Code가 보일러플레이트를 맡고, 인증과 로직 검토는 여러분이 맡아요 — 그게 올바른 분업이에요. 다음에 읽으면 좋은 글: API를 더 튼튼하게 하는 테스트 작성과 AI로 하는 TDD, 그리고 실제 URL에 올리는 Claude Code로 앱 배포하기.
Claude Code로 백엔드를 더 빠르게 만들고 싶으세요? API를 자주 세운다면, 기성 ak-backend-development 키트로 매번 규약을 다시 선언하지 않아도 Claude Code가 표준 규약을 따라요. 필수는 아니에요 — 손으로 해도 잘 돼요.