Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions .github/workflows/claude-code-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,18 +25,22 @@ jobs:
with:
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
github_token: ${{ github.token }}
claude_args: |
--max-turns 15
--dangerously-skip-permissions
prompt: |
이 Pull Request의 코드 변경 사항을 리뷰해주세요.
다음 항목을 중점적으로 확인해주세요:
1. 버그 및 정확성: 잠재적 NullPointerException, 로직 오류
2. 보안: JWT 처리, 인증/인가, 입력 검증
3. JPA 성능: N+1 쿼리, cascade/fetch 설정
4. API 설계: ResponseDTO 패턴 준수

리뷰는 한국어로 작성해주세요.
심각한 문제만 지적하고, 사소한 스타일 이슈는 넘어가주세요.

리뷰 결과는 반드시 PR에 코멘트로 남겨주세요.
문제를 발견하지 못한 경우에도 "검토 완료, 특이사항 없음" 코멘트를 남겨주세요.
claude_args: "--max-turns 15"

interactive:
if: |
Expand All @@ -56,4 +60,4 @@ jobs:
with:
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
github_token: ${{ github.token }}
claude_args: "--max-turns 5"
claude_args: |
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -147,3 +147,9 @@ replay_pid*
.env
!gradle/wrapper/gradle-wrapper.jar

# AI Test Orchestrator
.ai-test/last-plan.md

# Claude Code 로컬 설정
.claude/

53 changes: 53 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,56 @@ src/main/java/graduation/project/DoDutch_server/
- JPA: N+1 쿼리, cascade/fetch 타입, orphanRemoval 설정
- API: ResponseDTO 패턴 준수, HTTP 상태 코드 적절성
- Null safety 및 validation 어노테이션 활용

## 테스트 작성 규칙

### 테스트 스택
- JUnit 5 + Mockito + AssertJ + Spring Boot Test

### 파일 위치 규칙
- 단위 테스트: `*Test.java`, 통합 테스트: `*IT.java`
- 패키지 구조는 `src/main/java`와 미러링
- 소스 패키지명 그대로 사용: `graduation.project.DoDutch_server.*`

### ⚠️ macOS 패키지명 주의사항
- macOS는 case-insensitive 파일시스템이므로 `DoDutch_server`와 `dodutch_server`가 같은 디렉토리로 취급됨
- 테스트 패키지는 반드시 `graduation.project.DoDutch_server`로 작성 (대문자 D 주의)
- 임의의 패키지명(예: `trip.converter`)으로 우회하지 말 것 — 반드시 프로덕션 코드와 동일한 패키지 사용
- 테스트 파일 생성 후 `package` 선언이 디렉토리 경로와 정확히 일치하는지 확인

### 네이밍
- `@DisplayName`에 한글 사용 (예: `"여행 생성 시 시작일이 종료일 이후면 예외 발생"`)
- 메서드명: `should_기대동작_when_조건` 패턴

### 구조
- Given-When-Then (Arrange-Act-Assert)
- `@BeforeEach`로 공통 셋업, 각 테스트 독립성 확보

### Spring 테스트 슬라이스 기준

| 대상 | 어노테이션 | 비고 |
|------|-----------|------|
| Controller | `@WebMvcTest` | MockMvc 사용, Security 설정 주의 |
| Repository | `@DataJpaTest` | H2 인메모리 DB |
| Service | `@ExtendWith(MockitoExtension.class)` | Spring 컨텍스트 로드 금지 |
| 통합 테스트 | `@SpringBootTest` | 최소한으로 사용 |

### 프로파일 규칙
- 모든 `@SpringBootTest`, `@DataJpaTest`, `@WebMvcTest` 클래스는 반드시 `@ActiveProfiles("test")` 추가
- `application-test.yml`이 활성화되지 않으면 환경변수 누락으로 컨텍스트 로딩 실패

### Mocking 규칙
- BDDMockito 스타일: `given(...).willReturn(...)`
- 외부 의존성만 목킹 (Repository, 외부 API 클라이언트)
- 도메인 객체(Entity, DTO)는 실제 인스턴스 사용
- 외부 API(카카오, 네이버 CLOVA, OpenAI, AWS S3, KakaoPay)는 반드시 목킹

### 금지 사항
- `@Autowired` 필드 주입 (→ 생성자 주입 또는 `@Mock`/`@InjectMocks`)
- `Thread.sleep()` (→ 비동기 대기 필요 시 Awaitility 도입)
- 테스트 통과시키려고 프로덕션 코드 수정
- 허술한 assertion (`isNotNull`만 사용 등)
- 테스트에서 `@Transactional` 사용 (테스트 격리 오염)

### 커버리지 목표
- Line 80%, Branch 70%
21 changes: 21 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,24 @@ commit message는 `[Type] 작성 내용` 으로 통일하기
### 📋 Issue 및 Branch 생성 Rule
Issue로 코드 작성 관련 설명 작성 후, Issue Branch 생성하고 작업하기
참고 자료 🔗 https://codesyun.tistory.com/entry/Git-Issue-%EB%B0%8F-Issue-Branch-%EC%83%9D%EC%84%B1%ED%95%98%EC%97%AC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0

### 🧪 AI 테스트 자동 생성

Claude Code를 활용한 AI 기반 테스트 자동 생성 도구입니다.

**사전 조건**
- [Claude Code CLI](https://docs.anthropic.com/en/docs/claude-code) 설치 필요
- Anthropic API 키 설정 필요

**실행 방법**
```bash
./gradlew aiTest
```

**동작 과정**
1. 테스트 대상 선택 (파일 경로 / 자연어 설명 / git diff)
2. AI가 테스트 계획서 생성
3. 사용자가 계획 검토/승인
4. AI가 테스트 코드 생성 및 실행/검증

**참고**: 개인 API 비용이 발생합니다. 계획 생성 $0.50, 테스트 생성 $3.00 예산 제한이 설정되어 있습니다.
15 changes: 15 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ dependencies {
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'com.h2database:h2'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-webflux'
Expand All @@ -50,3 +51,17 @@ dependencies {
tasks.named('test') {
useJUnitPlatform()
}

tasks.register('aiTest', Exec) {
group = 'verification'
description = 'AI 기반 테스트 생성 및 실행'
workingDir = project.projectDir
commandLine 'bash', 'scripts/ai-test.sh'
standardInput = System.in
// Gradle 데몬은 stdin을 제대로 전달하지 못하므로 --no-daemon 필요
doFirst {
if (gradle.startParameter.noDaemon == false) {
logger.warn('⚠️ 대화형 입력을 위해 ./gradlew aiTest --no-daemon 으로 실행하세요.')
}
}
}
Loading
Loading