- CollectDB 다중 신호 수집 → S&P Global AIS API 단일 수집으로 전환 - sig_src_cd + target_id 이중 식별자 → mmsi(VARCHAR) 단일 식별자 - t_vessel_latest_position → t_ais_position 테이블 전환 - 레거시 배치/유틸 ~30개 클래스 삭제 (VesselAggregationJobConfig, ShipKindCodeConverter 등) - AisTargetCacheManager 기반 캐시 이중 구조 (최신위치 + 트랙 버퍼) - CacheBasedVesselTrackDataReader + CacheBasedTrackJobListener 신규 추가 - VesselStaticStepConfig: 정적정보 CDC 변경 검출 + hourly job 편승 - SignalKindCode enum: vesselType/extraInfo 기반 선종 자동 분류 - WebSocket/STOMP 전체 mmsi 전환 (StompTrackStreamingService ~40곳) - 모니터링/성능 최적화 코드 mmsi 기반 전환 - DataSource 설정 통합 (snpdb 단일 DB) - AreaBoundaryCache Polygon→Geometry 캐스트 수정 (MULTIPOLYGON 지원) - ConcurrentHashMap 적용 (VesselTrackStepConfig 동시성 버그 수정) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2.6 KiB
2.6 KiB
Java 코드 스타일 규칙
일반
- Java 17+ 문법 사용 (record, sealed class, pattern matching, text block 활용)
- 들여쓰기: 4 spaces (탭 사용 금지)
- 줄 길이: 120자 이하
- 파일 끝에 빈 줄 추가
클래스 구조
클래스 내 멤버 순서:
- static 상수 (public → private)
- 인스턴스 필드 (public → private)
- 생성자
- public 메서드
- protected/package-private 메서드
- private 메서드
- 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와 함께 사용)
로깅
@Slf4j(Lombok) 로거 사용- SLF4J
{}플레이스홀더에 printf 포맷 사용 금지 ({:.1f},{:d},{%s}등) - 숫자 포맷이 필요하면
String.format()으로 변환 후 전달// 잘못됨 log.info("처리율: {:.1f}%", rate); // 올바름 log.info("처리율: {}%", String.format("%.1f", rate)); - 예외 로깅 시 예외 객체는 마지막 인자로 전달 (플레이스홀더 불필요)
log.error("처리 실패: {}", id, exception);
예외 처리
- 비즈니스 예외는 커스텀 Exception 클래스 정의
@ControllerAdvice로 전역 예외 처리- 예외 메시지에 컨텍스트 정보 포함
- catch 블록에서 예외 무시 금지 (
// ignore금지)
기타
Optional은 반환 타입으로만 사용 (필드, 파라미터에 사용 금지)null반환보다 빈 컬렉션 또는Optional반환- Stream API 활용 (단, 3단계 이상 체이닝은 메서드 추출)
- 하드코딩된 문자열/숫자 금지 → 상수 또는 설정값으로 추출