This commit is contained in:
2026-05-29 10:45:56 +09:00
commit 9d69a95a5b
23 changed files with 610 additions and 0 deletions
+101
View File
@@ -0,0 +1,101 @@
# Telosys JPA Starter (config-driven entity & repository generator)
DB 스키마 → JPA **엔티티 + 레포지토리** 자동 생성기.
- 컬럼명 기반 `@Convert`/enum 매핑은 **설정 파일 한 개(`converters.csv`)** 로 관리
- DB 컬럼 코멘트는 필드 Javadoc 으로 자동 삽입
- 모든 출력 경로는 `telosys-tools.cfg` 의 4개 변수로 통제
새 프로젝트에 이 폴더를 풀고 **3개 파일 + cfg 의 4개 경로 변수** 만 채우면 됩니다.
```
TelosysTools/
├── telosys-tools.cfg ← ① 4개 패키지 경로 수정
├── databases.yaml ← ② DB 접속정보 수정 (커밋 금지)
├── lib/ ← ③ JDBC 드라이버 jar 넣기
├── models/ (자동 생성됨)
└── templates/
├── jpa-entities/ Base/Concrete 엔티티 생성 bundle
│ ├── templates.cfg (출력 경로 규칙)
│ ├── converters.csv ← ④ 컨버터 매핑 키 입력 (핵심)
│ ├── include/ (수정 불필요)
│ └── main-java/
│ ├── XxxBase_java.vm @MappedSuperclass 부모 생성
│ └── XxxConcrete_java.vm @Entity 자식 생성
└── jpa-repositories/ Base/Concrete 레포지토리 생성 bundle
├── templates.cfg
├── include/
└── main-java/
├── XxxRepositoryBase_java.vm @NoRepositoryBean 부모 인터페이스 생성
└── XxxRepositoryConcrete_java.vm @Repository 자식 인터페이스 생성
```
## 생성 구조 (Base / Concrete 상속)
### 엔티티 — `jpa-entities` bundle
각 테이블마다 2개 클래스 생성:
- `<Entity>Base.java``@MappedSuperclass`, **DB와 항상 1:1** (매번 재생성, 절대 수정 금지). 모든 컬럼·`@Convert` 매핑·DB 컬럼 코멘트(Javadoc)가 여기.
- `<Entity>.java``@Entity extends <Entity>Base`, **커스텀 영역** (없을 때만 1회 생성 → 재생성해도 보존). 비즈니스 로직·예외 매핑(`@Convert(attributeName=...)`, `@AttributeOverride`) 은 여기.
```
${ENTITY_BASE_PKG}/<Entity>Base.java (재생성됨, 손대지 마세요)
${ENTITY_CONCRETE_PKG}/<Entity>.java (커스텀, 보존됨)
```
### 레포지토리 — `jpa-repositories` bundle
각 테이블마다 2개 인터페이스 생성:
- `<Entity>JpaRepositoryBase.java``@NoRepositoryBean`, `JpaRepository<E,PK> + JpaSpecificationExecutor<E>` 상속 (매번 재생성, 수정 금지). 주요 컬럼 코멘트 Javadoc 포함.
- `<Entity>JpaRepository.java``@Repository extends <Entity>JpaRepositoryBase`, **커스텀 쿼리 영역** (없을 때만 1회 생성 → 재생성해도 보존). 모든 커스텀 메소드 / `@Query` 는 여기.
```
${REPO_BASE_PKG}/<Entity>JpaRepositoryBase.java (재생성됨, 손대지 마세요)
${REPO_CONCRETE_PKG}/<Entity>JpaRepository.java (커스텀 쿼리, 보존됨)
```
## 0. Telosys CLI 설치 (PC당 1회)
```bash
mkdir -p ~/tools/telosys && cd ~/tools/telosys
curl -sL -o t.zip https://github.com/telosys-tools-bricks/telosys-cli/releases/download/4.3.0-001/telosys-cli-4.3.0-001.zip
unzip -o t.zip && chmod +x tt
# 실행 별칭: alias tt='~/tools/telosys/tt'
```
## 1. 새 프로젝트에 풀기
이 zip 을 프로젝트 루트에서 풀면 `TelosysTools/` 가 생깁니다.
## 2. 파일 채우기
- `telosys-tools.cfg` : **4개 경로 변수** 수정
- `ProjectVariable.ENTITY_BASE_PKG` (예: `com.daewoong.platform.file.infrastructure.entity`)
- `ProjectVariable.ENTITY_CONCRETE_PKG` (예: `com.daewoong.platform.file.infrastructure.entity.concrete`)
- `ProjectVariable.REPO_BASE_PKG` (예: `com.daewoong.platform.file.infrastructure.persistence`)
- `ProjectVariable.REPO_CONCRETE_PKG` (예: `com.daewoong.platform.file.infrastructure.persistence.concrete`)
- `databases.yaml` : `HOST/DBNAME/USER/PASSWORD` 수정
- `lib/` : DB용 JDBC 드라이버 jar 넣기
- `templates/jpa-entities/converters.csv` : `컬럼명 ; enumFQN ; 컨버터FQN` 입력
## 3. 생성
```bash
cd <project-root>
~/tools/telosys/tt
telosys> h . # home = 프로젝트 루트
telosys> cdb db # DB 연결 확인
telosys> nm mymodel db # DB에서 모델 추출 (한 번만 — .entity 는 손으로 관리)
telosys> m mymodel
telosys> b jpa-entities # 엔티티 bundle 선택
telosys> gen * * # → y (전 엔티티 Base/Concrete 생성)
telosys> b jpa-repositories # 레포지토리 bundle 선택
telosys> gen * * # → y (전 레포지토리 Base/Concrete 생성)
```
## 동작 원리
- **컬럼 매핑** : `converters.csv` 의 컬럼명과 일치하는 Base 필드는 `@Convert(converter=...) private <enum> ...` 로 생성. 매핑 없는 컬럼은 표준 타입.
- **컬럼 코멘트** : DB 의 column comment 가 있으면 자동으로 `/** comment */` Javadoc 으로 Base 필드에 삽입. 레포지토리 Base 의 클래스 Javadoc 에도 컬럼별 요약이 들어감.
- **개별 예외** : 특정 테이블만 다르게 → 그 `.entity` 컬럼에 `#javaType(...) #converter(...)` 태그로 override.
- **새 컨버터 추가** = `converters.csv` 한 줄. 템플릿·엔티티 무수정.
- **PK 타입** : Base 의 키 attribute 에서 자동 추출 (`@Id` 컬럼의 Java 타입). 단일 키 가정.
- **DB 스키마 변경 시** 재생성 → Base 만 갱신 (새 컬럼·코멘트 반영), Concrete 의 커스텀은 보존.
## 주의
- `.entity` 모델 파일은 한 번 추출 후 **손으로 관리하는 소스** 입니다 (DB 재추출이 덮어쓰지 않음). git 에 커밋해 관리하세요.
- `databases.yaml` 은 비밀번호 때문에 `.gitignore` 에 추가 권장.
- `ENTITY_CONCRETE_PKG` / `REPO_CONCRETE_PKG``ENTITY_BASE_PKG` / `REPO_BASE_PKG` 의 서브패키지가 아니어도 됩니다 — 프로젝트 구조에 맞게 자유롭게 지정 가능.
- **이전 버전에서 마이그레이션** : 자식 엔티티 위치가 `template``concrete` 로 변경됐습니다. 기존 `*.template/` 폴더는 다음 재생성 시 orphan 되므로 직접 삭제 또는 이동 필요.