본 파일은 agents.md 표준에 따라 모든 AI 에이전트(Codex, Cursor, GitHub Copilot, Claude Code 등) 가 공통으로 읽는 컨텍스트. 본 파일은
CLAUDE.md의 ZONE: SHARED + ZONE: PROJECT-DOMAIN 으로부터 자동 생성됨 — 직접 수정 X. 변경은CLAUDE.md에 가하고apply/strategies/zone-extract.sh재실행.
tracktory 메인 백엔드. Spring Boot 기반으로 사용자 인증·프로필·이수 과목·트랙/직무/과목 도메인과 추천 결과 API 를 담당하며, AI 중계 서버와 내부 통신한다. 앱과 직접 통신하는 유일한 백엔드이며, AI 처리는 내부 중계 서버로 위임한다.
- 언어: java 21
- 프레임워크: Spring Boot 4.0.x
- 패키지 매니저: gradle (wrapper 9.4.x)
- 테스트 러너: junit-jupiter
- CI: github_actions
# 의존성 설치
./gradlew dependencies --refresh-dependencies
# 포매터
./gradlew spotlessApply
# 린터 (spotlessCheck + checkstyle + test 포함)
./gradlew check
# 타입 체커 (컴파일)
./gradlew compileJava
# 테스트
./gradlew test상세 규약은 CONTRIBUTING.md 참조.
src/main/java/com/hansung/tracktory/
├── TracktoryApplication.java # 엔트리포인트
└── global/ # 공통 인프라 (도메인 무관)
├── config/ # WebConfig, WebClientConfig
├── entity/ # BaseEntity (공통 감사 필드)
├── filter/ # RequestIdFilter (X-Request-Id 전파)
├── exception/ # ErrorCode, BusinessException, GlobalExceptionHandler
└── response/ # ApiResponse envelope, ErrorPayload, ApiResponseBodyAdvice
src/main/resources/
├── application.yaml
├── application-secret.yaml.example # 시크릿 템플릿 (실제 값은 gitignored)
└── logback-spring.xml
src/test/java/com/hansung/tracktory/
config/checkstyle/checkstyle.xml # 코드 스타일 규칙
- 공통 인프라 격리 — 응답 envelope·예외·요청 추적 등 도메인 무관 인프라는
global/에만 둔다. 도메인 패키지가global/을 의존하되 역방향은 금지. - 응답 일원화 — 모든 컨트롤러 응답은
ApiResponseenvelope 으로 감싸고, 예외는GlobalExceptionHandler에서 단일 처리한다 (컨트롤러에서 try/catch 분산 금지). - 계층 책임 분리 — 트랜잭션은 service 계층(
@Transactional)에서만. controller 는 요청/응답 DTO 변환, repository 는 영속성만. - AI 위임 경계 — AI 처리(추천·설명 생성 등)는 내부 중계 서버로 위임하고, 본 백엔드는 인증·도메인·트랜잭션·API 게이트키퍼 역할에 집중한다.
새로운 코드를 제안하기 전에 다음을 확인합니다:
- 컴포넌트가 단일 책임인가? (controller/service/repository 경계 준수)
- 외부 I/O 가 순수 로직과 섞이지 않았는가?
- public API 에 타입 정보와 Javadoc 이 있는가?
- 커밋 전 루틴 (
./gradlew spotlessApply→./gradlew check) 을 안내했는가?
본 프로젝트는 `harness-template` 기반.