기술 학습

Claude를 백엔드 API 개발에 효율적으로 활용하는 완벽 가이드

hawon6691 2026. 2. 10. 17:49
728x90

Claude를 백엔드 API 개발에 효율적으로 활용하는 완벽 가이드

1. 프롬프트 설계 원칙

1.1 컨텍스트를 먼저 제공하라

Claude에게 요청할 때 프로젝트 컨텍스트를 먼저 세팅하면 응답 품질이 극적으로 올라간다. 매 대화 시작 시 다음을 전달하자.

프로젝트: Bungae 마켓플레이스 클론
기술 스택: Java 17, Spring Boot 3.x, JPA, MySQL, Redis
아키텍처: 3-Layer (Controller → Service → Repository)
인증: JWT (Access + Refresh Token)
현재 작업: 상품 검색 API 구현

이렇게 하면 Claude가 매번 기술 스택을 추측하지 않고, 일관된 코드 스타일로 응답한다.

1.2 역할 지정으로 응답 수준 조절

너는 10년차 Spring Boot 시니어 개발자야.
프로덕션 레벨의 코드를 작성하고, 예외 처리와 로깅을 빠뜨리지 마.

역할 지정 없이 질문하면 범용적인 답변이 오고, 역할을 지정하면 해당 수준에 맞는 구체적인 답변이 나온다.

1.3 출력 형식을 명시하라

// 좋은 예
"상품 등록 API를 만들어줘. Controller, Service, Repository, DTO, Entity를 각각 별도 클래스로 작성해."

// 나쁜 예
"상품 등록 기능 만들어줘."

2. 단계별 활용 전략

2.1 설계 단계 — Claude를 아키텍트로 활용

API 명세 설계 요청

다음 요구사항으로 REST API 명세를 작성해줘.
- 리소스: 상품(Product)
- 기능: CRUD + 검색 + 페이징
- 응답 형식: 통일된 ApiResponse<T> 래퍼
- HTTP 상태 코드 명시
- 요청/응답 JSON 예시 포함

ERD 및 테이블 설계 검토

다음 ERD를 검토해줘. 정규화 수준, 인덱스 전략, N+1 문제 가능성을 분석해.
[ERD 이미지 첨부 또는 DDL 첨부]

아키텍처 의사결정 자문

상품 추천 시스템에서 협업 필터링 vs 콘텐츠 기반 필터링 중
우리 프로젝트(사용자 1만명 미만, 상품 5만개)에 적합한 방식과 구현 난이도를 비교해줘.

2.2 구현 단계 — Vibe Coding 워크플로우

선호하는 "AI가 코드 생성 → 사람이 검증" 방식에 최적화된 프로세스:

Step 1: 스켈레톤 생성

상품 검색 API의 전체 레이어 스켈레톤을 작성해줘.
- SearchProductRequest DTO (키워드, 카테고리, 가격범위, 페이징)
- ProductSearchService (Specification 패턴 사용)
- ProductSearchController (GET /api/v1/products/search)
- 각 클래스에 TODO 주석으로 비즈니스 로직 위치 표시

Step 2: 비즈니스 로직 채우기

위 스켈레톤의 TODO 부분을 구현해줘.
JPA Specification으로 동적 쿼리를 만들고, 정렬 조건은 최신순/가격순/인기순을 지원해.

Step 3: 검증 요청

내가 작성한 코드를 리뷰해줘. 다음 관점에서 분석해:
1. 보안 취약점 (SQL Injection, XSS 등)
2. 성능 병목 (N+1, 불필요한 쿼리)
3. 예외 처리 누락
4. Spring 컨벤션 위반
[코드 붙여넣기]

2.3 테스트 단계

ProductService.createProduct() 메서드에 대한 단위 테스트를 작성해줘.
- JUnit 5 + Mockito 사용
- 정상 케이스 + 예외 케이스(중복 상품, 잘못된 카테고리) 포함
- Given-When-Then 패턴
- DisplayName 한글로 작성

2.4 문서화 단계

다음 Controller 코드를 보고 Swagger(OpenAPI 3.0) 어노테이션을 추가해줘.
각 API에 설명, 요청/응답 예시, 에러 코드를 포함해.
[코드 붙여넣기]

3. 상황별 프롬프트 템플릿

3.1 에러 디버깅

다음 에러가 발생했어. 원인과 해결 방법을 알려줘.

[환경]
- Java 17, Spring Boot 3.2, JPA, MySQL 8.0

[에러 로그]
(스택 트레이스 전체 붙여넣기)

[관련 코드]
(에러가 발생하는 클래스 붙여넣기)

[시도한 것]
- ○○ 설정 변경 → 동일 에러

핵심: 에러 로그 + 관련 코드 + 이미 시도한 것을 함께 주면 Claude가 이미 실패한 방법을 다시 제안하지 않는다.

3.2 성능 최적화

다음 API가 응답 시간 3초 이상 걸려. 최적화 방안을 제시해줘.

[현재 상황]
- 엔드포인트: GET /api/v1/products?category=electronics&page=0&size=20
- DB 레코드 수: 상품 5만건, 카테고리 50개
- 현재 쿼리: (JPQL 또는 SQL 붙여넣기)
- 인덱스: (현재 인덱스 목록)

쿼리 최적화, 캐싱 전략, 인덱스 추가 순서로 분석해줘.

3.3 기존 코드 리팩토링

다음 코드를 리팩토링해줘.

[목표]
- 메서드 길이 30줄 이내
- 단일 책임 원칙 적용
- 매직 넘버 제거
- 변경 전후 동작이 동일해야 함

[코드]
(리팩토링 대상 코드)

3.4 새로운 기술 학습

Spring Security + JWT 인증을 구현하려고 해.
다음 순서로 설명해줘:

1. 전체 인증 흐름 (시퀀스 다이어그램 수준)
2. 필요한 클래스 목록과 각 역할
3. 핵심 클래스부터 순서대로 구현 코드
4. 각 코드 블록마다 "왜 이렇게 하는지" 주석 포함

나는 Spring Security를 처음 접하지만 Spring Boot와 HTTP 인증 개념은 알고 있어.

4. 대화 관리 전략

4.1 대화를 기능 단위로 분리하라

대화 1 대화 2 대화 3
상품 CRUD API 주문 처리 API 인증/인가 시스템

하나의 대화에 모든 기능을 넣으면 컨텍스트가 섞여서 응답 품질이 떨어진다. 기능 단위로 대화를 분리하고, 필요하면 이전 대화를 참조하도록 요청하자.

4.2 점진적으로 복잡도를 높여라

[1단계] 기본 CRUD 먼저 완성
[2단계] 검증(Validation) 추가
[3단계] 예외 처리(Global Exception Handler) 추가
[4단계] 캐싱 적용
[5단계] 테스트 코드 작성

한 번에 "캐싱 + 예외 처리 + 테스트 + 로깅이 포함된 CRUD API"를 요청하면 누락이 생긴다. 단계별로 요청하면 각 레이어가 확실하게 완성된다.

4.3 이전 응답을 레퍼런스로 활용

위에서 만든 ProductService를 기반으로 OrderService를 만들어줘.
동일한 예외 처리 패턴과 응답 형식을 유지해.

Claude는 같은 대화 내에서 이전 코드를 기억하므로, 일관성 있는 코드베이스를 만들 수 있다.


5. Claude의 파일 생성 기능 활용

5.1 프로젝트 구조 생성

Spring Boot 프로젝트의 패키지 구조를 잡아줘.
도메인 기반 패키지 구조(domain-driven)로, 다음 도메인 포함:
- product, order, user, payment
각 도메인에 controller, service, repository, dto, entity 패키지 포함
디렉토리 트리와 각 클래스의 빈 스켈레톤 파일을 만들어줘.

5.2 설정 파일 생성

application.yml을 환경별(local, dev, prod)로 분리해서 만들어줘.
- local: H2, 로그 DEBUG
- dev: MySQL(AWS RDS), 로그 INFO
- prod: MySQL(AWS RDS), 로그 WARN, HikariCP 풀 사이즈 최적화

5.3 API 문서 생성

다음 Controller 코드를 기반으로 API 명세서를 Markdown으로 만들어줘.
엔드포인트, 메서드, 요청/응답 형식, 에러 코드, 사용 예시 포함.

6. 코드 리뷰 체크리스트 활용

코드를 Claude에게 리뷰 맡길 때 다음 체크리스트를 함께 전달하면 체계적인 리뷰를 받을 수 있다:

다음 체크리스트로 코드 리뷰해줘. 각 항목에 ✅/❌ 표시하고 이유를 적어줘.

[필수]
- [ ] NPE 가능성이 있는 곳에 null 체크 또는 Optional 처리
- [ ] 사용자 입력에 대한 Validation 적용 (@Valid, @NotNull 등)
- [ ] 적절한 HTTP 상태 코드 반환
- [ ] 트랜잭션 범위 적정성 (@Transactional 위치)
- [ ] 민감 정보 로깅 여부 (비밀번호, 토큰 등)

[권장]
- [ ] 메서드 네이밍 컨벤션 준수
- [ ] 불필요한 의존성 주입 없음
- [ ] DTO ↔ Entity 변환 로직 분리
- [ ] 매직 넘버/문자열 상수화
- [ ] 적절한 접근 제어자 사용

7. 안티패턴 — 이렇게 하면 비효율적이다

❌ 비효율적 ✅ 효율적
"이거 어떻게 해?" "Spring Boot에서 Redis 캐싱을 @Cacheable로 적용하는 방법을 코드와 설정 파일로 보여줘"
에러 메시지만 던지기 에러 로그 + 관련 코드 + 시도한 것 함께 제공
한 대화에서 10개 기능 요청 기능별로 대화 분리, 점진적 복잡도 증가
생성된 코드 그대로 복붙 코드를 읽고 이해한 뒤, 리뷰 요청으로 검증
"전체 프로젝트 만들어줘" 레이어별·모듈별로 나눠서 요청
매번 기술 스택 재설명 대화 초반에 컨텍스트 한 번 세팅

8. 실전 워크플로우 요약

┌─────────────────────────────────────────────────┐
│              1. 설계 (Claude = 아키텍트)           │
│  API 명세 → ERD 검토 → 기술 선택 자문              │
└──────────────────────┬──────────────────────────┘
                       ▼
┌─────────────────────────────────────────────────┐
│           2. 구현 (Claude = 페어 프로그래머)         │
│  스켈레톤 생성 → 비즈니스 로직 → 코드 리뷰           │
└──────────────────────┬──────────────────────────┘
                       ▼
┌─────────────────────────────────────────────────┐
│            3. 테스트 (Claude = QA 엔지니어)         │
│  단위 테스트 → 통합 테스트 → 엣지 케이스 발굴         │
└──────────────────────┬──────────────────────────┘
                       ▼
┌─────────────────────────────────────────────────┐
│           4. 문서화 (Claude = 테크니컬 라이터)       │
│  API 문서 → Swagger 어노테이션 → README             │
└──────────────────────┬──────────────────────────┘
                       ▼
┌─────────────────────────────────────────────────┐
│           5. 배포 (Claude = DevOps 자문)           │
│  Dockerfile → docker-compose → AWS 설정 가이드     │
└─────────────────────────────────────────────────┘

9. 꿀팁 모음

  1. "왜?"를 붙여라: "이 코드에서 @Transactional(readOnly = true)를 쓴 이유는?" — Claude가 단순 코드 생성기가 아니라 학습 도구가 된다.

  2. 비교를 요청하라: "JPA Specification vs QueryDSL, 우리 프로젝트 규모에서 어떤 게 나아?" — 트레이드오프를 이해하고 의사결정할 수 있다.

  3. 제약 조건을 걸어라: "외부 라이브러리 없이 순수 Spring으로만 구현해줘" — 제약이 있을수록 답변이 정확해진다.

  4. 실패 시나리오를 요청하라: "이 API에서 발생할 수 있는 모든 에러 케이스를 나열하고 각각의 처리 방법을 알려줘" — 방어적 프로그래밍의 핵심.

  5. 메모리 기능을 활용하라: 기술 스택, 코딩 컨벤션, 선호하는 패턴 등을 Claude에게 기억시켜두면 매번 설명할 필요가 없다.

  6. 파일 업로드를 적극 활용하라: 기존 코드를 직접 붙여넣는 것보다 파일로 업로드하면 Claude가 전체 구조를 더 정확하게 파악한다.

728x90