hwss-investigation-agent-backend · 커밋 f1034441 · 2026-09-15 17:57 KST 빌드

HWSS 백엔드 가이드

폴더(모듈 → 패키지) 단위로 무엇이 있는지와 파일마다 맡은 역할을 정리했습니다. 역할 문장은 각 클래스의 Javadoc 첫 문장을 옮겼고, 주석이 없는 파일은 이름 규칙으로 보충했습니다. 파일 이름을 누르면 GitHub 소스로 가고, 최근 변경된 파일은 강조됩니다. 컨트롤러 행에는 그 API 를 부르는 프론트 화면이 연결됩니다. 코드에 쓰인 W·N·ST·DP 번호는 주말·야간 작업 플랜의 항목 번호, S-00x 는 docs/specs 스펙 번호입니다. 섹션 제목 옆 말풍선으로 댓글을, 이슈 버튼으로 GitHub 이슈를 남길 수 있습니다.

605Java 소스
178테스트
42Flyway 마이그레이션
19Gradle 모듈

모듈 계층과 의존 방향

  1. base공통 응답·예외·인증 골격·포트 인터페이스
  2. <domain>-sharedDTO·enum 계약 (base 에만 의존)
  3. <domain>-core엔티티·저장소·서비스·컨트롤러·마이그레이션 (base + 자기 shared)
  4. 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/ 에서 실행

접속 주소

Swagger 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

로그에 Successfully applied … migrationsStarted 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_PASSWORDlocal 프로필 공용 로그인 비밀번호. 비우면 로그인 자체가 막힌다.
DB_URL · DB_USERNAME기본 jdbc:postgresql://localhost:5432/hwss · hwss.
IMAGE_INCOMING_ROOT이미지시스템과 공유하는 ZIP 수신 폴더(기본 runtime/incoming). 이미지시스템 데모와 같은 절대 경로여야 API-02 가 동작.
IMAGE_PROCESSING_ROOTZIP 압축 해제·낱장 파일 처리 폴더(기본 runtime/image-processing).
COLLECTION_STORAGE_ROOT지식컬렉션 업로드 파일 저장 폴더(기본 runtime/collections).
AI_PLATFORM_PROVIDERnone(기본, in-memory) 또는 studio(업스테이지 Studio 접속 설정 필요).
MAIL_ENABLEDSMTP 발송 켜기(기본 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 verifyModuleDependenciescore 끼리 직접 의존 같은 모듈 경계 위반 검사.
./gradlew coverageSummary모듈별 커버리지 표 — build/reports/jacoco/coverage-summary.md. 빌드를 실패시키지 않는 보고 전용.
./gradlew :hwss-api:exportOpenApiSpecopenapi/openapi.json 스냅샷 갱신(서버·DB 불필요). 이어서 프론트에서 pnpm openapi:gen 을 같은 PR 에 커밋.
./gradlew :hwss-api:bootJar실행 jar 생성 — Dockerfile 이 쓰는 것과 같은 산출물.
./gradlew --no-daemon spotlessCheck test verifyModuleDependenciesCI(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일 이내에 바뀐 파일 행은 주황색으로 강조됩니다.

#47809/14 · 어제제목은 로그인 후 표시
#48109/14 · 어제제목은 로그인 후 표시
#46609/14 · 어제제목은 로그인 후 표시
#42909/09 · 6일 전제목은 로그인 후 표시
#42809/09 · 6일 전제목은 로그인 후 표시
#42409/08 · 6일 전제목은 로그인 후 표시
#41009/08 · 7일 전제목은 로그인 후 표시
#40909/08 · 7일 전제목은 로그인 후 표시
#40809/08 · 7일 전제목은 로그인 후 표시
#40609/08 · 7일 전제목은 로그인 후 표시
#40509/08 · 7일 전제목은 로그인 후 표시
#40409/08 · 7일 전제목은 로그인 후 표시
#40309/08 · 7일 전제목은 로그인 후 표시
#39809/04 · 11일 전제목은 로그인 후 표시
#39509/04 · 11일 전제목은 로그인 후 표시
#36409/02 · 12일 전제목은 로그인 후 표시
#35609/02 · 13일 전제목은 로그인 후 표시

루트

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) 테스트를 가진다.

2 소스52 테스트
의존 모듈 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
주요 라이브러리 spring-boot-starter-web spring-boot-starter-actuator micrometer-registry-prometheus springdoc-openapi-starter-webmvc-ui spring-boot-starter-data-jpa flyway-core flyway-database-postgresql postgresql spring-boot-devtools

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

테스트 파일 — 펼쳐서 보기
api/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-BS-007 §3-4 「조회 API」)를 실제 HTTP 경계 + H2 스키마 위에서 확인한다.
api/statistics/LifecycleStatisticsApiTest.java이력어제 · #466테스트시스템 통계 조회 API(DP06S-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-AS-007 §3-4 「미매핑 큐 API」)의 완료 조건을 실제 HTTP 경계 + H2 스키마 위에서 고정한다.
api/statistics/StatisticsBackfillApiTest.java이력7일 전 · #405테스트재적재 명령 API(ST04S-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 의존 없이 서로 부르게 하는 포트 인터페이스를 둔다. 다른 모듈에 의존하지 않는다.

77 소스15 테스트
의존 모듈 없음
주요 라이브러리 spring-boot-starter-web spring-security-crypto spring-boot-starter-validation micrometer-core jjwt-api jjwt-impl jjwt-jackson springdoc-openapi-starter-webmvc-ui spring-boot-starter-data-jpa

ai/11GitHub

외부 AI 플랫폼(벡터 컬렉션·인덱싱·검색) 포트와 값 객체.

VectorCollectionCreateCommand.java이력DTOVectorCollectionPort#create 입력.
VectorDocumentIndexCommand.java이력DTOVectorDocumentPort#requestIndexing 입력.
VectorSearchHit.java이력DTO검색 결과 한 건.
VectorIndexingStatus.java이력enum문서 인덱싱 진행 상태.
VectorCollectionRef.java이력record플랫폼에 만들어진 컬렉션 한 개에 대한 참조.
VectorDocumentRef.java이력record플랫폼에 인덱싱 요청된 문서 한 건에 대한 참조.
VectorSearchQuery.java이력recordVectorSearchPort#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)의 데이터 원천을 로컬 표본에서 라이브 뷰로 바꾸기 위한 자리다.

persistence/1GitHub

엔티티 공용 매핑 조각.

AuditTimestamps.java이력클래스모든 도메인 엔티티가 공유하는 감사 시각(생성/수정) 두 컬럼.

pipeline/2GitHub

사람이 고친 값을 외부 파이프라인에 반영하는 포트.

PipelineCorrectionSyncException.java이력예외보정을 외부 파이프라인에 반영하지 못했을 때.
PipelineCorrectionSyncPort.java이력포트사람이 고친 값을 외부 파이프라인에 되돌려 반영하는 포트.

response/2GitHub

표준 응답 래퍼(success/data/error).

ApiResponse.java이력DTOdocs/rules/api.md 의 표준 응답 구조(success/data/error)를 따르는 공통 응답 래퍼.
ApiError.java이력recordApiResponse#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이력화면 미연결SwaggerAPI최초 로그인 온보딩 API — 세션은 있으나 부수정보(레벨)가 없는 사용자가 이메일·비밀번호를 설정하고 기본 레벨(일반사용자)을 받는다.
AuthOnboardingService.java이력서비스최초 로그인 온보딩 — 부수정보(레벨·이메일)가 없는 사용자가 이메일과 비밀번호를 설정하면 기본 레벨(일반사용자)을 부여한다 (2026-08-26 PM 지시).

security/web/2GitHub

세션 API (login·logout·me·refresh).

AuthController.java이력화면 미연결SwaggerAPI세션 API.
LoginRequest.java이력DTO개발용 로그인 요청.

validation/2GitHub

커스텀 Bean Validation 제약.

NullOrNotBlank.java이력클래스PATCH(부분 수정) DTO의 String 필드용.
NullOrNotBlankValidator.java이력클래스NullOrNotBlank의 실제 검증 로직 — null은 통과(=필드 생략), 공백 문자열만 거부한다.

workflow/10GitHub

업무 도메인 ↔ 워크플로우 엔진 사이의 포트와 진행 뷰.

WorkflowLaunchCommand.java이력DTOWorkflowLauncherPort 로 워크플로우 실행을 시작할 때 넘기는 값이다.
WorkflowProgressDetail.java이력DTO화면 스테퍼가 한 번에 필요로 하는 것 전부 — 현재 단계 + 단계 이력 + 게이트 차단 사유.
WorkflowProgressView.java이력DTO업무 화면이 "지금 어느 단계인가"를 표시하기 위해 읽는 워크플로우 실행 스냅샷.
WorkflowStepProgressView.java이력DTO단계 하나의 진행 상태 — 화면 스테퍼의 칸 하나에 해당한다.
WorkflowStepSuccess.java이력record엔진이 WorkflowStepCompletionPort 로 알리는 "단계 성공" 사실.
StepPreconditionPort.java이력포트워크플로우 단계의 업무 선행 조건을 판정하는 포트.
WorkflowLauncherPort.java이력포트업무 도메인이 워크플로우 실행을 시작·진행시킬 때 쓰는 포트(인터페이스).
WorkflowProgressPort.java이력포트업무 도메인이 워크플로우 진행 상황을 읽기만 할 때 쓰는 포트.
WorkflowStepCompletionPort.java이력포트워크플로우 단계가 성공해 처리 상태가 넘어갈 때 그 사실을 업무 도메인에 되돌려 주는 포트.
WorkflowStepWorkPort.java이력포트워크플로우 단계가 실제로 하는 업무(분류·추출·분석 …)를 업무 도메인이 제공하는 포트.

빌드·리소스1GitHub

모듈 빌드 스크립트와 src/main/resources.

build.gradle이력빌드이 모듈의 의존성 선언 — 다른 모듈 의존 없음.

src/test/15GitHub

테스트 파일 — 펼쳐서 보기
ApiResponseTest.java이력테스트ApiResponse 대상 테스트.
ai/VectorSearchQueryTest.java이력테스트VectorSearchQuery 대상 테스트.
file/ZipArchiveProcessorTest.java이력테스트ZipArchiveProcessor 대상 테스트.
observability/ExternalCallMetricsTest.java이력테스트ExternalCallMetrics 대상 테스트.
observability/MdcPropagationTest.java이력테스트MdcPropagation 대상 테스트.
observability/RequestCorrelationFilterTest.java이력테스트RequestCorrelationFilter 대상 테스트.
persistence/AuditTimestampsTest.java이력테스트AuditTimestamps 콜백 규약을 컨텍스트 없이 리플렉션으로 검증한다.
security/AuthCookieFactoryTest.java이력테스트쿠키 계약(20260810-frontend-auth-and-api-client.md §1 표)이 그대로 나가는지 확인한다.
security/AuthSessionServiceTest.java이력테스트AuthSessionService 대상 테스트.
security/AuthTokenServiceTest.java이력테스트AuthTokenService 대상 테스트.
security/JwtCookieAuthenticationFilterTest.java이력테스트JwtCookieAuthenticationFilter 대상 테스트.
security/RoleCodeAuthorizationTest.java이력테스트네 도메인(mail·collection·organization·classification)이 복제하고 있던 설정값 레벨 대조 판정을 한 곳으로 모은 뒤, 그 판정이 종전과 같은 답을 내는지 고정하는 테스트.
security/credential/CredentialIdentityProviderTest.java이력테스트CredentialIdentityProvider 대상 테스트.
security/local/LocalDevIdentityProviderTest.java이력테스트LocalDevIdentityProvider 대상 테스트.
security/onboarding/AuthOnboardingServiceTest.java이력테스트AuthOnboardingService 대상 테스트.

modules/ · 도메인

modules/investigation-shared/GitHub

사고조사 · 공유 DTO

사고조사 · 공유 DTO — 사고조사 도메인의 요청·응답 DTO, 상태 enum, 통계 API 계약.

88 소스0 테스트
의존 모듈 base
주요 라이브러리 spring-boot-starter-validation

dto/56GitHub

모듈 경계를 넘는 요청·응답 DTO (record).

AiAgentLogicalChangeRequest.java이력어제 · #478DTOHWSS에서 확정된 이동·삭제 결과를 이미지 시스템에 보내는 API-10 요청이다.
AnalysisRequestCommand.java이력DTO분석 요청(분석 조건) 입력.
AnalysisRequestView.java이력DTO저장된 분석 요청 한 버전.
ClassificationCorrectionView.java이력DTO분류 보정 한 건 — "이 낱장을 무엇에서 무엇으로 바꿨는가".
ClassificationManualAssignRequest.java이력DTO미분류·저신뢰 낱장의 수동 분류 확정 요청 (W07).
ClassificationResultGroup.java이력DTO분류 결과의 문서종별 묶음 = 문서 분류 폴더 하나.
ClassificationResultPageView.java이력DTO분류 결과의 낱장 한 장.
ClassificationResultSummary.java이력DTO분류 결과 한 버전의 집계.
ClassificationResultView.java이력DTO보고서 한 건의 분류 결과 한 버전 (S-007 §3-2 classification_results).
CustomerCompaniesSyncRequest.java이력DTO이미지 시스템의 위탁사 마스터 전체 목록을 한 번에 동기화하는 요청이다 (S-003 API-06).
CustomerCompaniesSyncResponse.java이력DTOAPI-06 전체 동기화 결과다.
DocumentTypeStructureItem.java이력DTO위탁사 문서분류 계약(documentTypeContractId) 시점의 문서분류 한 건이다.
DocumentTypeSyncRequest.java이력6일 전 · #428DTO위탁사별 문서분류 전체 목록을 계약 ID 단위로 동기화하는 요청이다 (S-003 API-07).
DocumentTypeSyncResponse.java이력6일 전 · #428DTOAPI-07 전체 동기화 결과다.
ExtractionDocumentGroup.java이력DTO문서종별 추출 항목 묶음.
ExtractionFieldCorrectionRequest.java이력어제 · #466DTO최신 정보추출 결과의 항목 값 수정 요청 (S-012 §2 `추출 완료` — "추출값 확인·수정").
ExtractionFieldView.java이력DTO추출 항목 한 개.
ExtractionResultView.java이력DTO보고서 한 건의 추출 결과 한 버전.
ImageDocumentClassificationApplyRequest.java이력DTOAI Agent에서 확정한 문서분류 결과를 이미지 시스템에 반영하는 API-09 요청이다.
ImageLogicalTransferRequest.java이력6일 전 · #428DTO파일 추가 없이 분류·순서·삭제만 반영된 최신 활성 페이지 전체 스냅샷이다 (S-003 API-03).
ImageLogicalTransferResponse.java이력DTO논리 변경 스냅샷을 접수한 결과다.
ImageReportConfirmRequest.java이력DTO최신 정상 적재분의 분류·추출 시작을 확정하는 요청이다.
ImageReportConfirmResponse.java이력DTO확정 요청 접수 후 적용된 최신 스냅샷과 처리 상태다.
ImageReportStatusResponse.java이력DTO이미지 연동 보고서의 현재 처리 상태와 최근 전송 이력이다.
ImageSystemResponse.java이력어제 · #478DTO이미지 시스템 API-09·10이 반환하는 v1.2 공통 응답이다.
ImageTransferCompleteRequest.java이력DTOAPI-01로 시작한 ZIP 업로드의 성공 또는 최종 실패 결과를 접수하는 요청이다 (S-003 API-02).
ImageTransferCompleteResponse.java이력DTO이미지 전송 완료 통지를 접수한 뒤 반환하는 검증 대기 상태다.
ImageTransferStartRequest.java이력6일 전 · #429DTO이미지 시스템이 ZIP 업로드 전에 보내는 전송 시작 스냅샷이다.
ImageTransferStartResponse.java이력DTO이미지 전송 시작 통지를 접수한 직후 반환하는 상태다.
InvestigationCreateRequest.java이력DTOPOST /api/v1/investigations 요청 바디.
InvestigationDocumentGroup.java이력DTO워크스페이스 문서함의 묶음 하나 = 문서 분류 폴더 하나.
InvestigationDocumentPage.java이력DTO문서함의 페이지 한 장 (S-007 report_pages 의 현재 스냅샷).
InvestigationReportDetail.java이력DTO워크스페이스 화면(P1-2) 한 건.
InvestigationReportPage.java이력DTO목록 한 페이지.
InvestigationReportSummary.java이력DTO조사자 목록 화면 한 행 (S-004 §5 목록 표시 상태 + §8-4 변경감지 보조 상태).
InvestigationResponse.java이력DTOstatusName은 code-core가 소유한 공통 코드(INVESTIGATION_STATUS 그룹)를 base의 CommonCodeLookupPort로 조회해 채운다.
InvestigationTransferHistoryItem.java이력DTO워크스페이스의 전송 이력 한 줄 (S-007 image_transfers).
InvestigationUpdateRequest.java이력DTO부분 수정용 DTO.
InvestigationWorkflowProgressDetail.java이력DTO워크스페이스 스테퍼가 한 번에 필요로 하는 것 전부 (W14).
ReportDraftUpdateRequest.java이력DTO초안 본문 수정 요청.
ReportDraftView.java이력DTO보고서 초안 한 버전.
ReportMailDispatchView.java이력DTO보고서 메일 발송 기록 한 건.
ReportMailSendRequest.java이력DTO보고서 메일 보내기 요청.
ReportTemplateSaveRequest.java이력DTO보고서 양식 등록·수정 요청.
ReportTemplateView.java이력DTO보고서 양식 한 버전.
SummaryCardView.java이력DTO병원(기관)별 요약 카드.
SummaryItemSourceView.java이력DTO요약 항목의 출처 하나.
SummaryItemUpdateRequest.java이력DTO요약 항목 본문 수정 요청.
SummaryItemView.java이력DTO요약 카드 안의 항목 하나 (내원경위·검사내용·진단병명·치료내용·기타사항 등).
SummaryReflectionRequest.java이력DTO항목별 보고서 반영 체크 요청 (8/18 확정 — 요약 확정 후 켜고 끌 수 있는 유일한 값).
SummaryResultView.java이력DTO보고서 한 건의 요약 결과 한 버전.
Customer.java이력recordAPI-06 전체 동기화 목록의 위탁사 한 건이다.
ImageDownloadedFile.java이력recordAPI-08을 통해 이미지 시스템에서 내려받아 무결성 검증을 마친 단건 이미지다.
InvestigationWorkflowProgress.java이력record워크스페이스 상단 스테퍼가 쓰는 현재 단계 정보.
InvestigationWorkflowStep.java이력record워크스페이스 스테퍼의 칸 하나.
LifeManualInput.java이력record스마트심사 DB View가 조사자·피보험자 정보를 제공하지 않는 건의 수기 입력 정보다 (S-003 API-01 manualInput).

statistics/17GitHub

통계 API 요청·응답 DTO와 enum.

BackfillRequest.java이력7일 전 · #405DTO통계 사실 재적재(backfill) 명령 본문 (ST04, S-007 §3-4 「재적재 명령」).
BackfillResultView.java이력7일 전 · #405DTO통계 사실 재적재(backfill) 결과 (ST04, S-007 §3-4 「재적재 명령」).
BusinessStatisticsRow.java이력7일 전 · #404DTO업무 통계 조회 결과의 한 행 — 차원 키 조합 하나의 순위·건수·비율.
BusinessStatisticsView.java이력7일 전 · #404DTO업무 통계 조회 응답 — 한 차원의 기간 Top N (ST03-B, S-007 §3-4 「조회 API」).
DimensionMasterSearchView.java이력7일 전 · #406DTO차원 마스터 검색 결과 (ST05-A — 병합 대상 고르기).
DimensionMasterView.java이력7일 전 · #406DTO차원 마스터(dim_hospitals·dim_doctors·dim_diseases) 한 건 (ST05-A).
LifecycleStatisticsDay.java이력어제 · #466DTO시스템 통계 조회 응답의 일별 행 — 추이 차트(#10 처리 건수·#11 평균 처리시간·#13 자동 분류율 추이)의 원천.
LifecycleStatisticsMetrics.java이력어제 · #481DTO시스템 통계(9/1 엑셀 5~31행 중 생애주기 지표) 한 묶음 — 기간 합계에도, 일별 행에도 같은 형상으로 실린다 (2026-09-11 야간 DP06, S-007 §3-4 「생애주기 조회 API」).
LifecycleStatisticsView.java이력어제 · #466DTO시스템 통계 조회 응답 — 기간 합계 한 묶음 + 일별 행 (2026-09-11 야간 DP06, S-007 §3-4 「생애주기 조회 API」).
UnmappedQueueItemView.java이력7일 전 · #406DTO미매핑 큐 목록의 한 행 (ST05-AS-007 §3-4 「미매핑 큐 API」).
UnmappedQueuePageView.java이력7일 전 · #406DTO미매핑 큐 목록 한 쪽 (ST05-A).
UnmappedResolveRequest.java이력7일 전 · #406DTO미매핑 큐 처리 본문 (ST05-AS-007 §3-4 「미매핑 큐 API」).
UnmappedResolveResultView.java이력7일 전 · #406DTO미매핑 큐 처리 결과 (ST05-A).
BusinessStatisticsDimension.java이력7일 전 · #404enum업무 통계 조회 API(ST03-BS-007 §3-4 「조회 API」)의 차원 8종.
StatDimension.java이력7일 전 · #406enum통계 차원 — 별칭 표(stat_dim_aliases.dimension)와 미매핑 큐(stat_unmapped_queue.dimension)가 어느 마스터를 가리키는지.
StatUnmappedStatus.java이력7일 전 · #406enum미매핑 큐 행의 처리 상태 (stat_unmapped_queue.status).
UnmappedResolveAction.java이력7일 전 · #406enum미매핑 큐 처리 동작 (ST05-AS-007 §3-4 「미매핑 큐 API」).

status/15GitHub

상태·구분 enum.

AnalysisContractItemCategory.java이력enum계약별 입력 항목의 갈래 (2026-08-19 확정 구조의 '청약서 질문'과 '고지사항').
ClassificationCorrectionType.java이력enum분류 보정의 갈래 (W07).
ClassificationPageStatus.java이력enum낱장 한 장의 분류 상태 (S-007 §3-2 classification_result_pages.classification_status).
ClassificationResultSource.java이력enum분류 결과 한 행이 어디서 나왔는지 (S-007 §3-2 classification_result_pages.result_source).
CorrectionSyncStatus.java이력enum보정을 외부 파이프라인(Studio)에 되돌려 반영한 상태.
ExtractionValuePolicy.java이력enum추출 항목 값의 저장 정책 (2026-08-20 주간회의 결정 7·8·9).
InvestigationListStatus.java이력enum조사자 목록 화면에 노출하는 사용자 중심 상태 (S-004 §4-1).
InvestigationProcessingStatus.java이력enum워크플로우 엔진과 연동 API 의 기준이 되는 내부 처리 상태 (S-004 §4-2).
MailDispatchStatus.java이력enum보고서 메일 발송 결과.
ReportDraftBodyFormat.java이력enum초안 본문의 형식.
ReportDraftStatus.java이력enum보고서 초안 진행 상태 (S-007 investigation_reports.report_draft_status).
ResultProvenance.java이력enum처리 결과(분류·추출·요약 …)를 무엇이 만들었는가 — 스텁 표본인지 실연동 산출물인지.
SnapshotBaselineStatus.java이력enum처리 기준 스냅샷(전송)의 상태 (S-004 §4-3).
SummarySourceType.java이력enum요약 항목이 근거로 삼은 출처의 갈래.
InvestigationWorkflowEvent.java이력이벤트처리 상태를 전이시키는 이벤트 (S-004 §6-1).

빌드·리소스1GitHub

모듈 빌드 스크립트와 src/main/resources.

build.gradle이력빌드이 모듈의 의존성 선언 — base 모듈 참조.

modules/ · 도메인

modules/investigation-core/GitHub

사고조사 · 비즈니스 로직

사고조사 · 비즈니스 로직 — 이미지시스템 수신 → 분류 → 추출 → 분석 조건 → 요약 → 초안 → 메일까지의 사고조사 파이프라인과 통계 적재·조회. 백엔드 코드의 절반가량이 여기 있다.

217 소스66 테스트26 마이그레이션
의존 모듈 base investigation-shared
주요 라이브러리 spring-boot-starter-web spring-boot-starter-validation spring-boot-starter-data-jpa springdoc-openapi-starter-webmvc-ui micrometer-core

config/18GitHub

@ConfigurationProperties 설정 바인딩과 빈 구성 (application.yml hwss.* 블록).

AnalysisConfig.java이력설정분석 요청 도메인의 설정 바인딩.
AnalysisProperties.java이력설정분석 요청(분석 조건) 설정.
ClassificationConfig.java이력설정문서분류 결과 도메인의 설정 바인딩.
ClassificationProperties.java이력설정문서분류 결과 판정·조치 설정.
ExtractionConfig.java이력설정정보추출 결과 도메인의 설정 바인딩.
ExtractionProperties.java이력어제 · #466설정정보추출 결과의 저장 정책·판정 설정.
ImageIntegrationConfig.java이력설정이미지 시스템 수신·송신 설정 바인딩.
ImageIntegrationProperties.java이력설정이미지 시스템이 HWSS로 전송한 파일의 수신·검증 설정(hwss.image-integration.*).
ImageSystemProperties.java이력6일 전 · #424설정HWSS가 이미지 시스템 API-08·09·10을 호출할 때 사용하는 연결 설정 (hwss.image-system.*).
InvestigationListConfig.java이력7일 전 · #408설정사고조사 목록 조회(P1-1)의 설정 바인딩.
InvestigationListProperties.java이력7일 전 · #408설정사고조사 목록 조회(P1-1)의 설정 (hwss.investigation.list.*).
StatisticsBackfillProperties.java이력7일 전 · #405설정통계 사실 재적재 명령(ST04S-007 §3-4 「재적재 명령」)의 설정 (hwss.statistics.backfill.*).
StatisticsLifecycleProperties.java이력어제 · #466설정생애주기 사실 적재(DP04, 2026-09-11 야간)의 처리시간 판정 설정 (hwss.statistics.lifecycle.*).
StatisticsLoadConfig.java이력어제 · #466설정통계 사실 적재(ST02)·일별 롤업(ST03-A)·조회 API(ST03-B)·재적재 명령(ST04)·미매핑 큐 API(ST05-A)·생애주기 적재(DP04)의 설정 바인딩.
StatisticsLoadProperties.java이력설정통계 사실 적재(ST02)의 원천 항목 키·판정 규칙 설정 (hwss.statistics.load.*).
StatisticsQueryProperties.java이력7일 전 · #404설정업무 통계 조회 API(ST03-BS-007 §3-4 「조회 API」)의 설정 (hwss.statistics.query.*).
StatisticsRollupProperties.java이력7일 전 · #403설정일별 롤업(ST03-A)의 설정 (hwss.statistics.rollup.*).
StatisticsUnmappedProperties.java이력7일 전 · #406설정미매핑 큐·차원 마스터 관리자 API(ST05-AS-007 §3-4 「미매핑 큐 API」)의 설정 (hwss.statistics.unmapped.*).

entity/24GitHub

JPA 엔티티 — 테이블 한 행을 매핑한다.

AnalysisRequestCollectionEntity.java이력엔티티분석 요청이 참조할 지식컬렉션 하나.
AnalysisRequestContractEntity.java이력엔티티분석 요청의 계약 한 건 (계약 정보 — 계약일자·상품명·청약서 유형·약관 매칭).
AnalysisRequestContractItemEntity.java이력엔티티계약별 청약서 질문 / 고지사항 항목 하나.
AnalysisRequestEntity.java이력엔티티분석 요청(분석 조건) 한 버전 (W09, 2026-08-19 확정 구조).
AnalysisRequestFormEntity.java이력엔티티분석 요청이 선택한 보고서 양식 하나.
ClassificationCorrectionEntity.java이력엔티티분류 보정 한 건 — "이 낱장을 무엇에서 무엇으로 바꿨는가" (W07).
ClassificationResultEntity.java이력엔티티분류 결과 한 버전 (S-007 §3-2 classification_results).
ClassificationResultPageEntity.java이력엔티티분류 결과의 낱장 한 장 (S-007 §3-2 classification_result_pages).
ExtractionFieldCorrectionEntity.java이력어제 · #466엔티티추출값 수정 한 건 — "이 항목을 무엇에서 무엇으로 바꿨는가" (야간 플랜 20260911 DP02, ClassificationCorrectionEntity 와 동형).
ExtractionResultEntity.java이력엔티티정보추출 결과 한 벌 (W08).
ExtractionResultFieldEntity.java이력어제 · #466엔티티추출 항목 한 개 (W08).
ImageTransferEntity.java이력엔티티이미지 시스템 전송 묶음 한 건 (S-007 §3-2 image_transfers).
InvestigationEntity.java이력엔티티조사 건.
InvestigationReportEntity.java이력엔티티사고조사 보고서 한 건 (S-007 §3-2 investigation_reports).
ReportDraftEntity.java이력엔티티보고서 초안 한 버전 (W12 골격).
ReportMailDispatchEntity.java이력엔티티보고서 메일 발송 기록 한 건 (W13).
ReportPageEntity.java이력엔티티보고서의 현재 활성 페이지 (S-007 §3-2 report_pages).
ReportTemplateEntity.java이력엔티티보고서 양식 한 버전 (W15).
ReportTemplateVariableEntity.java이력엔티티보고서 양식 본문에 삽입할 수 있는 변수 하나.
SummaryCardEntity.java이력엔티티병원(기관)별 요약 카드.
SummaryItemEntity.java이력엔티티요약 카드 안의 항목 하나.
SummaryItemSourceEntity.java이력엔티티요약 항목의 출처 하나.
SummaryResultEntity.java이력엔티티요약 결과 한 벌 (W10).
TransferPageEntity.java이력엔티티전송별 페이지 스냅샷 (S-007 §3-2 transfer_pages).

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 상태를 정한다.

AnalysisRequestNotFoundException.java이력예외보고서는 있으나 아직 분석 요청이 없을 때.
ClassificationActionForbiddenException.java이력예외분류 조치를 할 권한이 없을 때.
ClassificationPageNotActionableException.java이력예외조치 대상이 아닌 낱장을 확정하려 할 때.
ClassificationPageNotInResultException.java이력예외최신 분류 결과에 없는 낱장을 확정하려 할 때.
ClassificationResultFinalizedException.java이력예외이미 확정(외부 반영)된 분류 결과를 고치려 할 때.
ClassificationResultNotFoundException.java이력예외보고서는 있으나 아직 분류 결과가 한 벌도 없을 때.
ClassificationSnapshotEmptyException.java이력예외분류 결과를 만들려는데 기준이 될 전송 스냅샷이 없을 때.
DuplicateClassificationAssignmentException.java이력예외한 요청에 같은 낱장이 두 번 들어 있을 때.
DuplicateExtractionFieldException.java이력예외한 번의 적재에 같은 항목(문서종 + 낱장 + 키)이 두 번 들어 있을 때.
DuplicateReportTemplateException.java이력예외이미 있는 양식 코드로 새로 등록하려 할 때.
DuplicateSummaryItemException.java이력예외한 카드 안에 같은 항목 키가 두 번 들어 있을 때.
ExtractionActionForbiddenException.java이력어제 · #466예외추출값을 고칠 권한이 없을 때.
ExtractionFieldNotInResultException.java이력어제 · #466예외최신 추출 결과에 없는 항목을 고치려 할 때.
ExtractionFieldValueNotStorableException.java이력어제 · #466예외값을 저장하지 않는 항목(개인 식별 정보, NOT_STORED)에 값을 넣으려 할 때.
ExtractionResultNotEditableException.java이력어제 · #466예외추출값을 고칠 수 없는 단계에서 수정을 시도할 때.
ExtractionResultNotFoundException.java이력예외보고서는 있으나 아직 추출 결과가 한 벌도 없을 때.
IdempotencyKeyReusedException.java이력예외완료된 전송 식별자를 다른 요청 본문으로 다시 사용했을 때 발생한다.
ImageReportNotFoundException.java이력예외이미지 연동으로 접수된 보고서가 메모리 상태 저장소에 없을 때 발생한다.
ImageSystemIntegrationException.java이력예외이미지 시스템 API 호출 또는 응답 검증에 실패했을 때 발생한다.
InactiveCustomerCompanyException.java이력예외비활성 위탁사에 대한 신규 이미지 전송을 거절할 때 발생한다 (S-003 API-01·API-06).
InvalidAnalysisRequestException.java이력예외분석 조건이 성립하지 않을 때.
InvalidImageSnapshotException.java이력예외페이지 수·식별자·순서가 최신 전체 스냅샷 규칙과 맞지 않을 때 발생한다.
InvalidInvestigationStatusException.java이력예외statusCode 가 code-core 의 INVESTIGATION_STATUS 그룹에 없거나 비활성 상태일 때 발생한다.
InvalidPageRequestException.java이력예외목록 조회의 page/size 가 허용 범위를 벗어났을 때.
InvalidReportTemplateException.java이력예외보고서 양식 내용이 성립하지 않을 때.
InvalidStatusTransitionException.java이력예외S-004 §7 상태 전이표에 없는 (현재 상태, 이벤트) 조합이 요청됐을 때 발생한다.
InvalidTransferPathException.java이력예외보고서 번호나 ZIP 파일명이 허용된 수신 루트 밖의 경로를 가리킬 때 발생한다.
InvestigationListDateRangeException.java이력7일 전 · #408예외사고조사 목록 조회의 접수일자 범위 시작이 끝보다 늦을 때.
InvestigationNotFoundException.java이력예외id로 조회/수정/삭제하려는 조사 건이 없을 때.
InvestigationReportNotFoundException.java이력예외요청한 접수번호의 사고조사 보고서가 없을 때.
MailDeliveryUnavailableException.java이력예외메일 발송 수단이 꺼져 있을 때.
MailRecipientNotResolvedException.java이력예외수신 메일 주소를 조직 정보에서 찾지 못했을 때.
ReportDraftNotConfirmedException.java이력예외보고서 초안이 CONFIRMED 가 아닌데 최종 전송 완료를 처리하려 했다 — S-004 §7 "`분석완료` + FINAL_TRANSFER_COMPLETED 는 보고서 초안 CONFIRMED 이후에만 허용".
ReportDraftNotFoundException.java이력예외보고서는 있으나 아직 초안이 없을 때.
ReportMailSendFailedException.java이력예외SMTP 발송이 실패했을 때.
ReportPageFileNotFoundException.java이력예외문서함에는 페이지가 있는데 압축 해제 저장소에 그 낱장 파일이 없을 때.
ReportPageNotFoundException.java이력예외요청한 보고서의 문서함에 그 sourcePageId 의 활성 페이지가 없을 때.
ReportTemplateNotFoundException.java이력예외보고서 양식을 찾을 수 없을 때.
StatDimensionKeyExistsException.java이력7일 전 · #406예외신규 등록(REGISTER)하려는 키가 차원 마스터에 이미 있을 때 (ST05-A) — 그때는 병합(MERGE)이다.
StatDimensionKeyNotFoundException.java이력7일 전 · #406예외병합(MERGE) 대상 키가 차원 마스터(dim_*)에 없을 때 (ST05-A).
StatDimensionNotFoundException.java이력7일 전 · #404예외업무 통계 조회 경로의 차원 값이 8종(BusinessStatisticsDimension) 밖일 때.
StatUnmappedAlreadyResolvedException.java이력7일 전 · #406예외처리하려는 (차원, 원문값)의 큐 행이 있지만 대기 중(PENDING)인 것이 하나도 없을 때 (ST05-A) — 이미 매핑·무시됐다.
StatUnmappedNotFoundException.java이력7일 전 · #406예외처리하려는 (차원, 원문값)이 미매핑 큐에 아예 없을 때 (ST05-A).
StatUnmappedRequestException.java이력7일 전 · #406예외미매핑 큐 처리 본문이 잘못됐을 때 (ST05-A) — 필수 누락(차원·원문값·동작, MERGE 의 mappedKey)·키 형식 위반· 길이 초과·목록 파라미터 오류.
StatisticsBackfillRequestException.java이력7일 전 · #405예외통계 재적재 명령의 본문이 대상을 정할 수 없을 때 — 기간을 한쪽만 줬거나 거꾸로이거나, 롤업 재집계를 기간 없이 요청했거나, 세 원천(기간·보고서번호·대기 실패) 중 어느 것도 지정하지 않았을 때.
StatisticsBackfillTooManyException.java이력7일 전 · #405예외통계 재적재 대상이 한 번의 명령 상한(hwss.statistics.backfill.max-reports)을 넘을 때.
StatisticsQueryPeriodException.java이력7일 전 · #404예외업무 통계 조회 기간의 시작이 끝보다 늦을 때.
SummaryAlreadyConfirmedException.java이력예외확정된 요약의 본문을 고치려 할 때.
SummaryItemNotFoundException.java이력예외수정하려는 요약 항목이 그 카드에 없을 때.
SummaryNotConfirmedException.java이력예외확정되지 않은 요약에 보고서 반영 체크를 하려 할 때.
SummaryResultNotFoundException.java이력예외보고서는 있으나 아직 요약 결과가 없을 때.
TransferNotStartedException.java이력예외API-01 접수 이력이 없는 전송 묶음에 API-02가 호출될 때 발생한다.
ZipFileNotFoundException.java이력예외API-02 시점에 공통 수신 폴더에서 예정된 ZIP을 찾지 못했을 때 발생한다.
ZipHashMismatchException.java이력예외공통 수신 폴더의 ZIP SHA-256이 API-01 메타와 다를 때 발생한다.

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일 전 · #408record사고조사 목록의 접수일자 범위 조건(야간 플랜 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일 전 · #406DTO재적재 명령 본문(BackfillRequest)의 정규화된 형태 (ST04).
UnmappedQueueGroup.java이력7일 전 · #406DTO미매핑 큐를 (차원, 원문값, 상태)로 묶은 JPQL 투영 (ST05-A).
MainDiseaseRule.java이력enum메인 질병코드(E41) 판정 규칙 한 단계.
StatDailyRollupTable.java이력7일 전 · #403enum일별 롤업 테이블 7종(ST03-A, V202609040002) — 테이블명과 차원 키 컬럼.
StatFactLoadFailureStatus.java이력7일 전 · #406enum적재 실패 기록(stat_fact_load_failures.status)의 상태.
BusinessStatisticsQuery.java이력어제 · #466record업무 통계 조회 조건의 정규화된 형태 (ST03-B).
LifecycleStatisticsQuery.java이력어제 · #466record시스템 통계 조회 조건의 정규화된 형태 (2026-09-11 야간 DP06).
LifecycleTotals.java이력어제 · #466record생애주기 일별 롤업(stat_daily_lifecycle) 합계 열 열 개의 기간 합 — 조회 API(DP06)가 읽는 벡터 (2026-09-11 야간).
ReportTransferTime.java이력7일 전 · #405record사실 행의 (보고서번호, 전송 완료 시각) 투영 — 재적재 명령(ST04)이 대상을 고를 때 조합 행까지 읽지 않기 위한 것.
StatDailyLifecycleContribution.java이력어제 · #466record생애주기 사실 행 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-BS-007 §3-4 「조회 API」).
LifecycleStatisticsQueryService.java이력어제 · #466서비스시스템 통계 조회 (2026-09-11 야간 DP06S-007 §3-4 「생애주기 조회 API」).
StatDailyLifecycleRollupService.java이력어제 · #466서비스생애주기 일별 롤업(stat_daily_lifecycle, V202609110003)의 증분 갱신 (2026-09-11 야간 DP05S-007 §3-4 「생애주기 일별 롤업」).
StatDailyRollupService.java이력어제 · #466서비스일별 롤업 7종(stat_daily_*)의 증분 갱신 (ST03-AS-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-AS-007 §3-4 「미매핑 큐 API」).
StatUnmappedResolveService.java이력7일 전 · #410서비스미매핑 큐 처리 (ST05-AS-007 §3-4 「미매핑 큐 API」).
StatisticsBackfillService.java이력어제 · #466서비스통계 사실 재적재(backfill) 명령 (ST04S-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 야간 DP06S-007 §3-4 「생애주기 조회 API」).
StatDailyRollupQueryRepository.java이력7일 전 · #404저장소일별 롤업(stat_daily_*)의 기간 합산 조회 (ST03-BS-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).

status/1GitHub

S-004 상태 전이표의 단일 구현.

InvestigationStatusTransition.java이력클래스S-004 §7 상태 전이표의 단일 구현 지점.

web/15GitHub

REST 컨트롤러 — HTTP 요청을 서비스로 넘기고 ApiResponse 로 감싼다.

AnalysisRequestController.java이력화면 /user/investigations/[reportNo]SwaggerAPI워크스페이스 `추출완료` 화면의 분석 요청(분석 조건) API (S-005 §3, 2026-08-19 확정 구조).
BusinessStatisticsController.java이력화면 미연결Swagger7일 전 · #404API관리자 업무 통계 조회 API (ST03-BS-007 §3-4 「조회 API」).
ClassificationResultController.java이력화면 /user/investigations/[reportNo]SwaggerAPI워크스페이스 문서분류 화면(P1-3)의 분류 결과 조회 API.
ExtractionResultController.java이력화면 /user/investigations/[reportNo]Swagger어제 · #466API워크스페이스 `추출완료` 화면(S-005 §3)의 정보추출 결과 조회·수정 API.
ImageIntegrationController.java이력화면 미연결Swagger6일 전 · #429API이미지시스템 → HWSS 연동 수신 API-01~07 (전송 시작·완료·논리 변경·확정·마스터 동기화).
InvestigationController.java이력화면 미연결SwaggerAPI두 번째 샘플 도메인.
InvestigationReportController.java이력화면 /user/investigations화면 /user/investigations/[reportNo]Swagger7일 전 · #408API조사자 목록 화면(P1-1)과 워크스페이스 화면(P1-2)의 사고조사 보고서 조회 API.
LifecycleStatisticsController.java이력화면 미연결Swagger어제 · #466API관리자 시스템 통계 조회 API (2026-09-11 야간 DP06S-007 §3-4 「생애주기 조회 API」).
ReportDraftController.java이력화면 미연결SwaggerAPI보고서 초안 API (W12 골격).
ReportMailController.java이력화면 미연결SwaggerAPI보고서 초안 화면의 `메일 보내기` API (W13, 8/19 확정 B안).
ReportPageImageController.java이력화면 미연결SwaggerAPI워크스페이스 문서 뷰어(N05)가 페이지 원본 이미지를 여는 API (2026-09-03 야간 N04).
ReportTemplateController.java이력화면 미연결SwaggerAPI관리자 보고서 양식 설정 API (W15, 화면 /admin/report-templates).
StatUnmappedQueueController.java이력화면 /admin/statistics/unmappedSwagger7일 전 · #406API관리자 미매핑 큐·차원 마스터 API (ST05-AS-007 §3-4 「미매핑 큐 API」).
StatisticsBackfillController.java이력화면 미연결Swagger7일 전 · #405API관리자 통계 사실 재적재(backfill) 명령 API (ST04S-007 §3-4 「재적재 명령」).
SummaryResultController.java이력화면 /user/investigations/[reportNo]SwaggerAPI워크스페이스 요약 화면의 조회·수정 API (W10).

빌드·리소스1GitHub

모듈 빌드 스크립트와 src/main/resources.

build.gradle이력빌드이 모듈의 의존성 선언 — base, investigation-shared 모듈 참조.

resources/db/migration/26GitHub

Flyway 마이그레이션 SQL — 파일명 V<YYYYMMDDhhmm>__설명. 앱 기동 시 모든 모듈의 것이 버전 순으로 합쳐 실행된다.

V202607230001__create_investigation.sql이력마이그레이션설명 주석 없음
V202608190002__create_investigation_report.sql이력마이그레이션S-007 §3-1/§3-2 사고조사 보고서·전송·페이지·분류 결과.
V202608190004__add_report_confirm_requested_at.sql이력마이그레이션P0-3.
V202608190005__seed_investigation_workflow_definition.sql이력마이그레이션P0-3.
V202608200001__extend_image_integration.sql이력마이그레이션이미지 시스템 쓰기 API의 X-Idempotency-Key와 요청 본문 해시를 보관한다.
V202608220002__extend_investigation_workflow_steps.sql이력마이그레이션W05(주말 플랜 20260822).
V202608220003__create_extraction_result.sql이력마이그레이션W08(주말 플랜 20260822).
V202608220004__create_analysis_request.sql이력마이그레이션W09(주말 플랜 20260822).
V202608220005__create_summary_result.sql이력마이그레이션W10(주말 플랜 20260822).
V202608220006__add_summary_confirmation.sql이력마이그레이션W11(주말 플랜 20260822).
V202608220007__create_report_draft.sql이력마이그레이션W12(주말 플랜 20260822).
V202608220008__create_report_mail_dispatch.sql이력마이그레이션W13(주말 플랜 20260822).
V202608220009__create_report_template.sql이력마이그레이션W15(주말 플랜 20260822).
V202608230001__create_classification_correction.sql이력마이그레이션분류 보정 원장 (8/21 협의 §7 "중간 수정 결과 반영" 대응).
V202609010001__add_image_page_mfileid.sql이력마이그레이션API-01에서 수신한 이미지 시스템 아카이브 파일 ID를 전송 이력과 현재 페이지에 보관한다.
V202609030001__add_classification_result_provenance.sql이력마이그레이션분류 결과의 근원 표시 (야간 플랜 20260903 N02, 공통 규칙 "스텁임을 코드에 명시한다").
V202609030002__classify_step_port_backed_handler.sql이력마이그레이션CLASSIFY 단계에 스텁 분류 핸들러를 붙인다 (야간 플랜 20260903 N02).
V202609030003__add_extraction_summary_provenance.sql이력마이그레이션추출·요약 결과의 근원 표시 (야간 플랜 20260903 N03, 공통 규칙 "스텁임을 코드에 명시한다").
V202609030004__extract_analyze_step_port_backed_handler.sql이력마이그레이션EXTRACT·ANALYZE 단계에 스텁 핸들러를 붙인다 (야간 플랜 20260903 N03).
V202609030005__create_report_stat_facts.sql이력마이그레이션ST01(야간 플랜 20260903).
V202609040001__create_stat_fact_load_failures.sql이력마이그레이션ST02(야간 플랜 20260903).
V202609040002__create_stat_daily_rollups.sql이력7일 전 · #403마이그레이션ST03-A(야간 플랜 20260904).
V202609040003__add_investigation_reports_created_at_index.sql이력7일 전 · #408마이그레이션N08(야간 플랜 20260904).
V202609110001__create_extraction_field_corrections.sql이력어제 · #466마이그레이션DP02(야간 플랜 20260911).
V202609110002__create_report_lifecycle_facts.sql이력어제 · #466마이그레이션DP03(야간 플랜 20260911).
V202609110003__create_stat_daily_lifecycle.sql이력어제 · #466마이그레이션DP05(야간 플랜 20260911).

src/test/66GitHub

테스트 파일 — 펼쳐서 보기
config/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이력테스트추출 진입 게이트 판정 (W07W05 가 세운 골격의 구현체).
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-shared/GitHub

위탁사·분류 마스터 · 공유 DTO

위탁사·분류 마스터 · 공유 DTO — 위탁사·문서분류 마스터와 매핑 화면 DTO.

6 소스0 테스트
의존 모듈 base
주요 라이브러리 spring-boot-starter-validation

dto/6GitHub

모듈 경계를 넘는 요청·응답 DTO (record).

ClassificationMappingSaveRequest.java이력DTO위탁사 한 곳의 이미지시스템 폴더 ↔ 에이전트 분류 매핑 저장 요청 (야간 플랜 20260824 N02).
ClassificationMappingView.java이력DTO위탁사 한 곳의 분류체계 매핑 화면 상태 (야간 플랜 20260824 N02).
CustomerCompanyMaster.java이력DTO마스터가 보관 중인 위탁사 한 건이다 (S-007 §3-1 customer_companies).
CustomerCompanySummary.java이력DTO화면 선택지용 위탁사 한 건이다 — 코드와 표시명만 담는다.
DocumentTypeMaster.java이력DTO마스터가 보관 중인 위탁사별 이미지시스템 폴더 분류 한 건이다 (S-007 §3-1 document_types).
MasterSyncOutcome.java이력record마스터 동기화 한 건의 적용 결과다.

빌드·리소스1GitHub

모듈 빌드 스크립트와 src/main/resources.

build.gradle이력빌드이 모듈의 의존성 선언 — base 모듈 참조.

modules/ · 도메인

modules/classification-core/GitHub

위탁사·분류 마스터 · 로직

위탁사·분류 마스터 · 로직 — 이미지시스템이 원천인 위탁사·폴더 분류 마스터를 보관하고, 폴더 ↔ 에이전트 분류 매핑을 관리한다. 외부 수신 표면은 investigation-core 가 갖고 이 모듈은 포트 구현으로 붙는다.

21 소스3 테스트1 마이그레이션
의존 모듈 base classification-shared
주요 라이브러리 spring-boot-starter-data-jpa spring-boot-starter-web spring-boot-starter-validation springdoc-openapi-starter-webmvc-ui

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]SwaggerAPI관리자 분류체계 매핑 API (야간 플랜 20260824 N02).
CustomerCompanyController.java이력화면 미연결SwaggerAPI위탁사 마스터 조회 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

테스트 파일 — 펼쳐서 보기
service/ClassificationMappingServiceTest.java이력테스트ClassificationMappingService — 관리자 매핑 화면의 조회·저장 규칙을 본다.
service/ClassificationMasterSyncServiceTest.java이력테스트마스터 동기화의 판정 규칙(최신값 우선, 과거 무시, 자리표시자 위탁사 생성)을 본다.
service/CustomerCompanyQueryServiceTest.java이력테스트CustomerCompanyQueryService — 조회 결과가 화면 선택지 모양으로 내려가는지 본다.

modules/ · 도메인

modules/collection-shared/GitHub

지식컬렉션 · 공유 DTO

지식컬렉션 · 공유 DTO — 컬렉션·파일·승인 요청·검색 DTO와 상태 enum.

14 소스0 테스트
의존 모듈 base
주요 라이브러리 spring-boot-starter-validation

dto/14GitHub

모듈 경계를 넘는 요청·응답 DTO (record).

CollectionApprovalCreateRequest.java이력DTO컬렉션 자체를 대상으로 하는 승인 요청 생성 (야간 플랜 20260821 N05).
CollectionApprovalRejectRequest.java이력DTO승인 요청 반려 (야간 플랜 20260821 N05).
CollectionApprovalRequestSummary.java이력DTO승인 요청 한 줄 (야간 플랜 20260821 N05).
CollectionCreateRequest.java이력DTO지식컬렉션 생성 요청 (야간 플랜 20260821 N04).
CollectionDetail.java이력DTO지식컬렉션 상세 — 목록 한 줄(CollectionSummary)에 파일 목록과 편집 가능 여부를 얹은 것.
CollectionFileSummary.java이력DTO컬렉션 상세 화면에 뿌리는 파일 한 줄.
CollectionSearchHit.java이력DTO지식컬렉션 검색 결과 한 건 (야간 플랜 20260821 N06).
CollectionSearchRequest.java이력DTO지식컬렉션 검색 요청 (야간 플랜 20260821 N06).
CollectionSummary.java이력DTO지식컬렉션 목록 한 줄.
CollectionUpdateRequest.java이력DTO지식컬렉션 부분 수정(PATCH) 요청 — 이름·설명만 바꾼다.
CollectionApprovalStatus.java이력enum승인 요청 한 건의 처리 상태.
CollectionApprovalType.java이력enum승인센터가 처리하는 지식컬렉션 승인 요청의 유형.
CollectionStatus.java이력enum지식컬렉션 사용 가능 여부 상태 (2026-08-19 현업 화면기획 리뷰 §4).
CollectionType.java이력enum지식컬렉션 구분 (2026-08-19 현업 화면기획 리뷰 §4).

빌드·리소스1GitHub

모듈 빌드 스크립트와 src/main/resources.

build.gradle이력빌드이 모듈의 의존성 선언 — base 모듈 참조.

modules/ · 도메인

modules/collection-core/GitHub

지식컬렉션 · 로직

지식컬렉션 · 로직 — 개인/공용 컬렉션, 파일 업로드·검증·로컬 저장, 승인센터, 검색. 외부 AI 플랫폼은 base 의 Vector*Port 로만 부른다.

28 소스7 테스트2 마이그레이션
의존 모듈 base collection-shared
주요 라이브러리 spring-boot-starter-web spring-boot-starter-validation spring-boot-starter-data-jpa springdoc-openapi-starter-webmvc-ui

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 로 감싼다.

빌드·리소스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

테스트 파일 — 펼쳐서 보기
entity/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-shared/GitHub

조직·권한 · 공유 DTO

조직·권한 · 공유 DTO — 부서 트리·사용자·레벨·메뉴 권한 DTO.

10 소스0 테스트
의존 모듈 base
주요 라이브러리 spring-boot-starter-validation

dto/10GitHub

모듈 경계를 넘는 요청·응답 DTO (record).

MenuPermissionMatrixResponse.java이력DTO권한 관리 화면용 매트릭스 — 레벨 5종 × 메뉴.
MenuPermissionResponse.java이력DTO한 레벨이 특정 메뉴에 대해 가지는 권한.
MenuPermissionSaveRequest.java이력DTO레벨 × 메뉴 권한 매트릭스 저장 요청 (야간 플랜 20260824 N03).
RoleResponse.java이력DTO사용자 레벨 한 종.
UserResponse.java이력DTO사용자(임직원) 한 명.
UserRoleAssignRequest.java이력DTO사용자 보유 레벨 교체 요청 (야간 플랜 20260828 N01).
AccountStatus.java이력enum계정 상태.
ConsoleType.java이력enum메뉴가 속한 콘솔.
DepartmentType.java이력enum부서 유형.
DepartmentTreeNode.java이력record조직도 트리의 노드 하나.

빌드·리소스1GitHub

모듈 빌드 스크립트와 src/main/resources.

build.gradle이력빌드이 모듈의 의존성 선언 — base 모듈 참조.

modules/ · 도메인

modules/organization-core/GitHub

조직·권한 · 로직

조직·권한 · 로직 — 조직도·사용자·레벨 5종 × 메뉴 권한, 그리고 인증 골격이 쓰는 비밀번호·refresh 토큰·부수정보 저장 포트의 구현.

42 소스9 테스트9 마이그레이션
의존 모듈 base organization-shared
주요 라이브러리 spring-boot-starter-web spring-boot-starter-validation spring-boot-starter-data-jpa springdoc-openapi-starter-webmvc-ui

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/organizationSwaggerAPI조직도 조회 API (docs/rules/api.md 의 URL 패턴·표준 응답 구조).
MenuPermissionController.java이력화면 /admin/permissionsSwaggerAPI사용자 레벨 × 메뉴 권한 API.
RoleController.java이력화면 /admin/organizationSwaggerAPI사용자 레벨 마스터 조회 API.
UserController.java이력화면 /admin/organizationSwaggerAPI사용자 조회 + 보유 레벨 편집 API.

빌드·리소스1GitHub

모듈 빌드 스크립트와 src/main/resources.

build.gradle이력빌드이 모듈의 의존성 선언 — base, organization-shared 모듈 참조.

resources/db/migration/9GitHub

Flyway 마이그레이션 SQL — 파일명 V<YYYYMMDDhhmm>__설명. 앱 기동 시 모든 모듈의 것이 버전 순으로 합쳐 실행된다.

V202608190006__create_organization.sql이력마이그레이션P0-4 조직·사용자·권한 스키마.
V202608190007__seed_organization_roles_and_menu_permissions.sql이력마이그레이션P0-4 시드 (1/2) — 시스템 마스터: 사용자 레벨 5종과 기본 메뉴 권한 매트릭스.
V202608190008__seed_organization_sample_directory.sql이력마이그레이션P0-4 시드 (2/2) — 표본 조직도·사용자.
V202608250001__create_user_credentials.sql이력마이그레이션사용자 임시 비밀번호 해시 — "신원은 스마트심사 뷰 라이브, 부수정보는 우리 DB" 결정의 비밀번호 부분 (docs/decisions/20260825-user-directory-live-and-supplement.md).
V202608260001__extract_user_supplements.sql이력마이그레이션부수정보(권한 레벨·이메일) 분리 — "신원·조직은 스마트심사 뷰 라이브, 부수정보는 우리 DB" 결정(docs/decisions/20260825-user-directory-live-and-supplement.md)의 테이블 구체화.
V202608260002__split_user_roles.sql이력마이그레이션권한 분리 — 사용자:권한 은 1:N 이다(2026-08-26 PM 지시).
V202608260003__create_auth_refresh_tokens.sql이력마이그레이션refresh 토큰 원장 — 회전·무효화의 서버 측 상태 (20260826 로테이션 결정).
V202608270001__menu_ia_prototype_alignment.sql이력마이그레이션메뉴 IA 를 프로토타입 관리자 사이드바(components/admin/app-sidebar.tsx) 기준으로 확정 반영 (2026-08-27 결정: docs/decisions/20260827-menu-ia-prototype-alignment.md).
V202608270003__seed_mail_account_menu.sql이력마이그레이션관리자 콘솔 '메일 발송 계정'(/admin/mail-account) 메뉴 등재 — 야간 20260827 N02.

src/test/9GitHub

테스트 파일 — 펼쳐서 보기
credential/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-shared/GitHub

감사 원장 · 공유 DTO

감사 원장 · 공유 DTO — 감사 로그 조회 조건·응답.

3 소스0 테스트
의존 모듈 base
주요 라이브러리 spring-boot-starter-validation

dto/3GitHub

모듈 경계를 넘는 요청·응답 DTO (record).

AuditLogPageView.java이력DTO원장 조회 결과 한 쪽.
AuditLogView.java이력DTO감사 원장 한 행 (관리자 "전체 로그" 화면이 읽는 형태).
AuditLogSearchCondition.java이력record원장 조회 필터 — 작업 항목 · 이벤트 타입 · 처리 결과 · 기간.

빌드·리소스1GitHub

모듈 빌드 스크립트와 src/main/resources.

build.gradle이력빌드이 모듈의 의존성 선언 — base 모듈 참조.

modules/ · 도메인

modules/audit-core/GitHub

감사 원장 · 로직

감사 원장 · 로직 — 행위자·시각·이벤트·대상·결과를 담는 범용 원장. base 의 AuditTrailPort 구현으로만 붙는다.

7 소스1 테스트1 마이그레이션
의존 모듈 base audit-shared
주요 라이브러리 spring-boot-starter-web spring-boot-starter-data-jpa springdoc-openapi-starter-webmvc-ui

entity/1GitHub

JPA 엔티티 — 테이블 한 행을 매핑한다.

AuditLogEntity.java이력엔티티감사 원장 한 행 (야간 플랜 20260824 N04).

exception/1GitHub

BusinessException 하위 도메인 예외 — 에러 코드와 HTTP 상태를 정한다.

AuditLogSearchPeriodException.java이력예외기간 필터의 시작이 끝보다 늦을 때.

port/1GitHub

base 포트 구현체.

AuditTrailPortAdapter.java이력포트 구현AuditTrailPort 의 구현체 — 업무 도메인이 base 인터페이스로만 원장을 부르게 하는 자리 (docs/guides/backend-module-guide.md §5).

repository/1GitHub

Spring Data JPA 저장소 인터페이스.

AuditLogRepository.java이력저장소감사 원장 리포지토리.

service/2GitHub

비즈니스 로직과 트랜잭션 경계.

AuditTrailService.java이력서비스감사 원장의 적재와 조회 (야간 플랜 20260824 N04).
AuditLogSpecifications.java이력클래스조회 조건 → JPA Criteria 조건.

web/1GitHub

REST 컨트롤러 — HTTP 요청을 서비스로 넘기고 ApiResponse 로 감싼다.

AuditLogController.java이력화면 /admin/audit-logsSwaggerAPI관리자 감사 로그 조회 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

테스트 파일 — 펼쳐서 보기
service/AuditTrailServiceTest.java이력테스트AuditTrailService 의 적재·조회 유닛 테스트 (야간 플랜 20260824 N04).

modules/ · 도메인

modules/workflow-shared/GitHub

워크플로우 엔진 · 공유 DTO

워크플로우 엔진 · 공유 DTO — 실행·단계 상태 enum과 시작 명령·실행 결과.

4 소스0 테스트
의존 모듈 base
주요 라이브러리 spring-boot-starter-validation

dto/4GitHub

모듈 경계를 넘는 요청·응답 DTO (record).

WorkflowStartCommand.java이력DTO워크플로우 실행 시작 명령.
WorkflowExecutionStatus.java이력enum워크플로우 실행 인스턴스의 상태.
WorkflowStepExecutionStatus.java이력enum단계 실행 1회(attempt)의 상태.
WorkflowExecutionResult.java이력record엔진 실행 1회의 결과.

빌드·리소스1GitHub

모듈 빌드 스크립트와 src/main/resources.

build.gradle이력빌드이 모듈의 의존성 선언 — base 모듈 참조.

modules/ · 도메인

modules/workflow-core/GitHub

워크플로우 엔진 · 로직

워크플로우 엔진 · 로직 — 업무 도메인을 모르는 범용 엔진. 단계 정의를 DB 데이터로 두고 해석·실행하며, 실제 업무는 base 의 WorkflowStepWorkPort 구현체에 위임한다.

24 소스6 테스트1 마이그레이션
의존 모듈 base workflow-shared
주요 라이브러리 spring-boot-starter-data-jpa spring-web jackson-databind

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

테스트 파일 — 펼쳐서 보기
engine/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-shared/GitHub

공통 코드 (샘플) · 공유 DTO

공통 코드 (샘플) · 공유 DTO — core/shared 패턴 참고용 샘플 도메인의 DTO.

5 소스0 테스트
의존 모듈 base
주요 라이브러리 spring-boot-starter-validation

dto/5GitHub

모듈 경계를 넘는 요청·응답 DTO (record).

CommonCodeCreateRequest.java이력DTOPOST /api/v1/common-codes 요청 바디 — 공통 코드 그룹 생성.
CommonCodeDetailCreateRequest.java이력DTOPOST /api/v1/common-codes/{id}/details 요청 바디 — 그룹에 하위 코드값 추가.
CommonCodeDetailResponse.java이력DTOCommonCodeResponse#details의 원소 — 공통 코드 그룹 하나 안의 코드값 하나.
CommonCodeResponse.java이력DTO공통 코드 그룹 조회 응답 — 하위 코드값 전부를 #details에 함께 담아 내려준다.
CommonCodeUpdateRequest.java이력DTOPATCH /api/v1/common-codes/{id} 요청 바디.

빌드·리소스1GitHub

모듈 빌드 스크립트와 src/main/resources.

build.gradle이력빌드이 모듈의 의존성 선언 — base 모듈 참조.

modules/ · 도메인

modules/code-core/GitHub

공통 코드 (샘플) · 로직

공통 코드 (샘플) · 로직 — 새 도메인 모듈을 만들 때 복제하는 참조 구현. 실제로 동작하며 CommonCodeLookupPort 를 제공한다.

9 소스1 테스트1 마이그레이션
의존 모듈 base code-shared
주요 라이브러리 spring-boot-starter-web spring-boot-starter-validation spring-boot-starter-data-jpa springdoc-openapi-starter-webmvc-ui

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이력화면 미연결SwaggerAPIdocs/rules/api.md 의 URL 패턴(/api/v1/{resource})과 표준 응답 구조를 따르는 공통 코드 관리 API.

빌드·리소스1GitHub

모듈 빌드 스크립트와 src/main/resources.

build.gradle이력빌드이 모듈의 의존성 선언 — base, code-shared 모듈 참조.

resources/db/migration/1GitHub

Flyway 마이그레이션 SQL — 파일명 V<YYYYMMDDhhmm>__설명. 앱 기동 시 모든 모듈의 것이 버전 순으로 합쳐 실행된다.

V202607220001__create_common_code.sql이력마이그레이션code-core 모듈이 필요로 하는 테이블.

src/test/1GitHub

테스트 파일 — 펼쳐서 보기
service/CommonCodeServiceTest.java이력테스트CommonCodeService 대상 테스트.

modules/ · 인프라 어댑터

modules/aiplatform-core/GitHub

외부 AI 플랫폼 어댑터

외부 AI 플랫폼 어댑터 — base 의 Vector*Port 구현만 담는 인프라 모듈(shared 없음). provider 설정으로 in-memory(기본) 또는 업스테이지 Studio 를 고른다.

19 소스5 테스트
의존 모듈 base
주요 라이브러리 spring-boot-starter spring-web spring-boot-starter-json micrometer-core

(루트)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이력DTOPOST /v2/vector_stores 요청 (예측 초안 — 패키지 주석 참고).
VectorStoreDeleteResponse.java이력DTO삭제 응답 (예측 초안 — 패키지 주석 참고).
VectorStoreFileBatchCreateRequest.java이력DTOPOST /v2/vector_stores/{vector_store_id}/file_batches 요청 (예측 초안 — 패키지 주석 참고).
VectorStoreFileBatchResponse.java이력DTO파일 배치 한 건의 응답 표현 (예측 초안 — 패키지 주석 참고).
VectorStoreFileCreateRequest.java이력DTOPOST /v2/vector_stores/{vector_store_id}/files 요청 (예측 초안 — 패키지 주석 참고).
VectorStoreFileResponse.java이력DTO벡터 스토어에 담긴 파일 한 건의 응답 표현 (예측 초안 — 패키지 주석 참고).
VectorStoreModifyRequest.java이력DTOPOST /v2/vector_stores/{vector_store_id} 수정 요청 (예측 초안 — 패키지 주석 참고).
VectorStoreResponse.java이력DTO벡터 스토어 한 개의 응답 표현 (예측 초안 — 패키지 주석 참고).
VectorStoreSearchRequest.java이력DTOPOST /v2/vector_stores/{vector_store_id}/search 요청 (예측 초안 — 패키지 주석 참고).
VectorStoreSearchResponse.java이력DTO검색 응답 (예측 초안 — 패키지 주석 참고).
package-info.java이력패키지 주석업스테이지 Studio(v2) Vector Stores 표면의 요청·응답 DTO 초안.

빌드·리소스1GitHub

모듈 빌드 스크립트와 src/main/resources.

build.gradle이력빌드이 모듈의 의존성 선언 — base 모듈 참조.

src/test/5GitHub

테스트 파일 — 펼쳐서 보기
AiPlatformConfigTest.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 구현)과 관리자 메일 계정 비밀번호 재설정.

24 소스9 테스트1 마이그레이션
의존 모듈 base
주요 라이브러리 spring-boot-starter-web spring-boot-starter-validation spring-boot-starter-mail spring-boot-starter-data-jpa springdoc-openapi-starter-webmvc-ui micrometer-core

(루트)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-accountSwaggerAPI관리자 메일 발송 계정 API (화면 /admin/mail-account, 결정문 docs/decisions/20260827-smtp-password-admin-reset.md).
MailTestController.java이력APISMTP 접속 검증용 임시 엔드포인트.
MailAccountPasswordResetRequest.java이력DTOSMTP 대표 계정 비밀번호 재설정 요청 (결정문 §2).
MailAccountView.java이력DTO관리자 "메일 발송 계정" 화면이 읽는 상태 전체 (결정문 §1·§3, 화면은 N03).
MailAccountPasswordChange.java이력record비밀번호 변경 이력 한 줄 — 언제 누가 만 담는다.

빌드·리소스1GitHub

모듈 빌드 스크립트와 src/main/resources.

build.gradle이력빌드이 모듈의 의존성 선언 — base 모듈 참조.

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

테스트 파일 — 펼쳐서 보기
SmtpCredentialProviderTest.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 로 라이브 조회한다(기본 비활성).

5 소스4 테스트
의존 모듈 base
주요 라이브러리 spring-boot-starter-jdbc ojdbc micrometer-core

(루트)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 🟢 "뷰 라이브 직접 조회").

빌드·리소스1GitHub

모듈 빌드 스크립트와 src/main/resources.

build.gradle이력빌드이 모듈의 의존성 선언 — base 모듈 참조.

src/test/4GitHub

테스트 파일 — 펼쳐서 보기
SmartReviewConfigTest.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일 전 · #405HTTP 시나리오관리자 통계 사실 재적재(backfill) 명령 — investigation-core statistics (야간 플랜 20260904 ST04, S-007 §3-4 「재적재 명령」)
admin-statistics-business.http이력7일 전 · #404HTTP 시나리오관리자 업무 통계 조회 API — investigation-core statistics (야간 플랜 20260904 ST03-B, S-007 §3-4 「조회 API」)
admin-statistics-lifecycle.http이력어제 · #466HTTP 시나리오관리자 시스템 통계 조회 API — investigation-core statistics (야간 플랜 20260911 DP06, S-007 §3-4 「생애주기 조회 API」)
admin-statistics-unmapped.http이력7일 전 · #406HTTP 시나리오관리자 미매핑 큐·차원 마스터 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이력어제 · #466HTTP 시나리오스텁 분류 결과 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일 전 · #424HTTP 시나리오이미지 시스템 연동 API-01~07 스모크 (S-003) 위에서 아래로 한 번에 실행하는 순서 있는 시나리오다. 정상 경로와, 컨트롤러가 실제로 돌려주는
image-reception-e2e.http이력6일 전 · #424HTTP 시나리오이미지시스템 수신 E2E — 접수 세로조각의 상태 전이 (P1-3, S-003 API-01~03 + S-004 §8)
investigation-workspace.http이력어제 · #466HTTP 시나리오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일 전 · #409HTTP 시나리오전 단계 보고서 세트 시드 — 목록·워크스페이스 화면을 실제 데이터로 돌려보기 위한 시나리오 (2026-09-03 야간 N03)
prepare-image-zip.sh이력스크립트!/usr/bin/env bash image-integration.http 의 API-02(전송 완료 통지) 스모크를 돌리기 전에 실행한다.
report-page-image.http이력7일 전 · #409HTTP 시나리오페이지 원본 이미지 서빙 — 문서 뷰어(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 첫 문장을 한 줄로 써 주세요.