feat: Gitea 팀 프로젝트 워크플로우 구조 적용
- .claude/rules/: 팀 정책, Git 워크플로우, 코드 스타일, 네이밍, 테스트 규칙
- .claude/skills/: init-project, sync-team-workflow, create-mr, fix-issue
- .claude/settings.json: deny 규칙 + hooks
- .claude/workflow-version.json: v1.2.0 적용
- .githooks/: commit-msg(grep -P→-E macOS 호환), pre-commit, post-checkout
- .editorconfig, .sdkmanrc, .mvn/settings.xml (Nexus 미러)
- .gitignore: .claude/ 팀 파일 추적 전환
- CLAUDE.md: 프로젝트 루트로 이동
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 22:00:24 +09:00
|
|
|
# Java 코드 스타일 규칙
|
|
|
|
|
|
|
|
|
|
## 일반
|
|
|
|
|
- Java 17+ 문법 사용 (record, sealed class, pattern matching, text block 활용)
|
|
|
|
|
- 들여쓰기: 4 spaces (탭 사용 금지)
|
|
|
|
|
- 줄 길이: 120자 이하
|
|
|
|
|
- 파일 끝에 빈 줄 추가
|
|
|
|
|
|
|
|
|
|
## 클래스 구조
|
|
|
|
|
클래스 내 멤버 순서:
|
|
|
|
|
1. static 상수 (public → private)
|
|
|
|
|
2. 인스턴스 필드 (public → private)
|
|
|
|
|
3. 생성자
|
|
|
|
|
4. public 메서드
|
|
|
|
|
5. protected/package-private 메서드
|
|
|
|
|
6. private 메서드
|
|
|
|
|
7. inner class/enum
|
|
|
|
|
|
|
|
|
|
## Spring Boot 규칙
|
|
|
|
|
|
|
|
|
|
### 계층 구조
|
|
|
|
|
- Controller → Service → Repository 단방향 의존
|
|
|
|
|
- Controller에 비즈니스 로직 금지 (요청/응답 변환만)
|
|
|
|
|
- Service 계층 간 순환 참조 금지
|
|
|
|
|
- Repository에 비즈니스 로직 금지
|
|
|
|
|
|
|
|
|
|
### DTO와 Entity 분리
|
|
|
|
|
- API 요청/응답에 Entity 직접 사용 금지
|
|
|
|
|
- DTO는 record 또는 불변 클래스로 작성
|
|
|
|
|
- DTO ↔ Entity 변환은 매퍼 클래스 또는 팩토리 메서드 사용
|
|
|
|
|
|
|
|
|
|
### 의존성 주입
|
|
|
|
|
- 생성자 주입 사용 (필드 주입 `@Autowired` 사용 금지)
|
|
|
|
|
- 단일 생성자는 `@Autowired` 어노테이션 생략
|
|
|
|
|
- Lombok `@RequiredArgsConstructor` 사용 가능
|
|
|
|
|
|
|
|
|
|
### 트랜잭션
|
|
|
|
|
- `@Transactional` 범위 최소화
|
|
|
|
|
- 읽기 전용: `@Transactional(readOnly = true)`
|
|
|
|
|
- Service 메서드 레벨에 적용 (클래스 레벨 지양)
|
|
|
|
|
|
|
|
|
|
## Lombok 규칙
|
|
|
|
|
- `@Getter`, `@Setter` 허용 (Entity에서 Setter는 지양)
|
|
|
|
|
- `@Builder` 허용
|
|
|
|
|
- `@Data` 사용 금지 (명시적으로 필요한 어노테이션만)
|
|
|
|
|
- `@AllArgsConstructor` 단독 사용 금지 (`@Builder`와 함께 사용)
|
2026-02-19 07:29:15 +09:00
|
|
|
|
|
|
|
|
## 로깅
|
|
|
|
|
- `@Slf4j` (Lombok) 로거 사용
|
|
|
|
|
- SLF4J `{}` 플레이스홀더에 printf 포맷 사용 금지 (`{:.1f}`, `{:d}`, `{%s}` 등)
|
|
|
|
|
- 숫자 포맷이 필요하면 `String.format()`으로 변환 후 전달
|
|
|
|
|
```java
|
|
|
|
|
// 잘못됨
|
|
|
|
|
log.info("처리율: {:.1f}%", rate);
|
|
|
|
|
// 올바름
|
|
|
|
|
log.info("처리율: {}%", String.format("%.1f", rate));
|
|
|
|
|
```
|
|
|
|
|
- 예외 로깅 시 예외 객체는 마지막 인자로 전달 (플레이스홀더 불필요)
|
|
|
|
|
```java
|
|
|
|
|
log.error("처리 실패: {}", id, exception);
|
|
|
|
|
```
|
feat: Gitea 팀 프로젝트 워크플로우 구조 적용
- .claude/rules/: 팀 정책, Git 워크플로우, 코드 스타일, 네이밍, 테스트 규칙
- .claude/skills/: init-project, sync-team-workflow, create-mr, fix-issue
- .claude/settings.json: deny 규칙 + hooks
- .claude/workflow-version.json: v1.2.0 적용
- .githooks/: commit-msg(grep -P→-E macOS 호환), pre-commit, post-checkout
- .editorconfig, .sdkmanrc, .mvn/settings.xml (Nexus 미러)
- .gitignore: .claude/ 팀 파일 추적 전환
- CLAUDE.md: 프로젝트 루트로 이동
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 22:00:24 +09:00
|
|
|
|
|
|
|
|
## 예외 처리
|
|
|
|
|
- 비즈니스 예외는 커스텀 Exception 클래스 정의
|
|
|
|
|
- `@ControllerAdvice`로 전역 예외 처리
|
|
|
|
|
- 예외 메시지에 컨텍스트 정보 포함
|
|
|
|
|
- catch 블록에서 예외 무시 금지 (`// ignore` 금지)
|
|
|
|
|
|
|
|
|
|
## 기타
|
|
|
|
|
- `Optional`은 반환 타입으로만 사용 (필드, 파라미터에 사용 금지)
|
|
|
|
|
- `null` 반환보다 빈 컬렉션 또는 `Optional` 반환
|
|
|
|
|
- Stream API 활용 (단, 3단계 이상 체이닝은 메서드 추출)
|
|
|
|
|
- 하드코딩된 문자열/숫자 금지 → 상수 또는 설정값으로 추출
|