diff --git a/.claude/settings.json b/.claude/settings.json index 8a9b0cd..0f4c35b 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -26,7 +26,9 @@ "Bash(git show *)", "Bash(git tag *)", "Bash(curl -s *)", - "Bash(sdk *)" + "Bash(sdk *)", + "Bash(chmod +x *)", + "Bash(bash .claude/scripts/*)" ], "deny": [ "Bash(git push --force*)", @@ -46,5 +48,42 @@ "Read(./**/application-local.yml)", "Read(./**/application-local.properties)" ] + }, + "hooks": { + "SessionStart": [ + { + "matcher": "compact", + "hooks": [ + { + "type": "command", + "command": "bash .claude/scripts/on-post-compact.sh", + "timeout": 10 + } + ] + } + ], + "PreCompact": [ + { + "hooks": [ + { + "type": "command", + "command": "bash .claude/scripts/on-pre-compact.sh", + "timeout": 30 + } + ] + } + ], + "PostToolUse": [ + { + "matcher": "Bash", + "hooks": [ + { + "type": "command", + "command": "bash .claude/scripts/on-commit.sh", + "timeout": 15 + } + ] + } + ] } } diff --git a/.claude/workflow-version.json b/.claude/workflow-version.json new file mode 100644 index 0000000..a1d074a --- /dev/null +++ b/.claude/workflow-version.json @@ -0,0 +1,6 @@ +{ + "applied_global_version": "1.6.1", + "applied_date": "2026-03-23", + "project_type": "java-maven", + "gitea_url": "https://gitea.gc-si.dev" +} diff --git a/.githooks/commit-msg b/.githooks/commit-msg old mode 100644 new mode 100755 diff --git a/.githooks/post-checkout b/.githooks/post-checkout old mode 100644 new mode 100755 diff --git a/.githooks/pre-commit b/.githooks/pre-commit old mode 100644 new mode 100755 diff --git a/CLAUDE.md b/CLAUDE.md index 3bcad04..a149881 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,17 +1,21 @@ # 프로젝트 개요 -- **타입**: Java + Spring Boot + Maven -- **JDK**: 17 (`.sdkmanrc` 참조) -- **프레임워크**: Spring Boot +- **프로젝트명**: SNP Sync Batch +- **타입**: Java + Spring Boot + Spring Batch + Maven +- **설명**: S&P Global 해양 데이터를 API로 수집하여 PostgreSQL에 동기화하는 배치 시스템 (Web GUI 포함) +- **JDK**: 17 (`.sdkmanrc` 참조, 17.0.18-amzn) +- **프레임워크**: Spring Boot 3.2.1, Spring Batch 5.1.0, Quartz 2.5.0 - **빌드 도구**: Maven (Maven Wrapper 사용) +- **DB**: PostgreSQL (dual datasource: batch-meta + business) +- **프론트엔드**: React (frontend-maven-plugin으로 빌드 통합) ## 빌드 및 실행 ```bash -# 빌드 -./mvnw clean compile +# 빌드 (백엔드만) +./mvnw clean compile -DskipTests -# 패키징 +# 전체 패키징 (프론트엔드 포함) ./mvnw clean package -DskipTests # 테스트 @@ -20,7 +24,7 @@ # 특정 테스트 클래스 실행 ./mvnw test -Dtest=클래스명 -# 로컬 실행 +# 로컬 실행 (포트 8051, context-path: /snp-sync) ./mvnw spring-boot:run # 린트 (Checkstyle 설정된 경우) @@ -33,21 +37,48 @@ src/ ├── main/ │ ├── java/ -│ │ └── com/gcsc/{프로젝트}/ -│ │ ├── config/ # 설정 클래스 -│ │ ├── controller/ # REST 컨트롤러 -│ │ ├── service/ # 비즈니스 로직 -│ │ ├── repository/ # 데이터 접근 -│ │ ├── domain/ # 엔티티 -│ │ ├── dto/ # 데이터 전송 객체 -│ │ ├── exception/ # 예외 처리 -│ │ └── util/ # 유틸리티 +│ │ └── com/snp/batch/ +│ │ ├── SnpBatchApplication.java # 메인 클래스 +│ │ ├── common/ +│ │ │ ├── batch/ # 배치 공통 (Base 클래스들) +│ │ │ │ ├── config/ # BaseJobConfig +│ │ │ │ ├── entity/ # BaseEntity +│ │ │ │ ├── processor/ # BaseProcessor +│ │ │ │ ├── reader/ # BaseApiReader +│ │ │ │ ├── repository/ # BaseJdbcRepository +│ │ │ │ └── writer/ # BaseWriter, BaseChunkedWriter +│ │ │ ├── util/ # 유틸리티 (EntityUtils, CommonSql 등) +│ │ │ └── web/ # 웹 공통 (BaseController, BaseService) +│ │ ├── jobs/datasync/batch/ # 동기화 배치 Job 모듈 +│ │ │ ├── code/ # 코드 동기화 (Stat5Code, FlagCode) +│ │ │ ├── compliance/ # 컴플라이언스 동기화 +│ │ │ ├── facility/ # 시설/항구 동기화 +│ │ │ ├── movement/ # 선박 이동 동기화 +│ │ │ ├── psc/ # PSC 검사 동기화 +│ │ │ └── ... # ship, event, risk 등 +│ │ └── scheduler/ # Quartz 스케줄러 │ └── resources/ -│ ├── application.yml # 공통 설정 -│ ├── application-local.yml # 로컬 설정 (.gitignore) -│ └── application-prod.yml # 운영 설정 -└── test/ - └── java/ # 테스트 코드 +│ ├── application.yml # 공통 설정 +│ ├── application-dev.yml # 개발 설정 +│ ├── application-prod.yml # 운영 설정 +│ └── application-local.yml # 로컬 설정 (.gitignore) +├── test/ +│ └── java/ # 테스트 코드 +└── frontend/ # React 프론트엔드 +``` + +## 배치 Job 구조 패턴 + +각 도메인 모듈은 동일한 구조를 따름: +``` +jobs/datasync/batch/{도메인}/ +├── config/ # JobConfig (Step, Job 정의) +├── dto/ # API 응답 DTO +├── entity/ # DB Entity +├── reader/ # ItemReader (API 호출) +├── processor/ # ItemProcessor (DTO → Entity 변환) +├── repository/ # JdbcRepository (SQL 직접 사용) +└── writer/ # ItemWriter (DB 저장) ``` ## 팀 규칙 diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw?