diff --git a/.claude/rules/naming.md b/.claude/rules/naming.md new file mode 100644 index 0000000..c1b6949 --- /dev/null +++ b/.claude/rules/naming.md @@ -0,0 +1,60 @@ +# Java 네이밍 규칙 + +## 패키지 +- 모두 소문자, 단수형 +- 도메인 역순: `com.gcsc.프로젝트명.모듈` +- 예: `com.gcsc.batch.scheduler`, `com.gcsc.api.auth` + +## 클래스 +- PascalCase +- 명사 또는 명사구 +- 접미사로 역할 표시: + +| 계층 | 접미사 | 예시 | +|------|--------|------| +| Controller | `Controller` | `UserController` | +| Service | `Service` | `UserService` | +| Service 구현 | `ServiceImpl` | `UserServiceImpl` (인터페이스 있을 때만) | +| Repository | `Repository` | `UserRepository` | +| Entity | (없음) | `User`, `ShipRoute` | +| DTO 요청 | `Request` | `CreateUserRequest` | +| DTO 응답 | `Response` | `UserResponse` | +| 설정 | `Config` | `SecurityConfig` | +| 예외 | `Exception` | `UserNotFoundException` | +| Enum | (없음) | `UserStatus`, `ShipType` | +| Mapper | `Mapper` | `UserMapper` | + +## 메서드 +- camelCase +- 동사로 시작 +- CRUD 패턴: + +| 작업 | Controller | Service | Repository | +|------|-----------|---------|------------| +| 조회(단건) | `getUser()` | `getUser()` | `findById()` | +| 조회(목록) | `getUsers()` | `getUsers()` | `findAll()` | +| 생성 | `createUser()` | `createUser()` | `save()` | +| 수정 | `updateUser()` | `updateUser()` | `save()` | +| 삭제 | `deleteUser()` | `deleteUser()` | `deleteById()` | +| 존재확인 | - | `existsUser()` | `existsById()` | + +## 변수 +- camelCase +- 의미 있는 이름 (단일 문자 변수 금지, 루프 인덱스 `i, j, k` 예외) +- boolean: `is`, `has`, `can`, `should` 접두사 + - 예: `isActive`, `hasPermission`, `canDelete` + +## 상수 +- UPPER_SNAKE_CASE +- 예: `MAX_RETRY_COUNT`, `DEFAULT_PAGE_SIZE` + +## 테스트 +- 클래스: `{대상클래스}Test` (예: `UserServiceTest`) +- 메서드: `{메서드명}_{시나리오}_{기대결과}` 또는 한국어 `@DisplayName` + - 예: `createUser_withDuplicateEmail_throwsException()` + - 예: `@DisplayName("중복 이메일로 생성 시 예외 발생")` + +## 파일/디렉토리 +- Java 파일: PascalCase (클래스명과 동일) +- 리소스 파일: kebab-case (예: `application-local.yml`) +- SQL 파일: `V{번호}__{설명}.sql` (Flyway) 또는 kebab-case