hwss-investigation-agent-backend · 커밋 f1034441 · 2026-09-15 17:57 KST 빌드
HWSS 백엔드 가이드
폴더(모듈 → 패키지) 단위로 무엇이 있는지와 파일마다 맡은 역할을 정리했습니다. 역할 문장은 각 클래스의 Javadoc 첫 문장을 옮겼고, 주석이 없는 파일은 이름 규칙으로 보충했습니다. 파일 이름을 누르면 GitHub 소스로 가고, 최근 변경된 파일은 강조됩니다. 컨트롤러 행에는 그 API 를 부르는 프론트 화면이 연결됩니다. 코드에 쓰인 W·N·ST·DP 번호는 주말·야간 작업 플랜의 항목 번호, S-00x 는 docs/specs 스펙 번호입니다. 섹션 제목 옆 말풍선으로 댓글을, 이슈 버튼으로 GitHub 이슈를 남길 수 있습니다.
모듈 계층과 의존 방향
base공통 응답·예외·인증 골격·포트 인터페이스<domain>-sharedDTO·enum 계약 (base 에만 의존)<domain>-core엔티티·저장소·서비스·컨트롤러·마이그레이션 (base + 자기 shared)apps/hwss-api전부 조합해 실행
도메인 core 끼리는 직접 의존할 수 없어서, 서로 부를 때는 base 의 *Port 인터페이스를 거치고 구현체는 각 모듈의 integration/·port/ 패키지에 둡니다. 빌드의 verifyModuleDependencies 가 이 방향을 강제합니다.
패키지 이름이 뜻하는 것
- web/
- REST 컨트롤러
- service/
- 비즈니스 로직·트랜잭션
- entity/
- JPA 엔티티(테이블)
- repository/
- Spring Data 저장소
- exception/
- 도메인 예외·에러 코드
- config/
- hwss.* 설정 바인딩
- integration/
- base 포트 구현체
- dto/ · status/
- shared 계약·enum
시작하기
로컬 실행 · Swagger
JDK 17 이상 · Docker 필요 · 모든 명령은 hwss-investigation-agent-backend/ 에서 실행
접속 주소
http://localhost:8080/swagger-ui.html
OpenAPI JSONhttp://localhost:8080/v3/api-docs
헬스 체크http://localhost:8080/actuator/health
메트릭http://localhost:8080/actuator/prometheus
http://localhost:8080/api/v1/… — 포트는 server.port: 8080Swagger UI 는 /swagger-ui/index.html 로 이동해 열립니다. Swagger 와 api-docs 경로는 세션 없이 열리고, 문서의 서버 주소는 같은 오리진(/)으로 고정돼 있어 “Try it out” 이 지금 연 호스트로 요청을 보냅니다.
Swagger 에서 로그인이 필요한 API 부르기
조사자·관리자 API 는 세션 쿠키가 없으면 401 입니다. Swagger 에서 먼저 로그인하면 브라우저가 httpOnly 쿠키를 저장해 이후 요청에 자동으로 붙입니다.
# auth-controller → POST /api/v1/auth/login { "employeeNo": "H2016-0071", "password": "devpass" }
H2016-0071 은 마이그레이션이 넣어 두는 시드 시스템 관리자이고, 비밀번호는 기동 때 준 AUTH_LOCAL_PASSWORD 값입니다. 이 로그인은 local 프로필에서만 동작합니다.
세션이 필요한 경로: investigation-reports · collections · collection-approvals · users · roles · admin/mail-account · admin/statistics · menu-permissions/my · auth/me · auth/onboarding (application.yml hwss.auth.protected-path-patterns). 이미지시스템 수신 API 는 시스템 간 호출이라 세션이 필요 없습니다.
1PostgreSQL 띄우기
docker compose up -d # postgres:16 · DB/계정/비밀번호 모두 hwss · 5432
5432 를 다른 PostgreSQL 이 쓰고 있으면(role "hwss" does not exist) 컨테이너를 5433 으로 띄우고 기동 명령에 DB_URL=jdbc:postgresql://localhost:5433/hwss 를 더합니다. 테이블은 앱이 기동하면서 Flyway 로 만듭니다.
2 서버 기동 — bootRun
DB_PASSWORD=hwss \ AUTH_JWT_SECRET=local-dev-only-secret-key-32bytes-min \ AUTH_LOCAL_PASSWORD=devpass \ SPRING_PROFILES_ACTIVE=local \ ./gradlew :hwss-api:bootRun
$env:DB_PASSWORD="hwss" $env:AUTH_JWT_SECRET="local-dev-only-secret-key-32bytes-min" $env:AUTH_LOCAL_PASSWORD="devpass" $env:SPRING_PROFILES_ACTIVE="local" .\gradlew.bat :hwss-api:bootRun
로그에 Successfully applied … migrations 와 Started HwssApiApplication 이 보이면 성공입니다. DB_PASSWORD·AUTH_JWT_SECRET 은 기본값이 일부러 없어서 빠뜨리면 기동이 실패합니다. 프로필은 --args='--spring.profiles.active=local' 로 줘도 같습니다.
환경변수
DB_PASSWORD필수 | DB 비밀번호. 로컬 compose 는 hwss. |
AUTH_JWT_SECRET필수 | 세션 JWT 서명 키 — 32바이트 이상 아무 문자열(로컬 전용 값). |
SPRING_PROFILES_ACTIVE=local | 개발용 로그인 스텁(LocalDevIdentityProvider)을 켠다. 없으면 로그인 불가. |
AUTH_LOCAL_PASSWORD | local 프로필 공용 로그인 비밀번호. 비우면 로그인 자체가 막힌다. |
DB_URL · DB_USERNAME | 기본 jdbc:postgresql://localhost:5432/hwss · hwss. |
IMAGE_INCOMING_ROOT | 이미지시스템과 공유하는 ZIP 수신 폴더(기본 runtime/incoming). 이미지시스템 데모와 같은 절대 경로여야 API-02 가 동작. |
IMAGE_PROCESSING_ROOT | ZIP 압축 해제·낱장 파일 처리 폴더(기본 runtime/image-processing). |
COLLECTION_STORAGE_ROOT | 지식컬렉션 업로드 파일 저장 폴더(기본 runtime/collections). |
AI_PLATFORM_PROVIDER | none(기본, in-memory) 또는 studio(업스테이지 Studio 접속 설정 필요). |
MAIL_ENABLED | SMTP 발송 켜기(기본 false). 켜면 MAIL_HOST·MAIL_USERNAME·MAIL_PASSWORD·MAIL_FROM 등이 필요. |
SMARTREVIEW_ENABLED | 스마트심사 오라클 사용자·조직 라이브 조회(기본 false). |
AUTH_CREDENTIAL_ENABLED | 개인별 임시 비밀번호 로그인(기본 false). 켜면 local 공용 비밀번호보다 우선. |
자주 쓰는 Gradle 명령
./gradlew :hwss-api:bootRun | 서버 기동 (위 환경변수와 함께). |
./gradlew build | 전체 빌드 — 테스트 · spotlessCheck · verifyModuleDependencies · JaCoCo 리포트까지 한 번에. |
./gradlew test | 전체 테스트. DB·Docker 없이 H2(PostgreSQL 호환 모드)로 돈다. |
./gradlew :investigation-core:test --tests '*SummaryResultServiceTest' | 모듈 하나·테스트 클래스 하나만 실행. |
./gradlew spotlessApply | 포맷 자동 수정. 검사만은 spotlessCheck (위반 시 빌드 실패). |
./gradlew verifyModuleDependencies | core 끼리 직접 의존 같은 모듈 경계 위반 검사. |
./gradlew coverageSummary | 모듈별 커버리지 표 — build/reports/jacoco/coverage-summary.md. 빌드를 실패시키지 않는 보고 전용. |
./gradlew :hwss-api:exportOpenApiSpec | openapi/openapi.json 스냅샷 갱신(서버·DB 불필요). 이어서 프론트에서 pnpm openapi:gen 을 같은 PR 에 커밋. |
./gradlew :hwss-api:bootJar | 실행 jar 생성 — Dockerfile 이 쓰는 것과 같은 산출물. |
./gradlew --no-daemon spotlessCheck test verifyModuleDependencies | CI(Backend Harness)가 PR 마다 돌리는 명령과 동일. |
Windows 는 ./gradlew 대신 .\gradlew.bat. 더 자세한 절차(프론트·이미지시스템 데모 함께 띄우기)는 docs/guides/local-dev-run-guide.md, .http 시나리오 실행은 docs/guides/api-http-testing-guide.md.
변경 추적
최근 변경
최근 14일 · PR 17건
dev 에 머지된 PR 중 이 가이드 범위의 파일을 바꾼 것입니다. 파일을 누르면 아래 해당 행으로 이동하고, 7일 이내에 바뀐 파일 행은 주황색으로 강조됩니다. PR 제목은 로그인하면 보입니다.
루트
hwss-investigation-agent-backend/GitHub
빌드·배포·로컬 실행에 필요한 루트 파일
build.gradle이력 | 빌드 | 루트 빌드 — 전 서브프로젝트에 Java 17·Spotless·JaCoCo 적용, 모듈 의존 방향 검증 태스크 verifyModuleDependencies, 커버리지 요약 태스크 coverageSummary. |
settings.gradle이력 | 빌드 | 모듈 등록과 projectDir 매핑 — base / <domain>-shared / <domain>-core / apps 계층과 의존 방향 규칙을 주석으로 설명한다. |
gradlew · gradlew.bat | 빌드 | Gradle Wrapper 실행 스크립트. |
gradle/wrapper/ | 빌드 | Wrapper jar 와 배포판 버전 지정 properties. |
Dockerfile이력 | 배포 | 2단 빌드 — JDK 에서 :hwss-api:bootJar 생성 → JRE 이미지에 certs/*.crt 를 JVM 신뢰 저장소로 등록하고 8080 으로 실행. |
.dockerignore이력 | 배포 | 이미지 빌드 컨텍스트에서 build 산출물·IDE 파일·문서를 뺀다. |
docker-compose.yml이력 | 로컬 | 로컬 개발용 PostgreSQL 16 (hwss/hwss) — 운영 구성이 아니다. |
README.md이력 | 문서 | 모듈 한 줄 소개. |
CLAUDE.md이력 | 문서 | Claude Code 작업 컨텍스트 — 모듈 구조, 빌드·테스트·로컬 실행 방법, 금지 사항. |
AGENTS.md이력 | 문서 | Codex 작업 지침 — 공통 패턴 우선 사용과 모듈 경계 규칙 요약. |
apps/
apps/hwss-api/GitHub
실행 앱
실행 앱 — 부팅 엔트리포인트. 필요한 core/shared 모듈을 전부 조합하고, 앱 설정·로컬 시드·통합(API) 테스트를 가진다.
api/1GitHub
앱 루트
HwssApiApplication.java이력 | 클래스 | Spring Boot 부팅 진입점 — 모든 core 모듈의 빈·엔티티·Flyway 경로를 한 앱으로 조합한다. |
api/config/1GitHub
앱 수준 설정 (OpenAPI 메타데이터).
OpenApiConfig.java이력 | 설정 | springdoc 이 생성하는 /v3/api-docs 문서의 메타데이터. |
빌드·리소스4GitHub
모듈 빌드 스크립트와 src/main/resources.
build.gradle이력 | 빌드 | 이 모듈의 의존성 선언 — base, code-shared, code-core, investigation-shared, investigation-core, workflow-shared, workflow-core, classification-shared, classification-core, smartreview-core, mail-core, organization-shared, organization-core, aiplatform-core, collection-shared, collection-core, audit-shared, audit-core 모듈 참조. |
application.yml이력어제 · #478 | 리소스 | 앱 전체 설정 — datasource·Flyway·백그라운드 풀·springdoc, 그리고 도메인별 hwss.* 블록(image-integration, image-system, collection, investigation, classification, extraction, statistics, ai-platform, smartreview, mail, organization, auth)과 actuator/prometheus 노출. |
db/local/R__local_seed_data.sql이력 | 리소스 | 로컬 전용 반복 실행 시드 — 개인 PC의 이미지 시스템 연동 테스트에 필요한 최소 위탁사 데이터 (PostgreSQL·H2 공용 문법). |
logback-spring.xml이력 | 리소스 | 로그 포맷 — 콘솔 패턴과 요청 상관관계 ID(MDC)를 담는 JSON 로그 설정. |
src/test/52GitHub
테스트 파일 — 펼쳐서 보기
src/test/52GitHubapi/classification/ClassificationMasterPersistenceTest.java이력6일 전 · #428 | 테스트 | API-06·API-07 이 실제 스키마(Flyway) 와 JPA 매핑 위에서 마스터를 영속화하는지 확인한다 — 유닛 테스트로는 잡히지 않는 영역이다 (docs/rules/testing.md): 엔티티 스캔, 컬럼/타입 매핑, document_types → customer_companies FK… |
api/classification/CustomerCompanyApiTest.java이력 | 테스트 | 위탁사 마스터 조회 API(N03)를 실제 HTTP 경계에서 확인한다 — 유닛 테스트로는 잡히지 않는 부분이다 (docs/rules/testing.md): 파생 쿼리(findByActiveTrueOrderBy…)가 실제 SQL 로 평가된 결과, 컨트롤러가 classification-core 에서… |
api/collection/CollectionApiScenarioTest.java이력 | 테스트 | http/collections.http 를 그대로 재생해 지식컬렉션 세로조각(N03~N06)을 검증한다. |
api/db/FlywayMigrationTest.java이력어제 · #466 | 테스트 | classpath 전체(db/migration)의 Flyway 마이그레이션이 실제로 순서대로 적용되고, S-007 §3 의 스키마가 만들어지는지 검증한다. |
api/guard/DtoSchemaNameGuardTest.java이력 | 테스트 | API 표면에 오르는 타입의 simple name 이 리포 전체에서 유일한지 지킨다. |
api/guard/ImageIntegrationHttpBodyGuardTest.java이력 | 테스트 | http/*.http 의 이미지시스템 연동 요청 본문이 계약 정본과 같은 필드명을 쓰는지 지킨다. |
api/guard/SourceTextGuardTest.java이력 | 테스트 | 소스 파일이 텍스트로 남아 있는지 지킨다. |
api/http/HttpScenarioFile.java이력 | 클래스 | http/*.http 시나리오 파일을 읽어 MockMvc 로 재생할 수 있는 형태로 옮긴다. |
api/http/HttpScenarioFileTest.java이력 | 테스트 | .http 시나리오 파서 자체의 회귀 테스트 (야간 플랜 20260821 Q1). |
api/investigation/AnalysisRequestApiTest.java이력 | 테스트 | W09 분석 요청의 저장·조회 왕복과 상태 전이를 실제 SQL 로 본다. |
api/investigation/ClassificationActionApiTest.java이력 | 테스트 | W07 분류 조치의 권한·상태 규칙이 실제 스택(세션 필터 → 컨트롤러 → 서비스 → SQL)에서도 그대로 걸리는지 본다. |
api/investigation/ClassificationResultApiTest.java이력7일 전 · #409 | 테스트 | W06 문서분류 결과 도메인의 세로조각 — 전송 접수(API-01·02)로 문서함이 채워진 뒤 분류 스텁 실행 → 결과 조회까지가 실제 SQL 로 도는지 본다. |
api/investigation/ClassificationStubE2eTest.java이력어제 · #466 | 테스트 | http/classification-stub-e2e.http 를 재생해 스텁 분류 → `미분류검출` → W07 조치 → `추출완료` 경로를 검증한다 (2026-09-03 야간 N02). |
api/investigation/ExtractionResultApiTest.java이력어제 · #466 | 테스트 | W08 정보추출 결과의 저장·조회 왕복을 실제 SQL 로 본다 (항목의 완료 조건). |
api/investigation/ImageIntegrationApiSmokeTest.java이력 | 테스트 | http/image-integration.http 를 그대로 재생해 API-01~07 의 실제 HTTP 응답을 검증한다. |
api/investigation/ImageReceptionE2eTest.java이력 | 테스트 | http/image-reception-e2e.http 를 재생해 이미지 접수 세로조각의 상태 전이를 검증한다 (P1-3). |
api/investigation/ImageReceptionZipFixture.java이력 | 클래스 | API-02(전송 완료 통지)가 존재와 SHA-256 을 검사할 ZIP 을 수신 폴더에 만든다. |
api/investigation/ImageTransferPersistenceTest.java이력6일 전 · #428 | 테스트 | 전송 접수가 실제 스키마(Flyway)와 JPA 매핑 위에서 동작하는지 확인한다 — 유닛 테스트로는 잡히지 않는 영역이다 (docs/rules/testing.md): 엔티티 스캔, 컬럼/타입 매핑, FK·CHECK 제약, 여러 모듈의 마이그레이션 순서, 그리고 investigation-core… |
api/investigation/InvestigationReportListApiTest.java이력7일 전 · #408 | 테스트 | 사고조사 목록 API(P1-1)를 실제 HTTP 경계에서 확인한다 — 유닛 테스트로 잡히지 않는 부분이다 (docs/rules/testing.md): 쿼리 파라미터 바인딩(enum 변환 포함), Specification 필터가 실제 SQL 로 평가된 결과, 정렬·페이지 경계, 세션 필터가 이 경… |
api/investigation/InvestigationWorkspaceApiTest.java이력 | 테스트 | P1-2 세로조각을 끝에서 끝까지 한 번에 확인한다 — 이미지시스템 전송 수신(API-01·02) → 조사자 목록 → 워크스페이스 상세. |
api/investigation/PipelineSeedE2eTest.java이력 | 테스트 | http/pipeline-seed.http 를 재생해 전 단계 보고서 세트 시드가 실제로 각 상태의 보고서를 만드는지 검증한다 (2026-09-03 야간 N03). |
api/investigation/ReportDraftApiTest.java이력 | 테스트 | W12 보고서 초안의 버전 증가·최신본 조회를 실제 SQL 로 본다 (항목의 완료 조건). |
api/investigation/ReportMailDispatchTransactionTest.java이력 | 테스트 | 발송 기록이 바깥 트랜잭션과 함께 롤백되지 않는지 본다 (야간 20260825 Q1 ②). |
api/investigation/ReportPageImageApiTest.java이력 | 테스트 | 페이지 이미지 서빙(2026-09-03 야간 N04) — 시드와 같은 1×1 PNG 를 API-01·02 로 접수한 뒤 GET /api/v1/investigation-reports/{reportNo}/pages/{sourcePageId}/image 가 그 바이트를 그대로 돌려주는지, 그리고 유닛… |
api/investigation/SummaryResultApiTest.java이력 | 테스트 | W10 요약 결과의 항목별 출처 복수 연결 왕복을 실제 SQL 로 본다 (항목의 완료 조건). |
api/investigation/SynchronousExtractionConfig.java이력 | 설정 | ZIP 압축 해제를 동기로 돌린다. |
api/investigation/WorkflowProgressApiTest.java이력 | 테스트 | W14 워크플로우 진행 상태 조회의 응답 스냅샷을 본다 (항목의 완료 조건). |
api/mail/MailAccountApiScenarioTest.java이력 | 테스트 | http/admin-mail-account.http 를 그대로 재생해 관리자 메일 발송 계정 API(N02)를 검증한다. |
api/mail/MailAccountConcurrentResetTest.java이력 | 테스트 | 동시 재설정 회귀 테스트 — 늦은 쪽이 조용히 이기지 않는다. |
api/mail/MailAccountPasswordPersistenceTest.java이력 | 테스트 | SMTP 대표 계정 비밀번호 저장소가 실제 스키마(Flyway) 와 JPA 매핑 위에서 동작하는지 확인한다 — 유닛 테스트로는 잡히지 않는 영역이다(docs/rules/testing.md): 엔티티 스캔, 단일 행 CHECK 제약, 컬럼 매핑, 그리고 mail-core 가 이 앱에 조립됐을 때… |
api/openapi/DemoContractsSyncTest.java이력 | 테스트 | 이미지시스템 데모 목서버의 계약 화면 명세(image-system-demo/backend/.../contracts.json)가 계약 정본(docs/specs/contracts/image-system-api.yaml)과 같은 엔드포인트 집합을 다루는지 검증한다. |
api/openapi/ImageSystemContractTest.java이력 | 테스트 | 이미지시스템 연동 API(API-01~07)가 협의된 계약 정본과 일치하는지 검증한다. |
api/openapi/OpenApiSnapshotTest.java이력 | 테스트 | OpenAPI 계약 스냅샷(openapi/openapi.json)이 현재 컨트롤러·DTO 와 일치하는지 검증한다. |
api/ops/ActuatorPrometheusExposureTest.java이력 | 테스트 | 시스템 관측 노출 회귀 (20260828 관측 스택 결정) — 프로메테우스 스크레이프 엔드포인트가 실제로 열려 있고 JVM 지표가 실려 나오는지 본다. |
api/ops/LogbackJsonFormatTest.java이력 | 테스트 | 로그 출력 형식 회귀 (20260828 관측 스택 결정 §2 — Loki). |
api/ops/RequestCorrelationApiTest.java이력 | 테스트 | 상관관계 ID 필터가 실제 서블릿 체인에 어떤 순서로 걸렸는지 보는 회귀 (20260828 관측 스택 결정 §2). |
api/organization/OrganizationPersistenceTest.java이력 | 테스트 | 조직 스키마·시드가 실제 마이그레이션과 JPA 매핑 위에서 동작하는지 확인한다 — 유닛 테스트로는 잡히지 않는 영역이다 (docs/rules/testing.md): 엔티티 스캔, 컬럼/타입 매핑, FK·CHECK 제약, 여러 모듈의 마이그레이션 순서, 그리고 시드가 실제로 적재되는지. |
api/organization/UserRoleApiScenarioTest.java이력 | 테스트 | http/user-roles.http 를 그대로 재생해 사용자 레벨 부여·회수 API(N01)를 검증한다. |
api/security/AuthApiTest.java이력 | 테스트 | 인증 골격이 실제 애플리케이션 조립 위에서 동작하는지 확인한다 — 유닛 테스트로는 잡히지 않는 영역이다 (docs/rules/testing.md): 필터가 서블릿 체인에 실제로 등록됐는지, local 프로필의 개발용 로그인 스텁이 organization 모듈의 UserAccountLookupPo… |
api/statistics/BusinessStatisticsApiTest.java이력7일 전 · #404 | 테스트 | 업무 통계 조회 API(ST03-B — S-007 §3-4 「조회 API」)를 실제 HTTP 경계 + H2 스키마 위에서 확인한다. |
api/statistics/LifecycleStatisticsApiTest.java이력어제 · #466 | 테스트 | 시스템 통계 조회 API(DP06 — S-007 §3-4 「생애주기 조회 API」)를 실제 HTTP 경계 + H2 스키마 위에서 확인한다. |
api/statistics/ReportLifecycleFactLoadIntegrationTest.java이력어제 · #466 | 테스트 | 생애주기 사실 적재(DP04)의 3지점을 실제 컨텍스트(커밋 후 이벤트·공용 풀·시퀀서·H2 스키마) 위에서 고정한다. |
api/statistics/ReportLifecycleFactPersistenceTest.java이력어제 · #466 | 테스트 | 생애주기 사실 테이블(DP03)의 엔티티·리포지토리가 실제 스키마(Flyway V202609110002) 위에서 영속화되는지 확인한다 — 유닛 테스트로는 잡히지 않는 영역이다(docs/rules/testing.md): 엔티티 스캔, 컬럼/타입/enum/boolean 매핑, report_no 유니… |
api/statistics/ReportStatFactLoadIntegrationTest.java이력7일 전 · #406 | 테스트 | 전송 완료 → 통계 사실 적재(ST02)의 세 완료 조건을 실제 컨텍스트(커밋 후 이벤트·공용 풀·H2 스키마) 위에서 고정한다. |
api/statistics/ReportStatFactPersistenceTest.java이력7일 전 · #406 | 테스트 | 통계 사실 테이블(ST01)의 엔티티·리포지토리가 실제 스키마(Flyway V202609030005) 위에서 영속화되는지 확인한다 — 유닛 테스트로는 잡히지 않는 영역이다(docs/rules/testing.md): 엔티티 스캔, 컬럼/타입/enum 매핑, 부모 경유 cascade, report_… |
api/statistics/StatDailyRollupIntegrationTest.java이력7일 전 · #403 | 테스트 | 적재 직후 일별 롤업 증분 갱신(ST03-A)의 완료 조건 다섯을 실제 컨텍스트(커밋 후 이벤트·공용 풀·H2 스키마) 위에서 고정한다. |
api/statistics/StatUnmappedQueueApiTest.java이력7일 전 · #406 | 테스트 | 미매핑 큐·차원 마스터 관리자 API(ST05-A — S-007 §3-4 「미매핑 큐 API」)의 완료 조건을 실제 HTTP 경계 + H2 스키마 위에서 고정한다. |
api/statistics/StatisticsBackfillApiTest.java이력7일 전 · #405 | 테스트 | 재적재 명령 API(ST04 — S-007 §3-4 「재적재 명령」)의 완료 조건을 실제 HTTP 경계 + H2 스키마 위에서 고정한다. |
api/support/H2TestDatasource.java이력 | 클래스 | 컨텍스트를 띄우는 테스트가 쓰는 H2 PostgreSQL 호환 모드 데이터소스 설정. |
api/support/RepoRoot.java이력 | 클래스 | 테스트가 리포 안의 파일을 가리킬 때 쓰는 단일 기준점. |
api/support/RepoRootTest.java이력 | 테스트 | RepoRoot 자체의 동작을 지킨다. |
api/workflow/WorkflowDefinitionOrderingTest.java이력 | 테스트 | 워크플로우 정의를 단계까지 함께 읽을 때 순서가 seq_no 오름차순인지 본다. |
modules/ · 공통
modules/base/GitHub
공통 기반
공통 기반 — 모든 모듈의 최하위 계층. 표준 응답·전역 예외·인증(JWT 쿠키) 골격, 그리고 도메인끼리 Gradle 의존 없이 서로 부르게 하는 포트 인터페이스를 둔다. 다른 모듈에 의존하지 않는다.
ai/11GitHub
외부 AI 플랫폼(벡터 컬렉션·인덱싱·검색) 포트와 값 객체.
VectorCollectionCreateCommand.java이력 | DTO | VectorCollectionPort#create 입력. |
VectorDocumentIndexCommand.java이력 | DTO | VectorDocumentPort#requestIndexing 입력. |
VectorSearchHit.java이력 | DTO | 검색 결과 한 건. |
VectorIndexingStatus.java이력 | enum | 문서 인덱싱 진행 상태. |
VectorCollectionRef.java이력 | record | 플랫폼에 만들어진 컬렉션 한 개에 대한 참조. |
VectorDocumentRef.java이력 | record | 플랫폼에 인덱싱 요청된 문서 한 건에 대한 참조. |
VectorSearchQuery.java이력 | record | VectorSearchPort#search 입력. |
VectorStoreException.java이력 | 예외 | AI 플랫폼 벡터 저장소 연동 실패. |
VectorCollectionPort.java이력 | 포트 | 외부 AI 플랫폼의 벡터 컬렉션(지식컬렉션 1개에 대응하는 저장 단위) 수명주기 포트. |
VectorDocumentPort.java이력 | 포트 | 컬렉션에 담긴 문서의 인덱싱(벡터화) 요청·상태 조회·제거 포트. |
VectorSearchPort.java이력 | 포트 | 선택된 컬렉션 집합을 대상으로 하는 검색 포트. |
audit/6GitHub
감사 원장 적재 포트와 값 객체.
AuditEventCommand.java이력 | DTO | 원장에 남길 행위 한 건. |
AuditEventType.java이력 | enum | 감사 원장에 남는 행위의 갈래 (야간 플랜 20260824 N04). |
AuditOutcome.java이력 | enum | 기록된 행위의 처리 결과. |
AuditTargetType.java이력 | enum | 행위가 가리키는 대상(작업 항목)의 갈래. |
AuditActor.java이력 | record | 행위자 — "누가 했는가". |
AuditTrailPort.java이력 | 포트 | 감사 원장 적재 포트 (야간 플랜 20260824 N04). |
classification/3GitHub
위탁사·분류 마스터 포트.
ModelMappingStatus.java이력 | enum | 이미지시스템 폴더 분류와 AI Agent 낱장 분류 사이의 매핑 진행 상태다 (S-003 API-07). |
CustomerCompanyLookupPort.java이력 | 포트 | 영속 위탁사 마스터의 사용 여부를 읽는 포트다. |
ImageMasterSyncPort.java이력 | 포트 | 이미지시스템이 보내는 위탁사·문서분류 마스터 전체 목록을 영속 마스터에 반영하는 포트다. |
commoncode/1GitHub
공통 코드 조회 포트.
CommonCodeLookupPort.java이력 | 포트 | 다른 도메인이 공통 코드 값을 조회/검증해야 할 때 쓰는 포트(인터페이스). |
exception/2GitHub
BusinessException 하위 도메인 예외 — 에러 코드와 HTTP 상태를 정한다.
BusinessException.java이력 | 예외 | 도메인 모듈에서 발생하는 처리 가능한 예외의 공통 상위 타입. |
GlobalExceptionHandler.java이력 | 핸들러 | ResponseEntityExceptionHandler 를 상속해 Spring MVC 가 던지는 4xx 예외 (검증 실패, 잘못된 요청 본문, 지원하지 않는 메서드 등)는 원래 상태 코드를 그대로 유지한다. |
file/2GitHub
ZIP 처리 유틸.
ZipProcessingException.java이력 | 예외 | ZIP 무결성 계산 또는 안전한 압축 해제에 실패했음을 나타낸다. |
ZipArchiveProcessor.java이력 | 클래스 | ZIP SHA-256 계산과 경로 탈출을 막는 안전한 압축 해제 유틸. |
mail/3GitHub
아웃바운드 메일 포트.
OutboundMail.java이력 | record | 발송할 메일 한 건. |
MailDeliveryException.java이력 | 예외 | 메일 발송 실패 (접속·TLS·인증·전송). |
MailDeliveryPort.java이력 | 포트 | 아웃바운드 메일 발송 포트. |
observability/5GitHub
요청 상관관계 ID·MDC 전파·외부 호출 계측.
ExternalCallMetrics.java이력 | DTO | 외부 시스템으로 나가는 호출 하나의 성패·지연을 남기는 공통 계측 헬퍼 (docs/decisions/20260828-observability-stack.md §2 가 관측의 이유로 든 "외부 연동 장애 분석"). |
ObservabilityConfig.java이력 | 설정 | 시스템 관측 빈 구성 (docs/decisions/20260828-observability-stack.md). |
MdcPropagation.java이력 | 클래스 | MDC(로그 컨텍스트)를 다른 스레드로 넘기는 도우미. |
RequestCorrelation.java이력 | 클래스 | 요청 상관관계 ID(correlation id)의 이름과 값 규칙을 한곳에 모은 상수/헬퍼. |
RequestCorrelationFilter.java이력 | 필터 | 요청마다 상관관계 ID 를 MDC 에 심고 응답 헤더로 돌려주는 필터. |
organization/1GitHub
조직·사용자 디렉터리 라이브 조회 포트.
OrganizationDirectoryPort.java이력 | 포트 | 조직·사용자 디렉터리 라이브 조회 포트 — 조직도 화면(/api/v1/departments·/api/v1/users)의 데이터 원천을 로컬 표본에서 라이브 뷰로 바꾸기 위한 자리다. |
pipeline/2GitHub
사람이 고친 값을 외부 파이프라인에 반영하는 포트.
PipelineCorrectionSyncException.java이력 | 예외 | 보정을 외부 파이프라인에 반영하지 못했을 때. |
PipelineCorrectionSyncPort.java이력 | 포트 | 사람이 고친 값을 외부 파이프라인에 되돌려 반영하는 포트. |
response/2GitHub
표준 응답 래퍼(success/data/error).
ApiResponse.java이력 | DTO | docs/rules/api.md 의 표준 응답 구조(success/data/error)를 따르는 공통 응답 래퍼. |
ApiError.java이력 | record | ApiResponse#error에 담기는 실패 상세. |
security/18GitHub
base 의 사용자 조회 포트 어댑터.
AuthenticatedUser.java이력 | record | 시스템 세션이 표현하는 "지금 요청을 보낸 사람". |
IdentityCredentials.java이력 | record | 신원 확인 요청. |
IssuedSession.java이력 | record | 수립된 시스템 세션. |
AuthSessionService.java이력 | 서비스 | 로그인·재발급의 흐름만 담당한다: 신원 확인(IdentityProviderPort) → 토큰 발급 (AuthTokenService). |
AuthTokenService.java이력 | 서비스 | 시스템 세션 토큰(JWT) 발급·검증. |
AuthProperties.java이력 | 설정 | 인증 설정. |
SecurityConfig.java이력 | 설정 | 인증 골격 빈 구성 (P0-5). |
AuthenticationFailedException.java이력 | 예외 | 신원 확인 실패 / 세션 없음. |
AuthCookieFactory.java이력 | 클래스 | 세션 쿠키 생성·판독. |
RoleCodeAuthorization.java이력 | 클래스 | 설정값 레벨 목록과 보유 레벨 집합을 대조하는 판정 한 곳. |
CredentialStorePort.java이력 | 포트 | 사용자 비밀번호 해시 저장 포트 — "부수정보는 우리 DB" 결정의 비밀번호 부분이다 (docs/decisions/20260825-user-directory-live-and-supplement.md 🟢). |
IdentityProviderPort.java이력 | 포트 | 신원 확인(로그인) 포트 — "이 사람이 누구인지"를 판정하는 자리다. |
RefreshTokenStorePort.java이력 | 포트 | refresh 토큰 원장 포트 — 회전(재발급마다 새 토큰)·무효화(로그아웃·재사용 감지)의 서버 측 상태다 (20260826 로테이션 결정). |
UserAccountLookupPort.java이력 | 포트 | 사번으로 사용자 부가 정보(이름·레벨·부서)를 읽는 포트. |
UserEmailLookupPort.java이력 | 포트 | 사번으로 사용자 메일 주소를 읽는 포트. |
UserSupplementLookupPort.java이력 | 포트 | 사용자 부수정보(우리 DB 소유) 조회 포트. |
UserSupplementStorePort.java이력 | 포트 | 사용자 부수정보 저장 포트 — 최초 로그인 온보딩이 기본 레벨·이메일을 기록할 때 쓴다. |
JwtCookieAuthenticationFilter.java이력 | 필터 | access 쿠키(JWT)를 읽어 요청에 세션 사용자를 붙이는 필터. |
security/credential/3GitHub
개인별 임시 비밀번호 로그인 (SSO 확정 전).
AuthPasswordController.java이력 | API | 임시 비밀번호(보조 테이블) 설정 API — hwss.auth.credential.enabled=true 에서만 노출. |
PasswordNotSetException.java이력 | 예외 | 재직 확인은 됐지만 비밀번호가 아직 설정되지 않은 사번의 로그인 시도. |
CredentialIdentityProvider.java이력 | 클래스 | 개인별 비밀번호(우리 DB 보조 테이블) 기반 신원 확인 — SSO 확정 전 임시 로그인 수단. |
security/local/1GitHub
local 프로필 전용 개발 로그인 스텁.
LocalDevIdentityProvider.java이력 | 클래스 | 개발용 로그인 스텁 — local 프로필에서만 등록된다. |
security/onboarding/2GitHub
최초 로그인 온보딩 API.
AuthOnboardingController.java이력화면 미연결Swagger | API | 최초 로그인 온보딩 API — 세션은 있으나 부수정보(레벨)가 없는 사용자가 이메일·비밀번호를 설정하고 기본 레벨(일반사용자)을 받는다. |
AuthOnboardingService.java이력 | 서비스 | 최초 로그인 온보딩 — 부수정보(레벨·이메일)가 없는 사용자가 이메일과 비밀번호를 설정하면 기본 레벨(일반사용자)을 부여한다 (2026-08-26 PM 지시). |
security/web/2GitHub
세션 API (login·logout·me·refresh).
AuthController.java이력화면 미연결Swagger | API | 세션 API. |
LoginRequest.java이력 | DTO | 개발용 로그인 요청. |
validation/2GitHub
커스텀 Bean Validation 제약.
NullOrNotBlank.java이력 | 클래스 | PATCH(부분 수정) DTO의 String 필드용. |
NullOrNotBlankValidator.java이력 | 클래스 | NullOrNotBlank의 실제 검증 로직 — null은 통과(=필드 생략), 공백 문자열만 거부한다. |
workflow/10GitHub
업무 도메인 ↔ 워크플로우 엔진 사이의 포트와 진행 뷰.
WorkflowLaunchCommand.java이력 | DTO | WorkflowLauncherPort 로 워크플로우 실행을 시작할 때 넘기는 값이다. |
WorkflowProgressDetail.java이력 | DTO | 화면 스테퍼가 한 번에 필요로 하는 것 전부 — 현재 단계 + 단계 이력 + 게이트 차단 사유. |
WorkflowProgressView.java이력 | DTO | 업무 화면이 "지금 어느 단계인가"를 표시하기 위해 읽는 워크플로우 실행 스냅샷. |
WorkflowStepProgressView.java이력 | DTO | 단계 하나의 진행 상태 — 화면 스테퍼의 칸 하나에 해당한다. |
WorkflowStepSuccess.java이력 | record | 엔진이 WorkflowStepCompletionPort 로 알리는 "단계 성공" 사실. |
StepPreconditionPort.java이력 | 포트 | 워크플로우 단계의 업무 선행 조건을 판정하는 포트. |
WorkflowLauncherPort.java이력 | 포트 | 업무 도메인이 워크플로우 실행을 시작·진행시킬 때 쓰는 포트(인터페이스). |
WorkflowProgressPort.java이력 | 포트 | 업무 도메인이 워크플로우 진행 상황을 읽기만 할 때 쓰는 포트. |
WorkflowStepCompletionPort.java이력 | 포트 | 워크플로우 단계가 성공해 처리 상태가 넘어갈 때 그 사실을 업무 도메인에 되돌려 주는 포트. |
WorkflowStepWorkPort.java이력 | 포트 | 워크플로우 단계가 실제로 하는 업무(분류·추출·분석 …)를 업무 도메인이 제공하는 포트. |
src/test/15GitHub
테스트 파일 — 펼쳐서 보기
src/test/15GitHubmodules/ · 도메인
modules/investigation-core/GitHub
사고조사 · 비즈니스 로직
사고조사 · 비즈니스 로직 — 이미지시스템 수신 → 분류 → 추출 → 분석 조건 → 요약 → 초안 → 메일까지의 사고조사 파이프라인과 통계 적재·조회. 백엔드 코드의 절반가량이 여기 있다.
config/18GitHub
@ConfigurationProperties 설정 바인딩과 빈 구성 (application.yml hwss.* 블록).
entity/24GitHub
JPA 엔티티 — 테이블 한 행을 매핑한다.
event/3GitHub
트랜잭션 커밋 후 발행되는 도메인 이벤트.
ClassificationStartedEvent.java이력어제 · #466 | 이벤트 | 보고서 한 건의 분류가 시작됐다(CONFIRM_REQUESTED → `분류중`, S-004 §8-2) — 확정 트랜잭션이 커밋된 뒤 후속 단계가 받는 도메인 이벤트 (2026-09-11 야간 DP04). |
FinalTransferCompletedEvent.java이력 | 이벤트 | 보고서 한 건의 최종 전송이 끝났다(FINAL_TRANSFER_COMPLETED, S-004 §7) — 전송 트랜잭션이 커밋된 뒤 후속 단계가 받는 도메인 이벤트 (2026-09-03 야간 ST02). |
SummaryCompletedEvent.java이력어제 · #466 | 이벤트 | 보고서 한 건의 요약 생성이 끝났다(ANALYSIS_FINISHED → `분석완료`, S-004 §7) — 엔진 단계 트랜잭션이 커밋된 뒤 후속 단계가 받는 도메인 이벤트 (2026-09-11 야간 DP04). |
exception/54GitHub
BusinessException 하위 도메인 예외 — 에러 코드와 HTTP 상태를 정한다.
integration/5GitHub
base 포트 구현체 — 다른 도메인·워크플로우 엔진이 이 모듈을 부르는 입구.
AnalysisStepWorkPortImpl.java이력 | 포트 구현 | ANALYZE 단계의 업무 — 스텁 요약 결과 산출 (2026-09-03 야간 N03). |
ClassificationStepWorkPortImpl.java이력 | 포트 구현 | CLASSIFY 단계의 업무 — 스텁 분류 결과 산출 (2026-09-03 야간 N02). |
ExtractionPreconditionPortImpl.java이력 | 포트 구현 | 추출(EXTRACT) 진입 게이트 — 미분류·저신뢰 낱장이 남아 있으면 막는다 (W05 가 세운 골격의 구현체, S-004 §7 `미분류검출`, 8/14 확정 "전건 확정 전에는 추출 시작 비활성"). |
ExtractionStepWorkPortImpl.java이력 | 포트 구현 | EXTRACT 단계의 업무 — 스텁 추출 결과 산출 (2026-09-03 야간 N03). |
WorkflowStepCompletionPortImpl.java이력어제 · #466 | 포트 구현 | 엔진 단계 성공을 보고서 처리 상태로 옮기는 구현체 (S-004 §7 자동 전이, 2026-09-03 야간 N01). |
repository/25GitHub
Spring Data JPA 저장소 인터페이스.
AnalysisRequestCollectionRepository.java이력 | 저장소 | AnalysisRequestCollectionEntity 저장소 (Spring Data JPA 인터페이스). |
AnalysisRequestContractItemRepository.java이력 | 저장소 | AnalysisRequestContractItemEntity 저장소 (Spring Data JPA 인터페이스). |
AnalysisRequestContractRepository.java이력 | 저장소 | AnalysisRequestContractEntity 저장소 (Spring Data JPA 인터페이스). |
AnalysisRequestFormRepository.java이력 | 저장소 | AnalysisRequestFormEntity 저장소 (Spring Data JPA 인터페이스). |
AnalysisRequestRepository.java이력 | 저장소 | AnalysisRequestEntity 저장소 (Spring Data JPA 인터페이스). |
ClassificationCorrectionRepository.java이력 | 저장소 | ClassificationCorrectionEntity 저장소 (Spring Data JPA 인터페이스). |
ClassificationResultPageRepository.java이력 | 저장소 | ClassificationResultPageEntity 저장소 (Spring Data JPA 인터페이스). |
ClassificationResultRepository.java이력 | 저장소 | ClassificationResultEntity 저장소 (Spring Data JPA 인터페이스). |
ExtractionFieldCorrectionRepository.java이력어제 · #466 | 저장소 | ExtractionFieldCorrectionEntity 저장소 (Spring Data JPA 인터페이스). |
ExtractionResultFieldRepository.java이력 | 저장소 | ExtractionResultFieldEntity 저장소 (Spring Data JPA 인터페이스). |
ExtractionResultRepository.java이력 | 저장소 | ExtractionResultEntity 저장소 (Spring Data JPA 인터페이스). |
ImageIntegrationIdempotencyRepository.java이력 | 저장소 | 이미지 연동 쓰기 API의 멱등성 키와 요청 본문 해시를 저장한다. |
ImageTransferRepository.java이력 | 저장소 | ImageTransferEntity 저장소 (Spring Data JPA 인터페이스). |
InvestigationReportRepository.java이력 | 저장소 | 보고서는 업무 번호(reportNo)로만 조회한다 — 이미지 시스템과 주고받는 모든 API 가 그 값을 키로 쓰기 때문이다. |
InvestigationRepository.java이력 | 저장소 | 커스텀 쿼리가 없다 — statusCode가 유효한 값인지는 여기서 걸러내지 않는다(DB에 FK가 없으므로). |
ReportDraftRepository.java이력 | 저장소 | ReportDraftEntity 저장소 (Spring Data JPA 인터페이스). |
ReportMailDispatchRepository.java이력 | 저장소 | ReportMailDispatchEntity 저장소 (Spring Data JPA 인터페이스). |
ReportPageRepository.java이력 | 저장소 | ReportPageEntity 저장소 (Spring Data JPA 인터페이스). |
ReportTemplateRepository.java이력 | 저장소 | ReportTemplateEntity 저장소 (Spring Data JPA 인터페이스). |
ReportTemplateVariableRepository.java이력 | 저장소 | ReportTemplateVariableEntity 저장소 (Spring Data JPA 인터페이스). |
SummaryCardRepository.java이력 | 저장소 | SummaryCardEntity 저장소 (Spring Data JPA 인터페이스). |
SummaryItemRepository.java이력 | 저장소 | SummaryItemEntity 저장소 (Spring Data JPA 인터페이스). |
SummaryItemSourceRepository.java이력 | 저장소 | SummaryItemSourceEntity 저장소 (Spring Data JPA 인터페이스). |
SummaryResultRepository.java이력 | 저장소 | SummaryResultEntity 저장소 (Spring Data JPA 인터페이스). |
TransferPageRepository.java이력 | 저장소 | TransferPageEntity 저장소 (Spring Data JPA 인터페이스). |
service/18GitHub
비즈니스 로직과 트랜잭션 경계.
InvestigationReceivedDateRange.java이력7일 전 · #408 | record | 사고조사 목록의 접수일자 범위 조건(야간 플랜 20260904 N08) — 달력 날짜 두 개를 절대 시각의 반열린 구간으로 환산한다. |
AnalysisRequestService.java이력어제 · #466 | 서비스 | 분석 요청(분석 조건)의 저장과 조회 (W09, 2026-08-19 확정 구조). |
ClassificationResultService.java이력7일 전 · #409 | 서비스 | 문서분류 결과의 산출(스텁)·조회·조치 (S-007 §3-2, W06·W07). |
ExtractionResultService.java이력어제 · #466 | 서비스 | 정보추출 결과의 적재·조회·사용자 수정 (W08, S-012 §2 `추출 완료`). |
FinalTransferCompletionService.java이력 | 서비스 | 최종 전송 완료(FINAL_TRANSFER_COMPLETED)를 보고서에 적용하고 커밋 후 이벤트를 내는 유일한 지점 (2026-09-03 야간 ST02). |
ImageIntegrationIdempotencyService.java이력 | 서비스 | 이미지 연동 쓰기 API의 동일 키·동일 본문 재호출만 허용한다. |
ImageMasterSyncService.java이력 | 서비스 | API-06·API-07 요청을 영속 마스터(classification-core)에 넘기고 계약 응답으로 되돌린다. |
ImageTransferReceptionService.java이력어제 · #481 | 서비스 | 이미지 연동 API-01~05 의 전송 접수와 보고서 상태를 DB에 영속화한다 (S-003 · S-007 §3-2). |
InvestigationReportQueryService.java이력7일 전 · #408 | 서비스 | 조사자 목록 화면(P1-1)과 워크스페이스 화면(P1-2)이 쓰는 사고조사 보고서 조회. |
InvestigationService.java이력 | 서비스 | InvestigationService의 구현. |
ReportDraftService.java이력 | 서비스 | 보고서 초안의 생성·조회·수정 (W12 골격). |
ReportMailService.java이력 | 서비스 | 보고서 메일 보내기 (W13). |
ReportPageImageService.java이력 | 서비스 | 워크스페이스 문서 뷰어(N05)가 페이지 원본 이미지를 여는 경로(2026-09-03 야간 N04). |
ReportTemplateService.java이력 | 서비스 | 보고서 양식(프롬프트 형식) 설정 (W15, 관리자 화면 /admin/report-templates). |
SummaryResultService.java이력 | 서비스 | 요약 결과의 적재·조회·수정 (W10). |
ImageSystemIntegrationClient.java이력어제 · #478 | 클래스 | AI Agent에서 이미지 시스템이 제공하는 API-08·09·10을 호출하는 외부 연동 클라이언트다. |
ReportMailDispatchRecorder.java이력 | 클래스 | 발송 기록 적재만 담당한다 — ReportMailService 에서 떼어 낸 이유가 전파 속성이다. |
ReportTaskSequencer.java이력7일 전 · #409 | 클래스 | 보고서별 백그라운드 작업 직렬 실행기 — 같은 보고서번호로 제출된 작업(ZIP 압축 해제)을 제출 순서 그대로 하나씩 실행한다 (2026-08-26 요구: 이미지 연동은 제약 없이 받되 도착 순서대로 큐처럼 처리). |
statistics/54GitHub
통계 star schema — 사실 적재, 일별 롤업, 조회, 미매핑 큐, 재적재.
BackfillCommand.java이력7일 전 · #406 | DTO | 재적재 명령 본문(BackfillRequest)의 정규화된 형태 (ST04). |
UnmappedQueueGroup.java이력7일 전 · #406 | DTO | 미매핑 큐를 (차원, 원문값, 상태)로 묶은 JPQL 투영 (ST05-A). |
MainDiseaseRule.java이력 | enum | 메인 질병코드(E41) 판정 규칙 한 단계. |
StatDailyRollupTable.java이력7일 전 · #403 | enum | 일별 롤업 테이블 7종(ST03-A, V202609040002) — 테이블명과 차원 키 컬럼. |
StatFactLoadFailureStatus.java이력7일 전 · #406 | enum | 적재 실패 기록(stat_fact_load_failures.status)의 상태. |
BusinessStatisticsQuery.java이력어제 · #466 | record | 업무 통계 조회 조건의 정규화된 형태 (ST03-B). |
LifecycleStatisticsQuery.java이력어제 · #466 | record | 시스템 통계 조회 조건의 정규화된 형태 (2026-09-11 야간 DP06). |
LifecycleTotals.java이력어제 · #466 | record | 생애주기 일별 롤업(stat_daily_lifecycle) 합계 열 열 개의 기간 합 — 조회 API(DP06)가 읽는 벡터 (2026-09-11 야간). |
ReportTransferTime.java이력7일 전 · #405 | record | 사실 행의 (보고서번호, 전송 완료 시각) 투영 — 재적재 명령(ST04)이 대상을 고를 때 조합 행까지 읽지 않기 위한 것. |
StatDailyLifecycleContribution.java이력어제 · #466 | record | 생애주기 사실 행 1건이 생애주기 일별 롤업(stat_daily_lifecycle)에 더하는(또는 빼는) 기여 — 순수 계산 (2026-09-11 야간 DP05, S-007 §3-4 「생애주기 일별 롤업」). |
ReportLifecycleFactLoadListener.java이력어제 · #466 | 리스너 | 생애주기 사실 적재의 진입점 — 3지점 (2026-09-11 야간 DP04). |
ReportStatFactLoadListener.java이력7일 전 · #405 | 리스너 | 전송 완료 후속 — 통계 사실 적재의 진입점 (ST02). |
BusinessStatisticsQueryService.java이력7일 전 · #404 | 서비스 | 업무 통계 조회 (ST03-B — S-007 §3-4 「조회 API」). |
LifecycleStatisticsQueryService.java이력어제 · #466 | 서비스 | 시스템 통계 조회 (2026-09-11 야간 DP06 — S-007 §3-4 「생애주기 조회 API」). |
StatDailyLifecycleRollupService.java이력어제 · #466 | 서비스 | 생애주기 일별 롤업(stat_daily_lifecycle, V202609110003)의 증분 갱신 (2026-09-11 야간 DP05 — S-007 §3-4 「생애주기 일별 롤업」). |
StatDailyRollupService.java이력어제 · #466 | 서비스 | 일별 롤업 7종(stat_daily_*)의 증분 갱신 (ST03-A — S-007 §3-4 「일별 롤업」). |
StatDimensionMasterService.java이력7일 전 · #406 | 서비스 | 차원 마스터 3종(dim_hospitals·dim_doctors·dim_diseases)을 StatDimension 하나로 다루는 얇은 층 (ST05-A). |
StatFactLoadFailureService.java이력 | 서비스 | 적재 실패 기록(stat_fact_load_failures) 쓰기 (ST02). |
StatUnmappedQueueQueryService.java이력7일 전 · #406 | 서비스 | 미매핑 큐 목록·차원 마스터 검색 (ST05-A — S-007 §3-4 「미매핑 큐 API」). |
StatUnmappedResolveService.java이력7일 전 · #410 | 서비스 | 미매핑 큐 처리 (ST05-A — S-007 §3-4 「미매핑 큐 API」). |
StatisticsBackfillService.java이력어제 · #466 | 서비스 | 통계 사실 재적재(backfill) 명령 (ST04 — S-007 §3-4 「재적재 명령」). |
DiseaseDimensionEntity.java이력 | 엔티티 | 질병 차원 마스터 (dim_diseases) — KCD 코드·표준 병명 (E41). |
DoctorDimensionEntity.java이력 | 엔티티 | 의사 차원 마스터 (dim_doctors) — 키(면허번호, 없으면 병원 키 + 정규화 이름의 대체 키)·표시명·소속 병원 (E43). |
HospitalDimensionEntity.java이력 | 엔티티 | 병원 차원 마스터 (dim_hospitals) — 키·대표 표기명·지역 (E42). |
ReportLifecycleFactEntity.java이력어제 · #466 | 엔티티 | 보고서 1건의 생애주기 사실(보고서당 1행) — 시스템 통계(9/1 엑셀 5~31행)의 원천 (DP03). |
ReportStatFactDetailEntity.java이력 | 엔티티 | 보고서 1건 안의 병원·의사·질병·문서유형 조합 한 행 (ST01). |
ReportStatFactEntity.java이력어제 · #466 | 엔티티 | 보고서 1건의 통계 사실(보고서당 1행) — 전송 완료 시점 확정값의 스냅샷 (ST01). |
StatDimensionAliasEntity.java이력7일 전 · #410 | 엔티티 | 별칭 → 차원 키 (stat_dim_aliases). |
StatFactLoadFailureEntity.java이력 | 엔티티 | 통계 사실 적재가 실패한 보고서 한 건 (stat_fact_load_failures, ST02). |
StatUnmappedQueueEntity.java이력7일 전 · #410 | 엔티티 | 코드로 바꾸지 못한 원문값 한 건 (stat_unmapped_queue). |
DepartmentSnapshot.java이력어제 · #466 | 인터페이스 | 사실 행이 갖는 부서 스냅샷(요청·전송 시점의 조사자 부서) — 두 사실 테이블(ReportStatFactEntity· ReportLifecycleFactEntity)이 같은 승계 규칙(ReportStatFactSourceReader#departmentOf(String,)을 타기 위한 최소 계약… |
DiseaseDimensionRepository.java이력7일 전 · #406 | 저장소 | DiseaseDimensionEntity 저장소 (Spring Data JPA 인터페이스). |
DoctorDimensionRepository.java이력7일 전 · #406 | 저장소 | DoctorDimensionEntity 저장소 (Spring Data JPA 인터페이스). |
HospitalDimensionRepository.java이력7일 전 · #406 | 저장소 | HospitalDimensionEntity 저장소 (Spring Data JPA 인터페이스). |
ReportLifecycleFactRepository.java이력어제 · #466 | 저장소 | 보고서 생애주기 사실 저장소 (DP03). |
ReportStatFactRepository.java이력7일 전 · #405 | 저장소 | 보고서 통계 사실(애그리게이트 루트) 저장소. |
StatDailyLifecycleQueryRepository.java이력어제 · #466 | 저장소 | 생애주기 일별 롤업(stat_daily_lifecycle)의 기간 조회 (2026-09-11 야간 DP06 — S-007 §3-4 「생애주기 조회 API」). |
StatDailyRollupQueryRepository.java이력7일 전 · #404 | 저장소 | 일별 롤업(stat_daily_*)의 기간 합산 조회 (ST03-B — S-007 §3-4 「조회 API」). |
StatDimensionAliasRepository.java이력7일 전 · #406 | 저장소 | StatDimensionAliasEntity 저장소 (Spring Data JPA 인터페이스). |
StatFactLoadFailureRepository.java이력 | 저장소 | StatFactLoadFailureEntity 저장소 (Spring Data JPA 인터페이스). |
StatUnmappedQueueRepository.java이력7일 전 · #406 | 저장소 | StatUnmappedQueueEntity 저장소 (Spring Data JPA 인터페이스). |
ReportLifecycleFactLoader.java이력어제 · #466 | 적재기 | 보고서 1건의 생애주기 사실 적재 — 3지점 갱신 (2026-09-11 야간 DP04, S-007 §3-4 report_lifecycle_facts, 경계 결정 §4-1 정정본). |
ReportStatFactLoader.java이력어제 · #466 | 적재기 | 보고서 1건의 통계 사실 적재 (ST02 — 9/1 노트 「세 층과 시점」 ①). |
RetryingStatFactLoader.java이력어제 · #466 | 적재기 | 통계 사실 적재의 실행 골격 — 경합 재시도 + 실패 기록 (ST03-A 의 재시도를 ST04 가 떼어 공유). |
BackfillTargets.java이력7일 전 · #405 | 클래스 | 재적재 대상 집합의 계산 — 순수 (ST04, S-007 §3-4 「재적재 명령」). |
ContentionRetry.java이력어제 · #466 | 클래스 | 통계 적재·재집계의 경합 재시도 골격 (2026-09-11 야간 DP08 — 세 벌로 흩어져 있던 같은 루프를 한 곳으로). |
MainDiseaseCodeSelector.java이력 | 클래스 | 보고서 1건의 질병코드 후보들 중 메인 질병코드(E41) 하나를 고른다 — 규칙 순서는 설정(MainDiseaseRule). |
ReportStatFactSourceReader.java이력어제 · #466 | 클래스 | 통계 사실 적재(ST02)의 원천 읽기 — 보고서 1건의 확정 스냅샷(추출 항목·요약 표본·활성 낱장·최신 분석 요청)과 부서 디렉터리를 읽어 ReportStatFactLoader 가 조립할 재료로 만든다. |
StatDailyRollupAxis.java이력어제 · #466 | 클래스 | 일별 롤업 테이블들의 공통 축(일자 × 위탁사 × 부서) — 업무 데이터 롤업 7종(StatDailyRollupService)과 생애주기 롤업 (StatDailyLifecycleRollupService)이 같은 WHERE 절과 파라미터를 쓴다 (2026-09-11 야간 DP08). |
StatDailyRollupContributions.java이력7일 전 · #403 | 클래스 | 사실 행 1건이 일별 롤업 7종에 더하는(또는 빼는) 기여 — 순수 계산 (ST03-A). |
StatDimensionKeyResolver.java이력7일 전 · #410 | 클래스 | 추출 원문값 → 차원 키 변환 (ST02 "코드 변환"). |
StatDimensionLabelResolver.java이력7일 전 · #404 | 클래스 | 통계 차원 키 → 대표 표기 (ST03-B). |
StatText.java이력7일 전 · #410 | 클래스 | 통계 패키지의 문자열 규칙 세 가지 — 필수 텍스트 검사, 공백 정리, 컬럼 길이 절단. |
package-info.java이력어제 · #466 | 패키지 주석 | 통계 사실 테이블(star schema) — 업무 데이터 통계(9/1 엑셀 32~39행)의 적재 대상 (ST01, 2026-09-03). |
web/15GitHub
REST 컨트롤러 — HTTP 요청을 서비스로 넘기고 ApiResponse 로 감싼다.
빌드·리소스1GitHub
모듈 빌드 스크립트와 src/main/resources.
build.gradle이력 | 빌드 | 이 모듈의 의존성 선언 — base, investigation-shared 모듈 참조. |
resources/db/migration/26GitHub
Flyway 마이그레이션 SQL — 파일명 V<YYYYMMDDhhmm>__설명. 앱 기동 시 모든 모듈의 것이 버전 순으로 합쳐 실행된다.
src/test/66GitHub
테스트 파일 — 펼쳐서 보기
src/test/66GitHubconfig/ExtractionPropertiesTest.java이력어제 · #466 | 테스트 | 스텁 추출 표본 신뢰도(hwss.extraction.stub.*, 2026-09-03 야간 N03)의 기동 검증 — 표본 신뢰도가 임계값과 모순이면 표본이 뜻대로 나오지 않으므로 조용히 돌지 않고 기동을 거부한다 (분류 스텁 ClassificationProperties.Stub 과 같은 계약). |
config/InvestigationListPropertiesTest.java이력7일 전 · #408 | 테스트 | InvestigationListProperties 대상 테스트. |
config/StatisticsBackfillPropertiesTest.java이력7일 전 · #405 | 테스트 | StatisticsBackfillProperties 대상 테스트. |
config/StatisticsLifecyclePropertiesTest.java이력어제 · #466 | 테스트 | StatisticsLifecycleProperties 대상 테스트. |
config/StatisticsLoadPropertiesTest.java이력 | 테스트 | StatisticsLoadProperties 대상 테스트. |
config/StatisticsQueryPropertiesTest.java이력7일 전 · #404 | 테스트 | StatisticsQueryProperties 대상 테스트. |
config/StatisticsRollupPropertiesTest.java이력7일 전 · #403 | 테스트 | StatisticsRollupProperties 대상 테스트. |
config/StatisticsUnmappedPropertiesTest.java이력7일 전 · #406 | 테스트 | StatisticsUnmappedProperties 대상 테스트. |
integration/AnalysisStepWorkPortImplTest.java이력 | 테스트 | ANALYZE 단계의 스텁 요약 포트 (2026-09-03 야간 N03) — 카드 한 장·항목 다섯 개 표본을 적재하고, 상태 전이는 하지 않는다(그건 WorkflowStepCompletionPortImpl 몫). |
integration/ClassificationStepWorkPortImplTest.java이력 | 테스트 | CLASSIFY 단계의 스텁 분류 포트 (2026-09-03 야간 N02) — 엔진이 되물으면 결과 산출 한 번으로 끝나고, 상태 전이는 하지 않는다(그건 WorkflowStepCompletionPortImpl 몫). |
integration/ExtractionPreconditionPortImplTest.java이력 | 테스트 | 추출 진입 게이트 판정 (W07 — W05 가 세운 골격의 구현체). |
integration/ExtractionStepWorkPortImplTest.java이력 | 테스트 | EXTRACT 단계의 스텁 추출 포트 (2026-09-03 야간 N03) — 최신 분류 결과의 문서종 묶음마다 표본 항목 세 개를 만들고, 상태 전이는 하지 않는다(그건 WorkflowStepCompletionPortImpl 몫). |
integration/WorkflowStepCompletionPortImplTest.java이력어제 · #466 | 테스트 | 엔진 단계 성공 → 보고서 상태 반영 (2026-09-03 야간 N01). |
service/AnalysisRequestServiceTest.java이력어제 · #466 | 테스트 | W09 분석 조건의 검증 규칙과 요약 단계 트리거. |
service/ClassificationResultActionTest.java이력7일 전 · #409 | 테스트 | W07 분류 조치의 권한·상태 규칙. |
service/ClassificationResultServiceTest.java이력 | 테스트 | 분류 결과 산출(스텁)과 조회 매핑·집계를 본다. |
service/ExtractionResultCorrectionTest.java이력어제 · #466 | 테스트 | 추출값 사용자 수정(S-012 §2 `추출 완료`, 야간 플랜 20260911 DP01)의 권한·상태·정책 규칙과 수정 이력 (DP02, extraction_field_corrections) 기록. |
service/ExtractionResultServiceTest.java이력어제 · #466 | 테스트 | 정보추출 결과의 저장 정책 적용과 조회 매핑·집계. |
service/FinalTransferCompletionServiceTest.java이력 | 테스트 | 최종 전송 완료 적용 지점(ST02). |
service/ImageIntegrationIdempotencyServiceTest.java이력 | 테스트 | ImageIntegrationIdempotencyService 대상 테스트. |
service/ImageMasterSyncServiceTest.java이력6일 전 · #428 | 테스트 | API-06·API-07 의 계약 응답이 마스터 포트 결과로부터 그대로 만들어지는지 본다. |
service/ImageReceptionRepositoryFixture.java이력 | 클래스 | 이미지 전송 접수가 쓰는 4개 리포지토리의 인메모리 대역. |
service/ImageSystemIntegrationClientTest.java이력어제 · #478 | 테스트 | ImageSystemIntegrationClient 대상 테스트. |
service/ImageTransferReceptionServiceTest.java이력어제 · #481 | 테스트 | 리포지토리는 ImageReceptionRepositoryFixture 의 인메모리 대역을 쓴다 — 이 테스트가 확인하는 것은 스냅샷 비교·상태 전이·워크플로우 연결 같은 서비스 로직이고, 실제 매핑/제약이 DB에서 성립하는지는 apps/hwss-api 의 영속화 통합 테스트가 맡는다 (docs/… |
service/InvestigationReceivedDateRangeTest.java이력7일 전 · #408 | 테스트 | 달력 날짜 → 절대 시각 구간 환산. |
service/InvestigationReportQueryServiceTest.java이력7일 전 · #408 | 테스트 | 필터가 실제로 어떤 행을 걸러내는지는 Criteria 로 조립되어 DB 에서 평가되므로 여기서는 검증되지 않는다 — 그 부분은 InvestigationReportListApiTest(H2 PostgreSQL 모드)가 본다. |
service/InvestigationServiceTest.java이력 | 테스트 | InvestigationService 은 생성자에서 ObjectProvider.getIfAvailable() 을 즉시 호출해 결과를 필드에 캐싱한다 (반복 조회를 피하려고 — 자세한 이유는 docs/guides/backend-module-guide.md §5-3). |
service/ReportDraftServiceTest.java이력 | 테스트 | W12 보고서 초안의 본문 조립 규칙. |
service/ReportMailServiceTest.java이력 | 테스트 | W13 보고서 메일 발송 — 항목의 완료 조건이 "발송 포트 목 테스트(실제 SMTP 호출 없음)" 라 여기가 그 자리다. |
service/ReportPageImageServiceTest.java이력 | 테스트 | 파일 위치 결정과 방어 로직을 본다 — 세션 필터·실제 스트리밍·오류 봉투는 ReportPageImageApiTest(apps/hwss-api, H2) 몫이다. |
service/ReportTaskSequencerTest.java이력7일 전 · #409 | 테스트 | ReportTaskSequencer 대상 테스트. |
service/ReportTemplateServiceTest.java이력 | 테스트 | W15 보고서 양식 설정 — 항목의 완료 조건이 "버전·활성 규칙 유닛 테스트" 라 여기가 그 자리다. |
service/SummaryConfirmationTest.java이력 | 테스트 | W11 요약 확정 전이 — 항목의 완료 조건이 "전이 유닛 테스트(확정 → 반영체크 → 초기화)" 라 여기가 그 자리다. |
statistics/BackfillCommandTest.java이력7일 전 · #405 | 테스트 | 재적재 명령 본문의 검증·기본값·기간 환산(ST04). |
statistics/BackfillTargetsTest.java이력7일 전 · #405 | 테스트 | 재적재 대상 집합 계산(ST04) — 세 원천의 합집합·전송 시각 우선순위·정렬·원천 없는 보고서번호. |
statistics/BusinessStatisticsQueryServiceTest.java이력7일 전 · #404 | 테스트 | 업무 통계 조회(ST03-B) — 차원 해석(404)·기간 역전(400)·정규화된 조건 전달·순위·비율·표기 폴백·캐시(히트/만료/끔/상한). |
statistics/BusinessStatisticsQueryTest.java이력7일 전 · #404 | 테스트 | 조회 조건 정규화(ST03-B) — 같은 뜻의 요청이 같은 값(캐시 키)이 되고, 기본·상한·역전 규칙이 한 곳에 있다. |
statistics/ContentionRetryTest.java이력어제 · #466 | 테스트 | 경합 재시도 골격(DP08 — 세 호출부가 공유) — 일시 오류만 상한까지 다시 돌리고, 그 밖의 예외와 상한을 넘긴 경합은 그대로 올린다. |
statistics/LifecycleStatisticsQueryServiceTest.java이력어제 · #466 | 테스트 | 시스템 통계 조회(DP06) — 기간 역전(400)·정규화된 조건 전달·일별 행 그대로·기간 합계는 일별 벡터의 합에서 다시 계산(비율 평균이 아님)·빈 결과. |
statistics/LifecycleTotalsTest.java이력어제 · #466 | 테스트 | 합계 열 → 지표 산식(DP06) — 분모·반올림·분모 0·어긋난 롤업의 음수 방지·벡터 합. |
statistics/MainDiseaseCodeSelectorTest.java이력 | 테스트 | 메인 질병코드 판정(ST02) — 규칙 순서는 설정, 기본 "진단서 주진단 → 최다 빈도 → 최초 문서". |
statistics/ReportLifecycleFactEntityTest.java이력어제 · #466 | 테스트 | ReportLifecycleFactEntity 대상 테스트. |
statistics/ReportLifecycleFactLoadListenerTest.java이력어제 · #466 | 테스트 | 생애주기 적재 진입점(DP04) — 세 이벤트를 순서 실행기(ReportTaskSequencer) 경유로 백그라운드에 넘기고, 일시 오류만 상한까지 다시 돌리며, 최종 실패는 로그로 남기고 예외를 밖으로 내지 않는다. |
statistics/ReportLifecycleFactLoaderTest.java이력어제 · #466 | 테스트 | 생애주기 사실 적재(DP04)의 3지점 규칙 — 분류 시작(행 생성·재호출 무변경·재시작), 요약 완료(처리시간 규칙·페이지 수·품질 수치·재분석·근원), 전송 완료(시각·플래그), 앞 지점 실패의 자가 복구, 부서 스냅샷 승계, 포트 부재 동작. |
statistics/ReportStatFactEntityTest.java이력 | 테스트 | ReportStatFactEntity 대상 테스트. |
statistics/ReportStatFactLoadListenerTest.java이력7일 전 · #405 | 테스트 | 전송 완료 후속 진입점(ST02) — 적재를 순서 실행기(ReportTaskSequencer) 경유로 백그라운드에 넘긴다. |
statistics/ReportStatFactLoaderTest.java이력7일 전 · #410 | 테스트 | 통계 사실 적재(ST02)의 조립 규칙 — 추출 저장 항목 → 조합 행·메인 질병코드·미매핑 큐, 부서 스냅샷, 청구유형·증권번호, DELETE→INSERT 멱등과 버전 증가, 원천 스텁 표시 승계. |
statistics/ReportStatFactSourceReaderTest.java이력어제 · #466 | 테스트 | 통계 적재의 원천 읽기(2026-09-04 Q2 — ReportStatFactLoader 에서 분리) — 문서함 순서 묶음·저장 정책·스텁 승계·청구유형· 페이지 수·부서 디렉터리. |
statistics/RetryingStatFactLoaderTest.java이력어제 · #466 | 테스트 | 적재 실행 골격(ST03-A 경합 재시도 → ST04 에서 분리) — 일시 오류만 상한까지 다시 돌리고, 최종 실패는 기록으로 남기며 예외를 밖으로 내지 않는다. |
statistics/StatDailyLifecycleContributionTest.java이력어제 · #466 | 테스트 | 생애주기 롤업 기여 계산(DP05)의 규칙 — 요청 시각 축의 날짜 절단, 단계 도달 여부 0/1, 판정 전(NULL) 수치는 더하지 않음, 부서 공백은 NULL 축, 벡터 차이·부호 반전, 키 순서. |
statistics/StatDailyLifecycleQueryRepositoryTest.java이력어제 · #466 | 테스트 | 생애주기 롤업 조회 SQL 의 형태(DP06) — 테이블·SUM 열 열 개·필터 절·GROUP BY·정렬과 파라미터 순서·행 매핑을 고정한다. |
statistics/StatDailyLifecycleRollupServiceTest.java이력어제 · #466 | 테스트 | 생애주기 롤업 증분 갱신(DP05)의 SQL 경로 — 새 행은 UPDATE 후 0행이면 INSERT, 같은 키는 차이만 한 번의 UPDATE(차이 0 이면 아무것도 안 함), 키 이동은 옛 키 빼기(+0 이면 삭제)와 새 키 더하기를 키 순서로, 뺄 행이 없으면 경고만. |
statistics/StatDailyRollupAxisTest.java이력어제 · #466 | 테스트 | 일별 롤업 공통 축(DP08 — 7종·생애주기가 공유) — WHERE 절과 파라미터 순서·타입이 짝을 이룬다. |
statistics/StatDailyRollupContributionsTest.java이력7일 전 · #403 | 테스트 | 롤업 기여 계산(ST03-A)의 규칙 — 날짜 절단(시간대 경계), 보고서 단위 DISTINCT, NULL 키 제외, 메인 질병코드 축. |
statistics/StatDailyRollupQueryRepositoryTest.java이력7일 전 · #404 | 테스트 | 롤업 조회 SQL 의 형태(ST03-B) — 차원별 테이블·GROUP BY 키·정렬·LIMIT·필터 절과 파라미터 순서를 고정한다. |
statistics/StatDailyRollupServiceTest.java이력7일 전 · #405 | 테스트 | 롤업 증분 갱신(ST03-A)의 SQL 경로 — 더하기는 UPDATE 후 0행이면 INSERT, 빼기는 UPDATE 후 0 행 삭제, 뺄 행이 없으면 경고만. |
statistics/StatDimensionKeyResolverTest.java이력7일 전 · #406 | 테스트 | 코드 변환(ST02) — 키 형식 → 마스터 → 별칭 → 정규화 대체 키 + 미매핑 사유 순서. |
statistics/StatDimensionLabelResolverTest.java이력7일 전 · #404 | 테스트 | 차원 키 → 대표 표기(ST03-B) — 마스터 3종은 키 집합 한 번에, 부서는 포트(없으면 건너뜀), 나머지는 찾지 않는다. |
statistics/StatDimensionMasterServiceTest.java이력7일 전 · #406 | 테스트 | 차원 마스터 3종을 한 차원 enum 으로 다루는 층(ST05-A) — 존재 확인·등록·검색이 차원별 리포지토리로 갈리는지, 검색 패턴 이스케이프. |
statistics/StatFactLoadFailureEntityTest.java이력 | 테스트 | StatFactLoadFailureEntity 대상 테스트. |
statistics/StatTextTest.java이력7일 전 · #410 | 테스트 | 통계 패키지 공통 문자열 규칙(2026-09-04 Q2 통합) — 엔티티·키 변환기·처리 명령·적재기가 같은 결과를 받는지 고정한다. |
statistics/StatUnmappedQueueEntityTest.java이력7일 전 · #406 | 테스트 | StatUnmappedQueueEntity 대상 테스트. |
statistics/StatUnmappedQueueQueryServiceTest.java이력7일 전 · #406 | 테스트 | 미매핑 큐 목록(ST05-A) — 파라미터 정규화·묶음 → 행 조립·보고서번호 배치 채움·쪽 계산, 마스터 검색 위임. |
statistics/StatUnmappedResolveServiceTest.java이력7일 전 · #406 | 테스트 | 미매핑 큐 처리(ST05-A) — 동작 3종·예외 유형별·커밋 뒤 재적재 제출 순서. |
statistics/StatisticsBackfillServiceTest.java이력7일 전 · #409 | 테스트 | 재적재 명령(ST04)의 조립 — 대상 원천 조회·상한·순서 실행기 경유·결과 집계·롤업 재집계·누락 스캔. |
status/InvestigationStatusTransitionTest.java이력 | 테스트 | S-004 §5·§7·§8 의 전이 규칙이 이 클래스 하나로 모여 있는지 확인한다. |
modules/ · 도메인
modules/classification-core/GitHub
위탁사·분류 마스터 · 로직
위탁사·분류 마스터 · 로직 — 이미지시스템이 원천인 위탁사·폴더 분류 마스터를 보관하고, 폴더 ↔ 에이전트 분류 매핑을 관리한다. 외부 수신 표면은 investigation-core 가 갖고 이 모듈은 포트 구현으로 붙는다.
entity/4GitHub
JPA 엔티티 — 테이블 한 행을 매핑한다.
AgentDocumentTypeEntity.java이력 | 엔티티 | 에이전트(낱장) 분류 마스터 한 건 (S-007 §3-1 agent_document_types). |
CustomerCompanyEntity.java이력 | 엔티티 | 위탁사(고객사) 마스터 한 건 (S-007 §3-1 customer_companies). |
DocumentTypeEntity.java이력 | 엔티티 | 위탁사별 이미지시스템 폴더 분류 한 건 (S-007 §3-1 document_types). |
FolderClassificationMappingEntity.java이력 | 엔티티 | 위탁사별 이미지시스템 폴더 ↔ 에이전트 분류 매핑 한 줄 (S-007 §3-1 folder_classification_mappings). |
exception/6GitHub
BusinessException 하위 도메인 예외 — 에러 코드와 HTTP 상태를 정한다.
AgentDocumentTypeNotFoundException.java이력 | 예외 | 배정하려는 에이전트 분류가 마스터에 없거나 비활성일 때. |
ClassificationMappingRequiredException.java이력 | 예외 | 배정이 한 건도 없는 상태로 최초 확정을 시도했을 때. |
CustomerCompanyNotFoundException.java이력 | 예외 | 매핑 화면이 다루려는 위탁사가 마스터에 없을 때. |
DocumentTypeNotFoundException.java이력 | 예외 | 배정 대상으로 지정한 폴더가 그 위탁사의 마스터에 없을 때. |
DuplicateAgentDocumentTypeAssignmentException.java이력 | 예외 | 한 요청에 같은 에이전트 분류가 두 번 이상 들어왔을 때. |
InactiveDocumentTypeAssignmentException.java이력 | 예외 | 삭제된(비활성) 폴더로 새로 배정하려 할 때. |
integration/2GitHub
base 포트 구현체 — 다른 도메인·워크플로우 엔진이 이 모듈을 부르는 입구.
CustomerCompanyLookupPortImpl.java이력 | 포트 구현 | CustomerCompanyLookupPort 의 실제 구현. |
ImageMasterSyncPortImpl.java이력 | 포트 구현 | ImageMasterSyncPort 의 실제 구현. |
repository/4GitHub
Spring Data JPA 저장소 인터페이스.
AgentDocumentTypeRepository.java이력 | 저장소 | 에이전트 분류 마스터 저장소. |
CustomerCompanyRepository.java이력 | 저장소 | 위탁사 마스터 저장소. |
DocumentTypeRepository.java이력 | 저장소 | 위탁사별 문서분류 마스터 저장소. |
FolderClassificationMappingRepository.java이력 | 저장소 | 폴더 ↔ 에이전트 분류 매핑 저장소. |
service/3GitHub
비즈니스 로직과 트랜잭션 경계.
ClassificationMappingService.java이력 | 서비스 | ClassificationMappingService 의 JPA 구현. |
ClassificationMasterSyncService.java이력 | 서비스 | ClassificationMasterSyncService 의 JPA 구현. |
CustomerCompanyQueryService.java이력 | 서비스 | CustomerCompanyQueryService 의 JPA 구현. |
web/2GitHub
REST 컨트롤러 — HTTP 요청을 서비스로 넘기고 ApiResponse 로 감싼다.
ClassificationMappingController.java이력화면 /admin/classification-mappings화면 /user/investigations/[reportNo]Swagger | API | 관리자 분류체계 매핑 API (야간 플랜 20260824 N02). |
CustomerCompanyController.java이력화면 미연결Swagger | API | 위탁사 마스터 조회 API (docs/rules/api.md 의 URL 패턴·표준 응답 구조). |
빌드·리소스1GitHub
모듈 빌드 스크립트와 src/main/resources.
build.gradle이력 | 빌드 | 이 모듈의 의존성 선언 — base, classification-shared 모듈 참조. |
resources/db/migration/1GitHub
Flyway 마이그레이션 SQL — 파일명 V<YYYYMMDDhhmm>__설명. 앱 기동 시 모든 모듈의 것이 버전 순으로 합쳐 실행된다.
V202608190001__create_classification_master.sql이력 | 마이그레이션 | S-007 §3-1 위탁사·분류체계 마스터 (API-06/07 동기화 수신 대상). |
src/test/3GitHub
테스트 파일 — 펼쳐서 보기
src/test/3GitHubservice/ClassificationMappingServiceTest.java이력 | 테스트 | ClassificationMappingService — 관리자 매핑 화면의 조회·저장 규칙을 본다. |
service/ClassificationMasterSyncServiceTest.java이력 | 테스트 | 마스터 동기화의 판정 규칙(최신값 우선, 과거 무시, 자리표시자 위탁사 생성)을 본다. |
service/CustomerCompanyQueryServiceTest.java이력 | 테스트 | CustomerCompanyQueryService — 조회 결과가 화면 선택지 모양으로 내려가는지 본다. |
modules/ · 도메인
modules/collection-core/GitHub
지식컬렉션 · 로직
지식컬렉션 · 로직 — 개인/공용 컬렉션, 파일 업로드·검증·로컬 저장, 승인센터, 검색. 외부 AI 플랫폼은 base 의 Vector*Port 로만 부른다.
config/2GitHub
@ConfigurationProperties 설정 바인딩과 빈 구성 (application.yml hwss.* 블록).
CollectionConfig.java이력 | 설정 | 지식컬렉션 모듈 설정 활성화. |
CollectionProperties.java이력 | 설정 | 지식컬렉션 운영 설정 (야간 플랜 20260821 N04). |
entity/3GitHub
JPA 엔티티 — 테이블 한 행을 매핑한다.
CollectionApprovalRequestEntity.java이력 | 엔티티 | 승인센터가 처리하는 승인 요청 한 건 (collection_approval_requests). |
CollectionEntity.java이력 | 엔티티 | 지식컬렉션 한 건 (collections). |
CollectionFileEntity.java이력 | 엔티티 | 컬렉션에 등록된 파일 한 건 (collection_files). |
exception/10GitHub
BusinessException 하위 도메인 예외 — 에러 코드와 HTTP 상태를 정한다.
CollectionAccessDeniedException.java이력 | 예외 | 남의 개인 컬렉션(또는 아직 승인되지 않은 공용 컬렉션)에 접근할 때. |
CollectionApprovalNotAllowedException.java이력 | 예외 | 승인 권한이 없는 사용자가 승인 대기함을 열거나 승인·반려를 시도할 때. |
CollectionApprovalRequestNotFoundException.java이력 | 예외 | 없는 승인 요청을 처리하려 할 때. |
CollectionApprovalStateException.java이력 | 예외 | 지금 상태에서는 성립하지 않는 승인 요청·처리일 때. |
CollectionFileLimitExceededException.java이력 | 예외 | 파일 크기·개수 제한을 넘겼을 때. |
CollectionFileStorageException.java이력 | 예외 | 업로드 파일을 로컬 저장소에 쓰지 못했을 때. |
CollectionFileTypeNotAllowedException.java이력 | 예외 | 허용되지 않은 확장자의 파일을 올렸을 때. |
CollectionNotEditableException.java이력 | 예외 | 수정·삭제 허용 규칙(2026-08-20 확정: 개인 컬렉션 + 파일 처리 완료 + 진행 중인 승인 요청 없음)에 걸렸을 때. |
CollectionNotFoundException.java이력 | 예외 | 조회·수정·삭제하려는 컬렉션이 없을 때. |
SharedCollectionFileApprovalRequiredException.java이력 | 예외 | 승인이 끝난 공용 컬렉션에 파일을 바로 밀어 넣으려 할 때. |
repository/2GitHub
Spring Data JPA 저장소 인터페이스.
CollectionApprovalRequestRepository.java이력 | 저장소 | 승인 요청 저장소. |
CollectionRepository.java이력 | 저장소 | 지식컬렉션 저장소. |
service/7GitHub
비즈니스 로직과 트랜잭션 경계.
CollectionFileUpload.java이력 | record | 서비스 계층이 보는 업로드 파일 한 건. |
CollectionApprovalService.java이력 | 서비스 | CollectionApprovalService 구현. |
CollectionSearchService.java이력 | 서비스 | CollectionSearchService 구현. |
CollectionService.java이력 | 서비스 | CollectionService 구현. |
CollectionFileRegistrar.java이력 | 클래스 | 업로드 파일을 검증·저장해 컬렉션에 붙이는 한 곳. |
CollectionFileTypeValidator.java이력 | 클래스 | 업로드 파일의 확장자·MIME 타입 검사 (docs/rules/secure.md — "파일 업로드 시 확장자 + MIME 타입 검증"). |
CollectionVectorGateway.java이력 | 클래스 | 이 도메인이 외부 AI 플랫폼(N01 포트)으로 나가는 유일한 통로. |
storage/2GitHub
업로드 파일의 로컬 디스크 저장.
StoredCollectionFile.java이력 | record | 로컬 저장소에 실제로 기록된 파일 한 건의 결과. |
CollectionFileStorage.java이력 | 클래스 | 업로드된 컬렉션 파일을 로컬 디스크에 두는 저장소 (야간 플랜 20260821 N04). |
web/2GitHub
REST 컨트롤러 — HTTP 요청을 서비스로 넘기고 ApiResponse 로 감싼다.
CollectionApprovalController.java이력화면 /admin/approval-centerSwagger | API | 지식컬렉션 승인센터 API (야간 플랜 20260821 N05). |
CollectionController.java이력화면 /user/collections화면 /user/collections/[id]Swagger | API | 지식컬렉션 API (야간 플랜 20260821 N04). |
빌드·리소스1GitHub
모듈 빌드 스크립트와 src/main/resources.
build.gradle이력 | 빌드 | 이 모듈의 의존성 선언 — base, collection-shared 모듈 참조. |
resources/db/migration/2GitHub
Flyway 마이그레이션 SQL — 파일명 V<YYYYMMDDhhmm>__설명. 앱 기동 시 모든 모듈의 것이 버전 순으로 합쳐 실행된다.
V202608210001__create_collection.sql이력 | 마이그레이션 | 지식컬렉션 도메인 스키마 (야간 플랜 20260821 N03). |
V202608220001__add_collection_vector_collection_id.sql이력 | 마이그레이션 | 지식컬렉션 ↔ 외부 AI 플랫폼 벡터 컬렉션 연결 (야간 플랜 20260821 N04). |
src/test/7GitHub
테스트 파일 — 펼쳐서 보기
src/test/7GitHubentity/CollectionApprovalRequestEntityTest.java이력 | 테스트 | 승인 요청의 유형 분리와 처리 규칙 — 2026-08-19 리뷰 §4(반려 사유 필수·재요청 허용)와 2026-08-20 확정(공용 컬렉션 파일 추가는 전환과 별개 시나리오)을 코드로 고정한다. |
entity/CollectionEntityTest.java이력 | 테스트 | 컬렉션 루트의 상태 전이 규칙 — 2026-08-19 리뷰 §4(개인 즉시 사용 / 공용 승인 후 사용 / 관리자 콘솔 등록은 즉시 공용)와 2026-08-20 확정(전환은 승인 시점, 반려 시 개인으로 계속 사용)을 코드로 고정한다. |
entity/CollectionFileEntityTest.java이력 | 테스트 | 파일 인덱싱 상태 전이 — 특히 "실패 사유는 실패 상태에서만 남는다"는 불변을 고정한다. |
service/CollectionApprovalServiceTest.java이력 | 테스트 | CollectionApprovalService 유닛 테스트 (야간 플랜 20260821 N05 완료 조건 — 상태 전이 승인/반려/재요청). |
service/CollectionSearchServiceTest.java이력 | 테스트 | CollectionSearchService 유닛 테스트 (docs/rules/testing.md). |
service/CollectionServiceTest.java이력 | 테스트 | CollectionService 유닛 테스트 (docs/rules/testing.md — public 메서드마다 정상 1개 + 던질 수 있는 도메인 예외마다 1개). |
storage/CollectionFileStorageTest.java이력 | 테스트 | CollectionFileStorage — 실제 파일시스템에 쓰는 부분이라 임시 디렉터리로 검증한다. |
modules/ · 도메인
modules/organization-core/GitHub
조직·권한 · 로직
조직·권한 · 로직 — 조직도·사용자·레벨 5종 × 메뉴 권한, 그리고 인증 골격이 쓰는 비밀번호·refresh 토큰·부수정보 저장 포트의 구현.
config/2GitHub
@ConfigurationProperties 설정 바인딩과 빈 구성 (application.yml hwss.* 블록).
OrganizationConfig.java이력 | 설정 | 조직 모듈 설정 활성화. |
OrganizationProperties.java이력 | 설정 | 조직·사용자 도메인 운영 설정 (야간 플랜 20260828 N01). |
credential/8GitHub
인증 골격 포트 어댑터 — 임시 비밀번호, refresh 토큰, 사용자 부수정보.
RefreshTokenEntity.java이력 | 엔티티 | refresh 토큰 원장 1행 — V202608260003. |
UserCredentialEntity.java이력 | 엔티티 | 임시 비밀번호 해시 1행 — V202608250001. |
RefreshTokenRepository.java이력 | 저장소 | refresh 토큰 원장 조회·폐기. |
UserCredentialRepository.java이력 | 저장소 | UserCredentialEntity 저장소 (Spring Data JPA 인터페이스). |
OrganizationCredentialStoreAdapter.java이력 | 포트 구현 | CredentialStorePort 의 JPA 구현 — user_credentials 테이블. |
OrganizationRefreshTokenStoreAdapter.java이력 | 포트 구현 | RefreshTokenStorePort 의 JPA 구현 — 회전·무효화 원장(V202608260003). |
OrganizationUserSupplementAdapter.java이력 | 포트 구현 | UserSupplementLookupPort 의 JPA 구현 — 우리 DB 가 원장인 부수정보를 조합한다: 이메일은 user_supplements(사번당 1행), 권한은 user_roles(1:N) 의 대표 권한 (UserRoleSelector). |
OrganizationUserSupplementStoreAdapter.java이력 | 포트 구현 | UserSupplementStorePort 의 JPA 구현 — 온보딩이 부여하는 값을 두 테이블에 나눠 적는다: 이메일은 user_supplements(사번당 1행), 기본 권한은 user_roles(1:N 의 첫 행). |
entity/6GitHub
JPA 엔티티 — 테이블 한 행을 매핑한다.
DepartmentEntity.java이력 | 엔티티 | 부서 한 개 (조직도 트리의 노드). |
RoleEntity.java이력 | 엔티티 | 사용자 레벨 5종(IT 슈퍼관리자 · 조직장 · 센터장 · 팀장 · 일반사용자) 중 하나. |
RoleMenuPermissionEntity.java이력 | 엔티티 | 한 레벨이 특정 메뉴에 대해 가지는 사용 권한 (레벨 5종 × 메뉴 매트릭스의 셀 하나). |
UserEntity.java이력 | 엔티티 | 사용자(임직원) 한 명 — 라이브 디렉터리(스마트심사 뷰)가 대체할 값만 남긴 표본이다. |
UserRoleEntity.java이력 | 엔티티 | 사용자 권한 레벨 한 건 — 사용자:권한 은 1:N 이다(2026-08-26 지시, V202608260002 분리). |
UserSupplementEntity.java이력 | 엔티티 | 사용자 부가정보 1행 — 사번당 1행인 값(이메일)만 가진다. |
exception/10GitHub
BusinessException 하위 도메인 예외 — 에러 코드와 HTTP 상태를 정한다.
DepartmentNotFoundException.java이력 | 예외 | 조회한 부서 코드가 조직도에 없을 때. |
DuplicateMenuPermissionAssignmentException.java이력 | 예외 | 한 저장 요청에 같은 (레벨, 메뉴) 셀이 두 번 이상 담겼을 때. |
EmptyUserRoleAssignmentException.java이력 | 예외 | 보유 레벨을 하나도 남기지 않는 교체 요청일 때. |
FixedRoleMenuPermissionException.java이력 | 예외 | 고정 레벨(슈퍼관리자) 행을 저장 요청에 담았을 때. |
RoleNotFoundException.java이력 | 예외 | 조회한 레벨 코드가 등록된 5종에 없을 때. |
UnknownMenuPermissionMenuException.java이력 | 예외 | 저장 요청 본문의 (레벨, 메뉴) 셀이 매트릭스에 없을 때. |
UnknownMenuPermissionRoleException.java이력 | 예외 | 저장 요청 본문에 등록되지 않은 레벨 코드가 담겼을 때. |
UnknownUserRoleAssignmentException.java이력 | 예외 | 레벨 교체 요청 본문에 등록되지 않은 레벨 코드가 담겼을 때. |
UserNotFoundException.java이력 | 예외 | 조회한 사번의 사용자가 없을 때. |
UserRoleAssignNotAllowedException.java이력 | 예외 | 허용 레벨이 아닌 사용자가 다른 사용자의 보유 레벨을 바꾸려 할 때. |
repository/6GitHub
Spring Data JPA 저장소 인터페이스.
DepartmentRepository.java이력 | 저장소 | 부서 조회. |
RoleMenuPermissionRepository.java이력 | 저장소 | 레벨 × 메뉴 권한 조회. |
RoleRepository.java이력 | 저장소 | 사용자 레벨 조회. |
UserRepository.java이력 | 저장소 | 사용자 조회. |
UserRoleRepository.java이력 | 저장소 | 사용자 권한 조회 — 역할은 LAZY 연관이라 UserRepository 와 같은 이유로 join fetch 로 한 번에 읽는다. |
UserSupplementRepository.java이력 | 저장소 | 사용자 부가정보 조회 — 사번이 PK 라 파생 쿼리 없이 기본 메서드로 충분하다. |
security/2GitHub
base 의 사용자 조회 포트 어댑터.
OrganizationUserAccountLookupAdapter.java이력 | 포트 구현 | UserAccountLookupPort 의 organization 쪽 구현 — 인증이 알아낸 사번으로 세션에 담을 사용자 정보를 읽어준다. |
OrganizationUserEmailLookupAdapter.java이력 | 포트 구현 | UserEmailLookupPort 의 organization 쪽 구현 — 사용자 이메일을 돌려준다. |
service/4GitHub
조직도·권한 조회와 레벨 부여·회수 로직.
MenuPermissionService.java이력 | 서비스 | 레벨 × 메뉴 권한 조회·저장. |
OrganizationService.java이력 | 서비스 | 조직도·사용자 조회. |
UserRoleAssignmentService.java이력 | 서비스 | 사용자 레벨 마스터 조회 + 보유 레벨 부여·회수. |
UserRoleSelector.java이력 | 클래스 | 보유 권한 정렬 규칙 — 사용자:권한 은 1:N 이고(V202608260002) 목록은 항상 level_order 가 앞선(상위) 레벨부터 정렬한다. |
web/4GitHub
REST 컨트롤러 — HTTP 요청을 서비스로 넘기고 ApiResponse 로 감싼다.
DepartmentController.java이력화면 /admin/organizationSwagger | API | 조직도 조회 API (docs/rules/api.md 의 URL 패턴·표준 응답 구조). |
MenuPermissionController.java이력화면 /admin/permissionsSwagger | API | 사용자 레벨 × 메뉴 권한 API. |
RoleController.java이력화면 /admin/organizationSwagger | API | 사용자 레벨 마스터 조회 API. |
UserController.java이력화면 /admin/organizationSwagger | API | 사용자 조회 + 보유 레벨 편집 API. |
빌드·리소스1GitHub
모듈 빌드 스크립트와 src/main/resources.
build.gradle이력 | 빌드 | 이 모듈의 의존성 선언 — base, organization-shared 모듈 참조. |
resources/db/migration/9GitHub
Flyway 마이그레이션 SQL — 파일명 V<YYYYMMDDhhmm>__설명. 앱 기동 시 모든 모듈의 것이 버전 순으로 합쳐 실행된다.
src/test/9GitHub
테스트 파일 — 펼쳐서 보기
src/test/9GitHubcredential/OrganizationRefreshTokenStoreAdapterTest.java이력 | 테스트 | OrganizationRefreshTokenStoreAdapter 대상 테스트. |
credential/OrganizationUserSupplementAdapterTest.java이력 | 테스트 | OrganizationUserSupplementAdapter 대상 테스트. |
credential/OrganizationUserSupplementStoreAdapterTest.java이력 | 테스트 | OrganizationUserSupplementStoreAdapter 대상 테스트. |
security/OrganizationUserAccountLookupAdapterTest.java이력 | 테스트 | OrganizationUserAccountLookupAdapter 대상 테스트. |
security/OrganizationUserEmailLookupAdapterTest.java이력 | 테스트 | OrganizationUserEmailLookupAdapter 대상 테스트. |
service/MenuPermissionServiceTest.java이력 | 테스트 | MenuPermissionService 대상 테스트. |
service/OrganizationServiceTest.java이력 | 테스트 | OrganizationService 대상 테스트. |
service/UserRoleAssignmentServiceTest.java이력 | 테스트 | UserRoleAssignmentService 대상 테스트. |
support/TestEntities.java이력 | 클래스 | 테스트 픽스처 헬퍼. |
modules/ · 도메인
modules/audit-core/GitHub
감사 원장 · 로직
감사 원장 · 로직 — 행위자·시각·이벤트·대상·결과를 담는 범용 원장. base 의 AuditTrailPort 구현으로만 붙는다.
exception/1GitHub
BusinessException 하위 도메인 예외 — 에러 코드와 HTTP 상태를 정한다.
AuditLogSearchPeriodException.java이력 | 예외 | 기간 필터의 시작이 끝보다 늦을 때. |
port/1GitHub
base 포트 구현체.
AuditTrailPortAdapter.java이력 | 포트 구현 | AuditTrailPort 의 구현체 — 업무 도메인이 base 인터페이스로만 원장을 부르게 하는 자리 (docs/guides/backend-module-guide.md §5). |
service/2GitHub
비즈니스 로직과 트랜잭션 경계.
AuditTrailService.java이력 | 서비스 | 감사 원장의 적재와 조회 (야간 플랜 20260824 N04). |
AuditLogSpecifications.java이력 | 클래스 | 조회 조건 → JPA Criteria 조건. |
web/1GitHub
REST 컨트롤러 — HTTP 요청을 서비스로 넘기고 ApiResponse 로 감싼다.
AuditLogController.java이력화면 /admin/audit-logsSwagger | API | 관리자 감사 로그 조회 API (야간 플랜 20260824 N04). |
빌드·리소스1GitHub
모듈 빌드 스크립트와 src/main/resources.
build.gradle이력 | 빌드 | 이 모듈의 의존성 선언 — base, audit-shared 모듈 참조. |
resources/db/migration/1GitHub
Flyway 마이그레이션 SQL — 파일명 V<YYYYMMDDhhmm>__설명. 앱 기동 시 모든 모듈의 것이 버전 순으로 합쳐 실행된다.
V202608240001__create_audit_log.sql이력 | 마이그레이션 | 감사 원장 (야간 플랜 20260824 N04) — 관리자 "전체 로그" 메뉴의 저장소. |
src/test/1GitHub
테스트 파일 — 펼쳐서 보기
src/test/1GitHubservice/AuditTrailServiceTest.java이력 | 테스트 | AuditTrailService 의 적재·조회 유닛 테스트 (야간 플랜 20260824 N04). |
modules/ · 도메인
modules/workflow-core/GitHub
워크플로우 엔진 · 로직
워크플로우 엔진 · 로직 — 업무 도메인을 모르는 범용 엔진. 단계 정의를 DB 데이터로 두고 해석·실행하며, 실제 업무는 base 의 WorkflowStepWorkPort 구현체에 위임한다.
engine/2GitHub
워크플로우 엔진 본체.
WorkflowEngine.java이력 | 인터페이스 | DB 정의 기반 파이프라인 엔진 (docs/decisions/20260804-workflow-engine-db-pipeline.md). |
WorkflowEngineImpl.java이력 | 클래스 | WorkflowEngine 구현 — DB 단계 정의를 해석해 핸들러 실행·게이트 판정·실행 이력 기록. |
entity/4GitHub
JPA 엔티티 — 테이블 한 행을 매핑한다.
WorkflowDefinitionEntity.java이력 | 엔티티 | 워크플로우 정의(버전 단위). |
WorkflowExecutionEntity.java이력 | 엔티티 | 보고서별 실행 인스턴스. |
WorkflowStepEntity.java이력 | 엔티티 | 단계 정의. |
WorkflowStepExecutionEntity.java이력 | 엔티티 | 단계 실행 1회(attempt)의 이력. |
exception/5GitHub
BusinessException 하위 도메인 예외 — 에러 코드와 HTTP 상태를 정한다.
AmbiguousWorkflowDefinitionException.java이력 | 예외 | 같은 정의 코드에 활성 버전이 2개 이상일 때. |
WorkflowDefinitionNotFoundException.java이력 | 예외 | 실행하려는 정의 코드에 활성(active) 버전이 하나도 없을 때. |
WorkflowExecutionAlreadyRunningException.java이력 | 예외 | 보고서에 이미 진행 중(RUNNING/WAITING_USER) 실행이 있는데 새 실행을 시작하려 할 때 (S-007 §4-2 원칙 5 — 보고서 단위 진행 중 실행은 1개). |
WorkflowExecutionNotFoundException.java이력 | 예외 | 진행 중인 실행이 없는 보고서에 대해 다음 단계 진행을 요청했을 때. |
WorkflowStepHandlerNotFoundException.java이력 | 예외 | 단계 정의의 handler_bean 이 가리키는 핸들러 bean 이 이 앱 조합에 없을 때. |
gate/3GitHub
단계 진입 전 선행 조건 판정.
GateDecision.java이력 | record | 게이트 판정. |
WorkflowStepGate.java이력 | 인터페이스 | 단계 공통 선행 조건(pre-step gate). |
PortBackedStepGate.java이력 | 클래스 | WorkflowStepGate 의 유일한 구현체. |
handler/6GitHub
단계 핸들러 계약과 레지스트리.
StepContext.java이력 | record | 단계 핸들러에 넘기는 실행 컨텍스트. |
StepResult.java이력 | record | 단계 핸들러의 실행 결과. |
WorkflowStepHandlerRegistry.java이력 | 클래스 | workflow_steps.handler_bean 문자열을 실제 핸들러 bean 으로 바꿔주는 레지스트리. |
NoopStepHandler.java이력 | 핸들러 | 아무 일도 하지 않고 성공만 돌려주는 스텁 핸들러. |
PortBackedStepHandler.java이력 | 핸들러 | 단계의 실제 업무를 업무 도메인이 등록한 WorkflowStepWorkPort 에 되묻는 범용 핸들러. |
WorkflowStepHandler.java이력 | 핸들러 | 단계 하나가 실제로 하는 일. |
integration/2GitHub
base 포트 구현체 — 다른 도메인·워크플로우 엔진이 이 모듈을 부르는 입구.
WorkflowLauncherPortImpl.java이력7일 전 · #409 | 포트 구현 | WorkflowLauncherPort 의 실제 구현. |
WorkflowProgressPortImpl.java이력 | 포트 구현 | WorkflowProgressPort 의 실제 구현. |
repository/2GitHub
Spring Data JPA 저장소 인터페이스.
WorkflowDefinitionRepository.java이력 | 저장소 | 단계(WorkflowStepEntity)는 별도 Repository 를 두지 않는다 — 애그리게이트 루트인 정의를 통해서만 접근한다 (docs/guides/backend-module-guide.md §3-2). |
WorkflowExecutionRepository.java이력 | 저장소 | WorkflowExecutionEntity 저장소 (Spring Data JPA 인터페이스). |
빌드·리소스1GitHub
모듈 빌드 스크립트와 src/main/resources.
build.gradle이력 | 빌드 | 이 모듈의 의존성 선언 — base, workflow-shared 모듈 참조. |
resources/db/migration/1GitHub
Flyway 마이그레이션 SQL — 파일명 V<YYYYMMDDhhmm>__설명. 앱 기동 시 모든 모듈의 것이 버전 순으로 합쳐 실행된다.
V202608190003__create_workflow.sql이력 | 마이그레이션 | S-007 §3-3 워크플로우 엔진 도메인. |
src/test/6GitHub
테스트 파일 — 펼쳐서 보기
src/test/6GitHubengine/InvestigationMainPipelineTest.java이력 | 테스트 | W05. |
engine/WorkflowEngineImplTest.java이력 | 테스트 | 엔진 유닛 테스트. |
gate/PortBackedStepGateTest.java이력 | 테스트 | 게이트가 업무 도메인 포트에 되묻는지 — 판정 자체는 포트가 한다. |
handler/PortBackedStepHandlerTest.java이력 | 테스트 | 범용 핸들러가 단계 코드로 업무 포트를 찾아 위임하는지 — 2026-09-03 N02 의 배치 결정(도메인 핸들러는 base 포트로 붙는다)을 엔진 쪽에서 고정한다. |
integration/WorkflowLauncherPortImplTest.java이력7일 전 · #409 | 테스트 | 업무 도메인이 쓰는 WorkflowLauncherPort 구현체. |
integration/WorkflowProgressPortImplTest.java이력 | 테스트 | 읽기 포트 유닛 테스트. |
modules/ · 도메인
modules/code-core/GitHub
공통 코드 (샘플) · 로직
공통 코드 (샘플) · 로직 — 새 도메인 모듈을 만들 때 복제하는 참조 구현. 실제로 동작하며 CommonCodeLookupPort 를 제공한다.
entity/2GitHub
JPA 엔티티 — 테이블 한 행을 매핑한다.
CommonCodeDetailEntity.java이력 | 엔티티 | 공통 코드 그룹(CommonCodeEntity) 안의 실제 코드값 하나(예: GENDER 그룹의 "M"/"F"). |
CommonCodeEntity.java이력 | 엔티티 | 공통 코드 그룹(예: GENDER, ORDER_STATUS). |
exception/3GitHub
BusinessException 하위 도메인 예외 — 에러 코드와 HTTP 상태를 정한다.
CommonCodeAlreadyExistsException.java이력 | 예외 | 이미 등록된 code로 공통 코드 그룹을 새로 만들려 할 때. |
CommonCodeDetailAlreadyExistsException.java이력 | 예외 | 같은 그룹 안에 이미 있는 codeValue를 detail로 다시 추가하려 할 때. |
CommonCodeNotFoundException.java이력 | 예외 | id로 조회/수정/삭제하려는 공통 코드 그룹이 없을 때. |
integration/1GitHub
base 포트 구현체 — 다른 도메인·워크플로우 엔진이 이 모듈을 부르는 입구.
CommonCodeLookupPortImpl.java이력 | 포트 구현 | CommonCodeLookupPort의 실제 구현. |
repository/1GitHub
Spring Data JPA 저장소 인터페이스.
CommonCodeRepository.java이력 | 저장소 | 애그리게이트 루트(CommonCodeEntity)만 대상으로 하는 Repository다 — 자식인 CommonCodeDetailEntity는 별도 Repository를 두지 않는다(항상 그룹을 통해 접근). |
service/1GitHub
비즈니스 로직과 트랜잭션 경계.
CommonCodeService.java이력 | 서비스 | CommonCodeService의 참조 구현 — core/shared 모듈 패턴을 그대로 복제해 새 도메인을 만들 때 참고하는 예시다(docs/guides/backend-module-guide.md §3). |
web/1GitHub
REST 컨트롤러 — HTTP 요청을 서비스로 넘기고 ApiResponse 로 감싼다.
CommonCodeController.java이력화면 미연결Swagger | API | docs/rules/api.md 의 URL 패턴(/api/v1/{resource})과 표준 응답 구조를 따르는 공통 코드 관리 API. |
resources/db/migration/1GitHub
Flyway 마이그레이션 SQL — 파일명 V<YYYYMMDDhhmm>__설명. 앱 기동 시 모든 모듈의 것이 버전 순으로 합쳐 실행된다.
V202607220001__create_common_code.sql이력 | 마이그레이션 | code-core 모듈이 필요로 하는 테이블. |
src/test/1GitHub
테스트 파일 — 펼쳐서 보기
src/test/1GitHubservice/CommonCodeServiceTest.java이력 | 테스트 | CommonCodeService 대상 테스트. |
modules/ · 인프라 어댑터
modules/aiplatform-core/GitHub
외부 AI 플랫폼 어댑터
외부 AI 플랫폼 어댑터 — base 의 Vector*Port 구현만 담는 인프라 모듈(shared 없음). provider 설정으로 in-memory(기본) 또는 업스테이지 Studio 를 고른다.
(루트)3GitHub
provider 선택과 어댑터 빈 구성.
AiPlatformProvider.java이력 | enum | 어느 AI 플랫폼 구현을 붙일지 고르는 값 (hwss.ai-platform.provider). |
AiPlatformConfig.java이력 | 설정 | AI 플랫폼 어댑터 빈 구성. |
AiPlatformProperties.java이력 | 설정 | AI 플랫폼 연동 설정 (hwss.ai-platform.*). |
inmemory/1GitHub
외부 호출 없는 in-memory 벡터 저장소.
InMemoryVectorStoreAdapter.java이력 | 포트 구현 | 외부 호출 없는 in-memory 벡터 저장소 (hwss.ai-platform.provider=none). |
studio/4GitHub
업스테이지 Studio(v2) 연동 어댑터.
StudioConfig.java이력 | 설정 | Studio 어댑터 빈 구성 — hwss.ai-platform.provider=studio 일 때만 활성화된다. |
StudioProperties.java이력 | 설정 | 업스테이지 Studio(v2) 접속 설정 (hwss.ai-platform.studio.*). |
StudioIndexingStatusMapper.java이력 | 클래스 | 플랫폼 인덱싱 상태 문자열 → VectorIndexingStatus 접기. |
StudioVectorStoreAdapter.java이력 | 포트 구현 | 업스테이지 Studio(v2) Vector Stores 어댑터 골격 (hwss.ai-platform.provider=studio). |
studio/dto/11GitHub
Studio Vector Stores 요청·응답 DTO 초안.
VectorStoreCreateRequest.java이력 | DTO | POST /v2/vector_stores 요청 (예측 초안 — 패키지 주석 참고). |
VectorStoreDeleteResponse.java이력 | DTO | 삭제 응답 (예측 초안 — 패키지 주석 참고). |
VectorStoreFileBatchCreateRequest.java이력 | DTO | POST /v2/vector_stores/{vector_store_id}/file_batches 요청 (예측 초안 — 패키지 주석 참고). |
VectorStoreFileBatchResponse.java이력 | DTO | 파일 배치 한 건의 응답 표현 (예측 초안 — 패키지 주석 참고). |
VectorStoreFileCreateRequest.java이력 | DTO | POST /v2/vector_stores/{vector_store_id}/files 요청 (예측 초안 — 패키지 주석 참고). |
VectorStoreFileResponse.java이력 | DTO | 벡터 스토어에 담긴 파일 한 건의 응답 표현 (예측 초안 — 패키지 주석 참고). |
VectorStoreModifyRequest.java이력 | DTO | POST /v2/vector_stores/{vector_store_id} 수정 요청 (예측 초안 — 패키지 주석 참고). |
VectorStoreResponse.java이력 | DTO | 벡터 스토어 한 개의 응답 표현 (예측 초안 — 패키지 주석 참고). |
VectorStoreSearchRequest.java이력 | DTO | POST /v2/vector_stores/{vector_store_id}/search 요청 (예측 초안 — 패키지 주석 참고). |
VectorStoreSearchResponse.java이력 | DTO | 검색 응답 (예측 초안 — 패키지 주석 참고). |
package-info.java이력 | 패키지 주석 | 업스테이지 Studio(v2) Vector Stores 표면의 요청·응답 DTO 초안. |
src/test/5GitHub
테스트 파일 — 펼쳐서 보기
src/test/5GitHubAiPlatformConfigTest.java이력 | 테스트 | AiPlatformConfig 대상 테스트. |
inmemory/InMemoryVectorStoreAdapterTest.java이력 | 테스트 | InMemoryVectorStoreAdapter 대상 테스트. |
studio/StudioConfigTest.java이력 | 테스트 | provider 별 빈 등록이 실제로 배타적인지 — 두 구성을 함께 올려서 확인한다. |
studio/StudioVectorStoreAdapterTest.java이력 | 테스트 | Studio 어댑터 골격의 요청 형태를 고정한다 — 실제 플랫폼은 부르지 않는다 (MockRestServiceServer). |
studio/dto/StudioVectorStoreDtoTest.java이력 | 테스트 | 아직 포트에 대응 메서드가 없어 어댑터가 부르지 않는 DTO 초안(배치·청킹)의 JSON 형태를 고정한다. |
modules/ · 인프라 어댑터
modules/mail-core/GitHub
SMTP 발송 어댑터
SMTP 발송 어댑터 — 사내 Postfix 발송(MailDeliveryPort 구현)과 관리자 메일 계정 비밀번호 재설정.
(루트)6GitHub
SMTP 발송 어댑터 본체 — 설정·자격 증명·sender 공급.
SmtpMailConfig.java이력 | 설정 | SMTP 발송 빈 구성. |
SmtpMailProperties.java이력 | 설정 | 사내 SMTP 접속 설정 (hwss.mail.*). |
SmtpSenderSupplier.java이력 | 인터페이스 | 발송 1회분 sender 를 공급한다. |
SmtpCredentialProvider.java이력 | 클래스 | 지금 발송에 쓸 SMTP 비밀번호를 결정한다 — DB 에 저장된 값이 우선, 없으면 설정값. |
SmtpMailSenderFactory.java이력 | 클래스 | 주어진 비밀번호로 발송 1회분 sender 를 만든다. |
SmtpMailDeliveryAdapter.java이력 | 포트 구현 | MailDeliveryPort 의 SMTP 구현. |
password/12GitHub
SMTP 대표 계정 비밀번호 암호화 저장·변경 이력.
MailAccountPasswordConfig.java이력 | 설정 | 비밀번호 저장소와 기동 점검의 빈 구성. |
MailAccountPasswordEntity.java이력 | 엔티티 | SMTP 대표 계정 비밀번호 한 건 — 테이블에 항상 최대 한 행이다(CHECK (id = 1)). |
MailAccountPasswordHistoryEntity.java이력 | 엔티티 | 비밀번호 변경 이력 한 줄 — 언제 누가 바꿨는가만 남긴다. |
MailAccountPasswordConfirmationException.java이력 | 예외 | 재설정 요청의 기존 비밀번호 확인이 통과하지 못했을 때 (값이 없거나 저장된 값과 다르다). |
MailAccountPasswordConflictException.java이력 | 예외 | 두 재설정이 같은 순간에 최초 행을 만들려다 부딪혔을 때. |
MailAccountPasswordResetNotAllowedException.java이력 | 예외 | 허용 레벨이 아닌 사용자가 SMTP 대표 계정 비밀번호를 재설정하려 할 때. |
MailSecretException.java이력 | 예외 | SMTP 대표 계정 비밀번호의 암·복호화가 성립하지 않는 상태. |
MailAccountPasswordHistoryRepository.java이력 | 저장소 | 비밀번호 변경 이력 저장소. |
MailAccountPasswordRepository.java이력 | 저장소 | 단일 행 비밀번호 저장소. |
MailAccountPasswordStartupCheck.java이력 | 클래스 | 기동 시점에 저장된 비밀번호를 실제로 복호화해 본다. |
MailAccountPasswordStore.java이력 | 클래스 | SMTP 대표 계정 비밀번호의 저장·조회·재설정 (결정문 §1). |
MailSecretCipher.java이력 | 클래스 | SMTP 대표 계정 비밀번호의 대칭 암·복호화 (AES-256-GCM). |
service/1GitHub
비즈니스 로직과 트랜잭션 경계.
MailAccountService.java이력 | 서비스 | 관리자 "메일 발송 계정" 화면의 조회·재설정 (결정문 §2·§3, 화면은 N03). |
web/5GitHub
관리자 메일 계정 API와 SMTP 접속 점검 엔드포인트.
MailAccountController.java이력화면 /admin/mail-accountSwagger | API | 관리자 메일 발송 계정 API (화면 /admin/mail-account, 결정문 docs/decisions/20260827-smtp-password-admin-reset.md). |
MailTestController.java이력 | API | SMTP 접속 검증용 임시 엔드포인트. |
MailAccountPasswordResetRequest.java이력 | DTO | SMTP 대표 계정 비밀번호 재설정 요청 (결정문 §2). |
MailAccountView.java이력 | DTO | 관리자 "메일 발송 계정" 화면이 읽는 상태 전체 (결정문 §1·§3, 화면은 N03). |
MailAccountPasswordChange.java이력 | record | 비밀번호 변경 이력 한 줄 — 언제 누가 만 담는다. |
resources/db/migration/1GitHub
Flyway 마이그레이션 SQL — 파일명 V<YYYYMMDDhhmm>__설명. 앱 기동 시 모든 모듈의 것이 버전 순으로 합쳐 실행된다.
V202608270002__create_mail_account_password.sql이력 | 마이그레이션 | SMTP 대표 계정 비밀번호 저장소 + 변경 이력 (docs/decisions/20260827-smtp-password-admin-reset.md 🟢 §1). |
src/test/9GitHub
테스트 파일 — 펼쳐서 보기
src/test/9GitHubSmtpCredentialProviderTest.java이력 | 테스트 | SmtpCredentialProvider 대상 테스트. |
SmtpMailConfigTest.java이력 | 테스트 | 활성화 조건과 JavaMail 프로퍼티 매핑(STARTTLS 강제·타임아웃·ssl.trust)이 설정대로 구성되는지 검증한다. |
SmtpMailDeliveryAdapterTest.java이력 | 테스트 | SmtpMailDeliveryAdapter 대상 테스트. |
SmtpMailPropertiesTest.java이력 | 테스트 | SmtpMailProperties 대상 테스트. |
password/MailAccountPasswordStartupCheckTest.java이력 | 테스트 | 기동 점검의 네 경우. |
password/MailAccountPasswordStoreTest.java이력 | 테스트 | MailAccountPasswordStore 대상 테스트. |
password/MailSecretCipherTest.java이력 | 테스트 | MailSecretCipher 대상 테스트. |
service/MailAccountServiceTest.java이력 | 테스트 | 관리자 메일 발송 계정 서비스의 세 책임 — 인가, 기존 비밀번호 확인 정책, 변경 주기 계산. |
web/MailTestControllerTest.java이력 | 테스트 | MailTestController 대상 테스트. |
modules/ · 인프라 어댑터
modules/smartreview-core/GitHub
스마트심사 오라클 조회 어댑터
스마트심사 오라클 조회 어댑터 — 스마트심사 사용자·조직 뷰를 두 번째 DataSource 로 라이브 조회한다(기본 비활성).
(루트)5GitHub
오라클 커넥션 풀과 사용자·조직 디렉터리 어댑터.
SmartReviewConfig.java이력 | 설정 | 스마트심사 오라클 라이브 조회 구성. |
SmartReviewProperties.java이력 | 설정 | 스마트심사 오라클 접속 설정(hwss.smartreview.*) — 값은 전부 환경변수로 주입한다. |
SmartReviewConnectionPool.java이력 | 클래스 | 스마트심사 오라클 커넥션 풀 홀더. |
SmartReviewOrganizationDirectoryAdapter.java이력 | 포트 구현 | 조직·사용자 디렉터리의 스마트심사 뷰 구현 — 조직도(VW_AI_UVORG001)·사용자 (VW_AI_UVORG002)를 라이브로 읽고, 직급/직책 코드는 공통코드 뷰 (VW_AI_UVCDT001)로 해석한다. |
SmartReviewUserDirectoryAdapter.java이력 | 포트 구현 | 스마트심사 사용자 뷰(SMART.VW_AI_UVORG002) 라이브 조회 — 사본 없이 매 조회가 실시간이다 (8/19 🟢 "뷰 라이브 직접 조회"). |
src/test/4GitHub
테스트 파일 — 펼쳐서 보기
src/test/4GitHubSmartReviewConfigTest.java이력 | 테스트 | 기본 비활성 검증 — 접속 정보 없는 환경(로컬·CI)에서 오라클 풀이 절대 뜨지 않아야 한다. |
SmartReviewDirectoryMetricsTest.java이력 | 테스트 | 스마트심사 오라클 조회의 계측을 고정한다 (docs/decisions/20260828-observability-stack.md §2 "외부 연동 장애 분석"). |
SmartReviewOrganizationDirectoryAdapterTest.java이력 | 테스트 | SmartReviewOrganizationDirectoryAdapter 대상 테스트. |
SmartReviewUserDirectoryAdapterTest.java이력 | 테스트 | SmartReviewUserDirectoryAdapter 대상 테스트. |
검증·계약·배포 보조
http/GitHub
API 호출 시나리오
API 수동·자동 검증 시나리오 — httpyac/IntelliJ HTTP Client 로 로컬 서버에 직접 요청을 보내는 파일. 일부는 apps/hwss-api 테스트가 파일을 그대로 재생해 기대값을 검증한다.
admin-mail-account.http이력 | HTTP 시나리오 | 관리자 메일 발송 계정 — 최초 배포 조회 → 첫 재설정 → 확인 강제 → 인가 (야간 플랜 20260827 N02) |
admin-report-template.http이력 | HTTP 시나리오 | 관리자 보고서 양식 설정 — 등록 → 수정(버전 증가) → 복제 → 버전 전환 → 삭제 (주말 플랜 20260822 W15) |
admin-statistics-backfill.http이력7일 전 · #405 | HTTP 시나리오 | 관리자 통계 사실 재적재(backfill) 명령 — investigation-core statistics (야간 플랜 20260904 ST04, S-007 §3-4 「재적재 명령」) |
admin-statistics-business.http이력7일 전 · #404 | HTTP 시나리오 | 관리자 업무 통계 조회 API — investigation-core statistics (야간 플랜 20260904 ST03-B, S-007 §3-4 「조회 API」) |
admin-statistics-lifecycle.http이력어제 · #466 | HTTP 시나리오 | 관리자 시스템 통계 조회 API — investigation-core statistics (야간 플랜 20260911 DP06, S-007 §3-4 「생애주기 조회 API」) |
admin-statistics-unmapped.http이력7일 전 · #406 | HTTP 시나리오 | 관리자 미매핑 큐·차원 마스터 API — investigation-core statistics (야간 플랜 20260904 ST05-A, S-007 §3-4 「미매핑 큐 API」) |
audit-log.http이력 | HTTP 시나리오 | 감사 로그 조회 API — audit-core (야간 플랜 20260824 N04) |
classification-mapping.http이력 | HTTP 시나리오 | 분류체계 매핑 API (야간 플랜 20260824 N02) — classification-core |
classification-stub-e2e.http이력어제 · #466 | HTTP 시나리오 | 스텁 분류 결과 E2E — 확정 → `미분류검출` → W07 조치 → `추출중` → `추출완료` (2026-09-03 야간 N02, S-004 §7) |
collections.http이력 | HTTP 시나리오 | 지식컬렉션 세로조각 — 생성 → 파일 등록 → 승인 → 검색 (야간 플랜 20260821 N03~N06) |
common-code.http이력 | HTTP 시나리오 | 공통 코드 관리 API — code-core 샘플 도메인 아래 요청들은 DB가 비어있는 상태(공통 코드 id가 1부터 시작)를 가정한다. |
customer-company.http이력 | HTTP 시나리오 | 위탁사 마스터 조회 API (N03) — classification-core |
image-integration.http이력6일 전 · #424 | HTTP 시나리오 | 이미지 시스템 연동 API-01~07 스모크 (S-003) 위에서 아래로 한 번에 실행하는 순서 있는 시나리오다. 정상 경로와, 컨트롤러가 실제로 돌려주는 |
image-reception-e2e.http이력6일 전 · #424 | HTTP 시나리오 | 이미지시스템 수신 E2E — 접수 세로조각의 상태 전이 (P1-3, S-003 API-01~03 + S-004 §8) |
investigation-workspace.http이력어제 · #466 | HTTP 시나리오 | P1-2 워크스페이스 세로조각 — 전송 수신 → 분류 → 추출 → 분석 → 요약·확정 → 초안 → 메일 → 진행상태(W06~W14) |
investigation.http이력 | HTTP 시나리오 | 조사 관리 API — investigation-core 샘플 도메인 code-core 를 Gradle 의존성 없이 base.CommonCodeLookupPort 로만 참조하는 예시. |
mail-test.http이력 | HTTP 시나리오 | SMTP 발송 테스트 (POST /api/v1/ops/mail-test) 전제: 서버가 메일 설정과 함께 기동돼 있어야 한다 — |
menu-permission.http이력 | HTTP 시나리오 | 메뉴 권한 매트릭스 API — organization-core (야간 N03) |
pipeline-seed.http이력7일 전 · #409 | HTTP 시나리오 | 전 단계 보고서 세트 시드 — 목록·워크스페이스 화면을 실제 데이터로 돌려보기 위한 시나리오 (2026-09-03 야간 N03) |
prepare-image-zip.sh이력 | 스크립트 | !/usr/bin/env bash image-integration.http 의 API-02(전송 완료 통지) 스모크를 돌리기 전에 실행한다. |
report-page-image.http이력7일 전 · #409 | HTTP 시나리오 | 페이지 원본 이미지 서빙 — 문서 뷰어(N05)가 <img src> 로 여는 경로 (2026-09-03 야간 N04) |
user-roles.http이력 | HTTP 시나리오 | 사용자 레벨 마스터 조회 + 보유 레벨 부여·회수 (야간 플랜 20260828 N01) |
검증·계약·배포 보조
openapi/GitHub
API 계약 스냅샷
프론트 타입 생성의 원천이 되는 API 계약 스냅샷.
openapi.json이력어제 · #466 | 계약 | springdoc /v3/api-docs 의 커밋 스냅샷 — 손으로 고치지 않고 ./gradlew :hwss-api:exportOpenApiSpec 으로 갱신. 프론트 lib/api/schema.d.ts·MSW 핸들러가 여기서 생성된다. |
README.md이력 | 문서 | 스냅샷 갱신 절차와 드리프트 검사(OpenApiSnapshotTest, 프론트 check:openapi) 설명. |
검증·계약·배포 보조
certs/GitHub
사내 인증서
Docker 이미지 빌드 때 JVM 신뢰 저장소에 자동 등록되는 공개 인증서.
postfix-internal.crt이력 | 인증서 | 사내 메일 서버(Postfix) 자가서명 인증서 — SMTP TLS 신뢰 검증용. |
README.md이력 | 문서 | 인증서 목록·출처·등록 방식. |
검증·계약·배포 보조
로컬 전용 (Git 미추적)
build · runtime · tools
.gitignore 대상이라 저장소에는 없고 로컬에서만 생기는 폴더입니다.
build/ (각 모듈) | 산출물 | Gradle 빌드 산출물 — jar, 테스트·JaCoCo 리포트. |
runtime/ | 로컬 데이터 | 이미지 수신·압축 해제·컬렉션 업로드 파일이 쌓이는 로컬 경로 (application.yml 의 *_ROOT 기본값). |
tools/ | 로컬 도구 | 로컬 목 서버 등 개인 도구 산출물. |
파일 목록·역할 문장·변경 표시는 dev 에 머지될 때마다 코드와 git 이력에서 다시 뽑습니다. 설명 주석이 없는 파일은 이름 규칙으로 채웠으니, 새 파일에는 Javadoc 첫 문장을 한 줄로 써 주세요.