# damo-manager
Penta scpdb 라이브러리 래퍼. **단일 jar (`damo-manager.jar`)** 로 운영/로컬 양쪽 환경에서 동작한다.
- **운영**: 클래스패스에 `com.penta.scpdb.ScpDbAgent` 가 존재 → 실제 `ScpEncB64` / `ScpDecB64` / `ScpHashB64` 호출
- **로컬 개발**: scpdb 라이브러리 없음 → 자동으로 **fake 모드** 진입, 시작 시 `System.err` 에 강한 경고 배너 출력. 암복호화는 단순 Base64 round-trip, 해시는 JRE `MessageDigest` 로 대체
## 빌드
```bash
cd damo-manager
gradle clean build # 또는 ./gradlew clean build (wrapper 추가 시)
ls build/libs/ # damo-manager.jar
```
JDK 8 toolchain 을 요구한다 (`build.gradle` 의 `JavaLanguageVersion.of(8)`). `JAVA_HOME` 이 JDK 8 이거나 Gradle 이 시스템에서 JDK 8 을 auto-detect 할 수 있어야 한다.
Fake 모드 스모크 검증:
```bash
gradle runFakeSmoke
```
## 소스 코드 커스터마이즈
`src/main/java/com/eactive/ext/djb/DamoManager.java` 상단 상수 영역을 수정한다.
| 상수 | 의미 | 기본값 |
|---|---|---|
| `INI_FILE` | scpdb 에 전달할 ini 경로 | `/prod/damo/ba_scp/scpdb_agent.ini` |
| `KEY` | `ScpEncB64`/`ScpDecB64` 의 키 이름 | `KEY1` |
| `CHARSET` | scpdb 호출 시 charset 인자 | `UTF-8` |
| `SHA256`, `SHA512` | 해시 type 상수 | `71`, `73` |
새 scpdb 메서드를 래핑하려면 다음 4 곳을 동기화한다.
1. `src/stub/java/com/penta/scpdb/ScpDbAgent.java` — 새 시그니처를 추가 (컴파일 통과용)
2. `DamoManager.RealBridge` — 실제 호출 메서드 추가
3. `DamoManager` 공개 메서드 — `if (REAL_MODE) bridge.xxx(...) else fakeXxx(...)`
4. fake 분기 로직 작성 (보통 Base64 또는 JRE 기능)
> Stub 은 `compileOnly` 로만 사용되므로 산출 jar 에 포함되지 않는다. 운영의 진짜 ScpDbAgent 메서드 시그니처와 stub 시그니처가 다르면 운영에서 `NoSuchMethodError` 가 발생하므로 정확히 일치시켜야 한다.
## 결과물 사용 방법
### 권장: 빌드된 jar 직접 참조
타 Gradle 프로젝트에서는 `damo-manager.jar` 를 lib 폴더에 복사하여 직접 참조하는 방식을 권장한다. (Nexus 배포 없이 즉시 사용 가능)
**Gradle**:
```groovy
dependencies {
// 권장. 산출 jar 를 본인 프로젝트의 libs/ 에 복사 후 참조
compileOnly files('libs/damo-manager.jar')
// 또는 다른 위치를 직접 가리킨다면
// compileOnly files('../damo-manager/build/libs/damo-manager.jar')
}
```
WAS lib 폴더에서 클래스를 로드하므로 의존성 scope 는 반드시 **`compileOnly`** (또는 Maven 의 `provided`) 로 둔다. `implementation`/`api` 로 두면 war 에 중복 포함되어 ClassLoader 충돌 위험.
`api` 로 다른 모듈에 노출이 필요하다면 동일하게 `files(...)` 를 `api` scope 로 (단, 위 충돌 가능성 인지).
**Maven**:
```xml
com.eactive.ext.djb
damo-manager
1.0.0
system
${project.basedir}/libs/damo-manager.jar
```
또는 사내 Nexus 등에 배포 시 `provided`.
### WAS (Tomcat) 설치
운영 / 로컬에 따라 lib 폴더 구성이 다르다.
**운영 (Tomcat)**:
```
$CATALINA_HOME/lib/
├── damo-manager.jar
└── libs_scpdb-*.jar ← penta scpdb 라이브러리 (실 암복호화)
```
`libs_scpdb-*.jar` 와 함께 네이티브 .so/.dll 및 `/prod/damo/ba_scp/scpdb_agent.ini` 도 준비되어 있어야 한다.
**로컬 개발**:
```
$CATALINA_HOME/lib/
└── damo-manager.jar ← 단독. scpdb 라이브러리 없음
```
WAS 기동 시 콘솔(`catalina.out` 또는 stderr)에 다음과 같은 배너가 출력되면 정상 동작이다.
```
============================================================
*** DAMO-MANAGER FAKE MODE ***
com.penta.scpdb.ScpDbAgent NOT FOUND on classpath.
Fallback:
encrypt/decrypt -> Base64 (NO ENCRYPTION)
hash -> JRE MessageDigest (SHA-256 / SHA-512)
*** DO NOT use this build for production! ***
============================================================
```
> Fake 모드는 **암호화가 전혀 없는 단순 Base64 통과** 이므로 운영 절대 금지.
## 주요 메서드
```java
import com.eactive.ext.djb.DamoManager;
DamoManager damo = new DamoManager(); // 클래스 로딩 시점에 모드 감지
String cipher = damo.encrypt("hello"); // Base64 cipher text
String plain = damo.decrypt(cipher); // → "hello"
String h256 = damo.hash(DamoManager.SHA256, "password"); // SHA-256 base64
String h512 = damo.hash(DamoManager.SHA512, "password"); // SHA-512 base64
boolean fake = damo.isFakeMode(); // 디버깅 / 분기용
int rc = damo.getReturnCode(); // 0: 성공, -1: 실패
```
| 메서드 | 운영 동작 | Fake 동작 |
|---|---|---|
| `String encrypt(String plain)` | `ScpEncB64(INI_FILE, "KEY1", plain, "UTF-8")` | `Base64.encode(plain.getBytes("UTF-8"))` |
| `String decrypt(String b64)` | `ScpDecB64(INI_FILE, "KEY1", b64, "UTF-8")` | `new String(Base64.decode(b64), "UTF-8")` |
| `String hash(int type, String src)` | `ScpHashB64(type, src, "UTF-8")` | `MessageDigest(SHA-256/512).digest(src) → Base64` |
해시 `type` 상수:
| 상수 | 값 | 알고리즘 |
|---|---|---|
| `DamoManager.SHA256` | 71 | SHA-256 |
| `DamoManager.SHA512` | 73 | SHA-512 |
기타 유틸 (원본 DamoManager 호환):
- `Base64Encode(byte[])`, `Base64Decode(String)`
- `byteToHex(byte[])`, `byteArrayToHex(byte[])`
- `checkHangul(char)`
- `getReturnCode()`, `getRevision()`
## 검증
스모크 main 이 포함되어 있다.
```bash
java -cp build/libs/damo-manager.jar com.eactive.ext.djb.DamoManager
```
또는:
```bash
gradle runFakeSmoke
```
예상 출력:
```
============================================================
*** DAMO-MANAGER FAKE MODE ***
...
============================================================
revision = 20160503
fakeMode = true
encrypt = aGVsbG8sIL3M3sCw
decrypt = hello, 다모
roundtrip = true
sha256 b64 = ... (len=44)
sha512 b64 = ... (len=88)
```