@ckstack/ck-lib-sequelize
Version:
sequelize helper module
873 lines (872 loc) • 60.9 kB
TypeScript
import Sequelize, { Transaction } from 'sequelize';
import { Sequelize as SequelizeTS } from 'sequelize-typescript';
import { CkValue } from '@dkpkg/dk-lib';
declare class DatabaseService {
private static CACHE_REDIS_INDEX;
private static CACHE_ALIVE_SEC;
private static IS_CACHE_REDIS_CLUSTER;
private static IS_USE_REDIS_CACHE;
private static CACHE_SVC_NAME;
/**
* DB 테이블에서 row 하나를 읽어서 redis 에 저장하여, 캐시를 만든다. 저장된 캐시는 setActiveRedisCache 에서 설정된 시간 동안 유지 된다.
* T 는 DB table model, U 는 리턴 받은 데이터 구조 이다.
* 만일 redis 에서 캐시가 없는 상태에서 DB 에서 데이터를 조회 하지 못한다면 null 을 리턴 한다.
* transaction 값이 undefined 가 아니라면, 함수를 호출 하는 곳에서 rollback, commit 을 해야 한다.
*
* 외부에 DB select 로 만들어지는 자동 cache 를 열어 주지 않기 위해서 private 으로 선언함.
*
* 다음과 같이 호출 될 것임
* DatabaseService._getCacheSingleDbRow<TbApp, TblType.ITbApp>(lhd, ...
*
* @param lhd {string} 로그키
* @param isCustomCache {boolean} cacheName 을 활용한 custom 캐시명으로 캐시를 생성 할지 여부
* @param cacheName {string} 캐시를 구분 할 수 있는 캐시명. custom 캐시명 일때만 의미 있음
* @param TCreator {{ new() : T; }} Sequelize DB 테이블 model
* @param dbFilter {{ [key: string]: any; }} DB 테이블 검색 조건
* @param transaction {Transaction | undefined} Sequelize transaction object
* @param order {Sequelize.Order | undefined} 테이블 select 시의 order
* @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드
* @param offset {number | undefined} select offset
* @returns {Promise<U | null>} DB 에서 값을 조회 할 수 없으면 null 을 리턴 하고, 값을 찾으면 U 타입의 값을 리턴 한다.
* @throws {CkError} 에러를 throw 한다.
* @private
*/
private static _getCacheSingleDbRow;
/**
* DB 테이블에서 row 여러 개를 읽어서 redis 에 저장하여, 캐시를 만든다. 저장된 캐시는 설정된(cacheAliveSec) 시간 동안 유지 된다.
* T 는 DB table model, U 는 리턴 받은 데이터 구조 이다.
* 만일 redis 에서 캐시가 없는 상태에서 DB 에서 데이터를 조회 하지 못한다면 empty array 를 리턴 한다.
* transaction 값이 undefined 가 아니라면, 함수를 호출 하는 곳에서 rollback, commit 을 해야 한다.
* 리턴 값은 Array<U> 형태 이다.
*
* 외부에 DB select 로 만들어지는 자동 cache 를 열어 주지 않기 위해서 private 으로 선언함.
*
* 다음과 같이 호출 될 것임
* DatabaseService._getCacheMultiDbRow<TbApp, TblType.ITbApp>(lhd, ...
*
* @param lhd {string} 로그키
* @param isCustomCache {boolean} cacheName 을 활용한 custom 캐시명으로 캐시를 생성 할지 여부
* @param cacheName {string} 캐시를 구분 할 수 있는 캐시명. custom 캐시명 일때만 의미 있음
* @param TCreator {{ new() : T; }} Sequelize DB 테이블 model
* @param dbFilter {{ [key: string]: any; }} DB 테이블 검색 조건
* @param transaction {Transaction | undefined} Sequelize transaction object
* @param order {Sequelize.Order | undefined} 테이블 select 시의 order
* @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드
* @returns {Promise<Array<U>>} DB 에서 값을 조회 할 수 없으면 empty array 를 리턴 하고, 값을 찾으면 값이 들어 있는 array 를 리턴 한다.
* @throws {CkError} 에러를 throw 한다.
* @private
*/
private static _getCacheMultiDbRow;
/**
* DB 테이블을 join 하여 데이터를 읽어서 redis 에 저장하여 캐시를 만든다. 저장된 캐시는 설정된(cacheAliveSec) 시간 동안 유지 된다.
* U 는 리턴 받은 데이터 구조 이다.
* 만일 redis 에서 캐시가 없는 상태에서 DB 에서 데이터를 조회 하지 못한다면 empty array 를 리턴 한다.
* transaction 값이 undefined 가 아니라면, 함수를 호출 하는 곳에서 rollback, commit 을 해야 한다.
* 리턴 값은 Array<U> 형태 이다.
*
* 외부에 DB select 로 만들어지는 자동 cache 를 열어 주지 않기 위해서 private 으로 선언함.
*
* 다음과 같이 호출 될 것임(IFilterAppVersion 는 참고용 코드 실제는 이렇게 사용 되지 않는다.)
* DatabaseService._getCacheJoinDbRow<IFilterAppVersion>(lhd, ...
*
* @param lhd {string} 로그키
* @param cacheKeyPrefix {string} 캐시 종류 구분
* @param isCustomCache {boolean} cacheName 을 활용한 custom 캐시명으로 캐시를 생성 할지 여부
* @param cacheName {string} 캐시를 구분 할 수 있는 캐시명. custom 캐시명 일때만 의미 있음
* @param rdb {SequelizeTS | number} CkSequelize.getSequelize2(lhd, rdb) 로 sequelize object 를 구할 수 있는 값 이나, 연결된 db index. db index 라면 알아서 sequelize object 를 가져 온다.
* @param rawQuery {string} join 을 하는 sql query
* @param replacements {{ [col: string]: any; } | string} join 시에 사용되는 replace 값. join 시에 replace 할 값이 없다면 string 값을 주어서, 캐시 종류를 구분 할 수 있도록 해야 한다.
* @param transaction {Transaction | undefined} DB transaction object
* @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드
* @returns {Promise<Array<U>>} DB 에서 값을 조회 할 수 없으면 empty array 를 리턴 하고, 값을 찾으면 값이 들어 있는 array 를 리턴 한다.
* @throws {CkError} 에러를 throw 한다.
* @private
*/
private static _getCacheJoinDbRow;
/**
* 자동으로 생성된 DB 테이블 캐시를 삭제 한다.
*
* @param lhd {string} 로그키
* @param TCreator {{ new() : T; }} Sequelize DB 테이블 model
* @param ids {Array<number> | number} 삭제할 데이터의 id 목록. 테이블의 row id 목록. 하나의 데이터를 삭제 하려면 row id 값을 주면 된다.
* @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드
* @returns {Promise<number>} 삭제된 데이터 캐시 갯수
* @throws {CkError} 에러를 throw 한다.
* @private
*/
private static _removeCacheAutoDbRow;
/**
* DB 테이블 캐시 데이터를 삭제 한다. single row, multi row 캐시를 모두 지원 한다. getCacheSingleDbRow, getCacheSingleDbRow 으로 생성된 캐시 삭제.
* 캐시 존재 유무 체크 하지 않고, 무조건 삭제 시도 하고, 삭제된 캐시 카운트를 리턴 한다.
* 자동으로 생성된 테이블 캐시는 _removeCacheAutoDbRow 를 사용해서 삭제 하도록 한다.
*
* @param lhd {string} 로그키
* @param isCustomCache {boolean} cacheName 을 활용한 custom 캐시명으로 캐시를 생성 할지 여부
* @param cacheName {string} 캐시를 구분 할 수 있는 캐시명. custom 캐시명 일때만 의미 있음
* @param TCreator {{ new() : T; }} Sequelize DB 테이블 model
* @param dbFilter {{ [key: string]: any; }} 캐시를 생성 할때 사용된 dbFilter 와 동일한 값
* @param isMulti {boolean | undefined} true 일 때, 멀티 row 캐시를 삭제 한다. undefined 라면 single row 로 처리 한다.
* @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드
* @returns {Promise<number>} 삭제된 캐시 카운트를 리턴 한다.
* @throws {CkError} 에러를 throw 한다.
* @private
*/
private static _removeCacheDbRow;
/**
* DB 테이블 join 으로 생성된 캐시 데이터를 삭제 한다. getCacheJoinDbRow 으로 생성된 캐시 삭제.
* 캐시 존재 유무 체크 하지 않고, 무조건 삭제 시도 하고, 삭제된 캐시 카운트를 리턴 한다.
*
* @param lhd {string} 로그키
* @param cacheKeyPrefix {string} 캐시 종류 구분
* @param isCustomCache {boolean} cacheName 을 활용한 custom 캐시명으로 캐시를 삭제 할지 여부
* @param cacheName {string} 캐시를 구분 할 수 있는 캐시명. custom 캐시명 일때만 의미 있음
* @param replacements {{ [col: string]: any; } | string} join 시에 사용되는 replace 값. join 시에 replace 할 값이 없다면 string 값을 주어서, 캐시 종류를 구분 할 수 있도록 해야 한다.
* @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드
* @returns {Promise<number>} 삭제된 캐시 카운트를 리턴 한다.
* @throws {CkError} 에러를 throw 한다.
* @private
*/
private static _removeCacheJoinDbRow;
/**
* id 로 테이블에서 데이터를 가져 온다.
* return 값이 null 이면 데이터를 발견 하지 못한 것이고, string 이면 에러임(에러 코드 리턴)
* null, string(DB 에러) 이 아니면 데이터를 발견해서 데이터를 리턴 한 것임.
*
* @param reqIpAndLhdAndHttpInfo {string} 로그키
* @param TCreator {{ new() : T; }} Sequelize DB 테이블 model
* @param id {number} row 의 id 값
* @param attributes {Array<string> | undefined} 조회할 테이블의 칼럼명 목록. undefined 라면 모든 칼럼을 select 한다.
* @param transaction {Transaction | undefined} Sequelize transaction object
* @returns {Promise<T | null | string>} 조회한 테이블 row 데이터나, 데이터가 없으면 null 을 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
* @private
*/
private static _getDataOneById;
/**
* id(srl) 목록으로 테이블에서 데이터를 가져 온다.
* return 값이 empty array 이면 데이터를 발견 하지 못한 것이고, string 이면 에러임(에러 코드 리턴)
* empty array, string(DB 에러) 이 아니면 데이터를 발견해서 데이터를 리턴 한 것임.
*
* @param reqIpAndLhdAndHttpInfo {string} 로그키
* @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델
* @param ids {Array<number>} row 의 id 목록
* @param attributes {Array<string>} 조회할 테이블의 칼럼명 목록. undefined 라면 모든 칼럼을 select 한다.
* @param transaction {Transaction | undefined} Sequelize transaction object
* @param order {Sequelize.Order | undefined} 정렬 방법
* @returns {Promise<Array<T> | string>} 조회한 테이블 row 데이터 목록을 리턴 한다. 데이터가 없으면 empty array 를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
* @private
*/
private static _getDatasByIds;
/**
* getDatasByIds 와 같은 역할을 하지만, 데이터가 아니라 데이터의 카운트를 구한다.
*
* @param reqIpAndLhdAndHttpInfo {string} 로그키
* @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델
* @param ids {Array<number>} row 의 id 목록
* @param transaction {Transaction | undefined} Sequelize transaction object
* @returns {Promise<number | string>} 데이터 카운트를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
* @private
*/
private static _countDatasByIds;
/**
* rid 로 테이블에서 데이터를 가져 온다.
* return 값이 null 이면 데이터를 발견 하지 못한 것이고, string 이면 에러임(에러 코드 리턴)
* null, string(DB 에러) 이 아니면 데이터를 발견해서 데이터를 리턴 한 것임.
*
* @param reqIpAndLhdAndHttpInfo {string} 로그키
* @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델
* @param rid {string} row 의 rid
* @param attributes {Array<string>} 조회할 테이블의 칼럼명 목록. undefined 라면 모든 칼럼을 select 한다.
* @param transaction {Transaction | undefined} Sequelize transaction object
* @returns {Promise<T | null | string>} 조회한 테이블 row 데이터나, 데이터가 없으면 null 을 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
* @private
*/
private static _getDataOneByRid;
/**
* rid 목록으로 테이블에서 데이터를 가져 온다.
* return 값이 empty array 이면 데이터를 발견 하지 못한 것이고, string 이면 에러임(에러 코드 리턴)
* empty array, string(DB 에러) 이 아니면 데이터를 발견해서 데이터를 리턴 한 것임.
*
* @param reqIpAndLhdAndHttpInfo {string} 로그키
* @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델
* @param rids {Array<string>} row 의 rid 목록
* @param attributes {Array<string>} 조회할 테이블의 칼럼명 목록. undefined 라면 모든 칼럼을 select 한다.
* @param transaction {Transaction | undefined} Sequelize transaction object
* @param order {Sequelize.Order | undefined} 정렬 방법
* @returns {Promise<Array<T> | string>} 조회한 테이블 row 데이터 목록을 리턴 한다. 데이터가 없으면 empty array 를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
* @private
*/
private static _getDatasByRids;
/**
* getDatasByRids 와 같은 역할을 하지만 데이터가 아니라, 데이터의 카운트를 구한다.
*
* @param reqIpAndLhdAndHttpInfo {string} 로그키
* @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델
* @param rids {Array<string>} row 의 rid 목록
* @param transaction {Transaction | undefined} Sequelize transaction object
* @returns {Promise<number | string>} 데이터 카운트를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
* @private
*/
private static _countDatasByRids;
/**
* 필터 조건으로 테이블에서 데이터를 하나 가져 온다.
* return 값이 null 이면 데이터를 발견 하지 못한 것이고, string 이면 에러임(에러 코드 리턴)
* null, string(DB 에러) 이 아니면 데이터를 발견해서 데이터를 리턴 한 것임.
*
* @param reqIpAndLhdAndHttpInfo {string} 로그키
* @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델
* @param filter {{ [key: string]: any; }} 검색 조건
* @param attributes {Array<string>} 조회할 테이블의 칼럼명 목록. undefined 라면 모든 칼럼을 select 한다.
* @param transaction {Transaction | undefined} Sequelize transaction object
* @param order {Sequelize.Order | undefined} 정렬 방법
* @param offset {number | undefined} select offset
* @returns {Promise<T | null | string>} 조회한 테이블 row 데이터를 리턴 한다. 데이터를 발견하지 못하면 null 을 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
* @private
*/
private static _getDataOneByFilter;
/**
* 필터 조건으로 테이블에서 데이터를 가져 온다.
* return 값이 null 이면 데이터를 발견 하지 못한 것이고, string 이면 에러임(에러 코드 리턴)
* null, string(DB 에러) 이 아니면 데이터를 발견해서 데이터를 리턴 한 것임.
* filter, limit 둘 중 하나는 반듯이 존재 해야 한다.
*
* order 는 다음과 같이 사용 한다.
* - [['name', 'DESC']] : name 칼럼으로 desc 정렬
* - [['name', 'DESC'], ['id', 'ASC']] : name 칼럼으로 desc 정렬하고, 두번째로 id 로 ASC 정렬
*
* @param reqIpAndLhdAndHttpInfo {string} 로그키
* @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델
* @param filter {{ [key: string]: any; }} 검색 조건
* @param attributes {Array<string>} 조회할 테이블의 칼럼명 목록. undefined 라면 모든 칼럼을 select 한다.
* @param transaction {Transaction | undefined} Sequelize transaction object
* @param order {Sequelize.Order | undefined} 정렬 방법
* @param offset {number | undefined} select offset
* @param limit {number | undefined} seledct limit
* @returns {Promise<Array<T> | string>} 조회한 테이블 row 데이터 목록을 리턴 한다. 데이터가 없으면 empty array 를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
* @private
*/
private static _getDatasByFilter;
/**
* getDatasByFilter 와 동일한 역할을 하지만, 데이터가 아니라 데이터의 카운트를 구한다.
*
* @param reqIpAndLhdAndHttpInfo {string} 로그키
* @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델
* @param filter {{ [key: string]: any; }} 검색 조건
* @param transaction {Transaction | undefined} Sequelize transaction object
* @returns {Promise<number | string>} 데이터 카운트를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
* @private
*/
private static _countDatasByFilter;
/**
* key array 로 데이터 목록을 구한다. 가령 file_id array 로 파일 데이터를 map 형태로 구 할 때 사용 한다.
*
* 다음과 같이 사용 한다면,
* getDataMapByKeyArray<string, TbFile>(req, res, fids, TbFile, 'rid', 'id', ['id', rid', 'description']);
*
* 기본 검색 조건은 colName 이 rid 이고, 검색 값이 fids 로 select 한다.
* { rid: { $in: fids } } 가 select 조건이 된다.
* 또한 테이블에서 select 되는 칼럼은 ['rid', 'description'] 이다.
* 그리고, select 로 선택된 값을 mapKey 인 id 로 map 을 만들어서 return 한다.
* 즉, CkUtils.arrayToMaps<VCreator>(selectedRows, 'id'); 의 결과값을 리턴 한다.
*
* @param reqIpAndLhdAndHttpInfo {string} 로그 헤더
* @param keys Array<T> select 조건 key array
* @param VCreator {{ new() : V; }} select 할 테이블
* @param colName {string} 테이블에서 select 할 칼럼명
* @param mapKey {string} map 으로 만들때 키가되는 칼럼명(k_칼럼값 형태로 키가 생성된다.)
* @param cols {Array<string> | undefined} 테이블에서 특정 칼럼만 가져오고 싶을때 지정 칼럼 목록
* @param toCond {{[key: string]: any; } | undefined} 검색할 테이블 select 시에 추가할 조건
* @param transaction {Transaction | undefined} transaction object
* @returns {Promise<{ [k_mapKey: string]: T }>} mapKey 기준으로 만들어진 object 를 리턴 한다. 에러가 발생하거나, 데이터가 없으면 empty object 를 리턴 한다.
* @private
*/
private static _getDataMapByKeyArray;
/**
* list_order 순서를 변경 한다.
* raw query 는 함수 내에서 추가 조건이 들어가고, 이에 따라 replacement 도 추가 조건이 들어 간다.
* list_order 변경 관련 값은 함수 내부에서 처리 되고, 파라미터로 주는 raw query 는 데이터 검색 조건만 들어 가도록 해야 한다.
* 움직이는 위치에 따라 list_order + 1, list_order -1 을 해야 하기 때문에 파라미터로 넘겨주는 rawQuery 내에 <list_order> 스트링으로
* 값을 설정 한다.
*
* 순수하게 list_order 만 변경 하고, list_order 변경 가능한지 데이터 비교 하지 않는다는 것이 changeListOrderV2 와 다른점 이다.
* 사용 예제는 한국문화교육의 ContentCategoryAdmRouter.ts 의 카테고리 위치 변경을 참고 하자.
*
* @param reqIpAndLhdAndHttpInfo {string} 로그 헤더
* @param rdb {SequelizeTS} sequelize object. typescript sequelize 의 object 임.
* @param TCreator {{ new() : T; }} 테이블
* @param rawQuery {string} 부분 raw 쿼리
* @param replacements {{ [key: string]: any; } | undefined} raw 쿼리에서 replace 값
* @param srcId {number} 순서를 변경할 src 의 id
* @param srcListOrder {number} 순서를 변경할 src 의 list_order
* @param destListOrder {number} 순서를 변경할 dest 의 list_order
* @param transaction {Transaction} transaction
* @returns {Promise<number>} 순서가 변경된 row 의 갯수를 리턴 한다.
* @throws {CkError} 에러를 throw 한다.
* @private
*/
private static _changeListOrder;
/**
* list_order 순서를 변경 한다. router 에서 순서 변경하는 것을 함수 한번에 처리 할 수 있도록 묶어 둔 것이다.
* 간단한 순서 변경에 사용 하고, 추가 제한 조건이 있으면 본 함수를 사용 하지 않도록 한다.
* 에러 나면 string 을 리턴 하는데, 이런 경우는 호출 하는 곳에서 transaction rollback 처리 해 주어야 한다.
*
* changeListOrder 와 다른점은 함수 내부에서 순서를 변경 하려는 데이터를 찾아, 데이터 존재 여부 및 list_order 가 동일한지 비교 한다.
* 만일 해당 작업을 외부에서 실행 한다면, changeListOrder 을 사용 하도록 한다.
* 사용 예제는 한국문화교육의 VRCAdminRouter.ts 의 키워드 위치 변경을 참고 하자.
*
* @param reqIpAndLhdAndHttpInfo {string} 로그 헤더
* @param rdb {SequelizeTS} sequelize object. typescript sequelize 의 object 임.
* @param TCreator {{ new() : T; }} 테이블
* @param srcRid {string} 순서를 변경할 src 의 rid
* @param destRid {string} 순서를 변경할 dest 의 rid
* @param rawQueryPart {string} 부분 raw 쿼리
* @param replacements {{ [key: string]: any; } | undefined} raw 쿼리에서 replace 값
* @param transaction {Transaction} transaction
* @returns {Promise<number |string>} 순서가 변경된 row 의 갯수를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
* @private
*/
private static _changeListOrderV2;
/**
* 새로운 데이터를 생성 하고, list_order 를 생성된 srl 값과 동일하게 설정 한다.
* list_order 가 있는 대부분의 데이터 생성시 사용 하면 된다.
*
* string 이 리턴 되면, 에러 처리 해야 한다. 에러가 발생 되면 호출 하는 곳에서 transaction rollback 처리 해야 한다.
* 한국 문화 교육의 VRCKeyword 생성을 참고 한다.
*
* @param reqIpAndLhdAndHttpInfo {string} 로그 헤더
* @param TCreator {{ new() : T; }} 테이블 모델
* @param newData {T} 저장할 데이터의 모델 object
* @param transaction {Transaction} transaction
* @returns {Promise<T | string>} 생성된 데이터의 모델 object 를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
* @private
*/
private static _createDataWithListOrder;
/**
* 데이터를 저장 한다. 정상으로 실행 되면 저장된 데이터를 리턴 하고, 에러이면 에러 코드(string)을 리턴 한다.
*
* @param reqIpAndLhdAndHttpInfo {string} 로그키
* @param newData {T} 저장할 데이터의 모델 object
* @param transaction {Transaction} transaction
* @returns {Promise<T | string>} 생성된 데이터의 모델 object 를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
* @private
*/
private static _createData;
/**
* 데이터를 업데이트 한다. number 를 리턴하면, 업데이트 데이터 카운트 이며, 스트링이면 에러 코드 이다.
*
* @param reqIpAndLhdAndHttpInfo {string} 로그키
* @param TCreate {{ new() : T; }} 테이블 모델
* @param modData {{ [key: string]: any; }} 업데이트 할 데이터
* @param where {{ [key: string]: any; }} 업데이트 할 데이터의 filter 조건
* @param transaction {Transaction} transaction
* @returns {Promise<number | string>} 업데이트 된 데이터 카운트를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
* @private
*/
private static _updateData;
/**
* 데이터를 삭제 한다. number 를 리턴하면, 삭제된 데이터 카운트 이며, 스트링 이면 에러 코드 이다.
*
* @param reqIpAndLhdAndHttpInfo {string} 로그키
* @param TCreate {{ new() : T; }} 테이블 모델
* @param where {{ [key: string]: any; }} 삭제 할 데이터의 filter 조건
* @param transaction {Transaction} transaction
* @returns {Promise<number | string>} 삭제 된 데이터 카운트를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
* @private
*/
private static _deleteData;
/**
* 칼럼 값을 증가 시키거나, 감소 시킨다. true 를 리턴하면 처리 성공이고, 스트링 이면 에러 코드 이다.
*
* @param reqIpAndLhdAndHttpInfo {string} 로그키
* @param TCreate {{ new() : T; }} 테이블 모델
* @param where {{ [key: string]: any; }} 쿼리 검색 조건
* @param cols {Array<string>} increase, decrease 시킬 칼럼명. 일반적으로 칼럼 하나만 사용 될 것이지만, 여러개 칼럼을 처리 할 수 있다.
* @param by {number} increase, decrease 시키는 양. 1 이면 1씩 증가하고, -1 이면 1씩 감소 한다.
* @param transaction {Transaction} transaction
* @returns {Promise<void|string>} string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
* @private
*/
private static _incrementData;
/**
* raw query 를 사용하여 데이터를 select 한다.
*
* @param reqIpAndLhdAndHttpInfo {string} 로그키
* @param rawQuery {string} join 을 하는 sql query
* @param rdb {SequelizeTS | number} CkSequelize.getSequelize2(lhd, rdb) 로 sequelize object 를 구할 수 있는 값 이나, 연결된 db index. db index 라면 알아서 sequelize object 를 가져 온다.
* @param replacements {{ [col: string]: any; } | undefined} join 시에 사용되는 replace 값
* @param transaction {Transaction | undefined} DB transaction object
* @returns {{ [col_name: string]: any; }[] | string>} select 된 데이터 목록을 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
* @private
*/
private static _getDataByRawQuery;
/**
* redis cache 를 활성화 시킨다.
* @param dbCacheRedisIndex {number} redis cache 로 사용할 redis 연결의 index. 음수 이면, redis cache 를 사용 하지 않는다.
* @param dbCacheAliveSec {number} cache 로 저장된 데이터의 alive 시간. cache 데이터 생성 이후, 설정 시간이 지나면 자동 삭제 된다. 초 단위. 0 보다 큰 값이어야 한다.
* @param dbCacheRedisCluster {boolean | undefined} db 캐시로 사용하는 redis 가 cluster 구성된 redis 인지 여부. true 일 때 cluster 로 구성된 redis 임.
* @param svcName {string | undefined} 개발기에서 하나의 redis 를 사용하기 위한 서비스 구별명
* @returns {void} 리턴 되는 값 없음
*/
static setActiveRedisCache(dbCacheRedisIndex: number, dbCacheAliveSec: number, dbCacheRedisCluster?: boolean, svcName?: string): void;
/**
* DB 테이블에서 row 하나를 읽어서 redis 에 저장하여, 캐시를 만든다. 저장된 캐시는 setActiveRedisCache 에서 설정된 시간 동안 유지 된다.
* T 는 DB table model, U 는 리턴 받은 데이터 구조 이다.
* 만일 redis 에서 캐시가 없는 상태에서 DB 에서 데이터를 조회 하지 못한다면 null 을 리턴 한다.
* transaction 값이 undefined 가 아니라면, 함수를 호출 하는 곳에서 rollback, commit 을 해야 한다.
*
* cacheName 으로 캐시 구분 가능 하다.
*
* 다음과 같이 호출 될 것임
* DatabaseService.getCacheSingleDbRow<TbApp, TblType.ITbApp>(lhd, ...
*
* @param lhd {string} 로그키
* @param cacheName {string} 캐시를 구분 할 수 있는 캐시명
* @param TCreator {{ new() : T; }} Sequelize DB 테이블 model
* @param dbFilter {{ [key: string]: any; }} DB 테이블 검색 조건
* @param transaction {Transaction | undefined} Sequelize transaction object
* @param order {Sequelize.Order | undefined} 테이블 select 시의 order
* @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드
* @returns {Promise<U | null>} DB 에서 값을 조회 할 수 없으면 null 을 리턴 하고, 값을 찾으면 U 타입의 값을 리턴 한다.
* @throws {CkError} 에러를 throw 한다.
*/
static getCacheSingleDbRow<T, U>(lhd: string, cacheName: string, TCreator: {
new (): T;
}, dbFilter: {
[key: string]: any;
}, transaction?: Transaction, order?: Sequelize.Order, lang?: CkValue.SUPPORT_LANG): Promise<U | null>;
/**
* DB 테이블에서 row 여러 개를 읽어서 redis 에 저장하여, 캐시를 만든다. 저장된 캐시는 설정된(cacheAliveSec) 시간 동안 유지 된다.
* T 는 DB table model, U 는 리턴 받은 데이터 구조 이다.
* 만일 redis 에서 캐시가 없는 상태에서 DB 에서 데이터를 조회 하지 못한다면 empty array 를 리턴 한다.
* transaction 값이 undefined 가 아니라면, 함수를 호출 하는 곳에서 rollback, commit 을 해야 한다.
* 리턴 값은 Array<U> 형태 이다.
*
* cacheName 으로 캐시 구분 가능 하다.
*
* 다음과 같이 호출 될 것임
* DatabaseService.getCacheMultiDbRow<TbApp, TblType.ITbApp>(lhd, ...
*
* @param lhd {string} 로그키
* @param cacheName {string} 캐시를 구분 할 수 있는 캐시명
* @param TCreator {{ new() : T; }} Sequelize DB 테이블 model
* @param dbFilter {{ [key: string]: any; }} DB 테이블 검색 조건
* @param transaction {Transaction | undefined} Sequelize transaction object
* @param order {Sequelize.Order | undefined} 테이블 select 시의 order
* @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드
* @returns {Promise<Array<U>>} DB 에서 값을 조회 할 수 없으면 empty array 를 리턴 하고, 값을 찾으면 값이 들어 있는 array 를 리턴 한다.
* @throws {CkError} 에러를 throw 한다.
*/
static getCacheMultiDbRow<T, U>(lhd: string, cacheName: string, TCreator: {
new (): T;
}, dbFilter: {
[key: string]: any;
}, transaction?: Transaction, order?: Sequelize.Order, lang?: CkValue.SUPPORT_LANG): Promise<Array<U>>;
/**
* DB 테이블을 join 하여 데이터를 읽어서 redis 에 저장하여 캐시를 만든다. 저장된 캐시는 설정된(cacheAliveSec) 시간 동안 유지 된다.
* U 는 리턴 받은 데이터 구조 이다.
* 만일 redis 에서 캐시가 없는 상태에서 DB 에서 데이터를 조회 하지 못한다면 empty array 를 리턴 한다.
* transaction 값이 undefined 가 아니라면, 함수를 호출 하는 곳에서 rollback, commit 을 해야 한다.
* 리턴 값은 Array<U> 형태 이다.
*
* cacheKeyPrefix, cacheName 으로 캐시 구분 가능 하다.
*
* 다음과 같이 호출 될 것임(IFilterAppVersion 는 참고용 코드 실제는 이렇게 사용 되지 않는다.)
* DatabaseService.getCacheJoinDbRow<IFilterAppVersion>(lhd, ...
*
* @param lhd {string} 로그키
* @param cacheKeyPrefix {string} 캐시 종류 구분
* @param cacheName {string} 캐시를 구분 할 수 있는 캐시명. custom 캐시명 일때만 의미 있음
* @param rdb {SequelizeTS | number} CkSequelize.getSequelize2(lhd, rdb) 로 sequelize object 를 구할 수 있는 값 이나, 연결된 db index. db index 라면 알아서 sequelize object 를 가져 온다.
* @param rawQuery {string} join 을 하는 sql query
* @param replacements {{ [col: string]: any; } | string} join 시에 사용되는 replace 값. join 시에 replace 할 값이 없다면 string 값을 주어서, 캐시 종류를 구분 할 수 있도록 해야 한다.
* @param transaction {Transaction | undefined} DB transaction object
* @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드
* @returns {Promise<Array<U>>} DB 에서 값을 조회 할 수 없으면 empty array 를 리턴 하고, 값을 찾으면 값이 들어 있는 array 를 리턴 한다.
* @throws {CkError} 에러를 throw 한다.
*/
static getCacheJoinDbRow<U>(lhd: string, cacheKeyPrefix: string, cacheName: string, rdb: SequelizeTS | number, rawQuery: string, replacements: {
[col: string]: any;
} | string, transaction?: Transaction, lang?: CkValue.SUPPORT_LANG): Promise<Array<U>>;
/**
* 자동으로 생성된 DB 테이블 캐시를 삭제 한다.
*
* @param lhd {string} 로그키
* @param TCreator {{ new() : T; }} Sequelize DB 테이블 model
* @param ids {Array<number> | number} 삭제할 데이터의 id 목록. 테이블의 row id 목록. 하나의 데이터를 삭제 하려면 row id 값을 주면 된다.
* @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드
* @returns {Promise<number>} 삭제된 데이터 캐시 갯수
* @throws {CkError} 에러를 throw 한다.
*/
static removeCacheAutoDbRow<T>(lhd: string, TCreator: {
new (): T;
}, ids: Array<number> | number, lang?: CkValue.SUPPORT_LANG): Promise<number>;
/**
* DB 테이블 캐시 데이터를 삭제 한다. single row, multi row 캐시를 모두 지원 한다. getCacheSingleDbRow, getCacheSingleDbRow 으로 생성된 캐시 삭제.
* 캐시 존재 유무 체크 하지 않고, 무조건 삭제 시도 하고, 삭제된 캐시 카운트를 리턴 한다.
* 자동으로 생성된 테이블 캐시는 _removeCacheAutoDbRow 를 사용해서 삭제 하도록 한다.
*
* @param lhd {string} 로그키
* @param cacheName {string} 캐시를 구분 할 수 있는 캐시명. custom 캐시명 일때만 의미 있음
* @param TCreator {{ new() : T; }} Sequelize DB 테이블 model
* @param dbFilter {{ [key: string]: any; }} 캐시를 생성 할때 사용된 dbFilter 와 동일한 값
* @param isMulti {boolean | undefined} true 일 때, 멀티 row 캐시를 삭제 한다. undefined 라면 single row 로 처리 한다.
* @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드
* @returns {Promise<number>} 삭제된 캐시 카운트를 리턴 한다.
* @throws {CkError} 에러를 throw 한다.
*/
static removeCacheDbRow<T>(lhd: string, cacheName: string, TCreator: {
new (): T;
}, dbFilter: {
[key: string]: any;
}, isMulti?: boolean, lang?: CkValue.SUPPORT_LANG): Promise<number>;
/**
* DB 테이블 join 으로 생성된 캐시 데이터를 삭제 한다. getCacheJoinDbRow 으로 생성된 캐시 삭제.
* 캐시 존재 유무 체크 하지 않고, 무조건 삭제 시도 하고, 삭제된 캐시 카운트를 리턴 한다.
*
* @param lhd {string} 로그키
* @param cacheKeyPrefix {string} 캐시 종류 구분
* @param cacheName {string} 캐시를 구분 할 수 있는 캐시명. custom 캐시명 일때만 의미 있음
* @param replacements {{ [col: string]: any; } | string} join 시에 사용되는 replace 값. join 시에 replace 할 값이 없다면 string 값을 주어서, 캐시 종류를 구분 할 수 있도록 해야 한다.
* @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드
* @returns {Promise<number>} 삭제된 캐시 카운트를 리턴 한다.
* @throws {CkError} 에러를 throw 한다.
*/
static removeCacheJoinDbRow(lhd: string, cacheKeyPrefix: string, cacheName: string, replacements: {
[col: string]: any;
} | string, lang?: CkValue.SUPPORT_LANG): Promise<number>;
/**
* id 로 테이블에서 데이터를 가져 온다.
* return 값이 null 이면 데이터를 발견 하지 못한 것이고, string 이면 에러임(에러 코드 리턴)
* null, string(DB 에러) 이 아니면 데이터를 발견해서 데이터를 리턴 한 것임.
*
* 캐시 기능을 지원 한다.
*
* @param lhd {string} 로그키
* @param TCreator {{ new() : T; }} Sequelize DB 테이블 model
* @param id {number} row 의 id 값
* @param attributes {Array<string> | undefined} 조회할 테이블의 칼럼명 목록. undefined 라면 모든 칼럼을 select 한다.
* @param transaction {Transaction | undefined} Sequelize transaction object
* @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드
* @param isUsingCache {boolean | undefined} cache 기능을 사용 할지 여부. setActiveRedisCache 로 캐시 사용이 설정 되고, 이 값이 true 인 경우만 cache 기능을 사용 할 수 있다.
* @returns {Promise<T | null | string>} 조회한 테이블 row 데이터나, 데이터가 없으면 null 을 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
*/
static getDataOneById<T>(lhd: string, TCreator: {
new (): T;
}, id: number | undefined, attributes?: Array<string>, transaction?: Transaction, lang?: CkValue.SUPPORT_LANG, isUsingCache?: boolean): Promise<T | null | string>;
/**
* id(srl) 목록으로 테이블에서 데이터를 가져 온다.
* return 값이 empty array 이면 데이터를 발견 하지 못한 것이고, string 이면 에러임(에러 코드 리턴)
* empty array, string(DB 에러) 이 아니면 데이터를 발견해서 데이터를 리턴 한 것임.
*
* @param lhd {string} 로그키
* @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델
* @param ids {Array<number>} row 의 id 목록
* @param attributes {Array<string>} 조회할 테이블의 칼럼명 목록. undefined 라면 모든 칼럼을 select 한다.
* @param transaction {Transaction | undefined} Sequelize transaction object
* @param order {Sequelize.Order | undefined} 정렬 방법
* @returns {Promise<Array<T> | string>} 조회한 테이블 row 데이터 목록을 리턴 한다. 데이터가 없으면 empty array 를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
*/
static getDatasByIds<T>(lhd: string, TCreator: {
new (): T;
}, ids: Array<number>, attributes?: Array<string>, transaction?: Transaction, order?: Sequelize.Order): Promise<Array<T> | string>;
/**
* getDatasByIds 와 같은 역할을 하지만, 데이터가 아니라 데이터의 카운트를 구한다.
*
* @param lhd {string} 로그키
* @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델
* @param ids {Array<number>} row 의 id 목록
* @param transaction {Transaction | undefined} Sequelize transaction object
* @returns {Promise<number | string>} 데이터 카운트를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
*/
static countDatasByIds<T>(lhd: string, TCreator: {
new (): T;
}, ids: Array<number>, transaction?: Transaction): Promise<number | string>;
/**
* rid 로 테이블에서 데이터를 가져 온다.
* return 값이 null 이면 데이터를 발견 하지 못한 것이고, string 이면 에러임(에러 코드 리턴)
* null, string(DB 에러) 이 아니면 데이터를 발견해서 데이터를 리턴 한 것임.
*
* 캐시 기능을 지원 한다. 캐시 기능을 사용하려면, 테이블에 id 칼럼이 반듯이 존재 해야 한다.
*
* @param lhd {string} 로그키
* @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델
* @param rid {string} row 의 rid
* @param attributes {Array<string>} 조회할 테이블의 칼럼명 목록. undefined 라면 모든 칼럼을 select 한다.
* @param transaction {Transaction | undefined} Sequelize transaction object
* @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드
* @param isUsingCache {boolean | undefined} cache 기능을 사용 할지 여부. setActiveRedisCache 로 캐시 사용이 설정 되고, 이 값이 true 인 경우만 cache 기능을 사용 할 수 있다.
* @returns {Promise<T | null | string>} 조조회한 테이블 row 데이터나, 데이터가 없으면 null 을 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
*/
static getDataOneByRid<T>(lhd: string, TCreator: {
new (): T;
}, rid: string | undefined, attributes?: Array<string>, transaction?: Transaction, lang?: CkValue.SUPPORT_LANG, isUsingCache?: boolean): Promise<T | null | string>;
/**
* rid 목록으로 테이블에서 데이터를 가져 온다.
* return 값이 empty array 이면 데이터를 발견 하지 못한 것이고, string 이면 에러임(에러 코드 리턴)
* empty array, string(DB 에러) 이 아니면 데이터를 발견해서 데이터를 리턴 한 것임.
*
* @param lhd {string} 로그키
* @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델
* @param rids {Array<string>} row 의 rid 목록
* @param attributes {Array<string>} 조회할 테이블의 칼럼명 목록. undefined 라면 모든 칼럼을 select 한다.
* @param transaction {Transaction | undefined} Sequelize transaction object
* @param order {Sequelize.Order | undefined} 정렬 방법
* @returns {Promise<Array<T> | string>} 조회한 테이블 row 데이터 목록을 리턴 한다. 데이터가 없으면 empty array 를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
*/
static getDatasByRids<T>(lhd: string, TCreator: {
new (): T;
}, rids: Array<string>, attributes?: Array<string>, transaction?: Transaction, order?: Sequelize.Order): Promise<Array<T> | string>;
/**
* getDatasByRids 와 같은 역할을 하지만 데이터가 아니라, 데이터의 카운트를 구한다.
*
* @param lhd {string} 로그키
* @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델
* @param rids {Array<string>} row 의 rid 목록
* @param transaction {Transaction | undefined} Sequelize transaction object
* @returns {Promise<number |string>} 데이터 카운트를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
*/
static countDatasByRids<T>(lhd: string, TCreator: {
new (): T;
}, rids: Array<string>, transaction?: Transaction): Promise<number | string>;
/**
* 필터 조건으로 테이블에서 데이터를 가져 온다.
* return 값이 null 이면 데이터를 발견 하지 못한 것이고, string 이면 에러임(에러 코드 리턴)
* null, string(DB 에러) 이 아니면 데이터를 발견해서 데이터를 리턴 한 것임.
*
* 캐시 기능을 지원 한다. 캐시 기능을 사용하려면, 테이블에 id 칼럼이 반듯이 존재 해야 한다.
*
* @param lhd {string} 로그키
* @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델
* @param filter {{ [key: string]: any; }} 검색 조건
* @param attributes {Array<string>} 조회할 테이블의 칼럼명 목록. undefined 라면 모든 칼럼을 select 한다.
* @param transaction {Transaction | undefined} Sequelize transaction object
* @param order {Sequelize.Order | undefined} 정렬 방법
* @param offset {number | undefined} select offset
* @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드
* @param isUsingCache {boolean | undefined} cache 기능을 사용 할지 여부. setActiveRedisCache 로 캐시 사용이 설정 되고, 이 값이 true 인 경우만 cache 기능을 사용 할 수 있다.
* @returns {Promise<T | null | string>} 조회한 테이블 row 데이터를 리턴 한다. 데이터를 발견하지 못하면 null 을 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
*/
static getDataOneByFilter<T>(lhd: string, TCreator: {
new (): T;
}, filter: {
[key: string]: any;
}, attributes?: Array<string>, transaction?: Transaction, order?: Sequelize.Order, offset?: number, lang?: CkValue.SUPPORT_LANG, isUsingCache?: boolean): Promise<T | null | string>;
/**
* 필터 조건으로 테이블에서 데이터를 가져 온다.
* return 값이 null 이면 데이터를 발견 하지 못한 것이고, string 이면 에러임(에러 코드 리턴)
* null, string(DB 에러) 이 아니면 데이터를 발견해서 데이터를 리턴 한 것임.
* filter, limit 둘 중 하나는 반듯이 존재 해야 한다.
*
* order 는 다음과 같이 사용 한다.
* - [['name', 'DESC']] : name 칼럼으로 desc 정렬
* - [['name', 'DESC'], ['id', 'ASC']] : name 칼럼으로 desc 정렬하고, 두번째로 id 로 ASC 정렬
*
* @param lhd {string} 로그키
* @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델
* @param filter {{ [key: string]: any; }} 검색 조건
* @param attributes {Array<string>} 조회할 테이블의 칼럼명 목록. undefined 라면 모든 칼럼을 select 한다.
* @param transaction {Transaction | undefined} Sequelize transaction object
* @param order {Sequelize.Order | undefined} 정렬 방법
* @param offset {number | undefined} select offset
* @param limit {number | undefined} seledct limit
* @returns {Promise<Array<T> | string>} 조회한 테이블 row 데이터 목록을 리턴 한다. 데이터가 없으면 empty array 를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
*/
static getDatasByFilter<T>(lhd: string, TCreator: {
new (): T;
}, filter: {
[key: string]: any;
} | undefined, attributes?: Array<string>, transaction?: Transaction, order?: Sequelize.Order, offset?: number, limit?: number): Promise<Array<T> | string>;
/**
* getDatasByFilter 와 동일한 역할을 하지만, 데이터가 아니라 데이터의 카운트를 구한다.
*
* @param lhd {string} 로그키
* @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델
* @param filter {{ [key: string]: any; }} 검색 조건
* @param transaction {Transaction | undefined} Sequelize transaction object
* @returns {Promise<number | string>} 데이터 카운트를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
*/
static countDatasByFilter<T>(lhd: string, TCreator: {
new (): T;
}, filter: {
[key: string]: any;
} | undefined, transaction?: Transaction): Promise<number | string>;
/**
* key array 로 데이터 목록을 구한다. 가령 file_id array 로 파일 데이터를 map 형태로 구 할 때 사용 한다.
*
* 다음과 같이 사용 한다면, <number, TbFile> 은 fids 가 number array 이고 리턴되는 map 에 할당되는 값이 TbFile 이기 때문임.
* getDataMapByKeyArray<number, TbFile>(req, res, fids, TbFile, 'rid', 'id', ['id', rid', 'description']);
*
* 기본 검색 조건은 colName 이 rid 이고, 검색 값이 fids 로 select 한다.
* { rid: { $in: fids } } 가 select 조건이 된다.
* 또한 테이블에서 select 되는 칼럼은 ['rid', 'description'] 이다.
* 그리고, select 로 선택된 값을 mapKey 인 id 로 map 을 만들어서 return 한다.
* 즉, CkUtils.arrayToMaps<VCreator>(selectedRows, 'id'); 의 결과값을 리턴 한다.
*
* @param lhd {string} 로그 헤더
* @param keys Array<T> select 조건 key array
* @param VCreator {{ new() : V; }} select 할 테이블
* @param colName {string} 테이블에서 select 할 칼럼명
* @param mapKey {string} map 으로 만들때 키가되는 칼럼명(k_칼럼값 형태로 키가 생성된다.)
* @param cols {Array<string> | undefined} 테이블에서 특정 칼럼만 가져오고 싶을때 지정 칼럼 목록
* @param toCond {{[key: string]: any; } | undefined} 검색할 테이블 select 시에 추가할 조건
* @param transaction {Transaction | undefined} transaction object
* @returns {Promise<{ [k_mapKey: string]: T }>} mapKey 기준으로 만들어진 object 를 리턴 한다. 에러가 발생하거나, 데이터가 없으면 empty object 를 리턴 한다.
*/
static getDataMapByKeyArray<T, V>(lhd: string, keys: Array<T>, VCreator: {
new (): V;
}, colName: string, mapKey: string, cols?: Array<string>, toCond?: {
[key: string]: any;
}, transaction?: Transaction): Promise<{
[key: string]: any;
}>;
/**
* list_order 순서를 변경 한다.
* raw query 는 함수 내에서 추가 조건이 들어가고, 이에 따라 replacement 도 추가 조건이 들어 간다.
* list_order 변경 관련 값은 함수 내부에서 처리 되고, 파라미터로 주는 raw query 는 데이터 검색 조건만 들어 가도록 해야 한다.
* 움직이는 위치에 따라 list_order + 1, list_order -1 을 해야 하기 때문에 파라미터로 넘겨주는 rawQuery 내에 <list_order> 스트링으로
* 값을 설정 한다.
*
* 순수하게 list_order 만 변경 하고, list_order 변경 가능한지 데이터 비교 하지 않는다는 것이 changeListOrderV2 와 다른점 이다.
* 사용 예제는 한국문화교육의 ContentCategoryAdmRouter.ts 의 카테고리 위치 변경을 참고 하자.
* 또는 ck-gw-core 의 MenuAdmRouter.putLorder 를 참고 한다.
*
* @param lhd {string} 로그 헤더
* @param rdb {SequelizeTS} sequelize object. typescript sequelize 의 object 임.
* @param TCreator {{ new() : T; }} 테이블
* @param rawQuery {string} 부분 raw 쿼리
* @param replacements {{ [key: string]: any; } | undefined} raw 쿼리에서 replace 값
* @param srcId {number} 순서를 변경할 src 의 id
* @param srcListOrder {number} 순서를 변경할 src 의 list_order
* @param destListOrder {number} 순서를 변경할 dest 의 list_order
* @param transaction {Transaction} transaction
* @returns {Promise<number>} 순서가 변경된 row 의 갯수를 리턴 한다.
* @throws {CkError} 에러를 throw 한다.
*/
static changeListOrder<T>(lhd: string, rdb: SequelizeTS, TCreator: {
new (): T;
}, rawQuery: string, replacements: {
[key: string]: any;
} | undefined, srcId: number, srcListOrder: number, destListOrder: number, transaction: Transaction): Promise<number>;
/**
* list_order 순서를 변경 한다. router 에서 순서 변경하는 것을 함수 한번에 처리 할 수 있도록 묶어 둔 것이다.
* 간단한 순서 변경에 사용 하고, 추가 제한 조건이 있으면 본 함수를 사용 하지 않도록 한다.
* 에러 나면 string 을 리턴 하는데, 이런 경우는 호출 하는 곳에서 transaction rollback 처리 해 주어야 한다.
*
* changeListOrder 와 다른점은 함수 내부에서 순서를 변경 하려는 데이터를 찾아, 데이터 존재 여부 및 list_order 가 동일한지 비교 한다.
* 사용 예제는 한국문화교육의 VRCAdminRouter.ts 의 키워드 위치 변경을 참고 하자.
* 또는 ck-gw-core 의 BoardAdmRouter.ts 파일을 참고 한다.
*
* @param lhd {string} 로그 헤더
* @param rdb {SequelizeTS} sequelize object. typescript sequelize 의 object 임.
* @param TCreator {{ new() : T; }} 테이블
* @param srcRid {string} 순서를 변경할 src 의 rid
* @param destRid {string} 순서를 변경할 dest 의 rid
* @param rawQueryPart {string} 부분 raw 쿼리
* @param replacements {{ [key: string]: any; } | undefined} raw 쿼리에서 replace 값
* @param transaction {Transaction} transaction
* @returns {Promise<number |string>} 순서가 변경된 row 의 갯수를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
*/
static changeListOrderV2<T>(lhd: string, rdb: SequelizeTS, TCreator: {
new (): T;
}, srcRid: string, destRid: string, rawQueryPart: string, replacements: {
[key: string]: any;
} | undefined, transaction: Transaction): Promise<number | string>;
/**
* 새로운 데이터를 생성 하고, list_order 를 생성된 srl 값과 동일하게 설정 한다.
* list_order 가 있는 대부분의 데이터 생성시 사용 하면 된다.
*
* string 이 리턴 되면, 에러 처리 해야 한다. 에러가 발생 되면 호출 하는 곳에서 transaction rollback 처리 해야 한다.
* 한국 문화 교육의 VRCKeyword 생성을 참고 한다.
* 또는 ck-gw-core 의 BoardAdmRouter.ts 파일을 참고 한다.
*
* @param lhd {string} 로그 헤더
* @param TCreator {{ new() : T; }} 테이블
* @param newData {T} 저장할 데이터의 모델 object
* @param transaction {Transaction} transaction
* @returns {Promise<T | string>} 생성된 데이터의 모델 object 를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
*/
static createDataWithListOrder<T>(lhd: string, TCreator: {
new (): T;
}, newData: T, transaction: Transaction): Promise<T | string>;
/**
* 데이터를 저장 한다. 정상으로 실행 되면 저장된 데이터를 리턴 하고, 에러이면 에러 코드(string)을 리턴 한다.
*
* @param lhd {string} 로그키
* @param newData {T} 저장할 데이터의 모델 object
* @param transaction {Transaction} transaction
* @returns {Promise<T | string>} 생성된 데이터의 모델 object 를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
*/
static createData<T>(lhd: string, newData: T, transaction?: Transaction): Promise<T | string>;
/**
* 데이터를 업데이트 한다. number 를 리턴하면, 업데이트 데이터 카운트 이며, 스트링이면 에러 코드 이다.
* 캐시 기능을 사용 할 때, cacheDataIds 파라미터를 준다면 캐시도 같이 삭제 한다.
*
* 캐시 기능을 지원 한다.
*
* @param lhd {string} 로그키
* @param TCreator {{ new() : T; }} 테이블 모델
* @param modData {{ [key: string]: any; }} 업데이트 할 데이터
* @param where {{ [key: string]: any; }} 업데이트 할 데이터의 filter 조건
* @param transaction {Transaction | undefined} transaction
* @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드
* @param cacheDataIds {Array<number> | number | undefined} DB 캐시 기능을 사용 할 때, 업데이트 하면서 캐시를 삭제 한다면 삭제 해야할 데이터의 id 또는 id 목록
* @returns {Promise<number | string>} 업데이트 된 데이터 카운트를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
*/
static updateData<T>(lhd: string, TCreator: {
new (): T;
}, modData: any, where: any, transaction?: Transaction, lang?: CkValue.SUPPORT_LANG, cacheDataIds?: Array<number> | number): Promise<number | string>;
/**
* 데이터를 삭제 한다. number 를 리턴하면, 삭제된 데이터 카운트 이며, 스트링 이면 에러 코드 이다.
*
* @param lhd {string} 로그키
* @param TCreator {{ new() : T; }} 테이블 모델
* @param where {{ [key: string]: any; }} 삭제 할 데이터의 filter 조건
* @param transaction {Transaction | undefined} transaction
* @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드
* @param cacheDataIds {Array<number> | number | undefined} DB 캐시 기능을 사용 할 때, 업데이트 하면서 캐시를 삭제 한다면 삭제 해야할 데이터의 id 또는 id 목록
* @returns {Promise<number | string>} 삭제 된 데이터 카운트를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
*/
static deleteData<T>(lhd: string, TCreator: {
new (): T;
}, where: any, transaction?: Transaction, lang?: CkValue.SUPPORT_LANG, cacheDataIds?: Array<number> | number): Promise<number | string>;
/**
* 칼럼 값을 증가 시키거나, 감소 시킨다. true 를 리턴하면 처리 성공이고, 스트링 이면 에러 코드 이다.
*
* @param lhd {string} 로그키
* @param TCreator {{ new() : T; }} 테이블 모델
* @param where {{ [key: string]: any; }} 쿼리 검색 조건
* @param cols {Array<string>} increase, decrease 시킬 칼럼명. 일반적으로 칼럼 하나만 사용 될 것이지만, 여러개 칼럼을 처리 할 수 있다.
* @param by {number} increase, decrease 시키는 양. 1 이면 1씩 증가하고, -1 이면 1씩 감소 한다.
* @param transaction {Transaction | undefined} transaction
* @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드
* @param cacheDataIds {Array<number> | number | undefined} DB 캐시 기능을 사용 할 때, 업데이트 하면서 캐시를 삭제 한다면 삭제 해야할 데이터의 id 또는 id 목록
* @returns {Promise<void|string>} string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
*/
static incrementData<T>(lhd: string, TCreator: {
new (): T;
}, where: any, cols: Array<string>, by: number, transaction?: Transaction, lang?: CkValue.SUPPORT_LANG, cacheDataIds?: Array<number> | number): Promise<void | string>;
/**
* raw query 를 사용하여 데이터를 select 한다.
*
* @param lhd {string} 로그키
* @param rawQuery {string} join 을 하는 sql query
* @param rdb {SequelizeTS | number} CkSequelize.getSequelize2(lhd, rdb) 로 sequelize object 를 구할 수 있는 값 이나, 연결된 db index. db index 라면 알아서 sequelize object 를 가져 온다.
* @param replacements {{ [col: string]: any; } | undefined} join 시에 사용되는 replace 값
* @param transaction {Transaction | undefined} DB transaction object
* @returns {Promise<Array<{ [col_name: string]: any; }> | string>} select 된 데이터 목록을 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다.
*/
static getDataByRawQuery(lhd: string, rawQuery: string, rdb: SequelizeTS | number, replacements?: {
[col: string]: any;
}, transaction?: Transaction): Promise<Array<{
[col_name: string]: any;
}> | string>;
/**
* DDL(create, drop, alter, truncate) 쿼리를 실행 한다.
*
* @param lhd {string} 로그키
* @param rawQuery {string} sql 문
* @param rdb {SequelizeTS | number} CkSequelize.getSequelize2(lhd, rdb) 로 sequelize object 를 구할 수 있는 값 이나, 연결된 db index. db index 라면 알아서 sequelize object 를 가져 온다.
* @returns {string | boolean} 에러가 발생하면 string(에러 코드)를 리턴 하고, 성공이면 true 를 리턴 한다. false 를 리턴 하는 경우 없음.
*/
static runDDLQuery(lhd: string, rawQuery: string, rdb: SequelizeTS | number): Promise<string | boolean>;
}
export default DatabaseService;