Ch 1. hera-v4 읽는 법¶
이 챕터를 마치면
- hera-v4 모듈 지도를 보고 각 모듈의 역할을 설명할 수 있습니다.
- 화면 요청과 데이터 요청이 어떤 경로로 처리되는지 머릿속에 그릴 수 있습니다.
sys0101공통코드 관리 화면에 관련된 파일 5개 이상을 직접 찾을 수 있습니다.
1. hera-v4는 어떤 프로젝트인가¶
hera-v4는 Java 25와 Spring Boot 4 기반의 MSA 엔터프라이즈 프레임워크입니다. 시스템 관리, 인사관리, 워크플로우 세 도메인을 독립 서비스로 분리하고, 화면·API 계약·데이터 모델·공통 라이브러리를 조합해 업무 메뉴를 빠르게 만들도록 설계했습니다.
처음 접하는 개발자에게는 이렇게 설명할 수 있습니다.
"업무 화면 하나를 만들 때 필요한 화면, API, 서비스, DB 매핑, 권한, 공통 코드 패턴을 미리 갖춘 사내 표준 프레임워크"
코드를 열었을 때 파일이 많아 막막한 이유는 hera-v4가 단일 애플리케이션이 아니라 여러 Gradle 모듈로 구성되기 때문입니다. 이 챕터에서는 모듈 지도를 먼저 파악하고, 요청 하나가 어디서 시작해 어디서 끝나는지를 추적합니다.
2. 모듈 지도¶
settings.gradle에 선언된 모듈은 크게 다섯 그룹으로 나눌 수 있습니다.
2.1 모듈 목록¶
| 그룹 | 모듈 | 역할 |
|---|---|---|
| 웹 | hera-webapp | Thymeleaf 화면, webapp API, Feign client 호출 |
| 도메인 서비스 | hera-system | 시스템 관리 비즈니스 로직, API, Mapper |
| 도메인 서비스 | hera-human-resource-mng | 인사관리 비즈니스 로직 |
| 도메인 서비스 | hera-workflow | Kafka 기반 워크플로우 엔진 |
| 실행 모듈 | bootstrap-system | hera-system을 Spring Boot 애플리케이션으로 실행 |
| 실행 모듈 | bootstrap-human-resource-mng | hrm 서비스 실행 |
| 실행 모듈 | bootstrap-workflow | workflow 서비스 실행 |
| 계약·공통 | hera-api-client | Feign client 인터페이스 |
| 계약·공통 | hera-domain-data | VO, SP, JVO 등 데이터 모델 |
| 계약·공통 | hera-commons | 보안, 유틸, 엑셀, 업로드, 매퍼 공통 |
| MSA 인프라 | _msa-api-gateway | Spring Cloud Gateway |
| MSA 인프라 | _msa-service-discovery | Eureka Server |
| 운영 | _system-doctor | Spring Boot Admin / 모니터링 |
| 생산성 | _hera-code-gen | 코드 생성기 |
실제 업무 개발에서 주로 다루는 모듈은 hera-webapp, hera-system, hera-api-client, hera-domain-data입니다.
2.2 의존 방향¶
flowchart TD
Webapp[hera-webapp] --> ApiClient[hera-api-client]
ApiClient --> Gateway[_msa-api-gateway]
Gateway --> Bootstrap[bootstrap-system]
Bootstrap --> System[hera-system]
System --> DomainData[hera-domain-data]
System --> Commons[hera-commons]
Webapp --> Commons
Webapp --> DomainData
핵심 규칙은 세 가지입니다.
hera-webapp은 화면과 진입 API만 담당합니다. DB를 직접 건드리지 않습니다.- 실제 데이터 처리는 도메인 서비스 (
hera-system등)가 맡습니다. hera-webapp은hera-api-client의 Feign client를 통해 도메인 서비스를 호출합니다.hera-domain-data는 webapp과 system이 함께 사용하는 데이터 계약 모듈입니다.
코드를 탐색할 때
새 기능을 찾을 때는 hera-webapp → hera-api-client → hera-system 순서로 따라가면 됩니다. 데이터 객체(VO, SP, JVO)는 hera-domain-data에 있습니다.
3. 두 갈래 요청¶
브라우저에서 서버로 오는 요청은 두 가지 유형으로 나뉩니다.
| 요청 유형 | 예시 | 처리 클래스 | 응답 |
|---|---|---|---|
| 페이지 이동 (HTML) | /sys/0101 | XxxViewRouter | Thymeleaf 렌더링 결과 (HTML) |
| 데이터 조회/저장 (Ajax) | /api/sys/common-codes/pageable | XxxApiController | JSON |
두 유형 모두 hera-webapp에서 처음 받지만, 이후 경로가 갈립니다.
flowchart TD
Browser[Browser]
Browser -->|HTML 페이지 요청| ViewRouter[hera-webapp\nXxxViewRouter]
ViewRouter -->|model 준비 후 뷰 이름 반환| Template[Thymeleaf 템플릿]
Template -->|HTML| Browser
Browser -->|Ajax JSON 요청| WebApi[hera-webapp\nXxxApiController]
WebApi -->|Feign client 호출| Gateway[_msa-api-gateway]
Gateway -->|라우팅| DomainApi[도메인 서비스\nXxxApiController]
DomainApi --> Service[Service]
Service --> Mapper[Mapper]
Mapper --> DB[(PostgreSQL)]
DB --> Mapper
Mapper --> Service
Service -->|Entity → VO 변환| DomainApi
DomainApi --> Gateway
Gateway --> WebApi
WebApi -->|JSON 응답| Browser
3.1 ViewRouter — 화면 진입 처리¶
ViewRouter는 HTML 페이지 요청을 받아, 화면에 필요한 공통 정보를 모델에 담고 뷰 이름을 반환하는 클래스입니다.
// hera-webapp: Sys0101ViewRouter.java
@Controller
public class Sys0101ViewRouter extends BaseViewRouter {
@GetMapping("/sys/0101")
public String index(Model model) {
prepareBaseInfo(model, Domain.SYS_0101); // 공통 모델 준비
return "sys/sys0101"; // templates/sys/sys0101.html
}
}
prepareBaseInfo를 호출하면 BaseViewRouter가 세션 사용자, 다국어 메시지, 사이드 메뉴 등을 모델에 자동으로 채웁니다. Thymeleaf 템플릿은 이 모델로 화면을 렌더링합니다.
3.2 ApiController — 데이터 요청 처리¶
데이터 요청은 hera-webapp의 XxxApiController가 받아 Feign client로 도메인 서비스에 위임합니다. hera-webapp은 데이터를 직접 처리하지 않습니다.
// hera-webapp: Sys0101ApiController.java
@RestController
@RequestMapping("/api/sys")
public class Sys0101ApiController {
private final CommonCodeClient commonCodeClient;
@GetMapping("/common-codes/pageable")
public PageResponse<CommonCodeVO> findAllOnPageable(
@RequestBody PageRequest<CommonCodeVO, CommonCodeSP> pageRequest) {
return commonCodeClient.findAllOnPageable(pageRequest);
}
}
4. 요청 흐름 한 사이클: sys0101 따라가기¶
sys0101 공통코드 관리 화면을 기준으로 전체 흐름을 추적합니다. 이 화면은 hera-v4의 대표 참조 구현입니다.
4.1 흐름 다이어그램¶
sequenceDiagram
participant Browser
participant Webapp as hera-webapp
participant Client as CommonCodeClient
participant Gateway as _msa-api-gateway
participant System as hera-system
participant DB as PostgreSQL
Browser->>Webapp: GET /sys/0101 (페이지 요청)
Webapp-->>Browser: sys0101.html + sys0101.js
Browser->>Webapp: GET /api/sys/common-codes/pageable (Ajax)
Webapp->>Client: commonCodeClient.findAllOnPageable(pageRequest)
Client->>Gateway: GET /api/v1/sys/common-codes/pageable
Gateway->>System: 라우팅
System->>DB: CommonCodeMapper / MyBatis
DB-->>System: common code rows
System-->>Client: PageResponse
Client-->>Webapp: PageResponse
Webapp-->>Browser: JSON (그리드 데이터)
4.2 핵심 파일 경로¶
| 계층 | 파일 경로 |
|---|---|
| ViewRouter | hera-webapp/.../view/sys/Sys0101ViewRouter.java |
| Thymeleaf 템플릿 | hera-webapp/src/main/resources/templates/sys/sys0101.html |
| JavaScript | hera-webapp/src/main/resources/static/js/sys/sys0101.js |
| Webapp ApiController | hera-webapp/.../api/sys/Sys0101ApiController.java |
| Feign Client | hera-api-client/.../sys/CommonCodeClient.java |
| System ApiController | hera-system/.../sys/CommonCodeApiController.java |
| Service | hera-system/.../sys/code/common/CommonCodeServiceImpl.java |
| Mapper | hera-system/.../sys/code/common/CommonCodeMapper.java |
| Mapper XML | hera-system/src/main/resources/mybatis/sys/code/common/common-code-mapper.xml |
| 데이터 모델 | hera-domain-data/.../sys/code/common/CommonCodeVO.java |
파일 5개 찾기 검증
이 표에서 ViewRouter, HTML, JS, Feign Client, System ApiController를 직접 IDE에서 열어 보세요. 파일의 위치와 역할이 일치한다면 이 챕터의 학습 목표를 달성한 것입니다.
5. 데이터 객체 4종¶
hera-v4에서는 데이터를 담는 객체를 네 가지로 구분합니다. 같은 테이블을 다루더라도 계층에 따라 사용하는 객체가 다릅니다.
| 종류 | 약어 풀이 | 역할 | 위치 |
|---|---|---|---|
| Entity | — | DB 테이블과 1:1 대응하는 내부 처리 객체 | hera-system |
| VO | ViewObject | 화면/API로 주고받는 데이터 객체 | hera-domain-data |
| SP | SearchParams | 조회 조건을 담는 검색 파라미터 객체 | hera-domain-data |
| JVO | JoinViewObject | 다중 테이블 조인 결과를 담는 화면 응답 객체 | hera-domain-data |
5.1 Entity — DB와 1:1¶
Entity는 DB 테이블 컬럼과 1:1로 매핑되는 객체입니다. Service와 Mapper 계층에서만 사용하며, API 응답으로 그대로 내보내지 않습니다.
모든 Entity는 AuditModel 타입 중 하나를 상속합니다. 어떤 타입을 상속하느냐에 따라 createdBy, createdAt 같은 감사 필드를 프레임워크가 자동으로 처리해 줍니다.
| AuditModel 타입 | 자동 처리 필드 |
|---|---|
AuditModel | createdBy, createdAt, updatedBy, updatedAt |
CreatedAtAuditModel | createdAt |
CreatedAuditModel | createdBy, createdAt |
DatetimeAuditModel | createdAt, updatedAt |
SimpleAuditModel | 없음 |
5.2 VO — 화면/API 응답¶
VO는 Service 계층이 Entity를 변환해서 Controller에 전달하는 객체입니다. 화면 표시 형식에 맞춰 값을 가공한 뒤 JSON으로 내려줍니다.
5.3 SP — 검색 조건¶
SP는 화면의 검색 조건을 담아 API에 전달하는 객체입니다. 모든 SP는 BaseSP를 상속하며, 도메인에 필요한 검색 필드를 덧붙입니다.
CommonCodeSP를 예로 들면 다음과 같습니다.
public class CommonCodeSP extends BaseSP {
private String categoryCode;
private String groupCode;
private String code;
private String name;
@Builder.Default
private String useYn = "Y"; // 기본값: 사용 중인 코드만 조회
// ...
}
SP의 필드는 Service의 searchCondition 메서드가 QueryWrapper로 변환해 DB 조건으로 사용합니다.
5.4 JVO — 조인 응답¶
JVO는 여러 테이블을 조인한 결과를 화면에 내려줄 때 사용합니다. 단일 테이블 조회는 VO로 충분하지만, 연관 테이블을 한 번에 조회해야 할 때 JVO를 만듭니다.
6. 명명 규칙¶
hera-v4의 모듈 코드와 도메인 코드는 일정한 규칙으로 이름을 정합니다.
| 요소 | 예시 | 설명 |
|---|---|---|
| 모듈 코드 | sys, hrm, wfw | 도메인을 구분하는 3글자 약어 |
| 도메인 코드 | SYS0101 | 모듈 코드 + 4자리 화면 번호 (대문자) |
| URL 경로 | /sys/0101 | 모듈/번호 형식의 소문자 경로 |
| API 경로 | /api/sys/common-codes | 기능명을 kebab-case로 표현 |
| Java 파일명 | Sys0101ViewRouter | 도메인 코드 + 역할 클래스 접미사 |
sys0101을 예로 들면 다음과 같이 연결됩니다.
화면 URL /sys/0101
도메인 코드 SYS0101
ViewRouter Sys0101ViewRouter.java
Thymeleaf sys0101.html
JavaScript sys0101.js
ApiController Sys0101ApiController.java
7. 이 챕터 요약¶
| 개념 | 핵심 |
|---|---|
| 모듈 | hera-v4는 14개 Gradle 모듈로 구성됩니다 |
| 웹 진입점 | hera-webapp이 모든 브라우저 요청의 첫 수신 모듈입니다 |
| HTML 요청 | XxxViewRouter → Thymeleaf 렌더링 |
| Ajax 요청 | XxxApiController → Feign client → Gateway → 도메인 서비스 |
| 데이터 처리 | DB 처리는 hera-system 같은 도메인 서비스가 담당합니다 |
| 데이터 객체 | Entity(DB 내부), VO(화면 응답), SP(검색 조건), JVO(조인 응답) |
다음 챕터 예고
Ch 2에서는 hera-v4를 로컬에서 직접 실행합니다. 이 챕터에서 파악한 모듈 지도를 머릿속에 두고 있으면, 어떤 서비스를 어떤 순서로 띄워야 하는지 한결 빠르게 잡힙니다.