shjung 1 year ago
parent
commit
6771cadb63

+ 19 - 0
pom.xml

@@ -13,6 +13,7 @@
 	<packaging>jar</packaging>
 
 	<properties>
+		<spring.version>2.4.13</spring.version>
 		<java.version>1.8</java.version>
 		<org.projectlombok.version>1.18.20</org.projectlombok.version>
 		<maven.compiler.source>1.8</maven.compiler.source>
@@ -26,6 +27,18 @@
 	</properties>
 
 	<dependencies>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.12</version>
+			<scope>test</scope>
+		</dependency>
+<!--		<dependency>-->
+<!--			<groupId>org.springframwork</groupId>-->
+<!--			<artifactId>spring-test</artifactId>-->
+<!--			<version>${spring.version}</version>-->
+<!--		</dependency>-->
+
 		<dependency>
 			<groupId>org.projectlombok</groupId>
 			<artifactId>lombok</artifactId>
@@ -58,6 +71,12 @@
 			<artifactId>guava</artifactId>
 			<version>26.0-jre</version>
 		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.13.1</version>
+			<scope>test</scope>
+		</dependency>
 
 	</dependencies>
 

+ 31 - 0
src/main/java/com/its/common/ItsCommonApplication.java

@@ -1,9 +1,40 @@
 package com.its.common;
 
+import com.its.common.util.SysUtil;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
 public class ItsCommonApplication {
 
 	public static void main(String[] args) {
 		System.out.println("Starting!");
+
+		log.info("################################################################");
+		log.info("availableProcessors: {}", SysUtil.availableProcessors());
+		log.info("         freeMemory: {}", SysUtil.freeMemory());
+		log.info("        totalMemory: {}", SysUtil.totalMemory());
+		log.info("          maxMemory: {}", SysUtil.maxMemory());
+
+		log.info("################################################################");
+		log.info(SysUtil.classLoadInfo("\n"));
+
+		log.info("################################################################");
+		log.info(SysUtil.compilationInfo("\n"));
+
+		log.info("################################################################");
+		log.info(SysUtil.collectionInfo("\n"));
+
+		log.info("################################################################");
+		log.info(SysUtil.memoryInfo("\n"));
+
+		log.info("################################################################");
+		log.info(SysUtil.osInfo("\n"));
+
+		log.info("################################################################");
+		log.info(SysUtil.threadInfo("\n"));
+
+		log.info("################################################################");
+		log.info(SysUtil.jvmInfo("\n"));
 	}
 
 }

+ 2 - 2
src/main/java/com/its/common/event/EventBus.java

@@ -12,8 +12,8 @@ import java.util.concurrent.*;
 public class EventBus {
 
     private static Map<Class<? extends Event>, List<EventHandler>> listenerMap = new ConcurrentHashMap<>();
-    private static ThreadFactory sceneThreadFactory = new ThreadFactoryBuilder().setNameFormat("event-loop-%d").build();
-    private static ExecutorService singleThreadSchedule = Executors.newSingleThreadScheduledExecutor(sceneThreadFactory);
+    private static final ThreadFactory sceneThreadFactory = new ThreadFactoryBuilder().setNameFormat("event-loop-%d").build();
+    private static final ExecutorService singleThreadSchedule = Executors.newSingleThreadScheduledExecutor(sceneThreadFactory);
 
     public static <E extends Event> void subscribe(Class<? extends Event> eventClass, EventHandler<E> eventHandler) {
         List<EventHandler> eventHandlerList = listenerMap.get(eventClass);

+ 55 - 0
src/main/java/com/its/common/util/ByteUtil.java

@@ -0,0 +1,55 @@
+package com.its.common.util;
+
+//@UtilityClass
+public final class ByteUtil {
+    private ByteUtil() {
+        throw new UnsupportedOperationException("생성자를 지원하지 않습니다.");
+    }
+
+    /**
+     * fourBytes2Int method transfer 4 bytes to int.
+     * @param bytes
+     * @return
+     */
+    public static int fourBytes2Int(byte[] bytes) {
+        if (bytes.length != 4) {
+            throw new IllegalArgumentException("parameter's length must be 4");
+        }
+
+        int val = 0;
+        val += ((bytes[3] & 0xFF) << 24);
+        val += ((bytes[2] & 0xFF) << 16);
+        val += ((bytes[1] & 0xFF) << 8);
+        val += (bytes[0] & 0xFF);
+        return val;
+    }
+
+    /**
+     * int2FourBytes method transfer int to 4 bytes.
+     * @param val
+     * @return
+     */
+    public static byte[] int2FourBytes(int val) {
+        byte[] bytes = new byte[4];
+        bytes[3] = (byte) ((val & 0xFF000000)>>24);
+        bytes[2] = (byte) ((val & 0x00FF0000)>>16);
+        bytes[1] = (byte) ((val & 0x0000FF00)>>8);
+        bytes[0] = (byte) ((val & 0x000000FF));
+        return bytes;
+    }
+
+    /**
+     * bytes2Hex method transfer byte array to hex string.
+     * @param bytes
+     * @return
+     */
+    public static String bytes2Hex(byte[] bytes) {
+        StringBuffer sb = new StringBuffer();//bytes.length * 2);
+        for (byte aByte : bytes) {
+            sb.append(Integer.toHexString((aByte & 0xF0) >> 4));
+            sb.append(Integer.toHexString((aByte & 0x0F)));
+        }
+        return sb.toString();
+    }
+
+}

+ 10 - 6
src/main/java/com/its/common/util/ClassUtil.java

@@ -15,8 +15,9 @@ import java.util.Set;
 import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
 
-public class ClassUtil {
+public final class ClassUtil {
     private ClassUtil() {
+        throw new UnsupportedOperationException("생성자를 지원하지 않습니다.");
     }
 
     public static Set<Class<?>> loadClasses(String packageStr) {
@@ -24,16 +25,17 @@ public class ClassUtil {
         boolean recursive = true;
         String packageName = packageStr;
         String packageDirName = packageName.replace('.', '/');
-        Enumeration<URL> dirs;
+
         try {
-            dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName);
+            Enumeration<URL> dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName);
             while (dirs.hasMoreElements()) {
                 URL url = dirs.nextElement();
                 String protocol = url.getProtocol();
                 if ("file".equals(protocol)) {
                     String filePath = URLDecoder.decode(url.getFile(), "UTF-8");
                     findAndAddClassesInPackageByFile(packageName, filePath, recursive, classes);
-                } else if ("jar".equals(protocol)) {
+                }
+                else if ("jar".equals(protocol)) {
                     JarFile jar;
                     try {
                         jar = ((JarURLConnection) url.openConnection()).getJarFile();
@@ -71,12 +73,14 @@ public class ClassUtil {
                                 }
                             }
                         }
-                    } catch (IOException e) {
+                    }
+                    catch (IOException e) {
                         e.printStackTrace();
                     }
                 }
             }
-        } catch (IOException e) {
+        }
+        catch (IOException e) {
             e.printStackTrace();
         }
 

+ 26 - 21
src/main/java/com/its/common/util/FileUtil.java

@@ -11,11 +11,12 @@ import java.util.List;
 import java.util.function.Predicate;
 
 @Slf4j
-public class FileUtil {
+public final class FileUtil {
 
     private static final Charset DEFAULT_CHARSET = Charset.defaultCharset();
 
     private FileUtil() {
+        throw new UnsupportedOperationException("생성자를 지원하지 않습니다.");
     }
 
     public static byte[] loadFile(final String fileLocation) {
@@ -24,7 +25,8 @@ public class FileUtil {
             final byte[] fileContents = Files.readAllBytes(file.toPath());
 
             return fileContents;
-        } catch (Exception e) {
+        }
+        catch (Exception e) {
             return null;
         }
     }
@@ -99,15 +101,16 @@ public class FileUtil {
 
     public static <T> T getConfigXML(String path, String fileName, Class<T> configClass) {
         T ob = null;
-        fileName = path + File.separatorChar + fileName;
-        if (!new File(fileName).exists()) {
-            return ob;
+        String allFileName = path + File.separatorChar + fileName;
+        if (!new File(allFileName).exists()) {
+            return null;
         }
         Serializer serializer = new Persister();
         try {
-            ob = serializer.read(configClass, new File(fileName));
-        } catch (Exception ex) {
-            log.error("getConfigXML: {}, {}", fileName, ex.getMessage());
+            ob = serializer.read(configClass, new File(allFileName));
+        }
+        catch (Exception ex) {
+            log.error("getConfigXML: {}, {}", allFileName, ex.getMessage());
         }
         return ob;
     }
@@ -120,9 +123,9 @@ public class FileUtil {
         try {
             String encoding = "UTF-8";
             File file = new File(filePath);
-            if (file.isFile() && file.exists()) { //判断文件是否存在
+            if (file.isFile() && file.exists()) {
                 InputStreamReader read = new InputStreamReader(
-                        new FileInputStream(file), encoding);//考虑到编码格式
+                        Files.newInputStream(file.toPath()), encoding);
                 BufferedReader bufferedReader = new BufferedReader(read);
                 String lineTxt = null;
                 StringBuffer sb = new StringBuffer();
@@ -131,37 +134,36 @@ public class FileUtil {
                 }
                 read.close();
                 return sb.toString();
-            } else {
+            }
+            else {
                 log.warn("文件{}配置有误,找不到指定的文件", file);
             }
-        } catch (Exception e) {
+        }
+        catch (Exception e) {
             log.error("读取文件内容出错", e);
         }
         return null;
     }
 
     public static boolean deleteDirectory(String dir) {
-        // 如果dir不以文件分隔符结尾,自动添加文件分隔符
         if (!dir.endsWith(File.separator)) {
             dir = dir + File.separator;
         }
         File dirFile = new File(dir);
-        // 如果dir对应的文件不存在,或者不是一个目录,则退出
         if ((!dirFile.exists()) || (!dirFile.isDirectory())) {
             log.info("删除目录失败:" + dir + "不存在!");
             return false;
         }
+
         boolean flag = true;
-        // 删除文件夹中的所有文件包括子目录
         File[] files = dirFile.listFiles();
         for (int i = 0; i < files.length; i++) {
-            // 删除子文件
             if (files[i].isFile()) {
                 flag = deleteFile(files[i].getAbsolutePath());
                 if (!flag) {
                     break;
                 }
-            } // 删除子目录
+            }
             else if (files[i].isDirectory()) {
                 flag = deleteDirectory(files[i]
                         .getAbsolutePath());
@@ -171,7 +173,7 @@ public class FileUtil {
             }
         }
         if (!flag) {
-            log.info("删除目录失败!");
+            log.error("디렉터리를 삭제하지 못했습니다!");
             return false;
         }
         // 删除当前目录
@@ -189,11 +191,13 @@ public class FileUtil {
         if (file.exists() && file.isFile()) {
             if (file.delete()) {
                 return true;
-            } else {
+            }
+            else {
                 log.info("删除文件" + fileName + "失败!");
                 return false;
             }
-        } else {
+        }
+        else {
             log.info("删除文件失败:" + fileName + "不存在!");
             return false;
         }
@@ -203,7 +207,8 @@ public class FileUtil {
         InputStream is=null;
         try {
             is=new FileInputStream(file);
-        } catch (FileNotFoundException e) {
+        }
+        catch (FileNotFoundException e) {
             log.error(String.format("文件%s不找到在", file),e);
         }
         return is;

+ 3 - 3
src/main/java/com/its/common/util/JsonUtil.java

@@ -2,6 +2,7 @@ package com.its.common.util;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.parser.Feature;
 import com.alibaba.fastjson.parser.ParserConfig;
 import com.alibaba.fastjson.serializer.JSONSerializer;
 import com.alibaba.fastjson.serializer.PropertyFilter;
@@ -18,13 +19,12 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
 
-import com.alibaba.fastjson.parser.Feature;
-
 @Slf4j
-public class JsonUtil {
+public final class JsonUtil {
     private static final Map<Class<?>, Map<String, FieldMethod>> fieldGetMethodCache = new ConcurrentHashMap<>();
 
     private JsonUtil() {
+        throw new UnsupportedOperationException("생성자를 지원하지 않습니다.");
     }
 
     public static void map2Object(Map<String, String> map, Object object) {

+ 59 - 0
src/main/java/com/its/common/util/RandomUtil.java

@@ -0,0 +1,59 @@
+package com.its.common.util;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class RandomUtil {
+
+    private RandomUtil() {
+
+    }
+
+    public static int randInt(int start, int end) {
+        return start + (int)Math.round(Math.random() * (end - start));
+    }
+
+    public static Set<Integer> randInts(int start, int end, int n) {
+        if ((end - start + 1) < n) {
+            return null;
+        }
+
+        Set<Integer> set = new HashSet<Integer>();
+        while (set.size() < n) {
+            set.add(randInt(start, end));
+        }
+        return set;
+    }
+
+    public static float randFloat(float start, float end) {
+        return start + (float)Math.round(Math.random() * (end - start));
+    }
+
+    public static Set<Float> randFloats(float start, float end, int n) {
+        if ((end - start + 1) < n) {
+            return null;
+        }
+
+        Set<Float> set = new HashSet<Float>();
+        while (set.size() < n) {
+            set.add(randFloat(start, end));
+        }
+        return set;
+    }
+
+    public static double randDouble(double start, double end) {
+        return start + (double)Math.round(Math.random() * (end - start));
+    }
+
+    public static Set<Double> randDoubles(double start, double end, int n) {
+        if ((end - start + 1) < n) {
+            return null;
+        }
+
+        Set<Double> set = new HashSet<Double>();
+        while (set.size() < n) {
+            set.add(randDouble(start, end));
+        }
+        return set;
+    }
+}

+ 2 - 1
src/main/java/com/its/common/util/ReflectUtil.java

@@ -22,8 +22,9 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 @Slf4j
-public class ReflectUtil {
+public final class ReflectUtil {
     private ReflectUtil() {
+        throw new UnsupportedOperationException("생성자를 지원하지 않습니다.");
     }
 
     public static Field getDeclaredField(Object object, String fieldName) {

+ 1 - 0
src/main/java/com/its/common/util/SingletonTemplate.java

@@ -3,6 +3,7 @@ package com.its.common.util;
 public class SingletonTemplate {
     private static volatile SingletonTemplate singletonTemplate;
     private SingletonTemplate() {
+        throw new UnsupportedOperationException("생성자를 지원하지 않습니다.");
     }
 
     public static SingletonTemplate getInstance() {

+ 55 - 1
src/main/java/com/its/common/util/StringUtil.java

@@ -2,10 +2,64 @@ package com.its.common.util;
 
 import java.util.regex.Pattern;
 
-public class StringUtil {
+public final class StringUtil {
     private StringUtil() {
+        throw new UnsupportedOperationException("생성자를 지원하지 않습니다.");
     }
+    public static String reverse(String string) {
+        return new StringBuilder(string).reverse().toString();
+    }
+
+    public static String int2FourByteString(int num) {
+        num %= 10000;
+        String str = String.format("%04d", num);
+        return str;
+    }
+
+    public static int string2Int(String string) {
+        int num = -1;
+
+        try {
+            num = Integer.valueOf(string).intValue();
+        } catch (NumberFormatException exception) {
+            exception.printStackTrace();
+        }
+
+        return num;
+    }
+
+    public static String toHex(String string) {
+        StringBuffer sb = new StringBuffer(2 * string.length());
+
+        for (int i = 0; i < string.length(); i++) {
+            char c = string.charAt(i);
+            sb.append(Integer.toHexString((c & 0xF0) >> 4));
+            sb.append(Integer.toHexString((c & 0x0F)));
+        }
 
+        return sb.toString();
+    }
+
+    public static String byte2Hex(byte[] bytes) {
+        StringBuffer sb = new StringBuffer(bytes.length * 2);
+
+        for (int i = 0; i < bytes.length; i++) {
+            sb.append(Integer.toHexString((bytes[i] & 0xF0) >> 4));
+            sb.append(Integer.toHexString((bytes[i] & 0x0F)));
+        }
+
+        return sb.toString();
+    }
+
+    public static byte[] hex2Byte(String hex) {
+        byte[] decBytes = new byte[hex.length()/2];
+
+        for (int i = 0; i < decBytes.length; i++) {
+            decBytes[i] = Byte.valueOf(hex.substring(2*i, 2*i+1), 16);
+        }
+
+        return decBytes;
+    }
     public static boolean isNullOrEmpty(String str) {
         return null == str || str.trim().isEmpty();
     }

+ 67 - 67
src/main/java/com/its/common/util/SysUtil.java

@@ -42,18 +42,18 @@ public class SysUtil {
     public static String classLoadInfo(String spliteStr) {
         ClassLoadingMXBean bean = ManagementFactory.getClassLoadingMXBean();
         StringBuilder sb = new StringBuilder();
-        sb.append("类加载数:   " + bean.getLoadedClassCount()).append(spliteStr);
-        sb.append("类加载总数:   " + bean.getTotalLoadedClassCount()).append(spliteStr);
-        sb.append("类卸载数:   " + bean.getUnloadedClassCount()).append(spliteStr);
+        sb.append("     클래스 로드 수: " + bean.getLoadedClassCount()).append(spliteStr);
+        sb.append("로드된 총 클래스 수: " + bean.getTotalLoadedClassCount()).append(spliteStr);
+        sb.append("     클래스 제거 수: " + bean.getUnloadedClassCount()).append(spliteStr);
         return sb.toString();
     }
 
     public static String compilationInfo(String spliteStr) {
         CompilationMXBean bean = ManagementFactory.getCompilationMXBean();
         StringBuilder sb = new StringBuilder();
-        sb.append("编译器名称:   " + bean.getName()).append(spliteStr);
-        sb.append("编译耗时:   " + bean.getTotalCompilationTime()).append(spliteStr);
-        sb.append("是否支持编译监视:   " + bean.isCompilationTimeMonitoringSupported()).append(spliteStr);
+        sb.append("            컴파일러 이름: " + bean.getName()).append(spliteStr);
+        sb.append("              컴파일 시간: " + bean.getTotalCompilationTime()).append(spliteStr);
+        sb.append("컴파일 모니터링 지원 여부: " + bean.isCompilationTimeMonitoringSupported()).append(spliteStr);
         return sb.toString();
     }
 
@@ -62,8 +62,8 @@ public class SysUtil {
         StringBuilder sb = new StringBuilder();
         for (int i = 0; i < beans.size(); i++) {
             GarbageCollectorMXBean bean = beans.get(i);
-            sb.append(i).append("垃圾回收次数:   ").append(bean.getCollectionCount()).append(spliteStr);
-            sb.append(i).append("垃圾回收累积时间:   ").append(bean.getCollectionTime()).append(spliteStr);
+            sb.append(i).append("     가비지 수거 시간: ").append(bean.getCollectionCount()).append(spliteStr);
+            sb.append(i).append("가비지 수집 누적 시간: ").append(bean.getCollectionTime()).append(spliteStr);
         }
         return sb.toString();
     }
@@ -71,23 +71,23 @@ public class SysUtil {
     public static String memoryInfo(String spliteStr) {
         MemoryMXBean bean = ManagementFactory.getMemoryMXBean();
         StringBuilder sb = new StringBuilder();
-        sb.append("堆内存使用:   ").append(bean.getHeapMemoryUsage()).append(spliteStr);
-        sb.append("栈内存使用:   ").append(bean.getNonHeapMemoryUsage()).append(spliteStr);
-        sb.append("挂起对象数:   ").append(bean.getObjectPendingFinalizationCount()).append(spliteStr);
+        sb.append("  힙 메모리 사용량: ").append(bean.getHeapMemoryUsage()).append(spliteStr);
+        sb.append("스택 메모리 사용량: ").append(bean.getNonHeapMemoryUsage()).append(spliteStr);
+        sb.append(" 보류 중인 개체 수: ").append(bean.getObjectPendingFinalizationCount()).append(spliteStr);
         //内存池
         List<MemoryPoolMXBean> beans = ManagementFactory.getMemoryPoolMXBeans();
         for(int i=0;i<beans.size();i++) {
             MemoryPoolMXBean b=beans.get(i);
-//			sb.append(i).append("垃圾回收后内存:   ").append(b.getCollectionUsage()).append(spliteStr);
-//			sb.append(i).append("内存池的回收使用量阈值:   ").append(b.getCollectionUsageThreshold()).append(spliteStr);
-//			sb.append(i).append("虚拟机已检测到内存使用量达到或超过回收使用量阈值的次数:   ").append(b.getCollectionUsageThresholdCount()).append(spliteStr);
-            sb.append(i).append("内存池管理器名称:   ").append(b.getMemoryManagerNames().toString()).append(spliteStr);
-            sb.append(i).append("内存池名称:   ").append(b.getName()).append(spliteStr);
-            sb.append(i).append("内存使用峰值:   ").append(b.getPeakUsage()).append(spliteStr);
-            sb.append(i).append("内存池类型:   ").append(b.getType()).append(spliteStr);
-            sb.append(i).append("内存池使用量:   ").append(b.getUsage()).append(spliteStr);
-//			sb.append(i).append("内存使用量阀值:   ").append(b.getUsageThreshold()).append(spliteStr);
-//			sb.append(i).append("超过阀值次数:   ").append(b.getUsageThresholdCount()).append(spliteStr);
+//			sb.append(i).append("가비지 수집 후 메모리:   ").append(b.getCollectionUsage()).append(spliteStr);
+//			sb.append(i).append("메모리 풀 재활용 사용량 임계값:   ").append(b.getCollectionUsageThreshold()).append(spliteStr);
+//			sb.append(i).append("메모리 사용량이 회수 사용량 임계값에 도달하거나 초과했음을 가상 머신에서 감지한 횟수:   ").append(b.getCollectionUsageThresholdCount()).append(spliteStr);
+            sb.append(i).append("메모리 풀 관리자 이름: ").append(b.getMemoryManagerNames().toString()).append(spliteStr);
+            sb.append(i).append("       메모리 풀 이름: ").append(b.getName()).append(spliteStr);
+            sb.append(i).append("   최대 메모리 사용량: ").append(b.getPeakUsage()).append(spliteStr);
+            sb.append(i).append("       메모리 풀 유형: ").append(b.getType()).append(spliteStr);
+            sb.append(i).append("     메모리 풀 사용량: ").append(b.getUsage()).append(spliteStr);
+//			sb.append(i).append(" 메모리 사용량 임계값: ").append(b.getUsageThreshold()).append(spliteStr);
+//			sb.append(i).append(" 임계값을 초과한 횟수: ").append(b.getUsageThresholdCount()).append(spliteStr);
         }
         return sb.toString();
     }
@@ -95,11 +95,11 @@ public class SysUtil {
     public static String osInfo(String spliteStr) {
         OperatingSystemMXBean bean=ManagementFactory.getOperatingSystemMXBean();
         StringBuilder sb = new StringBuilder();
-        sb.append("操作系统架构:   ").append(bean.getArch()).append(spliteStr);
-        sb.append("可使用的cpu数量:   ").append(bean.getAvailableProcessors()).append(spliteStr);
-        sb.append("操作系统名称:   ").append(bean.getName()).append(spliteStr);
-        sb.append("1分钟cpu消耗平均值:   ").append(bean.	getSystemLoadAverage()).append(spliteStr);
-        sb.append("操作系统版本:   ").append(bean.getVersion()).append(spliteStr);
+        sb.append("        운영 체제 이름: ").append(bean.getName()).append(spliteStr);
+        sb.append("        운영 체제 버전: ").append(bean.getVersion()).append(spliteStr);
+        sb.append("    운영 체제 아키텍처: ").append(bean.getArch()).append(spliteStr);
+        sb.append("    사용 가능한 CPU 수: ").append(bean.getAvailableProcessors()).append(spliteStr);
+        sb.append("1분 동안 평균 CPU 소비: ").append(bean.getSystemLoadAverage()).append(spliteStr);
         return sb.toString();
     }
 
@@ -108,12 +108,12 @@ public class SysUtil {
         StringBuilder sb = new StringBuilder();
         ThreadInfo[] threads = bean.dumpAllThreads(false, false);
         for(ThreadInfo thread:threads) {
-            sb.append("线程信息:   ").append(thread).append(spliteStr);
+            sb.append("          스레드 정보: ").append(thread).append(spliteStr);
         }
-        sb.append("活动守护线程数目:   ").append(bean.getDaemonThreadCount()).append(spliteStr);
-        sb.append("峰值线程数:   ").append(bean.getPeakThreadCount()).append(spliteStr);
-        sb.append("当前线程数:   ").append(bean.getThreadCount()).append(spliteStr);
-        sb.append("总启用线程数:   ").append(bean.	getTotalStartedThreadCount()).append(spliteStr);
+        sb.append("  활성 데몬 스레드 수: ").append(bean.getDaemonThreadCount()).append(spliteStr);
+        sb.append("       최대 스레드 수: ").append(bean.getPeakThreadCount()).append(spliteStr);
+        sb.append("       현재 스레드 수: ").append(bean.getThreadCount()).append(spliteStr);
+        sb.append("활성화된 총 스레드 수: ").append(bean.getTotalStartedThreadCount()).append(spliteStr);
         return sb.toString();
     }
 
@@ -125,45 +125,45 @@ public class SysUtil {
             addr = InetAddress.getLocalHost();
             ip = addr.getHostAddress();
         } catch (UnknownHostException e) {
-            log.error("虚拟机地址", e);
+            log.error("가상 머신 주소 Error: {}", e.getMessage());
         }
         Properties props = System.getProperties();
         Map<String, String> map = System.getenv();
-        sb.append("用户名:    " + map.get("USERNAME")).append(spliteStr);
-        sb.append("计算机名:    " + map.get("COMPUTERNAME")).append(spliteStr);
-        sb.append("计算机域名:    " + map.get("USERDOMAIN")).append(spliteStr);
-        sb.append("本地ip地址:    " + ip).append(spliteStr);
-        sb.append("本地主机名:    " + addr.getHostName()).append(spliteStr);
-        sb.append("JVM可以使用的总内存:    " + totalMemory()).append(spliteStr);
-        sb.append("JVM可以使用的剩余内存:    " + freeMemory()).append(spliteStr);
-        sb.append("JVM可以使用的处理器个数:    " + availableProcessors()).append(spliteStr);
-        sb.append("Java的运行环境版本:    " + props.getProperty("java.version")).append(spliteStr);
-        sb.append("Java的运行环境供应商:    " + props.getProperty("java.vendor")).append(spliteStr);
-        sb.append("Java供应商的URL:    " + props.getProperty("java.vendor.url")).append(spliteStr);
-        sb.append("Java的安装路径:    " + props.getProperty("java.home")).append(spliteStr);
-        sb.append("Java的虚拟机规范版本:    " + props.getProperty("java.vm.specification.version")).append(spliteStr);
-        sb.append("Java的虚拟机规范供应商:    " + props.getProperty("java.vm.specification.vendor")).append(spliteStr);
-        sb.append("Java的虚拟机规范名称:    " + props.getProperty("java.vm.specification.name")).append(spliteStr);
-        sb.append("Java的虚拟机实现版本:    " + props.getProperty("java.vm.version")).append(spliteStr);
-        sb.append("Java的虚拟机实现供应商:    " + props.getProperty("java.vm.vendor")).append(spliteStr);
-        sb.append("Java的虚拟机实现名称:    " + props.getProperty("java.vm.name")).append(spliteStr);
-        sb.append("Java运行时环境规范版本:    " + props.getProperty("java.specification.version")).append(spliteStr);
-        sb.append("Java运行时环境规范供应商:    " + props.getProperty("java.specification.vender")).append(spliteStr);
-        sb.append("Java运行时环境规范名称:    " + props.getProperty("java.specification.name")).append(spliteStr);
-        sb.append("Java的类格式版本号:    " + props.getProperty("java.class.version")).append(spliteStr);
-//		sb.append("Java的类路径:    " + props.getProperty("java.class.path")).append(spliteStr);
-        sb.append("加载库时搜索的路径列表:    " + props.getProperty("java.library.path")).append(spliteStr);
-        sb.append("默认的临时文件路径:    " + props.getProperty("java.io.tmpdir")).append(spliteStr);
-        sb.append("一个或多个扩展目录的路径:    " + props.getProperty("java.ext.dirs")).append(spliteStr);
-        sb.append("操作系统的名称:    " + props.getProperty("os.name")).append(spliteStr);
-        sb.append("操作系统的构架:    " + props.getProperty("os.arch")).append(spliteStr);
-        sb.append("操作系统的版本:    " + props.getProperty("os.version")).append(spliteStr);
-        sb.append("文件分隔符:    " + props.getProperty("file.separator")).append(spliteStr);
-        sb.append("路径分隔符:    " + props.getProperty("path.separator")).append(spliteStr);
-        sb.append("行分隔符:    " + props.getProperty("line.separator")).append(spliteStr);
-        sb.append("用户的账户名称:    " + props.getProperty("user.name")).append(spliteStr);
-        sb.append("用户的主目录:    " + props.getProperty("user.home")).append(spliteStr);
-        sb.append("用户的当前工作目录:    " + props.getProperty("user.dir")).append(spliteStr);
+        sb.append("                       운영 체제 이름: " + props.getProperty("os.name")).append(spliteStr);
+        sb.append("                   운영 체제 아키텍처: " + props.getProperty("os.arch")).append(spliteStr);
+        sb.append("                       운영 체제 버전: " + props.getProperty("os.version")).append(spliteStr);
+        sb.append("                       파일 구분 기호: " + props.getProperty("file.separator")).append(spliteStr);
+        sb.append("                       경로 구분 기호: " + props.getProperty("path.separator")).append(spliteStr);
+        sb.append("                         줄 구분 기호: " + props.getProperty("line.separator")).append(spliteStr);
+        sb.append("                   사용자의 계정 이름: " + props.getProperty("user.name")).append(spliteStr);
+        sb.append("                 사용자의 홈 디렉토리: " + props.getProperty("user.home")).append(spliteStr);
+        sb.append("          사용자의 현재 작업 디렉토리: " + props.getProperty("user.dir")).append(spliteStr);
+        sb.append("                          컴퓨터 이름: " + map.get("COMPUTERNAME")).append(spliteStr);
+        sb.append("                   컴퓨터 도메인 이름: " + map.get("USERDOMAIN")).append(spliteStr);
+        sb.append("                          사용자 이름: " + map.get("USERNAME")).append(spliteStr);
+        sb.append("                         로컬 IP 주소: " + ip).append(spliteStr);
+        sb.append("                     로컬 호스트 이름: " + addr.getHostName()).append(spliteStr);
+        sb.append("          JVM에 사용 가능한 총 메모리: " + totalMemory()).append(spliteStr);
+        sb.append("        JVM에 사용 가능한 남은 메모리: " + freeMemory()).append(spliteStr);
+        sb.append("     JVM이 사용할 수 있는 프로세서 수: " + availableProcessors()).append(spliteStr);
+        sb.append("                Java 런타임 환경 버전: " + props.getProperty("java.version")).append(spliteStr);
+        sb.append("            Java 런타임 환경 공급업체: " + props.getProperty("java.vendor")).append(spliteStr);
+        sb.append("                    Java 공급업체 URL: " + props.getProperty("java.vendor.url")).append(spliteStr);
+        sb.append("                       Java 설치 경로: " + props.getProperty("java.home")).append(spliteStr);
+        sb.append("             Java 가상 머신 사양 버전: " + props.getProperty("java.vm.specification.version")).append(spliteStr);
+        sb.append("         Java 가상 머신 사양 공급업체: " + props.getProperty("java.vm.specification.vendor")).append(spliteStr);
+        sb.append("             Java 가상 머신 사양 이름: " + props.getProperty("java.vm.specification.name")).append(spliteStr);
+        sb.append("             Java 가상 머신 구현 버전: " + props.getProperty("java.vm.version")).append(spliteStr);
+        sb.append("         Java 가상 머신 구현 공급업체: " + props.getProperty("java.vm.vendor")).append(spliteStr);
+        sb.append("             Java 가상 머신 구현 이름: " + props.getProperty("java.vm.name")).append(spliteStr);
+        sb.append("           Java 런타임 환경 사양 버전: " + props.getProperty("java.specification.version")).append(spliteStr);
+        sb.append("         Java 런타임 환경 사양 공급자: " + props.getProperty("java.specification.vender")).append(spliteStr);
+        sb.append("           Java 런타임 환경 사양 이름: " + props.getProperty("java.specification.name")).append(spliteStr);
+        sb.append("           Java 클래스 형식 버전 번호: " + props.getProperty("java.class.version")).append(spliteStr);
+//		sb.append("                     Java 클래스 경로: " + props.getProperty("java.class.path")).append(spliteStr);
+        sb.append("  라이브러리 로딩 시 검색할 경로 목록: " + props.getProperty("java.library.path")).append(spliteStr);
+        sb.append("                  기본 임시 파일 경로: " + props.getProperty("java.io.tmpdir")).append(spliteStr);
+        sb.append("하나 이상의 확장 디렉터리에 대한 경로: " + props.getProperty("java.ext.dirs")).append(spliteStr);
         sb.append(classLoadInfo(spliteStr));
         sb.append(compilationInfo(spliteStr));
         sb.append(collectionInfo(spliteStr));

+ 2 - 1
src/main/java/com/its/common/util/TimeUtil.java

@@ -10,7 +10,7 @@ import java.util.Calendar;
 import java.util.Locale;
 
 @Slf4j
-public class TimeUtil {
+public final class TimeUtil {
 
     public static final DateTimeFormatter YYYYMMDDHHMMSS = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withLocale(Locale.getDefault());
     public static final DateTimeFormatter YYYYMMDDHHMM = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
@@ -19,6 +19,7 @@ public class TimeUtil {
     private static long timeOffset;//86400000
 
     private TimeUtil() {
+        throw new UnsupportedOperationException("생성자를 지원하지 않습니다.");
     }
 
     public static String getDateTimeFormat(LocalDateTime localDateTime, DateTimeFormatter formatter) {

+ 108 - 0
src/main/java/com/its/common/util/time/DateUtil.java

@@ -0,0 +1,108 @@
+package com.its.common.util.time;
+
+import java.io.Serializable;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+public class DateUtil implements Serializable {
+
+    private Date mDate;
+
+    public DateUtil() {
+        mDate = new Date(System.currentTimeMillis());
+    }
+
+    public DateUtil(String dateString) {
+        SimpleDateFormat sdFormatter = new SimpleDateFormat("yyyyMMdd");
+
+        try {
+            mDate = sdFormatter.parse(dateString);
+        } catch (ParseException e) {
+            mDate = new Date(System.currentTimeMillis());
+        }
+    }
+
+    /**
+     * update date to current.
+     */
+    public void update() {
+        mDate = new Date(System.currentTimeMillis());
+    }
+
+    /**
+     * return time in format.
+     * @return time like "yyyyMMdd"
+     */
+    public String format() {
+        SimpleDateFormat sdFormatter = new SimpleDateFormat("yyyyMMdd");
+        String string = sdFormatter.format(mDate);
+
+        return string;
+    }
+
+    /**
+     * get day of DateUtil.
+     * @return from 1 to 31.
+     */
+    public int getDay() {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(mDate);
+
+        return calendar.get(Calendar.DAY_OF_MONTH);
+    }
+
+    /**
+     * get month of DateUtil.
+     * @return from 0 to 11.
+     */
+    public int getMonth() {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(mDate);
+
+        return calendar.get(Calendar.MONTH);
+    }
+
+    /**
+     * get year of DateUtil.
+     * @return year number.
+     */
+    public int getYear() {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(mDate);
+
+        return calendar.get(Calendar.YEAR);
+    }
+
+    /**
+     * get different days.
+     * @return if mDate is earlier, return negative number.
+     * if mDate is after, return positive number.
+     */
+    public int getDateDifferent(DateUtil diffDateUtil) {
+        return (int) (mDate.getTime() - diffDateUtil.mDate.getTime()) / (1000 * 60 * 60 * 24);
+    }
+
+    public DateUtil getTimeAfterDays(int days) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(mDate);
+        calendar.add(Calendar.DATE, days);
+
+        DateUtil afterDate = new DateUtil();
+        afterDate.mDate = calendar.getTime();
+
+        return afterDate;
+    }
+
+    public DateUtil getTimeBeforeDays(int days) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(mDate);
+        calendar.add(Calendar.DATE, -1 * days);
+
+        DateUtil afterDate = new DateUtil();
+        afterDate.mDate = calendar.getTime();
+
+        return afterDate;
+    }
+}

+ 221 - 0
src/main/java/com/its/common/util/time/TimeUtil.java

@@ -0,0 +1,221 @@
+package com.its.common.util.time;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+public class TimeUtil {
+    private Date mDate;
+
+    public TimeUtil() {
+        mDate = new Date(System.currentTimeMillis());
+    }
+
+    public TimeUtil(String milliString) {
+        SimpleDateFormat sdFormatter = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+
+        try {
+            mDate = sdFormatter.parse(milliString);
+        } catch (ParseException e) {
+            mDate = new Date(System.currentTimeMillis());
+        }
+    }
+
+    public void update() {
+        mDate = new Date(System.currentTimeMillis());
+    }
+
+    /**
+     * return time in format of "yyyyMMddHHmmssSSS"
+     */
+    public String format() {
+        SimpleDateFormat sdFormatter = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+        String string = sdFormatter.format(mDate);
+
+        return string;
+    }
+
+    /**
+     * get second of MyDate.
+     * @return from 0 to 59.
+     */
+    public int getSecond() {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(mDate);
+
+        return calendar.get(Calendar.SECOND);
+    }
+
+    /**
+     * get minute of MyDate.
+     * @return from 0 to 59.
+     */
+    public int getMinute() {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(mDate);
+
+        return calendar.get(Calendar.MINUTE);
+    }
+
+    /**
+     * get hour of MyDate.
+     * @return from 0 to 23.
+     */
+    public int getHour() {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(mDate);
+
+        return calendar.get(Calendar.HOUR_OF_DAY);
+    }
+
+
+    /**
+     * get different milli seconds.
+     * @return if mDate is earlier, return negative number.
+     * if mDate is after, return positive number.
+     */
+    public long getMillisDifferent(TimeUtil diffTimeUtil) {
+        return (mDate.getTime() - diffTimeUtil.mDate.getTime());
+    }
+
+    /**
+     * get different seconds.
+     * @return if mDate is earlier, return negative number.
+     * if mDate is after, return positive number.
+     */
+    public int getSecondsDifferent(TimeUtil diffTimeUtil) {
+        return (int) (mDate.getTime() - diffTimeUtil.mDate.getTime()) / 1000;
+    }
+
+    /**
+     * get different minutes.
+     * @return if mDate is earlier, return negative number.
+     * if mDate is after, return positive number.
+     */
+    public int getMinutesDifferent(TimeUtil diffTimeUtil) {
+        return (int) (mDate.getTime() - diffTimeUtil.mDate.getTime()) / (1000 * 60);
+    }
+
+    /**
+     * get different hours.
+     *
+     * @return if mDate is earlier, return negative number.
+     * if mDate is after, return positive number.
+     */
+    public int getHoursDifferent(TimeUtil diffTimeUtil) {
+        return (int) (mDate.getTime() - diffTimeUtil.mDate.getTime()) / (1000 * 60 * 60);
+    }
+
+    /**
+     * get different days.
+     * @return if mDate is earlier, return negative number.
+     * if mDate is after, return positive number.
+     */
+    public int getDaysDifferent(TimeUtil diffTimeUtil) {
+        return (int) (mDate.getTime() - diffTimeUtil.mDate.getTime()) / (1000 * 60 * 60 * 24);
+    }
+
+
+    public TimeUtil getTimeAfterMillis(int millis) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(mDate);
+        calendar.add(Calendar.MILLISECOND, millis);
+
+        TimeUtil afterTimeUtil = new TimeUtil();
+        afterTimeUtil.mDate = calendar.getTime();
+        return afterTimeUtil;
+    }
+
+    public TimeUtil getTimeAfterSeconds(int seconds) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(mDate);
+        calendar.add(Calendar.SECOND, seconds);
+
+        TimeUtil afterTimeUtil = new TimeUtil();
+        afterTimeUtil.mDate = calendar.getTime();
+        return afterTimeUtil;
+    }
+
+    public TimeUtil getTimeAfterMinutes(int minutes) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(mDate);
+        calendar.add(Calendar.MINUTE, minutes);
+
+        TimeUtil afterTimeUtil = new TimeUtil();
+        afterTimeUtil.mDate = calendar.getTime();
+        return afterTimeUtil;
+    }
+
+    public TimeUtil getTimeAfterHours(int hours) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(mDate);
+        calendar.add(Calendar.HOUR, hours);
+
+        TimeUtil afterTimeUtil = new TimeUtil();
+        afterTimeUtil.mDate = calendar.getTime();
+        return afterTimeUtil;
+    }
+
+    public TimeUtil getTimeAfterDays(int days) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(mDate);
+        calendar.add(Calendar.DATE, days);
+
+        TimeUtil afterTimeUtil = new TimeUtil();
+        afterTimeUtil.mDate = calendar.getTime();
+        return afterTimeUtil;
+    }
+
+
+    public TimeUtil getTimeBeforeMillis(int millis) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(mDate);
+        calendar.roll(Calendar.MILLISECOND, -1 * millis);
+
+        TimeUtil afterTimeUtil = new TimeUtil();
+        afterTimeUtil.mDate = calendar.getTime();
+
+        return afterTimeUtil;
+    }
+
+    public TimeUtil getTimeBeforeSeconds(int seconds) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(mDate);
+        calendar.add(Calendar.SECOND, -1 * seconds);
+
+        TimeUtil afterTimeUtil = new TimeUtil();
+        afterTimeUtil.mDate = calendar.getTime();
+        return afterTimeUtil;
+    }
+
+    public TimeUtil getTimeBeforeMinutes(int minutes) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(mDate);
+        calendar.add(Calendar.MINUTE, -1 * minutes);
+
+        TimeUtil afterTimeUtil = new TimeUtil();
+        afterTimeUtil.mDate = calendar.getTime();
+        return afterTimeUtil;
+    }
+
+    public TimeUtil getTimeBeforeHours(int hours) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(mDate);
+        calendar.add(Calendar.HOUR, -1 * hours);
+
+        TimeUtil afterTimeUtil = new TimeUtil();
+        afterTimeUtil.mDate = calendar.getTime();
+        return afterTimeUtil;
+    }
+
+    public TimeUtil getTimeBeforeDays(int days) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(mDate);
+        calendar.add(Calendar.DATE, -1 * days);
+
+        TimeUtil afterTimeUtil = new TimeUtil();
+        afterTimeUtil.mDate = calendar.getTime();
+        return afterTimeUtil;
+    }
+}

+ 3 - 0
src/main/resources/log4j.properties

@@ -0,0 +1,3 @@
+log4j.rootLogger=INFO, A1
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout

+ 8 - 3
src/test/java/com/its/common/ItsCommonApplicationTests.java

@@ -1,13 +1,18 @@
 package com.its.common;
 
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.context.SpringBootTest;
+import org.junit.Test;
 
-@SpringBootTest
+//@SpringBootTest
 class ItsCommonApplicationTests {
 
+	public interface EventListener {
+		public void onEvent(String event);
+	}
+
 	@Test
 	void contextLoads() {
+//		ObjectTimestampPair timestamp = new ObjectTimestampPair(null);
+
 	}
 
 }