diff --git a/readme.md b/readme.md index 65ad55c..a95e443 100644 --- a/readme.md +++ b/readme.md @@ -1,470 +1,365 @@ -# EAPIM Admin +# eapim-admin -광주은행 엔터프라이즈 API 관리 시스템 - 관리 콘솔 +제주은행(DJB) eLink EMS 관리 콘솔 -## 프로젝트 개요 +## 개요 -**EAPIM Admin**은 광주은행의 eLink EMS (eLink Management System) 관리 콘솔로, API 게이트웨이 구성, 모니터링, 통계, 트랜잭션 로그 조회 기능을 제공하는 웹 기반 플랫폼입니다. +**eapim-admin** 은 eLink EMS(eLink Management System)의 웹 기반 관리 콘솔입니다. +API 게이트웨이 구성, 실시간 모니터링/대시보드, 통계, 트랜잭션 로그 조회, 인터페이스·레이아웃·어댑터·라우팅 관리 기능을 제공합니다. + +eLink EMS 는 세 가지 애플리케이션으로 구성됩니다. + +| 애플리케이션 | 설명 | +|---|---| +| **eapim-admin** | 관리 콘솔 (이 저장소) | +| eapim-online | 실시간 트랜잭션 처리 API 게이트웨이 | +| eapim-portal | API 소비자용 개발자 포털 (Spring Boot) | + +> 패키지·클래스에 남아 있는 `kjb` / `KJB` 명칭은 초기 광주은행 커스터마이징에서 유래한 것으로, +> 현재 배포 대상은 제주은행(DJB)입니다. 제주은행 전용 코드는 `com.eactive.eai.rms.ext.djb` 하위에 있습니다. ## 기술 스택 -- Spring Framework 5.3.27 -- Java 17 -- Gradle 8.7 -- Oracle 19c -- Spring Data JPA 2.5.2 -- Hibernate 5.4.33/5.6.15 -- QueryDSL 5.0.0 -- iBATIS 2.3.4 (레거시 SQL 매핑) -- Quartz 2.2.1 -- Logback 1.2.10 +| 구분 | 버전 / 내용 | +|---|---| +| Java | **8** (Gradle toolchain 으로 강제, `JavaLanguageVersion.of(8)`) | +| 빌드 | Gradle **8.7** (wrapper), `war` 패키징 | +| Spring Framework | 5.3.27 (MVC / ORM / JDBC) | +| Spring Data JPA | 2.5.2 | +| Hibernate | 5.6.15.Final | +| QueryDSL | 5.0.0 (빌드 시 Q-class 생성) | +| iBATIS | 2.3.4 (레거시 SQL 매핑) | +| Quartz | 2.2.1 (스케줄링) | +| 로깅 | SLF4J + Logback 1.2.10 (모든 `log4j` 의존성 제외) | +| 기타 | Apache POI 3.17(Excel), Jackson 2.13.1, AWS SDK 2.x(S3), EhCache, Lombok, MapStruct | -## 초기 세팅 가이드 +애플리케이션 프레임워크는 Spring Boot 가 아닌 전통적 Spring 5.3 WAR 이며 Tomcat / WebLogic 등에 배포됩니다. +(Spring Boot 는 테스트 유틸리티 `spring-boot-starter-test:2.6.15` 에만 사용) -### 사전 요구사항 +## 사전 요구사항 -- JDK 17 이상 -- Gradle 8.7 +- **JDK 8** - `.envrc`(direnv) 또는 셸 rc 에서 `JAVA_HOME` 을 JDK 8 위치로 export. Gradle 8 toolchain auto-detect 가 `JAVA_HOME` 도 후보로 인식합니다. `gradle.properties` 에 JDK 경로를 넣지 않습니다. - Git -- Oracle 19c (또는 개발 환경에 따라 접근 가능한 DB) +- Oracle 접근 (개발/테스트 환경에 따라). 테스트는 H2 인메모리 DB 사용. +- **형제 디렉토리 체크아웃 필요** - 멀티 모듈 프로젝트로 아래 저장소가 같은 부모 디렉토리에 있어야 합니다. + ``` + / + ├── eapim-admin/ # 이 저장소 + ├── eapim-online/ # elink-online-* 모듈 + └── elink-portal-common/ # 포털 공통 JPA 엔티티 + ``` -### 환경별 설정 파일 -프로젝트 클론 후 필요한 환경 설정을 수정하세요: +## 멀티 모듈 구조 -- `WebContent/WEB-INF/properties/env.D.properties` - 개발 환경 -- `WebContent/WEB-INF/properties/env.T.properties` - 테스트/스테이징 환경 -- `WebContent/WEB-INF/properties/env.P.properties` - 운영 환경 +`settings.gradle` 에서 형제 디렉토리의 소스 프로젝트를 참조합니다. +| 모듈 | 위치 | 설명 | +|---|---|---| +| elink-online-core | `../eapim-online/elink-online-core` | 핵심 인터페이스 / 도메인 모델 | +| elink-online-core-jpa | `../eapim-online/elink-online-core-jpa` | JPA 엔티티 / 리포지토리 | +| elink-online-transformer | `../eapim-online/elink-online-transformer` | 메시지 변환 로직 | +| elink-online-common | `../eapim-online/elink-online-common` | 공통 유틸리티 | +| elink-online-emsclient | `../eapim-online/elink-online-emsclient` | EMS 통신 클라이언트 | +| elink-portal-common | `../elink-portal-common` | 포털 공통 컴포넌트 (JPA 엔티티) | -### 주의사항 -- **SafeDB**: 암호화 기능이 필요한 경우 `-Dkjb_safedb.mode=fake` 설정 (개발 환경) 또는 실제 SafeDB 라이브러리 설치 -- **멀티 모듈 구조**: eapim-online의 여러 모듈들을 참조하므로 반드시 eapim-online도 클론해야 합니다 - +> `kjb-safedb`, `eapim-admin-djb` 는 `settings.gradle` 에 주석 처리되어 있으며, +> 필요 시 주석을 해제하고 해당 디렉토리를 체크아웃합니다. ## 빌드 및 실행 -### Gradle 명령어 - 프로젝트 루트의 Gradle wrapper(`./gradlew`) 를 사용합니다. -### 빌드 및 실행 명령어 - ```bash # 표준 빌드 ./gradlew build -# Weblogic 배포용 빌드 (테스트 제외) -./gradlew build -x test -Pprofile=weblogic - -# WAR 파일 빌드[ems_stdout.log](../../logs/emsSvr-RinjaeMA/ems_stdout.log) -./gradlew war - # 클린 빌드 ./gradlew clean build -# 테스트 실행 -./gradlew test +# WAR 빌드 (build/libs/eapim-admin.war) +./gradlew war -# 패키징 없이 클래스만 컴파일 +# WebLogic 배포용 빌드 (테스트 제외, weblogic-web.xml 사용) +./gradlew build -x test -Pprofile=weblogic + +# 패키징 없이 컴파일만 ./gradlew classes -# QueryDSL Q-classes 및 기타 애노테이션 생성 +# QueryDSL Q-class 등 생성 코드만 생성 ./gradlew compileJava -# 의존성 트리 보기 -./gradlew dependencies +# 전체 테스트 +./gradlew test -# 사용 가능한 모든 태스크 목록 +# 특정 테스트 +./gradlew test --tests "com.eactive.eai.rms.*" + +# 의존성 트리 / 태스크 목록 +./gradlew dependencies ./gradlew tasks --all ``` +- WAR 파일명: `eapim-admin.war`, 컨텍스트 경로: `/monitoring` +- 프로필: `-Pprofile=weblogic` 지정 시 `web.xml` 대신 `weblogic-web.xml` 사용 (DefaultServlet 문제 회피) + +## 로컬 개발 빠른 시작 + +1. **생성 코드 생성** - 최초 1회 및 pull 이후 + ```bash + ./gradlew compileJava # Q-class IDE 오류 시: ./gradlew clean compileJava + ``` +2. **빌드/테스트** + ```bash + ./gradlew build + ``` +3. **IDE 열기** - 아래 "IDE 설정" 참조 +4. **WAS(Tomcat 등) 실행 구성** 에 `eapim-admin` 배포 + 아래 VM 옵션 추가 후 기동 + +### 로컬 Tomcat VM 옵션 예시 + +전체 목록과 설명은 `CLAUDE.md` 의 "필수 환경 변수 (Tomcat)" 를 참조하세요. + +``` +-Deai.datasource.type=DEV +-Dinst.Name=emsSvr11 +-Deai.tableowner=EMSADM +-Deai.systemmode=D +-Dfile.encoding=utf-8 +-Dlogin.mode=db +-DLOGBACK_LOG_LEVEL=DEBUG +-Ddamo-manager.enabled=true +-Dlogging.log-path=/logs/prod/eapim/emsSvr11 +-Dlogback.configurationFile=classpath:logback-dev.xml +-Dhibernate.dialect=org.hibernate.dialect.Oracle12cDialect +``` + +- `inst.Name` 은 클러스터 내에서 인스턴스마다 고유해야 합니다. +- `eai.tableowner` 는 Oracle 스키마 소유자. + ## 프로젝트 구조 -### 전체 프로젝트 구조 -``` -kjb-eapim/ -├── eapim-admin/ # Admin 관리 콘솔 (현재 프로젝트) -├── eapim-online/ # Online 게이트웨이 코어 모듈 -│ ├── elink-online-core/ -│ ├── elink-online-core-jpa/ -│ ├── elink-online-transformer/ -│ ├── elink-online-common/ -│ ├── elink-online-emsclient/ -│ └── elink-online-adapter/ -├── elink-portal-common/ # 포털 공통 컴포넌트 (JPA 엔티티) -├── kjb-safedb/ # SafeDB 암호화 라이브러리 -└── eapim-portal/ # Portal 개발자 포털 (선택사항) -``` - -### eapim-admin 내부 구조 ``` src/main/java/com/eactive/eai/ ├── agent/command - 커맨드 패턴 구현 -├── common/ - 공통 유틸리티, iBatis, JSON 직렬화 -├── custom/ - 고객사별 커스터마이제이션 -├── rms/ - 메인 애플리케이션 코드 -│ ├── bap/ - 배치 처리 (BAP) -│ ├── bat/ - 추가 배치 기능 -│ ├── common/ - RMS 공통 (필터, 시작, 서비스) -│ ├── data/ - 데이터 엔티티, 리포지토리 -│ ├── env/ - 환경 설정 -│ ├── kakao/ - 카카오 연동 -│ ├── onl/ - 온라인 트랜잭션 관리 -│ └── service/ - 비즈니스 서비스 -└── ext.kjb/ - 광주은행(KJB) 확장 -``` +├── common - 공통 유틸리티, iBatis, JSON 직렬화 +├── custom - 고객사별 커스터마이제이션 +├── rms - 메인 애플리케이션 코드 +│ ├── bap - 배치 처리(BAP): adaptor / manage / tansaction +│ ├── bat - 추가 배치 기능 +│ ├── common - RMS 공통 (필터, 시작, 서비스) +│ ├── data - 데이터 엔티티, 리포지토리 +│ ├── env - 환경 설정 +│ ├── kakao - 카카오 연동 +│ ├── onl - 온라인 트랜잭션 관리 (apim / manage / transaction) +│ ├── service - 비즈니스 서비스 +│ └── ext +│ ├── djb - 제주은행(DJB) 확장 (webhook, UMS 연동, 통계 등) +│ └── kjb - 광주은행(KJB) 유래 확장 +└── (com.eactive.ext.kjb) - 통계 화면 등 일부 확장 코드 -### 웹 리소스 구조 -``` WebContent/ ├── WEB-INF/ -│ ├── applicationContext.xml - Root Spring 설정 -│ ├── springapp-servlet.xml - Servlet Spring 설정 -│ ├── web.xml - Tomcat용 배포 디스크립터 -│ ├── weblogic-web.xml - WebLogic용 배포 디스크립터 -│ └── properties/ - 환경별 프로퍼티 -│ ├── env.D.properties - 개발 -│ ├── env.T.properties - 테스트 -│ └── env.P.properties - 운영 -└── guide/ - 사용자 가이드 +│ ├── applicationContext.xml - Root Spring 설정 +│ ├── springapp-servlet.xml - Servlet Spring 설정 +│ ├── web.xml / weblogic-web.xml +│ └── properties/ - env.D / env.T / env.P / env.L .properties +├── jsp/ - 화면 +└── guide/ - 사용자 가이드(docsify) ``` -## 주요 기능 +## 데이터 액세스 (하이브리드 ORM) -다음과 같은 관리 기능을 수행하며, 모든 관리 대상은 실시간으로 DB, 메모리에 있는 정보가 수정, 반영됩니다. +JPA 와 iBATIS 를 함께 사용합니다. -| 기능 | 설명 | -| -------------------- | ------------------------------------------------------------ | -| 사용자 관리 | 사용자 및 권한을 관리하는 기능 | -| 로그 조회 | 거래 수행 내역을 조회 하는 기능(온라인/배치/일괄) | -| 통계 조회 | 거래 통계 조회 기능 | -| 대시보드 조회 | 거래 내역 및 장애상황을 모니터링 할 수 있는 대시보드 조회 기능 | -| 인터페이스 관리 | 인터페이스 등록/관리 기능 | -| 레이아웃 관리 | 레이아웃 등록/관리 기능 | -| 변환 관리 | 변환 등록/관리 기능 | -| 어댑터 관리 | 통신 어댑터 등록/관리 기능 | -| 라우팅룰 관리 | 라우팅 룰 등록/관리 기능 | -| 배치 어댑터 관리 | 배치 어댑터 등록/관리 기능 | -| 배치 인터페이스 관리 | 배치 인터페이스 등록/관리 기능 | -| 일괄 관리 | 일괄 등록/관리 기능 | +- **신규 기능**: JPA + Spring Data 리포지토리 (`com.eactive.eai.rms.data.entity`, `elink-portal-common`) +- **레거시**: iBATIS SQL 매퍼 `src/main/resources/com/eactive/eai/**/*.xml` (Spring XML 설정, 점진적 마이그레이션 대상) +- 벤더별 매핑: Oracle `*-oracle.xml`, MariaDB `*-mariadb.xml`, PostgreSQL `*-postgresql.xml` -## 외부 모듈 +### Multi-tenancy (런타임 스키마 전환) -이 프로젝트는 다음 모듈에 의존합니다 (settings.gradle 참조): - -| 이름 | 버전 | 설명 | -| ------------------------ | ------------ | ---------------------------------------------- | -| elink-online-core | 4.5-SNAPSHOT | 코어 모듈로 인터페이스 클래스 정의 | -| elink-online-core-jpa | 4.5-SNAPSHOT | JPA 엔티티 및 리포지토리 | -| elink-online-transformer | 4.5-SNAPSHOT | 변환 모듈로 메시지 및 변환 관련 클래스 정의 | -| elink-online-adapter | 4.5-SNAPSHOT | 어댑터 모듈로 통신에 필요한 어댑터 클래스 정의 | -| elink-online-common | 4.5-SNAPSHOT | 나머지 공통 프로그램이 정의되어있다 | -| elink-online-emsclient | 4.5-SNAPSHOT | ems와 통신하기 위한 모듈 | -| elink-portal-common | - | 포털 공통 컴포넌트 (JPA 엔티티) | -| kjb-safedb | - | 커스텀 암호화 라이브러리 | -| eapim-admin-kjb | - | KJB 은행 특화 커스터마이제이션 | - -## 하이브리드 ORM 방식 - -이 애플리케이션은 **JPA와 iBATIS 모두를 사용**합니다: -- **JPA/Hibernate**: `elink-portal-common`을 통한 현대적인 데이터 액세스 (Spring Data repositories) -- **iBATIS**: 기존 코드를 위한 레거시 SQL 매핑 (점진적으로 마이그레이션 예정) - -데이터 액세스 작업 시: -- 새로운 기능은 JPA와 Spring Data repositories를 사용해야 합니다 -- 레거시 iBATIS 매퍼는 `src/main/resources/com/eactive/eai/**/*.xml`에 있으며 Spring XML을 통해 설정됩니다 +Hibernate Multi-tenancy 로 요청 시점에 스키마를 전환합니다. +`DataSourceContextHolder`(ThreadLocal) → `TenantIdentifierResolver` → `ConfigurableMultiTenantConnectionProvider.setSchema()`. +요청 파라미터 `serviceType`(예: `APIGW`) 를 `DataSourceTypeInterceptor` 가 읽어 자동 설정하거나, 컨트롤러에서 명시 설정합니다. +자세한 내용은 `CLAUDE.md` 의 "Multi-tenancy" 절 참조. ## 코드 생성 -빌드 프로세스에서 생성되는 것들: -- **QueryDSL Q-classes**: 타입 안전 쿼리 클래스 -- **Lombok**: 애노테이션 프로세싱을 통한 Getters/setters/builders -- **MapStruct**: DTO와 엔티티 간의 객체 매퍼 - -### 이중 Q-Class 생성 (Gradle + Eclipse) - -이 프로젝트는 **Gradle과 Eclipse 애노테이션 프로세서 모두를 사용**하므로, Q-classes가 **두 위치에 생성**됩니다: - -1. **`build/generated/java/`** - `gradle compileJava` 또는 `gradle build` 실행 시 Gradle이 생성 -2. **`WebContent/generated/`** - Eclipse IDE에서 빌드 시 Eclipse APT가 생성 - -**이는 예상된 동작이며 의도적입니다.** 두 디렉토리 모두 `.gitignore`에 포함되어 있으며 커밋해서는 안 됩니다. - -## AI 코딩 어시스턴트 지침 파일 - -이 프로젝트는 여러 AI 코딩 어시스턴트를 지원합니다. 각 도구는 다음 파일을 참조합니다: - -### 지침 파일 위치 - -| AI 도구 | 지침 파일 경로 | 용도 | -|---------|---------------|------| -| **Claude Code** | `CLAUDE.md` | 마스터 지침 파일 (한글) | -| **GitHub Copilot** | `.github/copilot-instructions.md` | Copilot용 지침 | -| **Cursor** | `.cursorrules` | Cursor용 간결한 규칙 | - -### 지침 파일 관리 방법 - -1. **마스터 파일**: `CLAUDE.md` - - 가장 상세한 프로젝트 지침을 포함 - - 한글로 작성되어 한국 개발팀이 이해하기 쉬움 - - 수정 시 이 파일을 먼저 업데이트 - -2. **동기화**: - ```bash - # CLAUDE.md 수정 후 다른 파일들 동기화 - cp CLAUDE.md .github/copilot-instructions.md - # .cursorrules는 간결한 버전이므로 필요시 수동 업데이트 - ``` - -3. **새로운 AI 도구 지원 추가**: - - Windsurf: `.windsurfrules` 파일 생성 - - 기타 도구: 해당 도구의 규칙 파일명 확인 후 생성 +빌드 시 생성됩니다. +- **QueryDSL Q-class** - `build/generated/java/` 에 생성, `.gitignore` 대상 (커밋 금지) +- **Lombok** - getter/setter/builder 등 +- **MapStruct** - DTO ↔ 엔티티 매퍼 +pull 이후 또는 Q-class IDE 오류 시 `./gradlew compileJava` (또는 `clean compileJava`) 로 재생성합니다. ## 환경 설정 ### 시스템 모드 -- **D (DEV)**: 개발 환경 -- **T (TEST)**: 테스트/스테이징 환경 -- **P (PROD)**: 운영 환경 +`-Deai.systemmode` 로 지정하며 해당 프로퍼티 파일을 로드합니다. -시스템 모드는 `-Deai.systemmode` JVM 옵션으로 설정하며, 해당 환경의 프로퍼티 파일(`env.D.properties` 등)을 로드합니다. +| 값 | 환경 | 파일 | +|---|---|---| +| D | 개발 | `env.D.properties` | +| T | 테스트 / 스테이징 | `env.T.properties` | +| P | 운영 | `env.P.properties` | +| L | 로컬 | `env.L.properties` | -### TOMCAT 기동 옵션 참조 +### 데이터베이스 -#### 은행 개발 서버용 -``` --Deai.datasource.type=DEV --Dinst.Name=emsSvr11 --Deai.tableowner=EMSAPP --Deai.systemmode=D --Dfile.encoding=utf-8 --DLOGBACK_LOG_LEVEL=info -``` +- **Oracle**: 운영 주 DB (`hibernate.dialect=org.hibernate.dialect.Oracle12cDialect`) +- **MariaDB / PostgreSQL**: 벤더별 SQL 매핑으로 지원 (JDBC 의존성은 필요 시 활성화) +- **H2**: 테스트용 인메모리 DB (`src/test/resources`) +- 연결 타입은 `-Deai.datasource.type`(DEV/STG/PROD) 로 선택 -#### 로컬 개발용 -``` --Deai.datasource.type=DEV --Dinst.Name=emsSvr99 --Deai.tableowner=EMSAPP --Deai.systemmode=D --Dfile.encoding=utf-8 --Dlogin.mode=db --DLOGBACK_LOG_LEVEL=DEBUG --Dlogback.configurationFile=classpath:logback-dev.xml --Dhibernate.dialect=org.hibernate.dialect.Oracle12cDialect --Dkjb_safedb.mode=fake +### DB 암호화 + +`damo-manager.jar` 모듈은 환경에 따라 다른 암호화로직을 제공한다. + +| 환경 | 설명 | +|---|---| +| 운영 | 실제 D'amo 네이티브 라이브러리 | +| 개발 | SHA-256 | + +로컬 개발 시 `-Ddamo-manager.enabled=false` + +## DJB (제주은행) 전용 설정 + +DJB 전용 프로퍼티는 DB 테이블 `TSEAIRM24` 에 그룹명 `'Monitoring'` 과 +DB 테이블 `PTL_PROPERTY` 에 그룹명 `'Portal'` 로 저장된다. + +> Monitoring 프라퍼티 (환경정보 > EMS관리 > 모니터링 프라퍼티) + +**계정관리** +- `rms.DUAL_LOGIN_ENABLED` - 중복 로그인 허용 여부 +- `rms.auto.logout.timeout` - 자동 로그아웃 시간(분) +- `djb.sms_auth.enabled` - 로그인시 2-factor 인증 적용여부 +- `djb.sms_auth.fixed_value` - sms_auth.mode=fixed일 경우 고정인증값 +- `djb.sms_auth.mode` - 2-factor 인증 모드 (real:실제, fixed:고정값-개발환경에서 사용) +- `rms.password.combi.check` - 비밀번호 영문/숫자/특수문자 조합 종류수 +- `rms.password.fail.count` - 비밀번호 실패 허용 횟수(이 값 이상 실패시 계정 잠김) +- `rms.password.history.count` - 이전 비밀번호 변경 불가 횟수 +- `rms.password.init.subfix` - 관리자가 비밀번호 초기화시 추가 문자 ex) 행번@! +- `rms.password.length.check` - 비밀번호 최소 자리수 +- `rms.password.repeat.check` - 비밀번호 동일문자,연속문자 반복 불가 횟수 +- `rms.password.sms_auth.enabled` - 비밀번호 변경시 2-factor 인증 여부 + +**UMS(공통) 연동** +- `djb.ums.was_ip_address` - 관리자포탈 WAS IP 주소 (UMS 연동시 필요) +- `djb.ums.was_mac_address` - 관리자포탈 WAS MAC 주소 (UMS 연동 시 필요) + +**UMS(이메일) 연동** +- `djb.ums.email.url` - 이메일 API 엔드포인트 (EAI) +- `djb.ums.email.cstno` - 고객번호 +- `djb.ums.email.ums_evnt_id` - UMS이벤트 ID + +**UMS(사내메신저) 연동** +- `djb.ums.messenger.url` - 사내메신저 API 앤드포인트 (FEP) +- `djb.ums.messenger.client_id` - 사내메신저 클라이언트 아이디 +- `djb.ums.messenger.client_secret` - 사내메신저 클라이언트 시크릿 +- `djb.ums.messenger.api-monitor.enabled` - API 상태변화시 직원에게 사내메신저 발송 여부 + +**UMS(SMS) 연동** +- `djb.ums.sms.url` - SMS API 엔드포인트 (EAI) +- `djb.ums.sms.almtk_snd_prtl_key.intra` - 카톡 알림톡 채널 ID (제주은행 임직원) +- `djb.ums.sms.almtk_snd_prtl_key.public` - 카톡 알림톡 채널 ID (제주은행) + +**Webhook 발송** +- `rms.webhook.enabled` - 웹훅 발송 여부 +- `rms.webhook.retry_count` - 웹훅 재발송 횟수 +- `rms.webhook.retry_time` - 웹훅 재발송 시간간격 +- `rms.webhook.reverse_proxy.url` - 리버스 프록시 경로 --Dlogback.configurationFile="C:\eactive\workspaces\kjb-eapim\eapim-admin\src\main\resources\logback-rinjae.xml" -``` +> Portal 프라퍼티 (파트너포탈 > 포탈관리 > Property관리) -### 데이터베이스 지원 +**UMS 연동** +- `djb.ums.email.if_id` - 이메일 연동 인터페이스 ID +- `djb.ums.email.tx_id` - 이메일 거래 ID +- `djb.ums.messenger.if_id` - 사내메신저 인터페이스 ID +- `djb.ums.messenger.tx_id` - 사내메신저 거래 ID +- `djb.ums.sms.if_id` - SMS 인터페이스 ID +- `djb.ums.sms.tx_id` - SMS 거래 ID -- **Oracle**: 운영 데이터베이스 (주) -- **PostgreSQL/MariaDB**: 대체 운영 DB -- **H2**: 테스트용 인메모리 데이터베이스 -데이터베이스 벤더는 프로퍼티 파일의 `db.vendor`와 `hibernate.dialect`를 통해 설정됩니다. +## 스케쥴러 -### SafeDB 암호화 라이브러리 +**API 상태 모니터링** +- `ApiStatusMonitorJob11, ApiStatusMonitorJob21` - API 상태 변화를 모니터링한다(서버수 만큼 등록) +- 실행간격(1분)이 짧아서 CLUSTERED는 적용을 못하고, 서버마다 번갈아 가면서 실행하도록 설정 +- API 상태 변화 발생시 직원에게 메신저 및 제휴사에게 웹훅을 발송한다. +- `api.status.error.range_minute` - API 장애 판단을 위한 로그 구간(분) +- `api.status.error.rate` - API 장애판단을 위한 오류율 (ex : 10분동안 90% 이상 오류 발생시 장애로 판단) +- `api.status.delay.range_minute` - API 지연 상태 판단을 위한 로그 구간(분) +- `api.status.delay.avg_resp_time` - API 지연 상태 판단을 위한 평균 응답속도 (ex: 10분동안 평균 응답속도가 10초이상이면 지연으로 판단) -`kjb-safedb` 모듈은 세 가지 동작 모드를 제공합니다: -- **REAL**: 실제 SafeDB 네이티브 라이브러리 사용 -- **FAKE**: SHA-256/AES-256을 사용하는 개발 모드 (SafeDB 설치 불필요) -- **NONE**: 암호화 우회 (테스트 전용) +**유량제어토큰실패감시** +- `InflowTokenMonitorJob` - 유량제어 토큰 획득 실패(TSEAIFR11) 발생시 직원에게 메신저를 발송한다 +- `api.inflow.fail.range_minute` - 최근 몇분동안 감시하는지 설정 -개발 시 SafeDB가 로컬에 설치되지 않은 경우 `-Dkjb_safedb.mode=fake`를 설정합니다. +**API 통계** +- `ApiStatsHourlyAggregationJob` - 당일 API 로그 정보를 시간별로 집계 (TSEAILG00 > API_STATS_HOUR) +- `APISTATSDAILYJOB` - API 사용통계 일집계 (API_STATS_HOUR > API_STATS_DAY) +- `APISTATSMONTHLYJOB` - API 사용통계 월집계 (API_STATS_DAY > API_STATS_MONTH) +- `APISTATSYEARLYJOB` - API 사용통계 년집계 (API_STATS_MONTH > API_STATS_YEAR) + +**UMS발송** +- `UMSDISPATCHJOB11, UMSDISPATCHJOB21` - UMS를 발송한다 (서버수 만큼 등록) +- 실행간격(6초)이 짧아서 CLUSTERED는 적용을 못하고, 서버마다 번갈아 가면서 실행하도록 설정 + +**게시글종료** +- `PortalInquiryClosingJob` - 답변완료 이후 일정기간 댓글이 없는 경우 게시글을 종료한다 +- `inquiry.comment.closing_day` - 게시글 종료 대기일수 + +**메모리초기화** +- `MEMORYTRINIT` - 관리자포탈 서버 메모리 초기화(G/W에서 받은 거래현황) + +**토큰발급이력삭제** +- `TOKENISSUANCELOGCLEANUPJOB` - 7일이 지난 토큰 발급내역을 삭제한다 ## 배포 -### 지원 서버 -- **Tomcat** (기본, 개발) -- **WebLogic 14.1.2** (운영, `-Pprofile=weblogic` 필요) -- **JEUS** (지원) -- **JBoss/WildFly** (descriptors와 함께 지원) +| 대상 | 비고 | +|---|---| +| Tomcat | 기본, 개발 | +| WebLogic 14.1.2 | 운영, `-Pprofile=weblogic` 필요 | +| JEUS | 지원 | +| JBoss / WildFly | descriptor 포함 지원 | -### WebLogic 전용 빌드 - -WebLogic용 빌드 시, DefaultServlet 문제를 해결하기 위해 `web.xml`을 `weblogic-web.xml`로 교체하는 `weblogic` 프로필을 사용합니다: - -```bash -gradle build -x test -Pprofile=weblogic -``` - -### WAR 배포 - -WAR 파일은 context path `/monitoring`으로 `eapim-admin.war`로 빌드됩니다. +- 모든 관리 변경사항은 DB 와 메모리에 즉시 반영됩니다. +- 인코딩은 UTF-8. `CharacterEncodingFilter` 가 `*.excel` 을 제외한 모든 요청에 적용. +- XSS 보호: `com.eactive.eai.rms.common.filter.CrossScriptingFilter` 전역 적용. ## IDE 설정 -### Eclipse +`build.gradle` 은 `eclipse` / `eclipse-wtp` / `idea` 플러그인을 모두 포함합니다. +IntelliJ 전용 변형은 `build.gradle.intellij` 로 별도 관리합니다 (필요 시 `build.gradle` 로 교체). ```bash -gradle eclipse +# Eclipse +./gradlew eclipse # .project / .classpath, WTP(context path: /monitoring), APT 설정 생성 + +# IntelliJ IDEA +./gradlew idea # 또는 IDE 에서 "Import Gradle Project" ``` -다음을 생성합니다: -- `.project` 및 `.classpath` 파일 -- Eclipse WTP 설정 (context path: `/monitoring`) -- UTF-8 인코딩 설정 -- QueryDSL/Lombok을 위한 애노테이션 프로세서 설정 - -### IntelliJ IDEA - -```bash -gradle idea -``` - -또는 IntelliJ에서 직접 "Import Gradle Project"를 사용합니다. - -## KJB (광주은행) 전용 설정 - -### 프로퍼티 관리 -KJB 전용 프로퍼티는 데이터베이스 테이블 `TSEAIRM24`에 그룹명 `'Monitoring'`으로 저장됩니다. - - -### 주요 프로퍼티 설정 - -**이메일 알림 (EAI Batch를 통해)** -- `kjb.eai_batch.url` - 이메일 발송을 위한 EAI 배치 서버 URL - - 개발: http://172.31.32.111:10230/BATAppWeb/EaiBatCall - - QA: http://172.31.33.111:10430/BATAppWeb/EaiBatCall - - 운영: http://172.21.1.40:10860/BATAppWeb/EaiBatCall - - 입력하지 않을 경우 EAI 배치 호출을 하지 않고 내부적으로 통신하지 않으며 warning 로그만 남김 -- `kjb.ums.eai_batch.send_dir` - 이메일 파일 발송 디렉토리 (기본값: `/Data/eapim/portal/sendmail/snd`) -- `kjb.ums.eai_batch.backup_dir` - 이메일 백업 디렉토리 (기본값: `/Data/eapim/portal/sendmail/bak`) -- `kjb.ums.eai_batch.interface_id` - 고객 이메일용 인터페이스 ID (예: `UAGFF00001UIE`) - -**UMS (SMS/LMS/카카오톡) 연동** -- `kjb.ums.host_url` - UMS API 엔드포인트 -- `kjb.ums.api_key` - UMS API 인증 키 -- `kjb.ums.connection_timeout` - 연결 타임아웃 (초 단위) -- `kjb.ums.response_timeout` - 응답 타임아웃 (초 단위) - -### 보안 -- 커스텀 패스워드 인코더: SafeDB 연동을 위한 `KjbSafedbPasswordEncoder` - ## 테스트 -테스트에 사용되는 것들: -- **JUnit 5 (Jupiter)**: 테스트 프레임워크 -- **Spring Boot Test 2.6.15**: 통합 테스트 유틸리티 -- **H2 Database**: 테스트용 인메모리 데이터베이스 -- **Mockito**: 모킹 프레임워크 (Spring Boot Test를 통해) +- **JUnit 5 (Jupiter)** - 테스트 프레임워크 +- **Spring Boot Test 2.6.15** - 통합 테스트 유틸리티 +- **H2** - 인메모리 DB (`src/test/resources`) +- **Mockito** - 모킹 (Spring Boot Test 경유) ```bash -# 모든 테스트 실행 -gradle test - -# 특정 테스트 클래스 실행 -gradle test --tests "com.example.ClassName" - -# 특정 테스트 패키지 실행 (JUnit 플랫폼 사용) -gradle test --tests "com.eactive.eai.rms.*" +./gradlew test +./gradlew test --tests "com.eactive.eai.rms.*" ``` -## 관련 프로젝트 - -프로젝트 구조 (kjb-eapim 디렉토리 기준): -- `eapim-admin/` - Admin 관리 콘솔 (현재 프로젝트) -- `eapim-online/` - Online 게이트웨이 (코어 모듈 포함) -- `eapim-portal/` - Portal 개발자 포털 -- `elink-portal-common/` - 공통 유틸리티 라이브러리 -- `kjb-safedb/` - SafeDB 암호화 라이브러리 -- `kjb-eapim-sql/` - SQL 스크립트 (선택사항) - ## 문서 -- **프로젝트 상세 지침**: `CLAUDE.md` (한글) -- **사용자 가이드**: `WebContent/guide/` (한글) +- **프로젝트 상세 지침**: `CLAUDE.md` (AI 어시스턴트 및 개발자용 마스터 문서, 한글) +- **사용자 가이드**: `WebContent/guide/` (docsify) -## 참고: KJB 데이터베이스 파라미터 설정 - -### 추가 파라미터 SQL -```sql --- 로컬 개발용 (외부) --- EAI, UMS 주소 미기입시 내부적으론 호출 시도 하지 않고 warning 로그만 남기며 정상 처리 ---insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.eai_batch.url', ''); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.eai.batch.connection_timeout', '5'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.eai.batch.response_timeout', '5'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.eai.batch.timeout', '10'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.eai.batch.charset', 'euc-kr'); - -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.eai_batch.send_dir', '/Data/eapim/portal/sendmail/snd'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.eai_batch.backup_dir', '/Data/eapim/portal/sendmail/bak'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.eai_batch.error_dir', '/Data/eapim/portal/sendmail/bak'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.eai_batch.retention_date', '60'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.eai_batch.interface_id', 'UIEFF00001UAG'); - --- insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.host_url', ''); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.api_key', '7cca6d58-e4f7-474d-9edd-525806bc99ff'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.connection_timeout', '5'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.response_timeout', '5'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.timeout', '10'); - ---insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.obp.host_url', ''); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.obp.trust_system', 'APIMPT-0002-QVBJTVBULTAwMDI='); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.obp.commission_uri', '/api/billing/findBillingForCondition'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.obp.commission_print_uri', '/api/billing/billing/findBillingForCondition/print'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.obp.query_partnercode_uri', '/api/customer/findCustomerByBusinessManRegistrationNo/%s'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.obp.create_partnercode_uri', '/not-yet-implement/%s'); -commit; - - --- 은행 개발 서버용 -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.eai_batch.url', 'http://172.31.32.111:10230/BATAppWeb/EaiBatCall'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.eai.batch.connection_timeout', '5'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.eai.batch.response_timeout', '5'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.eai.batch.timeout', '10'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.eai.batch.charset', 'euc-kr'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.eai_batch.send_dir', '/Data/eapim/portal/sendmail/snd'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.eai_batch.backup_dir', '/Data/eapim/portal/sendmail/bak'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.eai_batch.error_dir', '/Data/eapim/portal/sendmail/bak'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.eai_batch.retention_date', '60'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.eai_batch.interface_id', 'UIEFF00001UAG'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.host_url', 'http://172.31.35.144:9021'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.api_key', '7cca6d58-e4f7-474d-9edd-525806bc99ff'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.connection_timeout', '5'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.response_timeout', '5'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.timeout', '10'); - -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.obp.host_url', 'http://192.168.246.15:8181'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.obp.trust_system', 'APIMPT-0002-QVBJTVBULTAwMDI='); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.obp.commission_uri', '/api/billing/findBillingForCondition'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.obp.commission_print_uri', '/api/billing/billing/findBillingForCondition/print'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.obp.query_partnercode_uri', '/api/customer/findCustomerByBusinessManRegistrationNo/%s'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.obp.create_partnercode_uri', '/not-yet-implement/%s'); -commit; - - --- 은행 운영 서버용 -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.eai_batch.url', 'http://172.21.1.40:10860/BATAppWeb/EaiBatCall'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.eai.batch.connection_timeout', '5'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.eai.batch.response_timeout', '5'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.eai.batch.timeout', '10'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.eai.batch.charset', 'euc-kr'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.eai_batch.send_dir', '/Data/eapim/portal/sendmail/snd'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.eai_batch.backup_dir', '/Data/eapim/portal/sendmail/bak'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.eai_batch.error_dir', '/Data/eapim/portal/sendmail/bak'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.eai_batch.retention_date', '60'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.eai_batch.interface_id', 'UIEFF00001UAG'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.host_url', 'http://172.24.128.66:9021'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.api_key', '7cca6d58-e4f7-474d-9edd-525806bc99ff'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.connection_timeout', '5'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.response_timeout', '5'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.ums.timeout', '10'); - -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.obp.host_url', 'http://192.168.246.15:8181'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.obp.trust_system', 'APIMPT-0002-QVBJTVBULTAwMDI='); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.obp.commission_uri', '/api/billing/findBillingForCondition'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.obp.commission_print_uri', '/api/billing/billing/findBillingForCondition/print'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.obp.query_partnercode_uri', '/api/customer/findCustomerByBusinessManRegistrationNo/%s'); -insert into EMSAPP.TSEAIRM24 (PRPTYGROUPNAME, PRPTYNAME, PRPTY2VAL) values ('Monitoring', 'kjb.obp.create_partnercode_uri', '/not-yet-implement/%s'); -commit; -``` ## 라이선스 -© 광주은행 (Kwangju Bank) +사내 전용(proprietary). 제주은행 eLink EMS. diff --git a/src/main/java/com/eactive/eai/rms/data/entity/onl/djb/inflow/InflowTokenInsufficient.java b/src/main/java/com/eactive/eai/rms/data/entity/onl/djb/inflow/InflowTokenInsufficient.java deleted file mode 100644 index 64108f8..0000000 --- a/src/main/java/com/eactive/eai/rms/data/entity/onl/djb/inflow/InflowTokenInsufficient.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.eactive.eai.rms.data.entity.onl.djb.inflow; - -public interface InflowTokenInsufficient { - String getEaisvcname(); - String getEaisvcdesc(); - Long getCnt(); -} \ No newline at end of file diff --git a/src/main/java/com/eactive/eai/rms/data/entity/onl/inbound/error/InboundErrorInfoService.java b/src/main/java/com/eactive/eai/rms/data/entity/onl/inbound/error/InboundErrorInfoService.java index f7c864e..08b286f 100644 --- a/src/main/java/com/eactive/eai/rms/data/entity/onl/inbound/error/InboundErrorInfoService.java +++ b/src/main/java/com/eactive/eai/rms/data/entity/onl/inbound/error/InboundErrorInfoService.java @@ -62,6 +62,8 @@ public class InboundErrorInfoService extends AbstractDataService list = query .select(qInboundErrorInfo) .orderBy(qInboundErrorInfo.erroccurhms.desc()) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) .fetch(); return new PageImpl<>(list, pageable, totalCount); diff --git a/src/main/java/com/eactive/eai/rms/ext/djb/inflow/InflowTokenRepository.java b/src/main/java/com/eactive/eai/rms/ext/djb/inflow/InflowTokenRepository.java index d98c99c..3b76428 100644 --- a/src/main/java/com/eactive/eai/rms/ext/djb/inflow/InflowTokenRepository.java +++ b/src/main/java/com/eactive/eai/rms/ext/djb/inflow/InflowTokenRepository.java @@ -1,21 +1,16 @@ package com.eactive.eai.rms.ext.djb.inflow; -import java.util.List; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import com.eactive.eai.data.jpa.BaseRepository; -import com.eactive.eai.rms.data.entity.onl.djb.inflow.InflowTokenInsufficient; import com.eactive.eai.rms.data.entity.onl.djb.inflow.InflowTokenInsufficientLog; import com.eactive.eai.rms.data.entity.onl.djb.inflow.InflowTokenInsufficientLogId; public interface InflowTokenRepository extends BaseRepository { @Query(nativeQuery = true, value = - " SELECT EAISVCNAME" + - " , (SELECT EAISVCDESC FROM TSEAIHE01 WHERE A.EAISVCNAME = EAISVCNAME) AS EAISVCDESC" + - " , COUNT(*) AS CNT" + - " FROM TSEAIFR11 A" + - " WHERE MSGDPSTYMS >= TO_CHAR(SYSTIMESTAMP - NUMTODSINTERVAL(:rangeMinute, 'MINUTE'), 'YYYYMMDDHH24MISSFF3')" + - " GROUP BY EAISVCNAME") - List countTokenInsufficient(@Param("rangeMinute") long rangeMinute); -} \ No newline at end of file + " SELECT COUNT(*)" + + " FROM TSEAIFR11" + + " WHERE MSGDPSTYMS >= TO_CHAR(SYSTIMESTAMP - NUMTODSINTERVAL(:rangeMinute, 'MINUTE'), 'YYYYMMDDHH24MISSFF3')") + long countTokenInsufficient(@Param("rangeMinute") long rangeMinute); +} diff --git a/src/main/java/com/eactive/eai/rms/ext/djb/inflow/InflowTokenService.java b/src/main/java/com/eactive/eai/rms/ext/djb/inflow/InflowTokenService.java index 1f945cd..2297511 100644 --- a/src/main/java/com/eactive/eai/rms/ext/djb/inflow/InflowTokenService.java +++ b/src/main/java/com/eactive/eai/rms/ext/djb/inflow/InflowTokenService.java @@ -1,7 +1,6 @@ package com.eactive.eai.rms.ext.djb.inflow; import java.util.HashMap; -import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -11,7 +10,6 @@ import org.springframework.transaction.annotation.Transactional; import com.eactive.apim.portal.template.entity.MessageCode; import com.eactive.eai.rms.common.context.MonitoringContext; -import com.eactive.eai.rms.data.entity.onl.djb.inflow.InflowTokenInsufficient; import com.eactive.eai.rms.ext.djb.ums.UmsManager; @@ -23,25 +21,29 @@ public class InflowTokenService { @Autowired private InflowTokenRepository inflowTokenRepository; - + @Autowired private MonitoringContext monitoringContext; - + @Autowired - private UmsManager ums; + private UmsManager ums; public void checkRecentFails(long rangeMinute) { - if (monitoringContext.getBooleanProperty(MonitoringContext.DJB_UMS_MESSENGER_APIMONITOR_ENABLED, true)) { - List rows = inflowTokenRepository.countTokenInsufficient(rangeMinute); - - for (InflowTokenInsufficient info : rows) { - log.debug("유량제어 토큰 획득 실패: {}-{} 최근 {}분 동안 {}건", info.getEaisvcname(), info.getEaisvcdesc(), rangeMinute, info.getCnt()); - String message = "유량제어 토큰 획득 실패가 발생하였습니다 \n" + info.getEaisvcname(); - - HashMap params = new HashMap(); - params.put("message", message); - ums.sendMessenger("api-monitor", MessageCode.INFLOW_TOKEN_FAILED, params); - } + if (!monitoringContext.getBooleanProperty(MonitoringContext.DJB_UMS_MESSENGER_APIMONITOR_ENABLED, true)) { + return; } + + long failCount = inflowTokenRepository.countTokenInsufficient(rangeMinute); + if (failCount <= 0) { + return; + } + + log.debug("유량제어 토큰 획득 실패: 최근 {}분 동안 {}건", rangeMinute, failCount); + + String message = "유량제어 토큰 획득 실패가 발생하였습니다\n최근 " + rangeMinute + "분 동안 " + failCount + "건"; + + HashMap params = new HashMap(); + params.put("message", message); + ums.sendMessenger("api-monitor", MessageCode.INFLOW_TOKEN_FAILED, params); } }