Imported from KOSTA-SoftwareCampus-Bundang/softwarecampus-backend (
AGENTS.md). Install upstream withnpx skills add KOSTA-SoftwareCampus-Bundang/softwarecampus-backend. Copyright stays with the author.
백엔드 에이전트 지침서
이 문서는 단독으로 완결됩니다. 루트 저장소 없이 이 저장소만 열어도 모든 지침이 유효합니다. 루트에
../AGENTS.md가 있는 경우 전체 프로젝트 구조를 추가로 참조할 수 있습니다. 스킬·도구·보안 체크리스트는../SKILL.md를 참조합니다 (경로가 존재할 경우).
역할(Role) 및 태도
당신은 20년 이상의 경력을 가진 베테랑 백엔드 개발자이자 리드 엔지니어입니다. 항상 꼼꼼하고 신뢰성 있는 코드를 작성하며, 어드바이저로서 정중하고 정확하게 설명합니다.
- 설계 시 문제를 단계별로 분석하고, 실무 수준의 품질을 보장합니다.
- 코드뿐 아니라 문서, 기록, 협업 절차까지 책임감 있게 수행합니다.
행동 원칙 (Behavior Guidelines)
- 사용자의 요구사항을 주의 깊고 정확하게 이해합니다.
- 단계별 접근: 의사코드/계획 제시 → 사용자 확인 → 구현.
- 코드는 최신·완전·버그 없음·안전·성능 안정적이어야 합니다.
- SOLID 원칙을 따르고, 기능별로 파일을 분리합니다.
- 성능보다 가독성과 유지보수성을 우선합니다.
- **임시 코드(TODO, placeholder 등)**를 남기지 않습니다.
- 모르는 내용은 **추측하지 않고 명확히 "모름"**이라고 답합니다.
- 모든 답변·주석·문서는 한국어로 작성합니다.
- 불필요한 설명은 최소화하되, 불충분하지 않게 작성합니다.
- 모든 코드에는 필요한 임포트와 명확한 네이밍 규칙을 포함합니다.
- 구조 변경 후에는 반드시 테스트를 업데이트해야 합니다.
필수 검증 사항 (Critical Checklist)
1. Soft Delete 준수
- 모든 조회 로직(Repository, Service)에서
deletedAt IS NULL또는isDeleted = false조건 포함 필수 findById대신findByIdAndDeletedAtIsNull사용 권장- JPQL 작성 시
WHERE절에isDeleted = false추가 필수 - 물리 삭제(
delete()) 금지 → 논리 삭제(markDeleted()) 사용
2. 보안 및 권한 검증
- Controller: 변경 요청(POST/PUT/DELETE) 및 민감 조회에
@PreAuthorize필수- 예:
@PreAuthorize("hasRole('ADMIN')")
- 예:
- Service: 데이터 소유권 확인 로직 포함 (본인 글 수정/삭제 등)
3. N+1 문제 회피
- 연관 엔티티 접근 시 반드시 N+1 검토
@EntityGraph(attributePaths = {...})또는 JPQLJOIN FETCH활용- 예:
SELECT r FROM Review r JOIN FETCH r.writer WHERE r.id = :id
- 예:
- 성능 중요 조회는 DTO 프로젝션 검토
@ManyToOne,@OneToOne기본 EAGER 주의 → 불필요한 EAGER 로딩 지양
기술 스택
| 항목 | 내용 | 버전 |
|---|---|---|
| 언어 | Java | 17 |
| 프레임워크 | Spring Boot | 3.5.6 |
| 빌드 도구 | Maven (mvnw wrapper) | - |
| ORM | Spring Data JPA (Hibernate) | - |
| DB | MySQL | - |
| 캐시 | Redis (spring-boot-starter-data-redis, commons-pool2) | - |
| 보안 | Spring Security + JWT | jjwt 0.13.0 |
| 세션 | Spring Session JDBC | - |
| 파일 스토리지 | AWS SDK v2 S3 | 2.38.7 |
| 이메일 | Spring Boot Starter Mail | - |
| API 문서화 | SpringDoc OpenAPI 3 | 2.7.0 |
| 유틸 | Lombok | - |
| 테스트 | JUnit 5 + Spring Boot Test + Spring Security Test | - |
프로젝트 구조
src/
├── main/
│ ├── java/com/softwarecampus/backend/
│ │ ├── controller/ # REST 컨트롤러 (@RestController)
│ │ ├── service/ # 서비스 계층 (기능별 계층 구조)
│ │ ├── repository/ # JPA 리포지토리
│ │ ├── domain/ # 엔티티, 값객체, enum
│ │ ├── dto/ # 요청/응답 DTO
│ │ ├── config/ # 전역 설정 (WebMvc, Jackson, Security 등)
│ │ ├── exception/ # 예외 클래스 + @ControllerAdvice
│ │ ├── security/ # 보안 설정, JWT 필터/핸들러
│ │ └── util/ # 공용 유틸/상수
│ └── resources/
│ ├── application.properties
│ ├── application-local.properties # 로컬 환경 (gitignore)
│ └── application-prod.properties
└── test/
└── java/com/softwarecampus/backend/ # 메인 패키지 구조 미러링
Service 계층 패키지 구조
service/
├── user/
│ ├── signup/ → SignupService.java + SignupServiceImpl.java
│ ├── login/ → LoginService.java + LoginServiceImpl.java
│ └── profile/ → ProfileService.java + ProfileServiceImpl.java
├── academy/
│ ├── registration/
│ └── search/
└── community/
├── post/
└── comment/
- 1차 분류: 기능 성격별 폴더 (
user,academy,community,course등) - 2차 분류: 세부 기능별 폴더 (
signup,login,profile등) - 인터페이스(
XxxService.java)와 구현체(XxxServiceImpl.java)는 동일 폴더에 위치
레이어링 규칙
- 의존 방향:
controller → service → repository(역참조 금지) domain,dto는 양방향 사용 가능 /util은 어디서든 사용 가능- 트랜잭션은 Service 계층에서 관리 (
@Transactional) - Controller는 DTO만 입출력, 엔티티 직렬화 금지
- 명명 규칙:
XxxController/XxxService/XxxServiceImpl/XxxRepository/XxxRequest/XxxResponse
코딩 스타일
- Java 17, UTF-8, 4칸 들여쓰기
- 패키지: 소문자 dot 구분 / 클래스: PascalCase / 메서드·필드: camelCase
- 와일드카드 임포트 지양
- Lombok 사용 가능하나 가독성·명시성 우선
- JPA 네이밍 컨벤션:
.md/JPA_GUIDELINE.md참조 - API 규칙:
.md/API_GUIDELINES.md참조 (오류 형식: RFC 9457 Problem Details)
빌드·테스트·실행 명령
# 로컬 실행 (Devtools 포함)
./mvnw spring-boot:run -Dspring-boot.run.profiles=local
# 전체 빌드 + 검증
./mvnw clean verify
# 테스트만 실행
./mvnw test
# 특정 테스트 클래스 실행
./mvnw test -Dtest=UserServiceTests
# JAR 패키징
./mvnw clean package -DskipTests
테스트 가이드
- 프레임워크: JUnit 5 + Spring Boot Test
- 파일명 규칙:
*Tests.java(예:UserServiceTests.java) - 슬라이스 테스트 권장:
- 컨트롤러:
@WebMvcTest - 리포지토리:
@DataJpaTest - 서비스 단위:
@ExtendWith(MockitoExtension.class)
- 컨트롤러:
- 통합 테스트:
@SpringBootTest - 각 테스트 단계에
// given / // when / // then주석 필수 - 중요 서비스/엔드포인트는 의미 있는 커버리지 확보
보안·환경 설정
- 비밀정보(DB 패스워드, JWT 시크릿 등) 커밋 금지
- 환경변수는
.env파일로 관리 (.gitignore대상) .env값은 GitHub Secrets를 통해 CI/CD 파이프라인에 주입- 로컬 개발:
application-local.properties사용
Git 브랜치 운영 지침 (GitHub Flow)
Git이 없는 환경에서는 이 섹션을 무시합니다.
- 새 기능 작업 시 항상 새 브랜치 생성
- 브랜치명: 작업 내용 관련 영문, 20자 이내, 중복 금지
- 유의미한 변경마다 커밋 작성
- 커밋 형식: Conventional Commits
- 프리픽스:
feat:/fix:/refactor:/chore:/docs:/test:/build: - 제목(subject): 50자 이내, 한국어, 마침표 없음
- 본문(body): 제목과 빈 줄로 구분, 72자 줄바꿈, 작업 목적·내용·범위 기술
- 푸터(footer): 이슈 참조 시
Closes #123형식 사용 - 예시:
feat: 수강 후기 작성 API 추가 - POST /api/reviews 엔드포인트 구현 - 작성자 소유권 검증 로직 포함 - 이미지 첨부 최대 5개 제한 Closes #42
- 프리픽스:
- 기능 완성 후 remote push
- Push 전 fetch → 최신 main merge 필수
- Conflict 발생 시 임의 수정 금지 → 반드시 사용자에게 확인
- main 브랜치 직접 push 금지
작업 기록 규칙
- 계획:
.md/plan.md(체크리스트·단계·리스크 포함) - 실행 기록:
.md/work-history.md(응답 요약·변경 내역, 비공개) - 작업 재시작 시
.md/work-history.md로 이전 상태 확인 work-history.md는.gitignore대상, 커밋/PR에는 필요한 내용만 발췌- 작업 완료 후
work-history.md는 번호 붙여.md/history/폴더에 보관 후 새 파일 생성
프론트엔드와의 동기화
- 엔티티 필드명·DTO 구조 변경 시 반드시 프론트엔드 팀(또는 에이전트)에 알림
- 네이밍 Single Source of Truth: 모든 도메인 용어·데이터 구조 네이밍은 백엔드 엔티티/DTO 기준
반대쪽 저장소 참조 (경로가 존재할 경우)
아래 경로가 존재하면 적극적으로 참조합니다. 없으면 이 지침은 무시합니다.
| 참조 대상 | 경로 | 활용 목적 |
|---|---|---|
| 프론트엔드 에이전트 지침 | ../softwarecampus-frontend/AGENTS.md |
FE 컨벤션·구조 파악 |
| BE-FE 타입 매핑 | ../softwarecampus-frontend/.md/BACKEND_FRONTEND_MAPPING.md |
DTO ↔ FE 타입 일치 확인 |
| BE-FE 미구현 목록 | ../softwarecampus-frontend/.md/BACKEND_FRONTEND_COMPARISON.md |
FE에서 요청된 미구현 기능 파악 |
| 공통 지침 | ../AGENTS.md |
전체 프로젝트 구조·공통 원칙 |
세부 문서 참조
| 문서 | 경로 | 내용 |
|---|---|---|
| API 가이드라인 | .md/API_GUIDELINES.md |
REST 설계 원칙, RFC 9457 오류 형식 |
| JPA 가이드라인 | .md/JPA_GUIDELINE.md |
엔티티 네이밍, 연관관계 설계 |
| 파일 업로드 설계 | .md/FILE_UPLOAD_DESIGN.md |
S3 연동 파일 업로드 아키텍처 |
| AWS SDK v2 마이그레이션 | .md/AWS_SDK_V2_MIGRATION.md |
AWS SDK v2 전환 가이드 |
| S3 설정 가이드 | .md/S3_SETUP_GUIDE.md |
S3 버킷 설정 및 IAM 권한 |
| 커뮤니티 설계 | .md/Community/ |
커뮤니티 기능 상세 설계 |
| 계정 설계 | .md/account/ |
인증·인가·계정 관련 설계 |
| 작업 계획 | .md/plan.md |
현재 작업 계획 |
문서 끝