shjung 1 gadu atpakaļ
vecāks
revīzija
d2f4994819

BIN
app-install/application.png


+ 48 - 0
app-install/conf/application.yml

@@ -0,0 +1,48 @@
+application:
+  process:
+    name: 안동시 기상정보 연계 서버
+  atmp:
+    enabled: true
+    crontab: 40 0/30 * * * *
+    api-key: GKhEEB6LS9UEgLea0CorQiKzY0xxP86eJfhj8a2wmx4jNJ%2FBhL8f7rBviPWQY92ugK8zPjLYGQ8QQ5TRShtYFQ%3D%3D
+    api-ver: 1.3
+    start-hour: 0
+    end-hour: 23
+
+  frcs:
+    enabled: true
+    crontab: 50 0/30 * * * *
+    api-key: GKhEEB6LS9UEgLea0CorQiKzY0xxP86eJfhj8a2wmx4jNJ%2FBhL8f7rBviPWQY92ugK8zPjLYGQ8QQ5TRShtYFQ%3D%3D
+    start-hour: 0
+    end-hour: 23
+
+server:
+  port: 8873
+
+spring:
+  profiles:
+    active: dev
+
+---
+spring:
+  config:
+    activate:
+      on-profile: dev
+  datasource:
+    hikari:
+      driver-class-name: com.tmax.tibero.jdbc.TbDriver
+      jdbc-url: jdbc:tibero:thin:@115.91.94.42:8629:tibero
+      username: ENC(D/mtjX68HkE=)
+      password: ENC(D/mtjX68HkE=)
+
+---
+spring:
+  config:
+    activate:
+      on-profile: prod
+  datasource:
+    hikari:
+      driver-class-name: com.tmax.tibero.jdbc.TbDriver
+      jdbc-url: jdbc:tibero:thin:@115.91.94.42:8629:tibero
+      username: ENC(D/mtjX68HkE=)
+      password: ENC(D/mtjX68HkE=)

+ 43 - 0
app-install/wthr-comm-server.txt.jsmooth

@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<jsmoothproject>
+<JVMSearchPath>javahome</JVMSearchPath>
+<JVMSearchPath>jrepath</JVMSearchPath>
+<JVMSearchPath>jdkpath</JVMSearchPath>
+<JVMSearchPath>registry</JVMSearchPath>
+<JVMSearchPath>exepath</JVMSearchPath>
+<JVMSearchPath>jview</JVMSearchPath>
+<currentDirectory>${EXECUTABLEPATH}</currentDirectory>
+<embeddedJar>true</embeddedJar>
+<executableName>wthr-comm-server.exe</executableName>
+<iconLocation>application.png</iconLocation>
+<initialMemoryHeap>-1</initialMemoryHeap>
+<jarLocation>wthr-comm-server-0.0.1.jar</jarLocation>
+<mainClassName>org.springframework.boot.loader.JarLauncher</mainClassName>
+<maximumMemoryHeap>-1</maximumMemoryHeap>
+<maximumVersion></maximumVersion>
+<minimumVersion>1.8</minimumVersion>
+<skeletonName>Windowed Wrapper</skeletonName>
+<skeletonProperties>
+<key>Message</key>
+<value>Java has not been found on your computer. Do you want to download it?</value>
+</skeletonProperties>
+<skeletonProperties>
+<key>URL</key>
+</skeletonProperties>
+<skeletonProperties>
+<key>SingleProcess</key>
+<value>0</value>
+</skeletonProperties>
+<skeletonProperties>
+<key>SingleInstance</key>
+<value>0</value>
+</skeletonProperties>
+<skeletonProperties>
+<key>JniSmooth</key>
+<value>0</value>
+</skeletonProperties>
+<skeletonProperties>
+<key>Debug</key>
+<value>0</value>
+</skeletonProperties>
+</jsmoothproject>

+ 3 - 1
conf/application.yml

@@ -1,4 +1,6 @@
 application:
+  process:
+    name: 안동시 기상정보 연계 서버
   atmp:
     enabled: true
     crontab: 40 0/30 * * * *
@@ -10,7 +12,7 @@ application:
   frcs:
     enabled: true
     crontab: 50 0/30 * * * *
-    api-key: 2y3qwo%2BwhlG6E%2BZfcyDKLMCr5Lp4gy%2BNgGuvWmgAdq7O%2Bf%2Fs4DPQz2ZD1rzDLowBq%2F6pfSi5F6UWlyM5meRiaw%3D%3D
+    api-key: GKhEEB6LS9UEgLea0CorQiKzY0xxP86eJfhj8a2wmx4jNJ%2FBhL8f7rBviPWQY92ugK8zPjLYGQ8QQ5TRShtYFQ%3D%3D
     start-hour: 0
     end-hour: 23
 

+ 4 - 3
src/main/java/com/its/wthr/WthrCommServerApplication.java

@@ -84,10 +84,12 @@ public class WthrCommServerApplication implements CommandLineRunner, Application
     @Override
     public void run(String... args) throws Exception {
 
+        ServerConfig serverConfig = (ServerConfig) AppUtils.getBean(ServerConfig.class);
+
         if (OS.isWindows()) {
             String sysTime = SysUtils.getSysTimeStr();
             //JFrame.setDefaultLookAndFeelDecorated(true);
-            JFrame frame = new JFrame("기상정보 연계 서버 - [" + sysTime + "]");
+            JFrame frame = new JFrame(serverConfig.getProcessName() + " - [" + sysTime + "]");
             MainUI UI = new MainUI(frame);
             SwingUtilities.invokeLater(() -> {
                 try {
@@ -103,7 +105,7 @@ public class WthrCommServerApplication implements CommandLineRunner, Application
                 frame.addWindowListener(new WindowAdapter() {
                     @Override
                     public void windowClosing(WindowEvent e) {
-                        if (JOptionPane.showConfirmDialog(UI.getRootPanel(), "시스템을 종료 하시겠습니까?", "시스템 종료", 0) == 0) {
+                        if (JOptionPane.showConfirmDialog(UI.getRootPanel(), serverConfig.getProcessName()  + "프로그램을 종료 하시겠습니까?", "프로그램 종료", 0) == 0) {
                             System.exit(0);
                         } else {
                             frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
@@ -122,7 +124,6 @@ public class WthrCommServerApplication implements CommandLineRunner, Application
             });
         }
 
-        ServerConfig serverConfig = (ServerConfig) AppUtils.getBean(ServerConfig.class);
         log.info("");
         log.info("");
         log.info("************************************************************************************");

+ 35 - 7
src/main/java/com/its/wthr/openApi/vilageFcstInfoService/VilageFcstInfo.java

@@ -102,23 +102,51 @@ public class VilageFcstInfo {
 
     /**
      * 하늘상태(SKY) 코드 설명
-     * @param sky
+     * @param value
+     * @return
+     */
+    public String getSkyDesc2(String value) {
+        if (value == null) {
+            return "-";
+        }
+        if ("1".equals(value.trim())) {
+            return "맑음";
+        }
+        if ("3".equals(value.trim())) {
+            return "구름 많음";  // Mostly Cloudy
+        }
+        if ("4".equals(value.trim())) {
+            return "흐림";      // Cloudy
+        }
+        // 비, ㄲ먀ㅜ
+        return "-";
+    }
+    /**
+     * 하늘상태(SKY) 코드 설명
+     * @param value
      * @return
      */
-    public String getSkyDesc(String sky) {
-        if (sky == null) {
+    public String getSkyDesc(String value) {
+        if (value == null || "-".equals(value.trim())) {
             return "-";
         }
-        if ("1".equals(sky.trim())) {
+        int code = -99;
+        try {
+            code = Integer.parseInt(value);
+        } catch (NumberFormatException e) {
+            return value;
+        }
+
+        if (code >= 0 && code <= 5) {
             return "맑음";
         }
-        if ("3".equals(sky.trim())) {
+        if (code >= 6 && code <= 8) {
             return "구름많음";
         }
-        if ("4".equals(sky.trim())) {
+        if (code >= 9 && code <= 10) {
             return "흐림";
         }
-        return "-";
+        return value;
     }
 
     /**

+ 0 - 16
src/main/java/com/its/wthr/openApi/vilageFcstInfoService/entity/SrtFcstItem.java

@@ -1,16 +0,0 @@
-package com.its.wthr.openApi.vilageFcstInfoService.entity;
-
-import lombok.Data;
-
-/**
- * 초단기예보 Item
- */
-@Data
-public class SrtFcstItem {
-    private String baseDate;
-    private String baseTime;
-    private String category;
-    private int nx;
-    private int ny;
-    private String obsrValue;
-}

+ 0 - 16
src/main/java/com/its/wthr/openApi/vilageFcstInfoService/entity/SrtNcstItem.java

@@ -1,16 +0,0 @@
-package com.its.wthr.openApi.vilageFcstInfoService.entity;
-
-import lombok.Data;
-
-/**
- * 초단기실황 Item
- */
-@Data
-public class SrtNcstItem {
-    private String baseDate;
-    private String baseTime;
-    private String category;
-    private int nx;
-    private int ny;
-    private String obsrValue;
-}

+ 2 - 2
src/main/java/com/its/wthr/openApi/vilageFcstInfoService/entity/VilageBody.java

@@ -5,8 +5,8 @@ import lombok.Data;
 @Data
 public class VilageBody {
     private String dataType;
-    private VilageItems items;
-    private int pageNo;
     private int numOfRows;
+    private int pageNo;
     private int totalCount;
+    private VilageItems items;
 }

+ 60 - 0
src/main/java/com/its/wthr/openApi/vilageFcstInfoService/entity/VilageIem.java

@@ -0,0 +1,60 @@
+package com.its.wthr.openApi.vilageFcstInfoService.entity;
+
+import lombok.Data;
+
+@Data
+public class VilageIem {
+    // 공통
+    public String baseDate;
+    public String baseTime;
+    public String category;
+    public int nx;
+    public int ny;
+
+    // 단기예보, 초단기예보조회
+    public String fcstDate;
+    public String fcstTime;
+    public String fcstValue;
+
+    // 초단기실황조회
+    public String obsrValue;
+
+    // 초단기예보
+//    T1H	기온	        ℃	            10
+//    RN1	1시간 강수량	범주 (1 mm)	    8
+//    SKY	하늘상태	    코드값	        4
+//    UUU	동서바람성분	m/s	            12
+//    VVV	남북바람성분	m/s	            12
+//    REH	습도	        %	            8
+//    PTY	강수형태	    코드값	        4
+//    LGT	낙뢰	        kA(킬로암페어)	4
+//    VEC	풍향	        deg	            10
+//    WSD	풍속	        m/s	            10
+
+    // 초단기실황(SKY, LGT)
+//    T1H	기온	        ℃	    10
+//    RN1	1시간 강수량	mm	    8
+//    UUU	동서바람성분	m/s	    12
+//    VVV	남북바람성분	m/s	    12
+//    REH	습도	        %	    8
+//    PTY	강수형태	    코드값	4
+//    VEC	풍향	        deg	    10
+//    WSD	풍속	        m/s	    10
+
+    // 단기예보
+//    POP   강수확률	    %	        8   v
+//    PTY	강수형태	    코드값	    4   v
+//    PCP	1시간 강수량	범주 (1 mm)	8   v
+//    REH	습도	        %	        8   v
+//    SNO	1시간 신적설	범주(1 cm)	8   v
+//    SKY	하늘상태	    코드값	    4   v
+//    TMP	1시간 기온	    ℃	        10  v
+//    TMN	일 최저기온	    ℃	        10  -
+//    TMX	일 최고기온	    ℃	        10  -
+//    UUU	풍속(동서성분)	m/s	        12  v
+//    VVV	풍속(남북성분)	m/s	        12  v
+//    WAV	파고	        M	        8   v
+//    VEC	풍향	        deg	        10  v
+//    WSD	풍속	        m/s	        10  v
+
+}

+ 0 - 22
src/main/java/com/its/wthr/openApi/vilageFcstInfoService/entity/VilageItem.java

@@ -1,22 +0,0 @@
-package com.its.wthr.openApi.vilageFcstInfoService.entity;
-
-import lombok.Data;
-
-/**
- * 단기예보 Item
- */
-@Data
-public class VilageItem {
-    private String baseDate;
-    private String baseTime;
-    private String category;
-
-    private String fcstDate;
-    private String fcstTime;
-    private String fcstValue;
-
-    private String obsrValue;
-
-    private int nx;
-    private int ny;
-}

+ 1 - 1
src/main/java/com/its/wthr/openApi/vilageFcstInfoService/entity/VilageItems.java

@@ -6,5 +6,5 @@ import java.util.ArrayList;
 
 @Data
 public class VilageItems {
-    private ArrayList<VilageItem> item;
+    private ArrayList<VilageIem> item;
 }

+ 98 - 0
src/test/java/com/its/wthr/WthrCommServerApplicationTests.java

@@ -62,6 +62,7 @@ public class WthrCommServerApplicationTests {
 
     @Test
     void testGetUltraSrtNcst() {
+        // 초단기실황조회, https://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtNcst?serviceKey=2y3qwo%2BwhlG6E%2BZfcyDKLMCr5Lp4gy%2BNgGuvWmgAdq7O%2Bf%2Fs4DPQz2ZD1rzDLowBq%2F6pfSi5F6UWlyM5meRiaw%3D%3D&pageNo=1&numOfRows=1000&dataType=json&base_date=20210628&base_time=0600&nx=55&ny=127
         UltraSrtNcstData info = new UltraSrtNcstData();
         String apiUrl = "https://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtNcst";
         String serviceKey = "2y3qwo%2BwhlG6E%2BZfcyDKLMCr5Lp4gy%2BNgGuvWmgAdq7O%2Bf%2Fs4DPQz2ZD1rzDLowBq%2F6pfSi5F6UWlyM5meRiaw%3D%3D";
@@ -107,6 +108,103 @@ public class WthrCommServerApplicationTests {
         }
     }
 
+
+    @Test
+    void testGetUltraSrtFcst() {
+        // 초단기예보조회, https://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtFcst?serviceKey=2y3qwo%2BwhlG6E%2BZfcyDKLMCr5Lp4gy%2BNgGuvWmgAdq7O%2Bf%2Fs4DPQz2ZD1rzDLowBq%2F6pfSi5F6UWlyM5meRiaw%3D%3D&pageNo=1&numOfRows=1000&dataType=json&base_date=20230913&base_time=1130&nx=55&ny=127
+        UltraSrtNcstData info = new UltraSrtNcstData();
+        String apiUrl = "https://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtFcst";
+        String serviceKey = "2y3qwo%2BwhlG6E%2BZfcyDKLMCr5Lp4gy%2BNgGuvWmgAdq7O%2Bf%2Fs4DPQz2ZD1rzDLowBq%2F6pfSi5F6UWlyM5meRiaw%3D%3D";
+        String nx = "91";
+        String ny = "106";
+        String baseDate = info.getBaseDate();
+        String baseTime = info.getBaseTime();
+        String dataType = "json";
+
+        StringBuilder urlBuilder = new StringBuilder(apiUrl);
+        try {
+            urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "=" + serviceKey);
+            urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=1");
+            urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=1000");
+            urlBuilder.append("&" + URLEncoder.encode("dataType","UTF-8") + "=" + URLEncoder.encode(dataType, "UTF-8"));
+            urlBuilder.append("&" + URLEncoder.encode("base_date","UTF-8") + "=" + URLEncoder.encode(baseDate, "UTF-8"));
+            urlBuilder.append("&" + URLEncoder.encode("base_time","UTF-8") + "=" + URLEncoder.encode(baseTime, "UTF-8"));
+            urlBuilder.append("&" + URLEncoder.encode("nx","UTF-8") + "=" + URLEncoder.encode(nx, "UTF-8"));
+            urlBuilder.append("&" + URLEncoder.encode("ny","UTF-8") + "=" + URLEncoder.encode(ny, "UTF-8"));
+        } catch (UnsupportedEncodingException e) {
+            throw new RuntimeException(e);
+        }
+
+        log.info("{}", urlBuilder);
+        String result = info.lookUpApi(urlBuilder);
+        log.info("{}", result);
+
+        ObjectMapper mapper = new ObjectMapper();
+        try {
+            VilageRoot response = mapper.readValue(result, VilageRoot.class);
+            log.info("{}", response);
+
+            if (response != null && response.getResponse() != null && response.getResponse().getBody() != null) {
+                VilageItems items = response.getResponse().getBody().getItems();
+                if (items.getItem() != null) {
+                    items.getItem().forEach(obj -> {
+                        log.info("{}", obj);
+                    });
+                }
+            }
+        } catch (JsonProcessingException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Test
+    void testGetVilageFcst() {
+        // 단기예보조회,   https://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getVilageFcst?serviceKey=2y3qwo%2BwhlG6E%2BZfcyDKLMCr5Lp4gy%2BNgGuvWmgAdq7O%2Bf%2Fs4DPQz2ZD1rzDLowBq%2F6pfSi5F6UWlyM5meRiaw%3D%3D&pageNo=1&numOfRows=1000&dataType=json&base_date=20230913&base_time=1100&nx=88&ny=106
+        UltraSrtNcstData info = new UltraSrtNcstData();
+        String apiUrl = "https://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getVilageFcst";
+        String serviceKey = "2y3qwo%2BwhlG6E%2BZfcyDKLMCr5Lp4gy%2BNgGuvWmgAdq7O%2Bf%2Fs4DPQz2ZD1rzDLowBq%2F6pfSi5F6UWlyM5meRiaw%3D%3D";
+        String nx = "91";
+        String ny = "106";
+        String baseDate = info.getBaseDate();
+        String baseTime = info.getBaseTime();
+        String dataType = "json";
+
+        StringBuilder urlBuilder = new StringBuilder(apiUrl);
+        try {
+            urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "=" + serviceKey);
+            urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=1");
+            urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=1000");
+            urlBuilder.append("&" + URLEncoder.encode("dataType","UTF-8") + "=" + URLEncoder.encode(dataType, "UTF-8"));
+            urlBuilder.append("&" + URLEncoder.encode("base_date","UTF-8") + "=" + URLEncoder.encode(baseDate, "UTF-8"));
+            urlBuilder.append("&" + URLEncoder.encode("base_time","UTF-8") + "=" + URLEncoder.encode(baseTime, "UTF-8"));
+            urlBuilder.append("&" + URLEncoder.encode("nx","UTF-8") + "=" + URLEncoder.encode(nx, "UTF-8"));
+            urlBuilder.append("&" + URLEncoder.encode("ny","UTF-8") + "=" + URLEncoder.encode(ny, "UTF-8"));
+        } catch (UnsupportedEncodingException e) {
+            throw new RuntimeException(e);
+        }
+
+        log.info("{}", urlBuilder);
+        String result = info.lookUpApi(urlBuilder);
+        log.info("{}", result);
+
+        ObjectMapper mapper = new ObjectMapper();
+        try {
+            VilageRoot response = mapper.readValue(result, VilageRoot.class);
+            log.info("{}", response);
+
+            if (response != null && response.getResponse() != null && response.getResponse().getBody() != null) {
+                VilageItems items = response.getResponse().getBody().getItems();
+                if (items.getItem() != null) {
+                    items.getItem().forEach(obj -> {
+                        log.info("{}", obj);
+                    });
+                }
+            }
+        } catch (JsonProcessingException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
     @Test
     void testGetAtmp() {
         MsrStnAcctoRltmMesureDnsty request = new MsrStnAcctoRltmMesureDnsty();