투케이2K

44. (TWOK/UTIL) [Spring/Intelij] C_Util - string, 날짜, 형 변환, 정규식 수행 등 유틸 파일 클래스 본문

투케이2K 유틸파일

44. (TWOK/UTIL) [Spring/Intelij] C_Util - string, 날짜, 형 변환, 정규식 수행 등 유틸 파일 클래스

투케이2K 2022. 5. 16. 16:04

[설 명]

프로그램 : Spring / Intelij

설 명 : C_Util - string, 날짜, 형 변환, 정규식 수행 등 유틸 파일 클래스

 

[소스 코드]

 

import org.json.JSONArray;
import org.json.JSONObject;

import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.sql.Blob;
import java.text.SimpleDateFormat;
import java.util.*;

import org.apache.commons.codec.binary.Base64;

public class C_Util {


    /**
     * // -----------------------------------------
     * TODO [클래스 설명]
     * // -----------------------------------------
     * 1. 프로그램 상 필요한 유틸 파일 모음 클래스
     * // -----------------------------------------
     * 2. getNowDateTime24 : 24 시간 형태 현재 날짜 확인 : 2022.03.21 14:34:20 월요일
     * // -----------------------------------------
     * 3. getNowDateTime24Number : 24 시간 형태 현재 날짜 확인 : 20220321143420
     * // -----------------------------------------
     * 4. convert_HexString_To_Byte : 헥사 문자열 데이터를 바이트 배열로 반환 실시 : byte array
     * // -----------------------------------------
     * 5. convert_ByteArray_To_HexString : 바이트 배열 데이터를 헥사 문자열로 반환 실시 : 01 02 AB
     * // -----------------------------------------
     * 6. matchString : 정규식 수행 메소드 : 공백 및 특수 문자 제거 문자열
     * // -----------------------------------------
     * 7. HexUtil_To_ByteArray : 헥사 문자열 데이터를 바이트 배열로 반환 실시 : byte array
     * // -----------------------------------------
     * 8. getDateMinus : 두 날짜 차이 계산 수행 : 분, 초 int 형 반환
     * // -----------------------------------------
     * 9. getTimeStamp_To_Date : 타임 스탬프에서 Date 24시간 날짜 형식으로 변환 실시 : 20220321143420
     * // -----------------------------------------
     * 10. stringNotNull : String 문자열 데이터 널 판단 실시 : true / false
     * // -----------------------------------------
     * 11. stringMultiContains : String 문자열 다중 contains 문자 포함 확인 실시 : true / false
     * // -----------------------------------------
     * 12. stringJsonObjectEnable : String 문자열 데이터를 Json Object 형식으로 변경 가능 한지 체크 실시 : true / false
     * // -----------------------------------------
     * 13. stringToByte : string 문자열 데이터를 byte 배열 값으로 반환 수행
     * // -----------------------------------------
     * 14. byteToString : byte 배열 값을 string 문자열 데이터로 반환
     * // -----------------------------------------
     * 15. stringCount : string 문자열 데이터에서 특정 문자 개수 카운트 반환
     * // -----------------------------------------
     * 16. removeArrayOverlap : ArrayList 배열 중복 데이터 제거 실시
     * // -----------------------------------------
     * 17. stringIsNumber : string 문자열 데이터 모두 정수 구성 여부 확인
     * // -----------------------------------------
     * 18. doubleCutLength : Double 소수점 데이터를 특정 소수점 자릿수 기준으로 자르기 실시 [반올림 없음]
     * // -----------------------------------------
     * 19. arraySubList : subList 사용해 array list 가변 배열 데이터 부분 데이터 반환 실시
     * // -----------------------------------------
     * 20. arrayIntersect : ArrayList 배열 데이터 교집합 수행 실시
     * // -----------------------------------------
     * 21. mySqlMsgCursorJsonFormat : Mysql 전용 프로시저 호출 리턴 메시지 + 리턴 테이블 데이터 형식 JSON 포맷 실시
     * // -----------------------------------------
     * 22. procMsgJsonFormat : 프로시저 호출 리턴 메시지 JSON 형식 포맷 실시
     * // -----------------------------------------
     * 23. selectJsonFormat : 테이블 select 다중 결과 리턴 JSON 형식 포맷 실시
     * // -----------------------------------------
     * 24. InsertUpdateDeleteMsgJsonFormat : insert , update , delete 수행 리턴 메시지 JSON 형식 포맷 실시
     * // -----------------------------------------
     * 25. mapToJsonObject : map 데이터를 jsonObject 로 반환 실시
     * // -----------------------------------------
     * 26. listMapToJsonArray : List Map 데이터를 JsonArray 로 반환 실시
     * // -----------------------------------------
     * 27. listListMapToJsonArray : List List Map 데이터를 JsonArray 로 반환 실시
     * // -----------------------------------------
     * 28. stringToBase64AndUrlEncodeString : 원본 string > base64 인코딩 > URL 인코딩 문자열
     * // -----------------------------------------
     * 29. stringToUrlAndBase64DecodeString : url 인코딩 + base64 로 된 문자열 > Url 디코딩 > base64 디코딩 >원본 string 반환
     * // -----------------------------------------
     * 30. urlAndBase64Tobase64String : url 인코딩 + base64 로 된 문자열 > base64 문자열로 반환 실시
     * // -----------------------------------------
     * 31. stringToAes128AndUrlEncodeString : 원본 string > Aes128 암호화 > base64 > URL 인코딩 문자열
     * // -----------------------------------------
     * 32. aes128AndUrlToDecodeString : aes128 + URL 인코딩 문자열 > url 디코딩 > aes128 디코딩 > 원본 문자열
     * // -----------------------------------------
     * 33. mapNotNull : HashMap 객체 널 판단 실시 : true / false
     * // -----------------------------------------
     * 34. listMapNotNull : List Map 객체 널 판단 실시 : true / false
     * // -----------------------------------------
     * 35. listListMapNotNull : List List Map 객체 널 판단 실시 : true / false
     * // -----------------------------------------
     * 36. procMsgAndDataFormat : JSON 형식 메시지, 데이터 포맷 수행 실시
     * // -----------------------------------------
     * 37. base64StringToUrlEncodeString : base64 문자열 > URL 인코딩 문자열
     * // -----------------------------------------
     * 38. mySqlMsgBlobAndImageReturn : Mysql 전용 프로시저 호출 리턴 메시지 + 리턴 BLOB 이미지 형식을 Blob 이미지로 리턴 실시
     * // -----------------------------------------
     * 39. mapToUrlEncodeQueryString : Map 데이터를 http 요청 쿼리 스트링 형태 문자열로 리턴 실시
     * // -----------------------------------------
     * 40. queryStringUrlEncode : http get, post 쿼리 파람 데이터 요청 포맷 String 리턴 실시
     * // -----------------------------------------
     * 41. stringIsUrlParsing : String 문자열 데이터가 URL 형식으로 파싱 가능 한지 체크 실시
     * // -----------------------------------------
     * */





    // TODO [전역 변수 선언 실시]
    private static final String CLASS_NAME = "C_Util";





    // TODO [24 시간 형태 현재 날짜 확인]
    public static String getNowDateTime24(){

        /**
         * // -----------------------------------------
         * [getNowDateTime24 메소드 설명]
         * // -----------------------------------------
         * 1. 24 시간 형태 현재 날짜 확인 수행 메소드
         * // -----------------------------------------
         * 2. 호출 방법 : C_Util.getNowDateTime24();
         * // -----------------------------------------
         * 3. 리턴 데이터 : 2022.03.21 14:34:20 월요일
         * // -----------------------------------------
         * */

        // [날짜 데이터 확인 실시]
        long time = System.currentTimeMillis();
        SimpleDateFormat dayTime = new SimpleDateFormat("yyyy.MM.dd kk:mm:ss E요일");
        String str = dayTime.format(new Date(time));

        // [로그 출력]
        //*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("getNowDateTime24"));
        System.out.println("[RETURN] : "+String.valueOf(str));
        System.out.println("================================================");
        System.out.println("\n");
        // */

        // [리턴 데이터 반환 실시]
        return str;
    }





    // TODO [24 시간 형태 현재 날짜 확인]
    public static String getNowDateTime24Number(){

        /**
         * // -----------------------------------------
         * [getNowDateTime24Number 메소드 설명]
         * // -----------------------------------------
         * 1. 24 시간 형태 현재 날짜 확인 수행 메소드
         * // -----------------------------------------
         * 2. 호출 방법 : C_Util.getNowDateTime24Number();
         * // -----------------------------------------
         * 3. 리턴 데이터 : 20220321143420
         * // -----------------------------------------
         * */

        // [날짜 데이터 확인 실시]
        long time = System.currentTimeMillis();
        SimpleDateFormat dayTime = new SimpleDateFormat("yyyyMMddkkmmss");
        String str = dayTime.format(new Date(time));

        // [로그 출력]
        //*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("getNowDateTime24Number"));
        System.out.println("[RETURN] : "+String.valueOf(str));
        System.out.println("================================================");
        System.out.println("\n");
        // */

        // [리턴 데이터 반환 실시]
        return str;
    }





    // TODO [헥사 문자열 값을 바이트 배열로 변환 수행 메소드 : Hex String convert byte array]
    public static byte[] convert_HexString_To_Byte(String data) {

        /**
         * // -----------------------------------------
         * [convert_HexString_To_Byte 메소드 설명]
         * // -----------------------------------------
         * 1. 헥사 문자열 값을 바이트 배열로 변환 수행 메소드
         * // -----------------------------------------
         * 2. 호출 방법 : C_Util.convert_HexString_To_Byte("0123456789abcdef0123456789abcdef");
         * // -----------------------------------------
         * 3. 리턴 데이터 : byte array 배열
         * // -----------------------------------------
         * */

        String hex = data.replaceAll("0x", ""); //0x문자 제거
        String hex2 = hex.replaceAll("0X", ""); //0x문자 제거
        String Trim = hex2.replaceAll(" ", ""); //공백문자 제거

        byte arr[] = new byte[Trim.length()/2]; // (전체 문자열 길이 / 2) 만큼 배열 생성
        int before = 0;
        int after = 2;
        for(int i=0; i<arr.length; i++) {
            String value = Trim.substring(before, after); // 2글자씩 잘라서 데이터 출력
            arr[i] = new java.math.BigInteger(value, 16).byteValue(); // BigInteger사용해 hexString > byte 변환
            // [다음 2글자씩 또 변환하기 위함]
            before += 2;
            after += 2;
        }

        // [로그 출력]
        ///*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("convert_HexString_To_Byte"));
        System.out.println("[INPUT] : "+String.valueOf(data));
        System.out.println("[RETURN] : "+Arrays.toString(arr));
        System.out.println("================================================");
        System.out.println("\n");
        // */

        // [리턴 데이터 반환]
        return arr;
    }





    // TODO [바이트 배열 값을 헥사 문자열 값으로 변환 : byte array convert Hex String]
    public static String convert_ByteArray_To_HexString(byte buf[]) {

        /**
         * // -----------------------------------------
         * [convert_ByteArray_To_HexString 메소드 설명]
         * // -----------------------------------------
         * 1. 바이트 배열 값을 헥사 문자열 값으로 변환 수행 메소드
         * // -----------------------------------------
         * 2. 호출 방법 : C_Util.convert_ByteArray_To_HexString(new byte[] {1, 35, 69, 103, -119, -85, -51, -17, 1, 35, 69, 103, -119, -85, -51, -17} );
         * // -----------------------------------------
         * 3. 리턴 데이터 : 헥사 문자열 데이터
         * // -----------------------------------------
         * */

        String Hex_Value = "";
        for(int i=0; i<buf.length; i++) {
            //Hex_Value += String.format("0x%02x ", buf[i]); // [0xfg]
            //Hex_Value += String.format("%02x ", buf[i]); // [fg]

            //Hex_Value += String.format("0X%02X ", buf[i]); // [0XFG]
            Hex_Value += String.format("%02X ", buf[i]); // [FG]
        }

        // [로그 출력]
        ///*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("convert_ByteArray_To_HexString"));
        System.out.println("[INPUT] : "+Arrays.toString(buf));
        System.out.println("[RETURN] : "+String.valueOf(Hex_Value));
        System.out.println("================================================");
        System.out.println("\n");
        // */

        // [리턴 반환]
        return Hex_Value;
    }





    // TODO [정규식 수행 메소드]
    public static String matchString(String value) {

        /**
         * // -----------------------------------------
         * [matchString 메소드 설명]
         * // -----------------------------------------
         * 1. 정규식 수행 메소드 [공백 및 특수문자 제거]
         * // -----------------------------------------
         * 2. 호출 방법 : C_Util.matchString("hello@@TwoK");
         * // -----------------------------------------
         * 3. 리턴 데이터 : 공백 및 특수문자 제거 데이터 반환
         * // -----------------------------------------
         * */

        /**
         * // -----------------------------------------
         * [요약 설명]
         * // -----------------------------------------
         * 1. 정규식 패턴 ^[a-z] : 영어 소문자 허용
         * // -----------------------------------------
         * 2. 정규식 패턴 ^[A-Z] : 영어 대문자 허용
         * // -----------------------------------------
         * 3. 정규식 패턴 ^[ㄱ-ㅎㅏ-ㅣ가-힣] : 한글 허용
         * // -----------------------------------------
         * 4. 정규식 패턴 ^[ㄱ-ㅎㅏ-ㅣ가-힣] : 숫자 허용
         * // -----------------------------------------
         * 5. 정규식 패턴 ^[ ] or ^[\\s] : 공백 허용
         * // -----------------------------------------
         */

        // [결과를 반환할 변수 선언 실시]
        String result = "";

        // [정규식 패턴 형식 정의]
        String pattern = "^[ㄱ-ㅎㅏ-ㅣ가-힣a-zA-Z0-9]"; // 정규식 : 한글, 영어, 숫자만 허용 (공백, 특수문자 제거)
        //String pattern = "^[ㄱ-ㅎㅏ-ㅣ가-힣a-zA-Z0-9\\s]"; // 정규식 : 한글, 영어, 숫자, 공백만 허용 (특수문자 제거)

        if (value != null && value.length() > 0 && value.trim().equals("") == false) { // 문자열 길이가 1개 이상인 경우
            // for 반복문을 선언해서 문자 한글자씩 확인 실시
            for(int i=0; i<value.length(); i++) {
                if (String.valueOf(value.charAt(i)).matches(pattern)) { // 정규식 패턴을 만족하는 경우
                    result += value.charAt(i); // 문자열 추가
                }
                else { // 정규식 패턴이 아닌 경우
                    continue;
                }
            }
        }
        else { // 문자열 길이가 0개인 경우
            result = String.valueOf(value); // 인풋값 그대로 반환
        }

        // [로그 출력]
        ///*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("matchString"));
        System.out.println("[INPUT] : "+String.valueOf(value));
        System.out.println("[RETURN] : "+String.valueOf(result));
        System.out.println("================================================");
        System.out.println("\n");
        // */

        // 결과 반환 실시
        return result;
    }





    // TODO [헥사 문자열 값을 바이트 배열로 반환 메소드 : Hex String convert byte array]
    public static byte[] HexUtil_To_ByteArray(String data) {

        /**
         * // -----------------------------------------
         * [HexUtil_To_ByteArray 메소드 설명]
         * // -----------------------------------------
         * 1. 헥사 문자열 값을 바이트 배열로 반환 메소드
         * // -----------------------------------------
         * 2. 호출 방법 : C_Util.HexUtil_To_ByteArray("0123456789abcdef0123456789abcdef");
         * // -----------------------------------------
         * 3. 리턴 데이터 : 바이트 배열 반환 실시
         * // -----------------------------------------
         * */

        byte[] temp = new byte[data.length() / 2];
        for(int i = 0; i < data.length() / 2; ++i) {
            temp[i] = toByte(data.substring(i * 2, i * 2 + 2));
        }
        return temp;
    }
    public static byte toByte(String hexStr) {
        byte result = 0;
        String hex = hexStr.toUpperCase();
        for(int i = 0; i < hex.length(); ++i) {
            char c = hex.charAt(hex.length() - i - 1);
            byte b = toByte(c);
            result = (byte)(result | (b & 15) << i * 4);
        }
        return result;
    }
    private static byte toByte(char c) {
        switch(c) {
            case '0':
                return 0;
            case '1':
                return 1;
            case '2':
                return 2;
            case '3':
                return 3;
            case '4':
                return 4;
            case '5':
                return 5;
            case '6':
                return 6;
            case '7':
                return 7;
            case '8':
                return 8;
            case '9':
                return 9;
            case ':':
            case ';':
            case '<':
            case '=':
            case '>':
            case '?':
            case '@':
            default:
                return 0;
            case 'A':
                return 10;
            case 'B':
                return 11;
            case 'C':
                return 12;
            case 'D':
                return 13;
            case 'E':
                return 14;
            case 'F':
                return 15;
        }
    }





    // TODO [두 날짜 차이 계산 수행 실시]
    public static int getDateMinus(String bigDate, String smallDate) {

        /**
         * // -----------------------------------------
         * // [getDateMinus 메소드 설명]
         * // -----------------------------------------
         * 1. 날짜 형식 : yyyyMMddkkmmss 24시간 형태로 구성
         * // -----------------------------------------
         * 2. bigDate 큰 날짜 - smallDate 작은 날짜 연산 수행
         * // -----------------------------------------
         * 3. 리턴 형식 : 초 , 분 , 시간 , 일자 단위 선택 (int 형 반환)
         * // -----------------------------------------
         * 4. 인풋 예시 :
         *    - C_Util.getDateMinus("2022 02 10 18 30 15", "2022 02 10 18 30 15"); // 동일
         *
         *    - C_Util.getDateMinus("2022 02 10 18 30 15", "2022 02 10 18 30 10"); // 초 [다름]
         *    - C_Util.getDateMinus("2022 02 10 18 30 15", "2022 02 10 18 25 15"); // 분 [다름]
         *    - C_Util.getDateMinus("2022 02 10 18 30 15", "2022 02 10 17 30 15"); // 시간 [다름]
         *    - C_Util.getDateMinus("2022 02 10 18 30 15", "2022 02 09 18 30 15"); // 일자 [다름]
         *    - C_Util.getDateMinus("2022 02 10 18 30 15", "2022 01 10 18 30 15"); // 월 [다름]
         *    - C_Util.getDateMinus("2022 02 10 18 30 15", "2021 02 10 18 30 15"); // 연도 [다름]
         * // -----------------------------------------
         * */

        // [초기 리턴 데이터 선언]
        int returnData = 0;


        // [인풋으로 들어온 값에 공백이 있는 경우 제거 실시]
        bigDate = bigDate.replaceAll(" ", "");
        smallDate = smallDate.replaceAll(" ", "");


        // [인풋으로 들어온 값 널 데이터 검증 실시]
        try {
            if (bigDate != null && bigDate.length()>0 && !bigDate.equals("") && !bigDate.trim().equals("null")
                    && smallDate != null && smallDate.length()>0 && !smallDate.equals("") && !smallDate.trim().equals("null")){ // [정상 데이터 인 경우]

                // [인풋으로 들어온 데이터가 int 형 인지 검증 수행]
                boolean bigDate_NotNumber = false;
                boolean smallDate_NotNumber = false;

                for(int i=0; i<bigDate.length(); i++) {
                    if(Character.isDigit(bigDate.charAt(i)) == false) { // 숫자가 아닌 경우
                        bigDate_NotNumber = true;
                    }
                }
                for(int j=0; j<smallDate.length(); j++) {
                    if(Character.isDigit(smallDate.charAt(j)) == false) { // 숫자가 아닌 경우
                        smallDate_NotNumber = true;
                    }
                }

                if (bigDate_NotNumber == true || smallDate_NotNumber == true){ // 문자가 포함된 데이터 인 경우
                    // [로그 출력]
                    ///*
                    System.out.println("\n");
                    System.out.println("================================================");
                    System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
                    System.out.println("[METHOD] : "+String.valueOf("getDateMinus"));
                    System.out.println("[INPUT] [bigDate] : "+String.valueOf(bigDate));
                    System.out.println("[INPUT] [smallDate] : "+String.valueOf(smallDate));
                    System.out.println("[ERROR] : "+String.valueOf("문자에러 - 비정상 데이터"));
                    System.out.println("================================================");
                    System.out.println("\n");
                    // */
                    return returnData;
                }


                // [로직 처리 수행 실시]
                Date bigFormat = new SimpleDateFormat("yyyyMMddkkmmss").parse(bigDate);
                Date smallFormat = new SimpleDateFormat("yyyyMMddkkmmss").parse(smallDate);


                // [초, 분, 시간, 일자 차이 계산 실시 >> long 타입]
                long minusSec = (bigFormat.getTime() - smallFormat.getTime()) / 1000; // [초]
                long minusMin = (bigFormat.getTime() - smallFormat.getTime()) / 60000; // [분]
                long minusHour = (bigFormat.getTime() - smallFormat.getTime()) / 3600000; // [시간]
                long minusDay = minusSec / (24*60*60); // [일자]


                // [로그 출력]
                ///*
                System.out.println("\n");
                System.out.println("================================================");
                System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
                System.out.println("[METHOD] : "+String.valueOf("getDateMinus"));
                System.out.println("[INPUT] [bigDate] : "+String.valueOf(bigDate));
                System.out.println("[INPUT] [smallDate] : "+String.valueOf(smallDate));
                System.out.println("[minusSec] [초] [차이] : "+String.valueOf(minusSec));
                System.out.println("[minusMin] [분] [차이] : "+String.valueOf(minusMin));
                System.out.println("[minusHour] [시간] [차이] : "+String.valueOf(minusHour));
                System.out.println("[minusDay] [날짜] [차이] : "+String.valueOf(minusDay));
                System.out.println("================================================");
                System.out.println("\n");
                // */


                // [리턴하려는 값을 선택 후 결과 반환]
                returnData = (int) minusMin; // [분]
                //returnData = (int) minusSec; // [초]
            }
            else { // [비정상 데이터 인 경우]
                // [로그 출력]
                ///*
                System.out.println("\n");
                System.out.println("================================================");
                System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
                System.out.println("[METHOD] : "+String.valueOf("getDateMinus"));
                System.out.println("[INPUT] [bigDate] : "+String.valueOf(bigDate));
                System.out.println("[INPUT] [smallDate] : "+String.valueOf(smallDate));
                System.out.println("[ERROR] : "+String.valueOf("널 값 - 비정상 데이터"));
                System.out.println("================================================");
                System.out.println("\n");
                // */
            }
        }
        catch (Exception e){
            // [로그 출력]
            ///*
            System.out.println("\n");
            System.out.println("================================================");
            System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
            System.out.println("[METHOD] : "+String.valueOf("getDateMinus"));
            System.out.println("[INPUT] [bigDate] : "+String.valueOf(bigDate));
            System.out.println("[INPUT] [smallDate] : "+String.valueOf(smallDate));
            System.out.println("[CATCH] : "+String.valueOf(e.getMessage()));
            System.out.println("================================================");
            System.out.println("\n");
            // */
        }
        // [리턴 데이터 반환 실시]
        return returnData;
    }





    // TODO [타임 스탬프 값을 날짜 형식으로 변환 실시]
    public static String getTimeStamp_To_Date(String timeStamp){

        /**
         * // -----------------------------------------
         * [getTimeStamp_To_Date 메소드 설명]
         * // -----------------------------------------
         * 1. Timestamp 값은 현재 시간을 milliseconds 단위로 변환하여 보여줍니다
         * // -----------------------------------------
         * 2. 인풋 타임 스탬프 형식 : 1646295046677
         * // -----------------------------------------
         * 3. 리턴 데이터 : 20220321134530 (24 시간 날짜 형식)
         * // -----------------------------------------
         * 4. 타임 스탬프 (밀리세컨드 만드는 형식)
         *   - Timestamp timestamp = new Timestamp(System.currentTimeMillis()); // 현재 날짜
         *   - timestamp.getTime(); // 타임 스탬프 밀리 세컨드
         * // -----------------------------------------
         * */

        // [초기 리턴 결과 반환 변수 선언 실시]
        String returnDate = "";
        try {
            // [인풋 데이터 널 체크 수행 실시]
            if (timeStamp != null && timeStamp.length()>0 && !timeStamp.trim().equals("") && !timeStamp.trim().equals("null")){

                // [타임 스탬프 값 (1646295046677) 을 Date 로 변경]
                Date date = new Date(Long.parseLong(timeStamp));

                // [타임 스탬프 값을 포맷 Date 형식으로 변경]
                SimpleDateFormat sdf = new SimpleDateFormat ("yyyyMMddkkmmss");

                // [로그 출력]
                ///*
                System.out.println("\n");
                System.out.println("================================================");
                System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
                System.out.println("[METHOD] : "+String.valueOf("getTimeStamp_To_Date"));
                System.out.println("[타임 스탬프] : "+String.valueOf(timeStamp));
                System.out.println("[날 짜] : "+String.valueOf(sdf.format(date)));
                System.out.println("================================================");
                System.out.println("\n");
                // */

                // [리턴 데이터에 날짜 삽입 실시]
                returnDate = String.valueOf(sdf.format(date));
            }
            else {
                // [로그 출력]
                ///*
                System.out.println("\n");
                System.out.println("================================================");
                System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
                System.out.println("[METHOD] : "+String.valueOf("getTimeStamp_To_Date"));
                System.out.println("[타임 스탬프] : "+String.valueOf(timeStamp));
                System.out.println("[ERROR] : "+String.valueOf("NULL 에러"));
                System.out.println("================================================");
                System.out.println("\n");
                // */
            }
        }
        catch (Exception e){
            //e.printStackTrace();
            // [로그 출력]
            ///*
            System.out.println("\n");
            System.out.println("================================================");
            System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
            System.out.println("[METHOD] : "+String.valueOf("getTimeStamp_To_Date"));
            System.out.println("[CATCH] : "+String.valueOf(e.getMessage()));
            System.out.println("================================================");
            System.out.println("\n");
            // */
        }

        // [리턴 결과 반환 수행 실시]
        return returnDate;
    }





    // TODO [String 문자열 데이터 널 판단 실시]
    public static Boolean stringNotNull(String data){

        /**
         * // -----------------------------------------
         * [stringNotNull 메소드 설명]
         * // -----------------------------------------
         * 1. String 문자열 데이터 널 판단 실시
         * // -----------------------------------------
         * 2. 호출 방식 : C_Util.stringNotNull("twok");
         * // -----------------------------------------
         * 3. 리턴 데이터 : 문자열 데이터가 널이 아닌 경우 true / 널인 경우 false
         * // -----------------------------------------
         * */

        // [문자열 데이터 널 판단 수행 실시]
        try {
            if (data != null
                    && data.length()>0
                    && data.trim().equals("") == false
                    && data.trim().equals("null") == false
                    && data.trim().equals("undefined") == false){ // [널이 아닌 경우]

                // [리턴 결과 반환 수행 실시]
                return true;
            }
            else { // [널인 경우]

                // [리턴 결과 반환 수행 실시]
                return false;
            }
        }
        catch (Exception e){
            e.printStackTrace();

            // [리턴 결과 반환 수행 실시]
            return false;
        }
    }





    // TODO [String 문자열 데이터 다중 contains 포함 여부 확인 실시]
    public static Boolean stringMultiContains(String data, String [] containsArray){

        /**
         * // -----------------------------------------
         * [stringMultiContains 메소드 설명]
         * // -----------------------------------------
         * 1. String 문자열 데이터 다중 contains 포함 여부 확인 실시
         * // -----------------------------------------
         * 2. 호출 방식 : C_Util.stringMultiContains("twok,투케이,반갑습니다", new String[] {"twok", "투케이"});
         * // -----------------------------------------
         * 3. 리턴 데이터 : 특정 배열 값을 모두 포함하는 경우 true / 아닌 경우 false
         * // -----------------------------------------
         * */

        // [문자열 데이터 및 배열 데이터 널 판단 수행 실시]
        try {
            if (data != null
                    && data.length()>0
                    && data.trim().equals("") == false
                    && data.trim().equals("null") == false
                    && data.trim().equals("undefined") == false

                    && containsArray != null
                    && containsArray.length>0){ // [널이 아닌 경우]

                // [for 문을 수행하면서 데이터 포함 체크 수행 실시]
                boolean checkContains = true;

                for (int i=0; i<containsArray.length; i++){
                    if (data.contains(containsArray[i]) == true){
                    }
                    else {
                        // [하나라도 값을 포함하지 않는 경우 false 지정]
                        checkContains = false;
                    }
                }

                // [리턴 결과 반환 수행 실시]
                return checkContains;
            }
            else { // [널인 경우]

                // [리턴 결과 반환 수행 실시]
                return false;
            }
        }
        catch (Exception e){
            e.printStackTrace();

            // [리턴 결과 반환 수행 실시]
            return false;
        }
    }





    // TODO [String 문자열 데이터를 Json Object 형식으로 변경 가능 한지 체크 실시]
    public static Boolean stringJsonObjectEnable(String data){

        /**
         * // -----------------------------------------
         * [stringJsonObjectEnable 메소드 설명]
         * // -----------------------------------------
         * 1. String 문자열 데이터를 Json Object 형식으로 변경 가능한지 확인 실시
         * // -----------------------------------------
         * 2. 호출 방식 : C_Util.stringJsonObjectEnable(json 형식 문자열 데이터);
         * // -----------------------------------------
         * 3. 리턴 데이터 : Json 형식으로 변경 가능한 경우 true / 아닌 경우 false
         * // -----------------------------------------
         * 4. 참고 : 일반 자바 main 에서 수행 시 안드로이드 JSONObject 찾지 못함 [안드로이드 용으로 사용]
         * // -----------------------------------------
         * */

        // [리턴 데이터 변수 선언 실시]
        boolean result = false;

        // [문자열 데이터 널 판단 수행 실시]
        if (data != null
                && data.length()>0
                && data.trim().equals("") == false
                && data.trim().equals("null") == false
                && data.trim().equals("undefined") == false){ // [널이 아닌 경우]

            // [Json Object 형식으로 변경 가능한지 확인 실시]
            try {
                JSONObject checkJson = new JSONObject(String.valueOf(data));

                // [리턴 데이터 삽입 실시]
                result = true;
            }
            catch (Exception e){
                // [Json Object 변환 에러 발생]
                e.printStackTrace();

                // [리턴 데이터 삽입 실시]
                result = false;
            }
        }
        else { // [널인 경우]

            // [리턴 데이터 삽입 실시]
            result = false;
        }

        // [로그 출력]
        /*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("stringJsonObjectEnable"));
        System.out.println("[INPUT] : "+String.valueOf(data));
        System.out.println("[RETURN] : "+String.valueOf(result));
        System.out.println("================================================");
        System.out.println("\n");
        // */

        // [리턴 데이터 반환 실시]
        return result;
    }





    // TODO [string 문자열 데이터를 byte 배열 값으로 반환]
    public static byte[] stringToByte(String data){

        /**
         * // -----------------------------------------
         * [stringToByte 메소드 설명]
         * // -----------------------------------------
         * 1. string 문자열 데이터를 byte 배열 값으로 반환 수행
         * // -----------------------------------------
         * 2. 호출 방식 : C_Util.stringToByte("hello");
         * // -----------------------------------------
         * 3. 리턴 데이터 : byte array 바이트 배열 데이터
         * // -----------------------------------------
         * */

        // [리턴 데이터 변수 선언 실시]
        byte result[] = null;

        // [문자열 데이터 널 판단 수행 실시]
        if (data != null
                && data.length()>0
                && data.trim().equals("") == false
                && data.trim().equals("null") == false
                && data.trim().equals("undefined") == false){ // [널이 아닌 경우]

            try {
                result = data.getBytes("UTF-8");
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }

        // [로그 출력]
        ///*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("stringToByte"));
        System.out.println("[INPUT] : "+String.valueOf(data));
        System.out.println("[RETURN] : "+String.valueOf(Arrays.toString(result)));
        System.out.println("================================================");
        System.out.println("\n");
        // */

        // [리턴 데이터 반환 실시]
        return result;
    }





    // TODO [byte 배열 값을 string 문자열 데이터로 반환]
    public static String byteToString(byte[] data){

        /**
         * // -----------------------------------------
         * [byteToString 메소드 설명]
         * // -----------------------------------------
         * 1. byte 배열 값을 string 문자열 데이터로 반환
         * // -----------------------------------------
         * 2. 호출 방식 : C_Util.byteToString(new byte[] {104, 101, 108, 108, 111});
         * // -----------------------------------------
         * 3. 리턴 데이터 : string 문자열 데이터
         * // -----------------------------------------
         * */

        // [리턴 데이터 변수 선언 실시]
        String result = "";

        // [데이터 널 판단 수행 실시]
        if (data != null
                && data.length>0){ // [널이 아닌 경우]

            try {
                result = new String(data, "UTF-8");
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }

        // [로그 출력]
        ///*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("byteToString"));
        System.out.println("[INPUT] : "+String.valueOf(Arrays.toString(data)));
        System.out.println("[RETURN] : "+String.valueOf(result));
        System.out.println("================================================");
        System.out.println("\n");
        // */

        // [리턴 데이터 반환 실시]
        return result;
    }





    // TODO [string 문자열 데이터에서 특정 문자 개수 카운트 반환]
    public static int stringCount(String stringData, String charData){

        /**
         * // -----------------------------------------
         * [stringCount 메소드 설명]
         * // -----------------------------------------
         * 1. string 문자열 데이터에서 특정 문자 개수 카운트 반환
         * // -----------------------------------------
         * 2. 호출 방식 : C_Util.stringCount("hello,TWOK,투케이", ",");
         * // -----------------------------------------
         * 3. 리턴 데이터 : 특정 문자 개수 카운트 반환 실시
         * // -----------------------------------------
         * */

        // [리턴 데이터 변수 선언 실시]
        int result = 0;

        // [인풋 데이터 널 판단 수행 실시]
        if (stringData != null
                && stringData.length()>0
                && stringData.trim().equals("") == false
                && stringData.trim().equals("null") == false
                && stringData.trim().equals("undefined") == false

                && charData != null
                && charData.length() == 1
                && charData.trim().equals("") == false
                && charData.trim().equals("null") == false
                && charData.trim().equals("undefined") == false ){ // [널이 아닌 경우]

            try {
                // [인풋으로 들어온 문자열 데이터 배열에 삽입 실시]
                String array[] = stringData.split("");

                // [for 문을 돌면서 특정 문자 포함 확인]
                for (int i=0; i<array.length; i++){
                    if (String.valueOf(array[i]).equals(charData)){
                        result = result + 1;
                    }
                }
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }

        // [로그 출력]
        ///*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("stringCount"));
        System.out.println("[INPUT] [STRING] : "+String.valueOf(stringData));
        System.out.println("[INPUT] [CHAR] : "+String.valueOf(charData));
        System.out.println("[RETURN] [COUNT] : "+String.valueOf(result));
        System.out.println("================================================");
        System.out.println("\n");
        // */

        // [리턴 데이터 반환 실시]
        return result;
    }





    // TODO [ArrayList 배열 중복 데이터 제거 실시]
    public static ArrayList removeArrayOverlap(ArrayList list){

        /**
         * // -----------------------------------------
         * [removeArrayOverlap 메소드 설명]
         * // -----------------------------------------
         * 1. 배열 중복 데이터 제거 메소드
         * // -----------------------------------------
         * 2. 호출 방식 :
         *    ArrayList list = new ArrayList();
         *    list.add("하나");
         *    list.add("둘");
         *    list.add("하나");
         *
         *    C_Util.removeArrayOverlap(list);
         * // -----------------------------------------
         * 3. 리턴 데이터 : 중복 제거된 배열 데이터 반환 실시
         * // -----------------------------------------
         * */

        // [리턴 데이터 변수 선언 실시]
        ArrayList returnArray = new ArrayList();

        // [인풋 데이터 널 판단 수행 실시]
        if (list != null
                && list.size()>0
                && list.isEmpty() == false){ // [널이 아닌 경우]

            try {
                // [HashSet 을 사용해 ArrayList 배열 데이터 중복 제거 실시]
                HashSet hashSet = new HashSet<>(list);

                // [HashSet to ArrayList 변환 실시]
                returnArray = new ArrayList(hashSet);
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }

        // [로그 출력]
        ///*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("removeArrayOverlap"));
        System.out.println("[INPUT] : "+String.valueOf(list.toString()));
        System.out.println("[RETURN] : "+String.valueOf(returnArray.toString()));
        System.out.println("================================================");
        System.out.println("\n");
        // */

        // [리턴 데이터 반환 실시]
        return returnArray;
    }





    // TODO [String 문자열 데이터가 모두 정수 값으로 구성되어 있는지 확인 실시]
    public static Boolean stringIsNumber(String data){

        /**
         * // -----------------------------------------
         * [stringIsNumber 메소드 설명]
         * // -----------------------------------------
         * 1. String 문자열 데이터가 모두 정수 값으로 구성되어 있는지 확인 실시
         * // -----------------------------------------
         * 2. 호출 방식 :
         *   C_Util.stringIsNumber("12345");
         *   C_Util.stringIsNumber("-12345");
         *   C_Util.stringIsNumber("123hello");
         * // -----------------------------------------
         * 3. 리턴 데이터 : string 문자열 데이터가 모두 정수값으로 된 경우 true / 아니면 false
         * // -----------------------------------------
         * */

        // [리턴 데이터 변수 선언 실시]
        boolean result = true;

        // [문자열 데이터 널 판단 수행 실시]
        if (data != null
                && data.length()>0
                && data.trim().equals("") == false
                && data.trim().equals("null") == false
                && data.trim().equals("undefined") == false){ // [널이 아닌 경우]

            // [Character.isDigit 사용해 정수값 체크 실시]
            try {
                for (int i=0; i<data.length(); i++){
                    if (Character.isDigit(data.charAt(i)) == true){ // [숫자]
                    }
                    else { // [문자]
                        if (i == 0 && data.charAt(i) == '-' || data.charAt(i) == '+') { // [처음 문자가 - , + 인 경우는 통과 실시]
                        }
                        else {
                            // [리턴 데이터 삽입 실시]
                            result = false;
                        }
                    }
                }
            }
            catch (Exception e){
                // [Json Object 변환 에러 발생]
                // e.printStackTrace();

                // [리턴 데이터 삽입 실시]
                result = false;
            }
        }
        else { // [널인 경우]

            // [리턴 데이터 삽입 실시]
            result = false;
        }

        // [로그 출력]
        ///*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("stringIsNumber"));
        System.out.println("[INPUT] : "+String.valueOf(data));
        System.out.println("[RETURN] : "+String.valueOf(result));
        System.out.println("================================================");
        System.out.println("\n");
        // */

        // [리턴 데이터 반환 실시]
        return result;
    }





    // TODO [Double 소수점 데이터를 특정 소수점 자릿수 기준으로 자르기 실시]
    public static String doubleCutLength(double doubleData, int length){

        /**
         * // -----------------------------------------
         * [doubleCutLength 메소드 설명]
         * // -----------------------------------------
         * 1. Double 소수점 데이터를 특정 소수점 자릿수 기준으로 자르기 실시 [반올림 없음]
         * // -----------------------------------------
         * 2. 호출 방식 :
         *   C_Util.doubleCutLength(123.4567, 2);
         *   C_Util.doubleCutLength(-123.4567, 2);
         * // -----------------------------------------
         * 3. 리턴 데이터 : 123.45 : 소수점 특정 자릿수 기준 제한 문자열 데이터
         * // -----------------------------------------
         * */

        // [리턴 데이터 변수 선언 실시]
        String result = "";

        // [인풋 데이터 체크 수행 실시]
        if (length >= 0){ // [0 자릿수 이상 들어온 경우]

            try {
                // [필요 변수 선언 실시]
                int dotCount = 0; // 점 개수
                int dotLocation = 0; // 점 위치
                int dotLength = 0; // 소수점 이하 자릿수 기준

                // [for 문을 돌면서 데이터 확인 실시]
                String strData = String.valueOf(doubleData);
                for (int i=0; i<strData.length(); i++){
                    if (strData.charAt(i) == '.'){ // 문자열 특정 자릿수가 점 (.) 인 경우
                        dotCount = dotCount + 1; // 카운트 증가
                        dotLocation = i; // 위치 지정

                        String subString = strData.substring((dotLocation + 1), strData.length());
                        dotLength = subString.length(); // 소수점 이하 자릿수 확인
                    }
                }

                // [정상적으로 소수점이 포함된 경우]
                if (dotCount == 1){
                    if (length > dotLength){ // [원본 데이터 보다 인풋값이 큰 경우 >> 0 값으로 채움]
                        result = strData.substring(0, strData.length());

                        int zeroCount = length - dotLength;
                        for (int j=0; j<zeroCount; j++){
                            result = result + "0";
                        }
                    }
                    else {
                        if (length == 0){
                            result = strData.substring(0, (dotLocation + length));
                        }
                        else {
                            result = strData.substring(0, (dotLocation + length + 1));
                        }
                    }
                }
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }

        // [로그 출력]
        ///*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("doubleCutLength"));
        System.out.println("[INPUT] [DOUBLE] : "+String.valueOf(doubleData));
        System.out.println("[INPUT] [LENGTH] : "+String.valueOf(length));
        System.out.println("[RETURN] [STRING] : "+String.valueOf(result));
        System.out.println("================================================");
        System.out.println("\n");
        // */

        // [리턴 데이터 반환 실시]
        return result;
    }





    // TODO [인풋으로 들어온 배열 데이터 중 부분 배열 데이터 반환 실시]
    public static ArrayList arraySubList(ArrayList list, int startIdx, int endIdx){

        /**
         * // -----------------------------------------
         * [arraySubList 메소드 설명]
         * // -----------------------------------------
         * 1. 인풋으로 들어온 배열 데이터 중 부분 배열 데이터 반환 실시
         * // -----------------------------------------
         * 2. 호출 방식 :
         *   ArrayList list = new ArrayList();
         *   list.add("하나");
         *   list.add("둘");
         *   list.add("셋");
         *   list.add("넷");
         *   list.add("다섯");
         *
         *   C_Util.arraySubList(list, 0, list.size()-1); // [배열 전체 데이터]
         *   C_Util.arraySubList(list, 1, 3); // [배열 부분 데이터 : 1, 2, 3 인덱스 데이터 출력]
         * // -----------------------------------------
         * 3. 리턴 데이터 : [하나, 둘, 셋, 넷, 다섯] / [둘, 셋, 넷]
         * // -----------------------------------------
         * */

        // [리턴 데이터 변수 선언 실시]
        ArrayList result = new ArrayList();

        // [인풋 데이터 체크 수행 실시]
        if (list != null && list.size()>0
                && startIdx >= 0 && startIdx <= endIdx
                && endIdx >= 0 && endIdx >= startIdx){

            try {
                // [subList 를 사용해 배열 자르기 수행 실시]
                result = new ArrayList(list.subList(startIdx, (endIdx+1)));
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }

        // [로그 출력]
        ///*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("arraySubList"));
        System.out.println("[INPUT] [LIST] : "+String.valueOf(list.toString()));
        System.out.println("[INPUT] [START] : "+String.valueOf(startIdx));
        System.out.println("[INPUT] [END] : "+String.valueOf(endIdx));
        System.out.println("[RETURN] [LENGTH] : "+String.valueOf(result.size()));
        System.out.println("[RETURN] [LIST] : "+String.valueOf(result));
        System.out.println("================================================");
        System.out.println("\n");
        // */

        // [리턴 데이터 반환 실시]
        return result;
    }





    // TODO [ArrayList 배열 데이터 교집합 수행 실시]
    public static ArrayList arrayIntersect(ArrayList array_1, ArrayList array_2){

        /**
         * // -----------------------------------------
         * [arrayIntersect 메소드 설명]
         * // -----------------------------------------
         * 1. ArrayList 배열 데이터 교집합 수행 실시
         * // -----------------------------------------
         * 2. 호출 방식 :
         *   ArrayList list_1 = new ArrayList();
         *   list_1.add("하나");
         *   list_1.add("둘");
         *   list_1.add("셋");
         *
         *   ArrayList list_2 = new ArrayList();
         *   list_2.add("둘");
         *   list_2.add("셋");
         *   list_2.add("넷");
         *
         *   C_Util.arrayIntersect(list_1, list_2);
         * // -----------------------------------------
         * 3. 리턴 데이터 : [둘, 셋]
         * // -----------------------------------------
         * */

        // [리턴 데이터 변수 선언 실시]
        ArrayList result = new ArrayList();

        // [원본 데이터 저장]
        ArrayList original = new ArrayList();

        // [인풋 데이터 체크 수행 실시]
        if (array_1 != null && array_1.size()>0 && array_1.isEmpty() == false
                && array_2 != null && array_2.size()>0 && array_2.isEmpty() == false){

            try {
                // [원본 데이터 저장 실시]
                original = new ArrayList(array_1);

                // [retainAll 사용해 배열 데이터 교집합 실시]
                array_1.retainAll(array_2);
                result = new ArrayList(array_1);
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }

        // [로그 출력]
        ///*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("arrayIntersect"));
        System.out.println("[INPUT] [array_1] : "+String.valueOf(original));
        System.out.println("[INPUT] [array_2] : "+String.valueOf(array_2));
        System.out.println("[RETURN] : "+String.valueOf(result));
        System.out.println("================================================");
        System.out.println("\n");
        // */

        // [리턴 데이터 반환 실시]
        return result;
    }




    // TODO [Mysql 전용 프로시저 호출 리턴 메시지 + 리턴 테이블 데이터 형식 JSON 포맷 실시]
    public static JSONObject mySqlMsgCursorJsonFormat (List<List<Map<String, Object>>> totalData, String O_MSG_NAME, String O_CUR_NAME) {

        /**
         * // -----------------------------------------
         * [mySqlMsgCursorJsonFormat 메소드 설명]
         * // -----------------------------------------
         * 1. Mysql 전용 프로시저 호출 리턴 메시지 + 리턴 테이블 데이터 형식 JSON 포맷 실시
         * // -----------------------------------------
         * 2. Mysql 프로시저 호출 리턴 메시지, 테이블 조회 데이터는 개별 List Map 형식으로 받습니다
         * // -----------------------------------------
         * 3. Mybatis 참고 코드 :
         *     <resultMap id="PRO_SEL_TEST_USER_RESULT_O_MSG" type="hashmap" />
         *     <resultMap id="PRO_SEL_TEST_USER_RESULT_O_CURSOR" type="hashmap" />
         *     <select id="PRO_SEL_TEST_USER" parameterType="hashmap" resultMap="PRO_SEL_TEST_USER_RESULT_O_MSG, PRO_SEL_TEST_USER_RESULT_O_CURSOR" statementType="CALLABLE">
         *         <![CDATA[
         *         { call PRO_SEL_TEST_USER(
         *                 #{I_DEPT_NAME, mode=IN, jdbcType=VARCHAR, javaType=string},
         *
         *                 #{O_MSG}
         *             )}
         *         ]]>
         *     </select>
         * // -----------------------------------------
         * 4. 호출 방식 :
         *
         * // [service 호출 수행]
         * List<List<Map<String, Object>>> serviceData = db_maria_api_service.PRO_SEL_TEST_USER("백제");
         *
         * // [리턴 받은 결과 JSON 포맷 실시 : 메시지, 테이블]
         * JSONObject returnData = new JSONObject();
         * returnData = C_Util.mySqlMsgCursorJsonFormat(serviceData, "O_MSG", "O_CUR");
         * // -----------------------------------------
         * 5. 리턴 데이터 :
         * {"O_MSG":"Y : SUCCESS : M_DEGUB : [2]","O_CUR":[{"T_NAME":"의자왕","T_DEPT":"백제","T_PHONE":"010-1234-5684"}]}
         * // -----------------------------------------
         * */

        // [리턴 데이터 선언 실시]
        JSONObject returnJson = new JSONObject();


        // [로직 처리 수행 실시]
        try {
            // [사전 인풋 데이터 널 체크 실시]
            if (O_MSG_NAME != null
                    && O_MSG_NAME.length()>0
                    && O_MSG_NAME.trim().equals("") == false
                    && O_MSG_NAME.trim().equals("null") == false
                    && O_MSG_NAME.trim().equals("undefined") == false

                    && O_CUR_NAME != null
                    && O_CUR_NAME.length()>0
                    && O_CUR_NAME.trim().equals("") == false
                    && O_CUR_NAME.trim().equals("null") == false
                    && O_CUR_NAME.trim().equals("undefined") == false

                    && totalData != null
                    && totalData.size()>1){ // [널이 아닌 경우]

                // [리턴 데이터 반환 실시]
                int curIdx = 0;
                for(int i=0; i<totalData.size(); i++){
                    JSONArray parseArray = new JSONArray(totalData.get(i));

                    if (parseArray.length() == 1){
                        JSONObject msgObj = new JSONObject(String.valueOf(parseArray.get(0)));
                        if (msgObj.has(String.valueOf(O_MSG_NAME))){ // [메시지인 경우]
                            returnJson.put(String.valueOf(O_MSG_NAME), String.valueOf(msgObj.get(O_MSG_NAME)));
                        }
                        else { // [커서 데이터인 경우]
                            curIdx = i;
                        }
                    }
                    else { // [커서 데이터인 경우]
                        curIdx = i;
                    }
                }

                // [리턴 테이블 반환]
                returnJson.put(String.valueOf(O_CUR_NAME), new JSONArray(totalData.get(curIdx)));
            }
            else {
                // [에러 출력]
                ///*
                System.out.println("\n");
                System.out.println("================================================");
                System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
                System.out.println("[METHOD] : "+String.valueOf("mySqlMsgCursorJsonFormat"));
                System.out.println("[ERROR] : "+String.valueOf("Json Total Data Size Error"));
                System.out.println("================================================");
                System.out.println("\n");
                // */
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }


        // [로그 출력]
        ///*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("mySqlMsgCursorJsonFormat"));
        System.out.println("[INPUT] : [totalData] : "+String.valueOf(totalData.toString()));
        System.out.println("[INPUT] : [O_MSG_NAME] : "+String.valueOf(O_MSG_NAME));
        System.out.println("[INPUT] : [O_CUR_NAME] : "+String.valueOf(O_CUR_NAME));
        System.out.println("[RETURN] : [JSON] : "+String.valueOf(returnJson.toString()));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 데이터 반환 실시]
        return returnJson;
    }




    // TODO [프로시저 호출 리턴 메시지 JSON 형식 포맷 실시]
    public static JSONObject procMsgJsonFormat (String O_MSG_NAME, String O_MSG_DATA) {

        /**
         * // -----------------------------------------
         * [procMsgJsonFormat 메소드 설명]
         * // -----------------------------------------
         * 1. 프로시저 호출 리턴 메시지 JSON 형식 포맷 실시
         * // -----------------------------------------
         * 2. Mybatis 참고 코드 :
         *     <select id="PRO_SEL_TEST_USER" parameterType="hashmap" resultType="String" statementType="CALLABLE">
         *         <![CDATA[
         *         { call PRO_SEL_TEST_USER(
         *                 #{I_DEPT_NAME, mode=IN, jdbcType=VARCHAR, javaType=string},
         *
         *                 #{O_MSG}
         *             )}
         *         ]]>
         *     </select>
         * // -----------------------------------------
         * 3. 호출 방식 :
         *
         * // [service 호출 수행]
         * String serviceData = db_maria_api_service.PRO_SEL_TEST_USER("백제");
         *
         * // [리턴 받은 결과 JSON 포맷 실시 : 메시지, 테이블]
         * JSONObject returnData = new JSONObject();
         * returnData = C_Util.procMsgJsonFormat("O_MSG", serviceData);
         * // -----------------------------------------
         * 4. 리턴 데이터 :
         * {"O_MSG":"Y : SUCCESS : M_DEGUB : [2]"}
         * // -----------------------------------------
         * */

        // [리턴 데이터 선언 실시]
        JSONObject returnJson = new JSONObject();


        // [로직 처리 수행 실시]
        try {

            // [사전 인풋 데이터 널 체크 실시]
            if (O_MSG_NAME != null
                    && O_MSG_NAME.length()>0
                    && O_MSG_NAME.trim().equals("") == false
                    && O_MSG_NAME.trim().equals("null") == false
                    && O_MSG_NAME.trim().equals("undefined") == false

                    && O_MSG_DATA != null
                    && O_MSG_DATA.length()>0
                    && O_MSG_DATA.trim().equals("") == false
                    && O_MSG_DATA.trim().equals("null") == false
                    && O_MSG_DATA.trim().equals("undefined") == false){ // [널이 아닌 경우]

                // [JSON 데이터 삽입 실시]
                returnJson.put(String.valueOf(O_MSG_NAME), String.valueOf(O_MSG_DATA));
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }


        // [로그 출력]
        /*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("procMsgJsonFormat"));
        System.out.println("[INPUT] : [O_MSG_NAME] : "+String.valueOf(O_MSG_NAME));
        System.out.println("[INPUT] : [O_MSG_DATA] : "+String.valueOf(O_MSG_DATA));
        System.out.println("[RETURN] : [JSON] : "+String.valueOf(returnJson.toString()));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 데이터 반환 실시]
        return returnJson;
    }




    // TODO [테이블 select 다중 결과 리턴 JSON 형식 포맷 실시]
    public static JSONObject selectJsonFormat (String O_CUR_NAME, List<Map<String, Object>> O_CUR_DATA) {

        /**
         * // -----------------------------------------
         * [selectJsonFormat 메소드 설명]
         * // -----------------------------------------
         * 1. 테이블 select 다중 결과 리턴 JSON 형식 포맷 실시
         * // -----------------------------------------
         * 2. 테이블 조회 데이터는 개별 List Map 형식으로 받습니다
         * // -----------------------------------------
         * 3. Mybatis 참고 코드 :
         *      <select id="TEST_SELECT" parameterType="hashmap" resultType="hashmap">
         *         <![CDATA[
         *         select *
         *             from TEST_USER
         *         where T_DEPT = #{I_DEPT}
         *         ]]>
         *     </select>
         * // -----------------------------------------
         * 4. 호출 방식 :
         *
         * // [service 호출 수행]
         * List<Map<String, Object>> serviceData = db_maria_api_service.TEST_SELECT("백제");
         *
         * // [리턴 받은 결과 JSON 포맷 실시 : 메시지, 테이블]
         * JSONObject returnData = new JSONObject();
         * returnData = C_Util.selectJsonFormat(serviceData, "O_CUR", serviceData);
         * // -----------------------------------------
         * 5. 리턴 데이터 :
         * {"O_CUR":[{"T_NAME":"의자왕","T_DEPT":"백제","T_PHONE":"010-1234-5684"}]}
         * // -----------------------------------------
         * */

        // [리턴 데이터 선언 실시]
        JSONObject returnJson = new JSONObject();


        // [로직 처리 수행 실시]
        try {

            // [사전 인풋 데이터 널 체크 실시]
            if (O_CUR_NAME != null
                    && O_CUR_NAME.length()>0
                    && O_CUR_NAME.trim().equals("") == false
                    && O_CUR_NAME.trim().equals("null") == false
                    && O_CUR_NAME.trim().equals("undefined") == false

                    && O_CUR_DATA != null){

                // [JSON 데이터 삽입 실시]
                returnJson.put(String.valueOf(O_CUR_NAME), new JSONArray(O_CUR_DATA));
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }


        // [로그 출력]
        ///*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("selectJsonFormat"));
        System.out.println("[INPUT] : [O_CUR_NAME] : "+String.valueOf(O_CUR_NAME));
        System.out.println("[INPUT] : [O_CUR_DATA] : "+String.valueOf(O_CUR_DATA.toString()));
        System.out.println("[RETURN] : [JSON] : "+String.valueOf(returnJson.toString()));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 데이터 반환 실시]
        return returnJson;
    }






    // TODO [insert , update , delete 수행 리턴 메시지 JSON 형식 포맷 실시]
    public static JSONObject InsertUpdateDeleteMsgJsonFormat (String O_MSG_NAME, String O_MSG_DATA) {

        /**
         * // -----------------------------------------
         * [InsertUpdateDeleteMsgJsonFormat 메소드 설명]
         * // -----------------------------------------
         * 1. insert , update , delete 수행 리턴 메시지 JSON 형식 포맷 실시
         * // -----------------------------------------
         * 2. 호출 방식 :
         *
         * // [service 호출 수행]
         * int serviceData = db_maria_api_service.TEST_INSERT(input);
         *
         * // [리턴 받은 결과 JSON 포맷 실시 : 메시지, 테이블]
         * if (serviceData > 0){
         *     JSONObject returnData = new JSONObject();
         *     returnData = C_Util.InsertUpdateDeleteMsgJsonFormat("O_MSG", serviceData);
         * }
         * // -----------------------------------------
         * 3. 리턴 데이터 :
         * {"O_MSG":"Y : SUCCESS"}
         * // -----------------------------------------
         * */

        // [리턴 데이터 선언 실시]
        JSONObject returnJson = new JSONObject();


        // [로직 처리 수행 실시]
        try {

            // [사전 인풋 데이터 널 체크 실시]
            if (O_MSG_NAME != null
                    && O_MSG_NAME.length()>0
                    && O_MSG_NAME.trim().equals("") == false
                    && O_MSG_NAME.trim().equals("null") == false
                    && O_MSG_NAME.trim().equals("undefined") == false

                    && O_MSG_DATA != null
                    && O_MSG_DATA.length()>0
                    && O_MSG_DATA.trim().equals("") == false
                    && O_MSG_DATA.trim().equals("null") == false
                    && O_MSG_DATA.trim().equals("undefined") == false){ // [널이 아닌 경우]

                // [JSON 데이터 삽입 실시]
                returnJson.put(String.valueOf(O_MSG_NAME), String.valueOf(O_MSG_DATA));
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }


        // [로그 출력]
        ///*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("InsertUpdateDeleteMsgJsonFormat"));
        System.out.println("[INPUT] : [O_MSG_NAME] : "+String.valueOf(O_MSG_NAME));
        System.out.println("[INPUT] : [O_MSG_DATA] : "+String.valueOf(O_MSG_DATA));
        System.out.println("[RETURN] : [JSON] : "+String.valueOf(returnJson.toString()));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 데이터 반환 실시]
        return returnJson;
    }





    // TODO [map 데이터를 jsonObject 로 반환 실시]
    public static JSONObject mapToJsonObject (Map<String, Object> inputMap) {

        /**
         * // -----------------------------------------
         * [mapToJsonObject 메소드 설명]
         * // -----------------------------------------
         * 1. map 데이터를 jsonObject 로 반환 실시
         * // -----------------------------------------
         * 2. 호출 방식 :
         *
         * Map map = new HashMap();
         * map.put("name", "투케이");
         *
         * JSONObject returnData = C_Util.mapToJsonObject(map);
         * // -----------------------------------------
         * 3. 리턴 데이터 : {"name":"투케이"}
         * // -----------------------------------------
         * */

        // [리턴 데이터 선언 실시]
        JSONObject returnJson = new JSONObject();


        // [로직 처리 수행 실시]
        try {
            // [사전 인풋 데이터 널 체크 실시]
            if (inputMap != null && inputMap.size()>0 && inputMap.keySet().isEmpty() == false){

                // [JSON 데이터 삽입 실시]
                returnJson = new JSONObject(inputMap);
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }


        // [로그 출력]
        ///*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("mapToJsonObject"));
        System.out.println("[INPUT] : [inputMap] : "+String.valueOf(inputMap.toString()));
        System.out.println("[RETURN] : [JSON] : "+String.valueOf(returnJson.toString()));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 데이터 반환 실시]
        return returnJson;
    }





    // TODO [List Map 데이터를 JsonArray 로 반환 실시]
    public static JSONArray listMapToJsonArray (List<Map<String, Object>> inputData) {

        /**
         * // -----------------------------------------
         * [listMapToJsonArray 메소드 설명]
         * // -----------------------------------------
         * 1. List Map 데이터를 JsonArray 로 반환 실시
         * // -----------------------------------------
         * 2. 호출 방식 :
         *
         * List<Map<String, Object>> listMapInsert = new ArrayList<Map<String, Object>>();
         *
         * // [for 반복문을 순회하면서 데이터 삽입 실시]
         * for(int i=1; i<=3; i++) {
         *     // [Map 객체 생성 및 데이터 생성]
         *     Map<String, Object> map = new HashMap<String, Object>();
         *     map.put(String.valueOf(i), i+"value");
         *
         *     // [List Map 에 배열에 데이터 삽입 실시]
         *     listMapInsert.add(map);
         * }
         *
         * JSONArray returnData = C_Util.listMapToJsonArray(listMapInsert);
         * // -----------------------------------------
         * 3. 리턴 데이터 : [{"1":"1value"},{"2":"2value"},{"3":"3value"}]
         * // -----------------------------------------
         * */

        // [리턴 데이터 선언 실시]
        JSONArray returnJson = new JSONArray();


        // [로직 처리 수행 실시]
        try {
            // [사전 인풋 데이터 널 체크 실시]
            if (inputData != null && inputData.size()>0 && inputData.isEmpty() == false){

                // [JSON 데이터 삽입 실시]
                returnJson = new JSONArray(inputData);
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }


        // [로그 출력]
        ///*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("listMapToJsonArray"));
        System.out.println("[INPUT] : [inputData] : "+String.valueOf(inputData.toString()));
        System.out.println("[RETURN] : [JSON] : "+String.valueOf(returnJson.toString()));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 데이터 반환 실시]
        return returnJson;
    }





    // TODO [List List Map 데이터를 JsonArray 로 반환 실시]
    public static JSONArray listListMapToJsonArray (List<List<Map<String, Object>>> inputData) {

        /**
         * // -----------------------------------------
         * [listListMapToJsonArray 메소드 설명]
         * // -----------------------------------------
         * 1. List List Map 데이터를 JsonArray 로 반환 실시
         * // -----------------------------------------
         * 2. 호출 방식 :
         *
         * List<List<Map<String, Object>>> listMapInsert = new ArrayList();
         *
         * List<Map<String, Object>> oneList = new ArrayList();
         * Map<String, Object> oneMap = new HashMap<String, Object>();
         * oneMap.put("name", "twok");
         * oneList.add(oneMap);
         *
         * List<Map<String, Object>> twoList = new ArrayList();
         * Map<String, Object> twoMap = new HashMap<String, Object>();
         * twoMap.put("name", "투케이");
         * twoList.add(twoMap);
         *
         * listMapInsert.add(oneList);
         * listMapInsert.add(twoList);
         *
         * JSONArray returnData = C_Util.listListMapToJsonArray(listMapInsert);
         * // -----------------------------------------
         * 3. 리턴 데이터 : [[{"name":"twok"}],[{"name":"투케이"}]]
         * // -----------------------------------------
         * */

        // [리턴 데이터 선언 실시]
        JSONArray returnJson = new JSONArray();


        // [로직 처리 수행 실시]
        try {
            // [사전 인풋 데이터 널 체크 실시]
            if (inputData != null && inputData.size()>0 && inputData.isEmpty() == false){

                // [JSON 데이터 삽입 실시]
                returnJson = new JSONArray(inputData);
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }


        // [로그 출력]
        ///*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("listListMapToJsonArray"));
        System.out.println("[INPUT] : [inputData] : "+String.valueOf(inputData.toString()));
        System.out.println("[RETURN] : [JSON] : "+String.valueOf(returnJson.toString()));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 데이터 반환 실시]
        return returnJson;
    }





    // TODO [원본 string > base64 인코딩 > URL 인코딩 문자열 변환 실시]
    public static String stringToBase64AndUrlEncodeString (String inputData) {

        /**
         * // -----------------------------------------
         * [stringToBase64AndUrlEncodeString 메소드 설명]
         * // -----------------------------------------
         * 1. 원본 string > base64 인코딩 > URL 인코딩 문자열 변환 실시
         * // -----------------------------------------
         * 2. 호출 방식 :
         * C_Util.stringToBase64AndUrlEncodeString("안녕@#hello");
         * // -----------------------------------------
         * 3. 리턴 데이터 :
         * 7JWI64WVQCNoZWxsbw%3D%3D
         * // -----------------------------------------
         * */

        // [리턴 데이터 선언 실시]
        String base64Encode = "";
        String returnData = "";


        // [로직 처리 수행 실시]
        try {

            // [사전 인풋 데이터 널 체크 실시]
            if (inputData != null
                    && inputData.length()>0
                    && inputData.trim().equals("") == false
                    && inputData.trim().equals("null") == false
                    && inputData.trim().equals("undefined") == false){ // [널이 아닌 경우]

                // [base64 변환 수행 실시]
                base64Encode = String.valueOf(new String(Base64.encodeBase64(inputData.getBytes("UTF-8"))));

                // [URL 인코딩 변환 수행 실시]
                String urlEncode = URLEncoder.encode(base64Encode, "UTF-8");

                // [리턴 변수에 삽입]
                returnData = String.valueOf(urlEncode);
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }


        // [로그 출력]
        ///*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("stringToBase64AndUrlEncodeString"));
        System.out.println("[INPUT] : "+String.valueOf(inputData));
        System.out.println("[FORMAT] : [BASE64] : "+String.valueOf(inputData));
        System.out.println("[RETURN] : [URL] : "+String.valueOf(returnData));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 데이터 반환 실시]
        return returnData;
    }





    // TODO [url 인코딩 + base64 로 된 문자열 > Url 디코딩 > base64 디코딩 >원본 string 반환 실시]
    public static String stringToUrlAndBase64DecodeString (String inputData) {

        /**
         * // -----------------------------------------
         * [stringToUrlAndBase64DecodeString 메소드 설명]
         * // -----------------------------------------
         * 1. url 인코딩 + base64 로 된 문자열 > Url 디코딩 > base64 디코딩 >원본 string 반환 실시
         * // -----------------------------------------
         * 2. 호출 방식 :
         * C_Util.stringToUrlAndBase64DecodeString("7JWI64WVQCNoZWxsbw%3D%3D");
         * // -----------------------------------------
         * 3. 리턴 데이터 :
         * 안녕@#hello
         * // -----------------------------------------
         * */

        // [리턴 데이터 선언 실시]
        String base64String = "";
        String returnData = "";


        // [로직 처리 수행 실시]
        try {

            // [사전 인풋 데이터 널 체크 실시]
            if (inputData != null
                    && inputData.length()>0
                    && inputData.trim().equals("") == false
                    && inputData.trim().equals("null") == false
                    && inputData.trim().equals("undefined") == false){ // [널이 아닌 경우]

                if (inputData.contains("%") == true){ // [URL 인코딩 된 base64 문자열 인 경우]
                    base64String = URLDecoder.decode(inputData,  "UTF-8");
                }
                else { // [base64 문자열로만 구성된 경우]
                    base64String = inputData;
                }
                // [base64 디코딩 수행 실시]
                byte textBytes[] = Base64.decodeBase64(base64String);

                // [리턴 변수에 삽입]
                returnData = new String(textBytes, "UTF-8");
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }


        // [로그 출력]
        ///*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("stringToUrlAndBase64DecodeString"));
        System.out.println("[INPUT] : "+String.valueOf(inputData));
        System.out.println("[FORMAT] : [BASE64] : "+String.valueOf(base64String));
        System.out.println("[RETURN] : [STRING] : "+String.valueOf(returnData));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 데이터 반환 실시]
        return returnData;
    }





    // TODO [url 인코딩 + base64 로 된 문자열 > base64 문자열로 반환 실시]
    public static String urlAndBase64Tobase64String (String inputData) {

        /**
         * // -----------------------------------------
         * [urlAndBase64Tobase64String 메소드 설명]
         * // -----------------------------------------
         * 1. url 인코딩 + base64 로 된 문자열 > base64 문자열로 반환 실시
         * // -----------------------------------------
         * 2. 호출 방식 :
         * C_Util.urlAndBase64Tobase64String("7JWI64WVQCNoZWxsbw%3D%3D");
         * // -----------------------------------------
         * 3. 리턴 데이터 :
         * 7JWI64WVQCNoZWxsbw==
         * // -----------------------------------------
         * */

        // [리턴 데이터 선언 실시]
        String base64String = "";
        String returnData = "";


        // [로직 처리 수행 실시]
        try {

            // [사전 인풋 데이터 널 체크 실시]
            if (inputData != null
                    && inputData.length()>0
                    && inputData.trim().equals("") == false
                    && inputData.trim().equals("null") == false
                    && inputData.trim().equals("undefined") == false){ // [널이 아닌 경우]

                if (inputData.contains("%") == true){ // [URL 인코딩 된 base64 문자열 인 경우]
                    base64String = URLDecoder.decode(inputData,  "UTF-8");
                }
                else { // [base64 문자열로만 구성된 경우]
                    base64String = inputData;
                }

                // [리턴 변수에 삽입]
                returnData = String.valueOf(base64String);
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }


        // [로그 출력]
        ///*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("urlAndBase64Tobase64String"));
        System.out.println("[INPUT] : "+String.valueOf(inputData));
        System.out.println("[RETURN] : "+String.valueOf(returnData));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 데이터 반환 실시]
        return returnData;
    }





    // TODO [원본 string > base64 인코딩 > URL 인코딩 문자열 변환 실시]
    public static String stringToAes128AndUrlEncodeString (String aes128SecretKey, byte[] aes128ivBytes, String data) {

        /**
         * // -----------------------------------------
         * [stringToBase64AndUrlEncodeString 메소드 설명]
         * // -----------------------------------------
         * 1. 원본 string > base64 인코딩 > URL 인코딩 문자열 변환 실시
         * // -----------------------------------------
         * 2. 호출 방식 :
         * C_Util.stringToAes128AndUrlEncodeString("0123456789abcdef", new byte[16], "hello@@안녕");
         * C_Util.stringToAes128AndUrlEncodeString("0123456789abcdef", "0123456789abcdef".getBytes("UTF-8"), "hello@@안녕");
         * // -----------------------------------------
         * 3. 리턴 데이터 :
         * a9KPLoYb6DOiq7KNoyLmlQ%3D%3D
         * t9fQzooP8YOkDsUl0Lt1%2BA%3D%3D
         * // -----------------------------------------
         * */

        // [리턴 데이터 선언 실시]
        String aes128Encode = "";
        String returnData = "";


        // [로직 처리 수행 실시]
        try {

            // [사전 인풋 데이터 널 체크 실시]
            if (aes128SecretKey != null
                    && aes128SecretKey.length()>0
                    && aes128SecretKey.trim().equals("") == false
                    && aes128SecretKey.trim().equals("null") == false
                    && aes128SecretKey.trim().equals("undefined") == false

                    && aes128ivBytes != null

                    && data != null
                    && data.length()>0
                    && data.trim().equals("") == false
                    && data.trim().equals("null") == false
                    && data.trim().equals("undefined") == false){ // [널이 아닌 경우]

                // [AES 128 암호화 수행 실시]
                aes128Encode = String.valueOf(
                        C_Encryption.getAES128EncodeString(aes128SecretKey, aes128ivBytes, data)
                );

                // [URL 인코딩 변환 수행 실시]
                String urlEncode = URLEncoder.encode(aes128Encode, "UTF-8");

                // [리턴 변수에 삽입]
                returnData = String.valueOf(urlEncode);
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }


        // [로그 출력]
        /*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("stringToAes128AndUrlEncodeString"));
        System.out.println("[INPUT] : [KEY] : "+String.valueOf(aes128SecretKey));
        System.out.println("[INPUT] : [IV] : "+String.valueOf(Arrays.toString(aes128ivBytes)));
        System.out.println("[INPUT] : [DATA] : "+String.valueOf(data));
        System.out.println("[FORMAT] : [AES128] : "+String.valueOf(aes128Encode));
        System.out.println("[RETURN] : [URL] "+String.valueOf(returnData));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 데이터 반환 실시]
        return returnData;
    }





    // TODO [aes128 + URL 인코딩 문자열 > url 디코딩 > aes128 디코딩 > 원본 문자열 변환 실시]
    public static String aes128AndUrlToDecodeString (String aes128SecretKey, byte[] aes128ivBytes, String data) {

        /**
         * // -----------------------------------------
         * [stringToBase64AndUrlEncodeString 메소드 설명]
         * // -----------------------------------------
         * 1. aes128 + URL 인코딩 문자열 > url 디코딩 > aes128 디코딩 > 원본 문자열 변환 실시
         * // -----------------------------------------
         * 2. 호출 방식 :
         * C_Util.aes128AndUrlToDecodeString("0123456789abcdef", new byte[16], "a9KPLoYb6DOiq7KNoyLmlQ%3D%3D");
         * C_Util.aes128AndUrlToDecodeString("0123456789abcdef", "0123456789abcdef".getBytes("UTF-8"), "t9fQzooP8YOkDsUl0Lt1%2BA%3D%3D");
         * // -----------------------------------------
         * 3. 리턴 데이터 :
         *
         * hello@@안녕
         * hello@@안녕
         * // -----------------------------------------
         * */

        // [리턴 데이터 선언 실시]
        String base64String = "";
        String returnData = "";


        // [로직 처리 수행 실시]
        try {

            // [사전 인풋 데이터 널 체크 실시]
            if (aes128SecretKey != null
                    && aes128SecretKey.length()>0
                    && aes128SecretKey.trim().equals("") == false
                    && aes128SecretKey.trim().equals("null") == false
                    && aes128SecretKey.trim().equals("undefined") == false

                    && aes128ivBytes != null

                    && data != null
                    && data.length()>0
                    && data.trim().equals("") == false
                    && data.trim().equals("null") == false
                    && data.trim().equals("undefined") == false){ // [널이 아닌 경우]

                if (data.contains("%") == true){ // [URL 인코딩 된 base64 문자열 인 경우]
                    base64String = URLDecoder.decode(data,  "UTF-8");
                }
                else { // [base64 문자열로만 구성된 경우]
                    base64String = data;
                }

                // [AES 128 복호화 수행 실시]
                String aes128Decode = String.valueOf(
                        C_Encryption.getAES128DecodeString(aes128SecretKey, aes128ivBytes, base64String)
                );

                // [리턴 변수에 삽입]
                returnData = String.valueOf(aes128Decode);
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }


        // [로그 출력]
        /*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("aes128AndUrlToDecodeString"));
        System.out.println("[INPUT] : [KEY] : "+String.valueOf(aes128SecretKey));
        System.out.println("[INPUT] : [IV] : "+String.valueOf(Arrays.toString(aes128ivBytes)));
        System.out.println("[INPUT] : [DATA] : "+String.valueOf(data));
        System.out.println("[FORMAT] : [AES128] : "+String.valueOf(base64String));
        System.out.println("[RETURN] : [STRING] : "+String.valueOf(returnData));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 데이터 반환 실시]
        return returnData;
    }





    // TODO [HashMap 객체 널 판단 실시 : true / false]
    public static boolean mapNotNull (Map inputData) {

        /**
         * // -----------------------------------------
         * [mapNotNull 메소드 설명]
         * // -----------------------------------------
         * 1. HashMap 객체 널 판단 실시
         * // -----------------------------------------
         * 2. 호출 방식 :
         *
         * C_Util.mapNotNull(null);
         *
         * C_Util.mapNotNull(new HashMap());
         *
         * Map map = new HashMap();
         * map.put("name", "TWOK");
         * C_Util.mapNotNull(map);
         * // -----------------------------------------
         * 3. 리턴 데이터 : HashMap 객체가 널이 아닌 경우 true / 널인 경우 false
         * // -----------------------------------------
         * */

        // [리턴 데이터 선언 실시]
        boolean returnData = false;


        // [로직 처리 수행 실시]
        try {

            // [사전 인풋 데이터 널 체크 실시]
            if (inputData != null
                    && inputData.isEmpty() == false
                    && inputData.size() > 0
                    && inputData.keySet().size() > 0){ // [널이 아닌 경우]

                // [리턴 변수에 삽입]
                returnData = true;
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }


        // [로그 출력]
        /*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("mapNotNull"));
        System.out.println("[INPUT] : "+String.valueOf(inputData));
        System.out.println("[RETURN] : "+String.valueOf(returnData));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 데이터 반환 실시]
        return returnData;
    }





    // TODO [List Map 객체 널 판단 실시 : true / false]
    public static boolean listMapNotNull (List<Map<String, Object>> inputData) {

        /**
         * // -----------------------------------------
         * [listMapNotNull 메소드 설명]
         * // -----------------------------------------
         * 1. List Map 객체 널 판단 실시
         * // -----------------------------------------
         * 2. 호출 방식 :
         *
         * C_Util.listMapNotNull(null);
         *
         * List<Map<String, Object>> listMap_1 = new ArrayList<>();
         * C_Util.listMapNotNull(listMap_1);
         *
         * List<Map<String, Object>> listMap_2 = new ArrayList<>();
         * Map map = new HashMap();
         * map.put("name", "TWOK");
         * listMap_2.add(map);
         * C_Util.listMapNotNull(listMap_2);
         * // -----------------------------------------
         * 3. 리턴 데이터 : List Map 객체가 널이 아닌 경우 true / 널인 경우 false
         * // -----------------------------------------
         * */

        // [리턴 데이터 선언 실시]
        boolean returnData = false;


        // [로직 처리 수행 실시]
        try {

            // [사전 인풋 데이터 널 체크 실시]
            if (inputData != null
                    && inputData.isEmpty() == false
                    && inputData.size() > 0){ // [널이 아닌 경우]

                // [리턴 변수에 삽입]
                returnData = true;
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }


        // [로그 출력]
        /*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("listMapNotNull"));
        System.out.println("[INPUT] : "+String.valueOf(inputData));
        System.out.println("[RETURN] : "+String.valueOf(returnData));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 데이터 반환 실시]
        return returnData;
    }





    // TODO [List List Map 객체 널 판단 실시 : true / false]
    public static boolean listListMapNotNull (List<List<Map<String, Object>>> inputData) {

        /**
         * // -----------------------------------------
         * [listListMapNotNull 메소드 설명]
         * // -----------------------------------------
         * 1. List Map 객체 널 판단 실시
         * // -----------------------------------------
         * 2. 호출 방식 :
         *
         * C_Util.listListMapNotNull(null);
         *
         * List<List<Map<String, Object>>> listMap_1 = new ArrayList<>();
         * List<Map<String, Object>> listMap_2 = new ArrayList<>();
         * Map map = new HashMap();
         * map.put("name", "TWOK");
         * listMap_2.add(map);
         * listMap_1.add(listMap_2);
         *
         * C_Util.listListMapNotNull(listMap_1);
         * // -----------------------------------------
         * 3. 리턴 데이터 : List List Map 객체가 널이 아닌 경우 true / 널인 경우 false
         * // -----------------------------------------
         * */

        // [리턴 데이터 선언 실시]
        boolean returnData = false;


        // [로직 처리 수행 실시]
        try {

            // [사전 인풋 데이터 널 체크 실시]
            if (inputData != null
                    && inputData.isEmpty() == false
                    && inputData.size() > 0){ // [널이 아닌 경우]

                // [리턴 변수에 삽입]
                returnData = true;
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }


        // [로그 출력]
        /*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("listListMapNotNull"));
        System.out.println("[INPUT] : "+String.valueOf(inputData));
        System.out.println("[RETURN] : "+String.valueOf(returnData));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 데이터 반환 실시]
        return returnData;
    }





    // TODO [프로시저 호출 리턴 메시지 JSON 형식 포맷 실시]
    public static JSONObject procMsgAndDataFormat (String O_MSG_NAME, String O_MSG_VALUE, String O_DATA_NAME, String O_DATA_VALUE) {

        /**
         * // -----------------------------------------
         * [procMsgAndDataFormat 메소드 설명]
         * // -----------------------------------------
         * 1. JSON 형식 메시지, 데이터 포맷 수행 실시
         * // -----------------------------------------
         * 2. 호출 방식 :
         *
         *
         * // -----------------------------------------
         * 4. 리턴 데이터 :
         * {"O_MSG":"Y : SUCCESS", "O_DATA":"안녕하세요"}
         * // -----------------------------------------
         * */

        // [리턴 데이터 선언 실시]
        JSONObject returnJson = new JSONObject();


        // [로직 처리 수행 실시]
        try {

            // [사전 인풋 데이터 널 체크 실시]
            if (O_MSG_NAME != null
                    && O_MSG_NAME.length()>0
                    && O_MSG_NAME.trim().equals("") == false
                    && O_MSG_NAME.trim().equals("null") == false
                    && O_MSG_NAME.trim().equals("undefined") == false

                    && O_DATA_NAME != null
                    && O_DATA_NAME.length()>0
                    && O_DATA_NAME.trim().equals("") == false
                    && O_DATA_NAME.trim().equals("null") == false
                    && O_DATA_NAME.trim().equals("undefined") == false){ // [널이 아닌 경우]

                // [JSON 데이터 삽입 실시]
                returnJson.put(String.valueOf(O_MSG_NAME), String.valueOf(O_MSG_VALUE));
                returnJson.put(String.valueOf(O_DATA_NAME), String.valueOf(O_DATA_VALUE));
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }


        // [로그 출력]
        /*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("procMsgAndDataFormat"));
        System.out.println("[INPUT] : [O_MSG_NAME] : "+String.valueOf(O_MSG_NAME));
        System.out.println("[INPUT] : [O_MSG_VALUE] : "+String.valueOf(O_MSG_VALUE));
        System.out.println("[INPUT] : [O_DATA_NAME] : "+String.valueOf(O_DATA_NAME));
        System.out.println("[INPUT] : [O_DATA_VALUE] : "+String.valueOf(O_DATA_VALUE));
        System.out.println("[RETURN] : [JSON] : "+String.valueOf(returnJson.toString()));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 데이터 반환 실시]
        return returnJson;
    }





    // TODO [base64 문자열 > URL 인코딩 문자열 변환 실시]
    public static String base64StringToUrlEncodeString (String inputData) {

        /**
         * // -----------------------------------------
         * [base64StringToUrlEncodeString 메소드 설명]
         * // -----------------------------------------
         * 1. base64 문자열 > URL 인코딩 문자열 변환 실시
         * // -----------------------------------------
         * 2. 호출 방식 :
         * C_Util.base64StringToUrlEncodeString("4RVOKXvm5JBqFxfUqt2OT3Qzi8HacCFXC4CtvvdxHGLfMmIDOXa5VQPgPTJpbTxCMYO6DKUiXQctFioE+qXdUdrB1ORw+5savncSzJifr24=");
         * // -----------------------------------------
         * 3. 리턴 데이터 :
         * 4RVOKXvm5JBqFxfUqt2OT3Qzi8HacCFXC4CtvvdxHGLfMmIDOXa5VQPgPTJpbTxCMYO6DKUiXQctFioE%2BqXdUdrB1ORw%2B5savncSzJifr24%3D
         * // -----------------------------------------
         * */

        // [리턴 데이터 선언 실시]
        String returnData = "";


        // [로직 처리 수행 실시]
        try {

            // [사전 인풋 데이터 널 체크 실시]
            if (inputData != null
                    && inputData.length()>0
                    && inputData.trim().equals("") == false
                    && inputData.trim().equals("null") == false
                    && inputData.trim().equals("undefined") == false){ // [널이 아닌 경우]

                // [이미 URL 인코딩 된 문자 인지 확인 실시]
                if (inputData.contains("%")){

                    // [리턴 변수에 삽입]
                    returnData = inputData;
                }
                else {

                    // [URL 인코딩 변환 수행 실시]
                    String urlEncode = URLEncoder.encode(inputData, "UTF-8");

                    // [리턴 변수에 삽입]
                    returnData = String.valueOf(urlEncode);
                }
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }


        // [로그 출력]
        ///*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("base64StringToUrlEncodeString"));
        System.out.println("[INPUT] : "+String.valueOf(inputData));
        System.out.println("[RETURN] : "+String.valueOf(returnData));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 데이터 반환 실시]
        return returnData;
    }





    // TODO [Mysql 전용 프로시저 호출 리턴 메시지 + 리턴 BLOB 이미지 형식을 Blob 이미지로 리턴 실시]
    public static Blob mySqlMsgBlobAndImageReturn (List<List<Map<String, Object>>> totalData, String O_MSG_NAME, String O_MSG_CHECK) {

        /**
         * // -----------------------------------------
         * [mySqlMsgBlobAndImageReturn 메소드 설명]
         * // -----------------------------------------
         * 1. Mysql 전용 프로시저 호출 리턴 메시지 + 리턴 BLOB 이미지 형식을 Blob 이미지로 리턴 실시
         * // -----------------------------------------
         * 2. Mysql 프로시저 호출 리턴 메시지, 테이블 조회 데이터는 개별 List Map 형식으로 받습니다
         * // -----------------------------------------
         * 3. Mybatis 참고 코드 :
         *     <resultMap id="PRO_SEL_PHTO_O_MSG" type="hashmap" />
         *     <resultMap id="PRO_SEL_PHTO_O_CURSOR" type="hashmap" />
         *     <select id="PRO_SEL_PHTO" parameterType="hashmap" resultMap="PRO_SEL_PHTO_O_MSG, PRO_SEL_PHTO_O_CURSOR" statementType="CALLABLE">
         *         <![CDATA[
         *         { call PRO_SEL_PHTO(
         *                 #{IDNO,     mode=IN,    jdbcType=VARCHAR,    javaType=string},
         *
         *                 #{O_MSG}
         *             )}
         *         ]]>
         *     </select>
         * // -----------------------------------------
         * 4. 호출 방식 :
         *
         * // [service 호출 수행]
         * List<List<Map<String, Object>>> serviceData = db_maria_api_service.PRO_SEL_PHTO(map);
         *
         * // [이미지 리턴 실시]
         * Blob returnData = C_Util.mySqlMsgBlobAndImageReturn(serviceData, "O_MSG", "O_CUR");
         * // -----------------------------------------
         * 5. 리턴 데이터 :
         *
         * Blob 이미지 리턴
         * // -----------------------------------------
         * */

        // [리턴 데이터 선언 실시]
        Blob returnBlob = null;


        // [메시지 데이터 삽입 변수 선언]
        String msgData = "";


        // [로직 처리 수행 실시]
        try {
            // [사전 인풋 데이터 널 체크 실시]
            if (O_MSG_NAME != null
                    && O_MSG_NAME.length()>0
                    && O_MSG_NAME.trim().equals("") == false
                    && O_MSG_NAME.trim().equals("null") == false
                    && O_MSG_NAME.trim().equals("undefined") == false

                    && O_MSG_CHECK != null
                    && O_MSG_CHECK.length()>0
                    && O_MSG_CHECK.trim().equals("") == false
                    && O_MSG_CHECK.trim().equals("null") == false
                    && O_MSG_CHECK.trim().equals("undefined") == false

                    && totalData != null
                    && totalData.size()>1){ // [널이 아닌 경우]

                // [리턴 데이터 반환 실시]
                int curIdx = 0;
                for(int i=0; i<totalData.size(); i++){
                    JSONArray parseArray = new JSONArray(totalData.get(i));

                    if (parseArray.length() == 1){
                        JSONObject msgObj = new JSONObject(String.valueOf(parseArray.get(0)));
                        if (msgObj.has(String.valueOf(O_MSG_NAME))){ // [메시지인 경우]

                            // [메시지 삽입]
                            msgData = String.valueOf(msgObj.get(O_MSG_NAME));
                        }
                        else { // [커서 데이터인 경우]
                            curIdx = i;
                        }
                    }
                    else { // [커서 데이터인 경우]
                        curIdx = i;
                    }
                }

                // [메시지 판단 실시]
                if (msgData.trim().startsWith(O_MSG_CHECK.toUpperCase()) == true
                        || msgData.trim().startsWith(O_MSG_CHECK.toLowerCase()) == true){ // [Y 시작 판단]

                    // [배열에 데이터 삽입 : [{T_BLOB=org.mariadb.jdbc.MariaDbBlob@a4eb84be}]]
                    List<Map<String, Object>> blobArray = totalData.get(curIdx);

                    // [데이터 파싱 수행 실시]
                    if (blobArray != null && blobArray.isEmpty() == false && blobArray.size()>0){

                        // [맵으로 데이터 받음 : {T_BLOB=org.mariadb.jdbc.MariaDbBlob@a4eb84be}]
                        Map blobMap = blobArray.get(0);

                        // [맵에 포함된 KEY 확인]
                        Set set = blobMap.keySet();
                        Iterator iterator = set.iterator();
                        while(iterator.hasNext()){
                            String key = (String) iterator.next(); // [KEY]

                            // [리턴 변수에 삽입 실시]
                            returnBlob = (Blob) blobMap.get(key);
                        }
                    }
                }
            }
            else {
                // [에러 출력]
                ///*
                System.out.println("\n");
                System.out.println("================================================");
                System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
                System.out.println("[METHOD] : "+String.valueOf("mySqlMsgBlobAndImageReturn"));
                System.out.println("[ERROR] : "+String.valueOf("Total Data Size Error"));
                System.out.println("================================================");
                System.out.println("\n");
                // */
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }


        // [로그 출력]
        ///*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("mySqlMsgBlobAndImageReturn"));
        System.out.println("[INPUT] : [totalData] : "+String.valueOf(totalData.toString()));
        System.out.println("[INPUT] : [O_MSG_NAME] : "+String.valueOf(O_MSG_NAME));
        System.out.println("[INPUT] : [O_MSG_CHECK] : "+String.valueOf(O_MSG_CHECK));
        System.out.println("[RETURN] : [BLOB] : "+String.valueOf(returnBlob));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 데이터 반환 실시]
        return returnBlob;
    }
    
    
    
    
    
    // TODO [Map 데이터를 http 요청 쿼리 스트링 형태 문자열로 리턴 실시]
    public static String mapToUrlEncodeQueryString (Map<String, Object> inputData) {

        /**
         * // -----------------------------------------
         * [mapToUrlEncodeQueryString 메소드 설명]
         * // -----------------------------------------
         * 1. Map 데이터를 http 요청 쿼리 스트링 형태 문자열로 리턴 실시
         * // -----------------------------------------
         * 2. 호출 방식 :
         *
         * Map<String, Object> map = new HashMap<>();
         * map.put("name", "투케이");
         * map.put("age", 29);
         *
         * C_Util.mapToUrlEncodeQueryString(map);
         * // -----------------------------------------
         * 3. 리턴 데이터 :
         * name=%ED%88%AC%EC%BC%80%EC%9D%B4&age=29
         * // -----------------------------------------
         * */

        // [리턴 데이터 선언 실시]
        String returnData = "";


        // [로직 처리 수행 실시]
        try {

            // [사전 인풋 데이터 널 체크 실시]
            if (inputData != null
                    && inputData.isEmpty() == false
                    && inputData.size()>0){ // [널이 아닌 경우]

                // [map 데이터 key, value 확인]
                Set set = inputData.keySet();
                Iterator iterator = set.iterator();
                while(iterator.hasNext()){
                    if (returnData.length()>0){
                        returnData += "&";
                    }
                    String key = (String) iterator.next();
                    String value = String.valueOf(inputData.get(key));

                    // [리턴 변수에 순차적으로 삽입 실시]
                    returnData += URLEncoder.encode(key, "UTF-8");
                    returnData += "=";
                    returnData += URLEncoder.encode(value, "UTF-8");
                }
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }


        // [로그 출력]
        ///*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("mapToUrlEncodeQueryString"));
        System.out.println("[INPUT] : "+String.valueOf(inputData));
        System.out.println("[RETURN] : "+String.valueOf(returnData));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 데이터 반환 실시]
        return returnData;
    }
    
    
    
    
    
    // TODO [http get, post 쿼리 파람 데이터 요청 포맷 String 리턴 실시]
    public static String queryStringUrlEncode (String url, Map<String, Object> params) {

        /**
         * // -----------------------------------------
         * [queryStringUrlEncode 메소드 설명]
         * // -----------------------------------------
         * 1. http get, post 쿼리 파람 데이터 요청 포맷 String 리턴 실시
         * // -----------------------------------------
         * 2. 호출 방식 :
         *
         * String url = "http://jsonplaceholder.typicode.com/posts";
         *
         * Map<String, Object> map = new HashMap<>();
         * map.put("userId", 1);
         * map.put("id", 1);
         *
         * C_Util.queryStringUrlEncode(url, map);
         * // -----------------------------------------
         * 3. 리턴 데이터 :
         * http://jsonplaceholder.typicode.com/posts?id=1&userId=1
         * // -----------------------------------------
         * */

        // [리턴 데이터 선언 실시]
        String returnData = "";


        // [로직 처리 수행 실시]
        try {

            // [사전 인풋 데이터 널 체크 실시]
            if (url != null
                    && url.isEmpty() == false
                    && url.length()>0
                    && url.trim().equals("") == false
                    && url.trim().equals("undefined") == false
                    && url.trim().equals("null") == false

                    && params != null
                    && params.isEmpty() == false
                    && params.size()>0){ // [널이 아닌 경우]

                // [쿼리 파라미터 형식 주소 설정 실시]
                returnData = url.trim();
                if(returnData.endsWith("?") == true){
                }
                else{
                    returnData = returnData + "?";
                }

                // [파라미터 map 데이터 key, value 확인]
                String paramData = "";
                Set set = params.keySet();
                Iterator iterator = set.iterator();
                while(iterator.hasNext()){
                    if (paramData.length()>0){
                        paramData += "&";
                    }
                    String key = (String) iterator.next();
                    String value = String.valueOf(params.get(key));

                    // [리턴 변수에 순차적으로 삽입 실시]
                    paramData += URLEncoder.encode(key, "UTF-8");
                    paramData += "=";
                    paramData += URLEncoder.encode(value, "UTF-8");
                }

                // [최종 리턴 데이터 삽입]
                returnData = returnData + paramData;
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }


        // [로그 출력]
        ///*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("queryStringUrlEncode"));
        System.out.println("[INPUT] : [URL] : "+String.valueOf(url));
        System.out.println("[INPUT] : [param] : "+String.valueOf(params));
        System.out.println("[RETURN] : "+String.valueOf(returnData));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 데이터 반환 실시]
        return returnData;
    }
    
    
    
    
    
    // TODO [String 문자열 데이터가 URL 형식으로 파싱 가능 한지 체크 실시]
    public static boolean stringIsUrlParsing(String url){

        /**
         * // -----------------------------------------
         * [stringIsUrlParsing 메소드 설명]
         * // -----------------------------------------
         * 1. String 문자열 데이터가 URL 형식으로 파싱 가능 한지 체크 실시
         * // -----------------------------------------
         * 2. 호출 방식 :
         *
         *   C_Util.stringIsUrlParsing("https://www.naver.com");
         *   C_Util.stringIsUrlParsing("test.co.kr");
         * // -----------------------------------------
         * 3. 리턴 데이터 : true / false
         * // -----------------------------------------
         * */

        // [리턴 데이터 변수 선언 실시]
        boolean returnData = false;

        // [인풋 데이터 널 체크 수행 실시]
        if (url != null && url.length()>0 && url.equals("") == false
                && url.trim().equals("null") == false && url.trim().equals("undefined") == false
                && url.startsWith("http") == true){

            try {
                // [URL 형식으로 파싱 가능 한지 확인 실시]
                URL checkUrl = new URL(url);

                // [리턴 변수 삽입 실시]
                returnData = true;
            }
            catch (Exception e){
                //e.printStackTrace();
            }
        }


        // [로그 출력]
        ///*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("stringIsUrlParsing"));
        System.out.println("[INPUT] : "+String.valueOf(url));
        System.out.println("[RETURN] : "+String.valueOf(returnData));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 데이터 반환 실시]
        return returnData;
    }


} // TODO [클래스 종료]

 


 

반응형
Comments