shjung пре 2 година
родитељ
комит
c5a97b2727

+ 72 - 0
application.yml.1

@@ -0,0 +1,72 @@
+application:
+  process:
+    id: API00
+    name: UTIC Signal Open API Server
+
+server:
+  port: 8888
+  shutdown: graceful
+  error:
+    whitelabel:
+      enabled: true
+    include-exception: false
+    include-stacktrace: never
+
+logging:
+  level:
+    com.zaxxer.hikari.HikariConfig: ERROR
+    com.zaxxer.hikari: ERROR
+    org.hibernate.SQL: ERROR
+    org:
+      springframework:
+        security: ERROR
+        jdbc:
+          core:
+            JdbcTemplate: ERROR
+            StatementCreatorUtils: ERROR
+      hibernate:
+        type:
+          descriptor:
+            sql:
+              BasicBinder: ERROR
+spring:
+  application:
+    name: sig-api-server
+  profiles:
+    active: prod
+  output:
+    ansi:
+      enabled: always
+  main:
+    banner-mode: off
+  datasource:
+    hikari:
+      driver-class-name: oracle.jdbc.OracleDriver
+      jdbc-url: jdbc:oracle:thin:@192.168.10.68:1521:CVIBDB
+      username: siguser
+      password: siguser
+      auto-commit: true
+      connection-test-query: SELECT 1 FROM DUAL
+      minimum-idle: 10
+      #maximum-pool-size: 50
+      idleTimeout: 30000
+      connectTimeout: 10000
+      pool-name: pool-sig-api-server
+  jpa:
+    open-in-view: false
+    show-sql: false
+    hibernate:
+      ddl-auto: none
+    database-platform: org.hibernate.dialect.Oracle10gDialect
+    properties:
+      hibernate:
+        default_batch_fetch_size: 1000
+        format_sql: false
+        use_sql_columns: false
+        hbm2ddl.auto: validate
+        dialect: org.hibernate.dialect.Oracle10gDialect
+        implicit_naming_strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
+        physical_naming_strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
+    output:
+      ansi:
+        enabled: always

+ 2 - 3
src/main/java/com/sig/api/config/SwaggerConfig.java

@@ -2,7 +2,6 @@ package com.sig.api.config;
 
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Profile;
 import org.springframework.http.HttpHeaders;
 import springfox.documentation.builders.ApiInfoBuilder;
 import springfox.documentation.builders.ParameterBuilder;
@@ -18,7 +17,6 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2;
 import java.util.ArrayList;
 import java.util.List;
 
-@Profile("dev|swagger")
 @Configuration
 @EnableSwagger2
 public class SwaggerConfig {
@@ -42,7 +40,8 @@ public class SwaggerConfig {
                 .select()
                 .apis(RequestHandlerSelectors.basePackage("com.sig.api.controller"))
                 .paths(PathSelectors.any())
-                .build();
+                .build()
+                .pathMapping("/tsi/api");
     }
 
     private ApiInfo apiInfo() {

+ 161 - 8
src/main/java/com/sig/api/controller/sig/CrossRoadInfoController.java

@@ -1,20 +1,24 @@
 package com.sig.api.controller.sig;
 
 import com.sig.api.aspectj.SigOpenApiElapsed;
+import com.sig.api.dto.sig.ServiceHistDto;
 import com.sig.api.dto.sig.SigOpenApiHeaderDto;
 import com.sig.api.entity.sig.DataCount;
 import com.sig.api.entity.sig.TbInt;
 import com.sig.api.entity.sig.TbIntPhase;
 import com.sig.api.service.sig.CrossRoadInfoService;
 import com.sig.utils.ApiUtils;
-import com.sun.istack.Nullable;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.time.StopWatch;
 import org.jdom2.Element;
-import org.springframework.http.MediaType;
+import org.springframework.core.io.InputStreamResource;
+import org.springframework.core.io.Resource;
+import org.springframework.http.*;
+import org.springframework.lang.Nullable;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -22,7 +26,11 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.io.File;
 import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -34,6 +42,7 @@ import java.util.Map;
 @Api(tags = "02.교차로기반정보서비스")
 public class CrossRoadInfoController extends SigOpenApiCommonController {
 
+    private final String serviceName = "CrossRoadInfoService";
     private final CrossRoadInfoService service;
 
     @SigOpenApiElapsed
@@ -48,13 +57,12 @@ public class CrossRoadInfoController extends SigOpenApiCommonController {
             @RequestParam(name="numOfRows", required = false) @Nullable Integer numOfRows,
             @ApiParam(name = "pageNo", value = "페이지 번호", example = "1")
             @RequestParam(name="pageNo", required = false) @Nullable Integer pageNo,
-            @ApiParam(name = "srchCTId", value = "지역코드", example = "L01")
+            @ApiParam(name = "srchCTId", value = "지역코드", example = "L02")
             @RequestParam(name="srchCTId", required = false) @Nullable String srchCTId,
-            @ApiParam(name = "srchCRNm", value = "교차로명", example = "시청입구")
+            @ApiParam(name = "srchCRNm", value = "교차로명", example = "옥골4거리")
             @RequestParam(name="srchCRNm", required = false) @Nullable String srchCRNm,
             HttpServletRequest req, HttpServletResponse res
     ) throws IOException {
-        final String serviceName = "CrossRoadInfoService";
         final String remoteIP = ApiUtils.getRemoteIP(req);
 
         String type_ = (type == null) ? "json" : type;
@@ -66,6 +74,20 @@ public class CrossRoadInfoController extends SigOpenApiCommonController {
             numOfRows_ = 100;
         }
 
+        ServiceHistDto hist = ServiceHistDto.builder()
+                .OPENAPI_ID(6)
+                .OPEN_DATA_KEY(serviceKey)
+                .HOST_IP(remoteIP)
+                .DATA_TYPE(type)
+                .EXECUTE_TIME(0)
+                .STATUS(0)
+                .REGION_CD("".equals(srchCTId_) ? "ALL" : srchCTId_)
+                .REGION_CD("".equals(srchCTId_) ? "ALL" : srchCTId_)
+                .startTime(System.currentTimeMillis())
+                .build();
+        StopWatch stopWatch = new StopWatch();
+        stopWatch.start();
+
         Integer [] calcPageReturn = this.service.calcPageStartEndNo(pageNo_, numOfRows_);
         log.info("getCrossRoadInfoList: type_:{}, numOfRows_:{}, pageNo_:{}, srchCTId_:{}, srchCRNm_:{}, startRow:{}, endRow:{}",
                 type_, numOfRows_, pageNo_, srchCTId_, srchCRNm_, calcPageReturn[0], calcPageReturn[1]);
@@ -81,6 +103,8 @@ public class CrossRoadInfoController extends SigOpenApiCommonController {
         SigOpenApiHeaderDto headerVo = this.service.checkServiceKey("/CrossRoadInfoService/getCrossRoadInfoList", remoteIP, serviceKey);
         if (!"0".equals(headerVo.getResultCode())) {
             sendErrorResponse(type_, "CrossRoadInfoService", headerVo, res);
+            hist.setSTATUS("30".equals(headerVo.getResultCode()) ? 1 : 2);
+            this.service.saveServiceHistory(hist);
             return;
         }
 
@@ -135,6 +159,7 @@ public class CrossRoadInfoController extends SigOpenApiCommonController {
             }
             sendResponseJson(jsonList, res);
         }
+        this.service.saveServiceHistory(hist);
     }
 
     @SigOpenApiElapsed
@@ -149,13 +174,12 @@ public class CrossRoadInfoController extends SigOpenApiCommonController {
             @RequestParam(name="numOfRows", required = false) @Nullable Integer numOfRows,
             @ApiParam(name = "pageNo", value = "페이지 번호", example = "1")
             @RequestParam(name="pageNo", required = false) @Nullable Integer pageNo,
-            @ApiParam(name = "srchCTId", value = "지역코드", example = "L01")
+            @ApiParam(name = "srchCTId", value = "지역코드", example = "L02")
             @RequestParam(name="srchCTId", required = false) @Nullable String srchCTId,
-            @ApiParam(name = "srchCRNm", value = "교차로명", example = "시청입구")
+            @ApiParam(name = "srchCRNm", value = "교차로명", example = "옥골4거리")
             @RequestParam(name="srchCRNm", required = false) @Nullable String srchCRNm,
             HttpServletRequest req, HttpServletResponse res
     ) throws IOException {
-        final String serviceName = "CrossRoadInfoService";
         final String remoteIP = ApiUtils.getRemoteIP(req);
 
         String type_ = (type == null) ? "json" : type;
@@ -167,6 +191,19 @@ public class CrossRoadInfoController extends SigOpenApiCommonController {
             numOfRows_ = 100;
         }
 
+        ServiceHistDto hist = ServiceHistDto.builder()
+                .OPENAPI_ID(7)
+                .OPEN_DATA_KEY(serviceKey)
+                .HOST_IP(remoteIP)
+                .DATA_TYPE(type)
+                .EXECUTE_TIME(0)
+                .STATUS(0)
+                .REGION_CD("".equals(srchCTId_) ? "ALL" : srchCTId_)
+                .startTime(System.currentTimeMillis())
+                .build();
+        StopWatch stopWatch = new StopWatch();
+        stopWatch.start();
+
         Integer [] calcPageReturn = this.service.calcPageStartEndNo(pageNo_, numOfRows_);
         log.info("getCrossRoadInfoDetail: type_:{}, numOfRows_:{}, pageNo_:{}, srchCTId_:{}, srchCRNm_:{}, startRow:{}, endRow:{}",
                 type_, numOfRows_, pageNo_, srchCTId_, srchCRNm_, calcPageReturn[0], calcPageReturn[1]);
@@ -182,6 +219,8 @@ public class CrossRoadInfoController extends SigOpenApiCommonController {
         SigOpenApiHeaderDto headerVo = this.service.checkServiceKey("/CrossRoadInfoService/getCrossRoadInfoDetail", remoteIP, serviceKey);
         if (!"0".equals(headerVo.getResultCode())) {
             sendErrorResponse(type_, "CrossRoadInfoService", headerVo, res);
+            hist.setSTATUS("30".equals(headerVo.getResultCode()) ? 1 : 2);
+            this.service.saveServiceHistory(hist);
             return;
         }
 
@@ -298,6 +337,120 @@ public class CrossRoadInfoController extends SigOpenApiCommonController {
             }
             sendResponseJson(jsonList, res);
         }
+        this.service.saveServiceHistory(hist);
+    }
+
+    @SigOpenApiElapsed
+    @ApiOperation(value = "3.교차로정보-다운로드")
+    @GetMapping(value = "/download/crossInfo", produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE})
+    public ResponseEntity<Object> getCrossRoadInfoListDownload(
+            @ApiParam(name = "serviceKey", value = "인증키", example = "A515753C425C4B579BCC1F2E0ED50374", required = true)
+            @RequestParam final String serviceKey,
+            @ApiParam(name = "srchCTId", value = "지역코드", example = "L02")
+            @RequestParam(name="srchCTId", required = false) @Nullable String srchCTId,
+            HttpServletRequest req, HttpServletResponse res
+    ) throws IOException {
+        final String remoteIP = ApiUtils.getRemoteIP(req);
+        String srchCTId_ = (srchCTId == null) ? "" : srchCTId;
+        ServiceHistDto hist = ServiceHistDto.builder()
+                .OPENAPI_ID(8)
+                .OPEN_DATA_KEY(serviceKey)
+                .HOST_IP(remoteIP)
+                .DATA_TYPE("file")
+                .EXECUTE_TIME(0)
+                .STATUS(0)
+                .REGION_CD("".equals(srchCTId_) ? "ALL" : srchCTId_)
+                .startTime(System.currentTimeMillis())
+                .build();
+        StopWatch stopWatch = new StopWatch();
+        stopWatch.start();
+
+        SigOpenApiHeaderDto headerVo = this.service.checkServiceKey("/CrossRoadInfoService/download/crossInfo", remoteIP, serviceKey);
+        if (!"0".equals(headerVo.getResultCode())) {
+            sendErrorResponse(null, serviceName, headerVo, res);
+            hist.setSTATUS("30".equals(headerVo.getResultCode()) ? 1 : 2);
+            this.service.saveServiceHistory(hist);
+            return new ResponseEntity<Object>(null, HttpStatus.CONFLICT);
+        }
+        // 여기서 파일 다운로드....
+        String dataFileName = "".equals(srchCTId_) ? "crossInfo.zip" : srchCTId_ + "_crossInfo.xlsx";
+        String separator = System.getProperty("file.separator");
+        String fileFullName = System.getProperty("user.dir")+separator+"download"+separator+dataFileName;
+
+        try {
+            Path filePath = Paths.get(fileFullName);
+            File file = new File(fileFullName);
+            String fileName = file.getName();
+            Resource resource = new InputStreamResource(Files.newInputStream(filePath));
+            String header = req.getHeader("User-Agent");
+            String encodeFileName = service.fileNameEncoder(fileName, header);
+            HttpHeaders headers = new HttpHeaders();
+            // 다운로드 되거나 로컬에 저장되는 용도로 쓰이는지를 알려주는 헤더
+            headers.setContentDisposition(ContentDisposition.builder("attachment").filename(encodeFileName).build());
+
+            this.service.saveServiceHistory(hist);
+            return new ResponseEntity<Object>(resource, headers, HttpStatus.OK);
+        }
+        catch (Exception e) {
+            sendErrorResponse(null, serviceName, headerVo, res);
+            return new ResponseEntity<Object>(null, HttpStatus.CONFLICT);
+        }
+    }
+
+    @SigOpenApiElapsed
+    @ApiOperation(value = "4.교차로현시구성정보-다운로드")
+    @GetMapping(value = "/download/crossDetailInfo", produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE})
+    public ResponseEntity<Object> getPlanCRWDInfoDownload(
+            @ApiParam(name = "serviceKey", value = "인증키", example = "A515753C425C4B579BCC1F2E0ED50374", required = true)
+            @RequestParam final String serviceKey,
+            @ApiParam(name = "srchCTId", value = "지역코드", example = "L02")
+            @RequestParam(name="srchCTId", required = false) @Nullable String srchCTId,
+            HttpServletRequest req, HttpServletResponse res
+    ) throws IOException {
+        final String remoteIP = ApiUtils.getRemoteIP(req);
+        String srchCTId_ = (srchCTId == null) ? "" : srchCTId;
+        ServiceHistDto hist = ServiceHistDto.builder()
+                .OPENAPI_ID(9)
+                .OPEN_DATA_KEY(serviceKey)
+                .HOST_IP(remoteIP)
+                .DATA_TYPE("file")
+                .EXECUTE_TIME(0)
+                .STATUS(0)
+                .REGION_CD("".equals(srchCTId_) ? "ALL" : srchCTId_)
+                .startTime(System.currentTimeMillis())
+                .build();
+        StopWatch stopWatch = new StopWatch();
+        stopWatch.start();
+
+        SigOpenApiHeaderDto headerVo = this.service.checkServiceKey("/CrossRoadInfoService/download/crossDetailInfo", remoteIP, serviceKey);
+        if (!"0".equals(headerVo.getResultCode())) {
+            sendErrorResponse(null, serviceName, headerVo, res);
+            hist.setSTATUS("30".equals(headerVo.getResultCode()) ? 1 : 2);
+            this.service.saveServiceHistory(hist);
+            return new ResponseEntity<Object>(null, HttpStatus.CONFLICT);
+        }
+        // 여기서 파일 다운로드....
+        String dataFileName = "".equals(srchCTId_) ? "crossDetailInfo.zip" : srchCTId_ + "_crossDetailInfo.xlsx";
+        String separator = System.getProperty("file.separator");
+        String fileFullName = System.getProperty("user.dir")+separator+"download"+separator+dataFileName;
+        try {
+            Path filePath = Paths.get(fileFullName);
+            File file = new File(fileFullName);
+            String fileName = file.getName();
+            Resource resource = new InputStreamResource(Files.newInputStream(filePath));
+            String header = req.getHeader("User-Agent");
+            String encodeFileName = this.service.fileNameEncoder(fileName, header);
+            HttpHeaders headers = new HttpHeaders();
+            // 다운로드 되거나 로컬에 저장되는 용도로 쓰이는지를 알려주는 헤더
+            headers.setContentDisposition(ContentDisposition.builder("attachment").filename(encodeFileName).build());
+
+            this.service.saveServiceHistory(hist);
+            return new ResponseEntity<Object>(resource, headers, HttpStatus.OK);
+        }
+        catch (Exception e) {
+            sendErrorResponse(null, serviceName, headerVo, res);
+            return new ResponseEntity<Object>(null, HttpStatus.CONFLICT);
+        }
     }
 
 }

+ 74 - 12
src/main/java/com/sig/api/controller/sig/PlanCrossRoadInfoController.java

@@ -11,6 +11,7 @@ import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.time.StopWatch;
 import org.jdom2.Element;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -32,6 +33,7 @@ import java.util.Map;
 @Api(tags = "01.교차로계획정보서비스")
 public class PlanCrossRoadInfoController extends SigOpenApiCommonController {
 
+    private final String serviceName = "PlanCrossRoadInfoService";
     private final PlanCrossRoadInfoService service;
 
     @SigOpenApiElapsed
@@ -46,13 +48,12 @@ public class PlanCrossRoadInfoController extends SigOpenApiCommonController {
             @RequestParam(name="numOfRows", required = false) @Nullable Integer numOfRows,
             @ApiParam(name = "pageNo", value = "페이지 번호", example = "1")
             @RequestParam(name="pageNo", required = false) @Nullable Integer pageNo,
-            @ApiParam(name = "srchCTId", value = "지역코드", example = "L01")
+            @ApiParam(name = "srchCTId", value = "지역코드", example = "L02")
             @RequestParam(name="srchCTId", required = false) @Nullable String srchCTId,
-            @ApiParam(name = "srchCRNm", value = "교차로명", example = "시청입구")
+            @ApiParam(name = "srchCRNm", value = "교차로명", example = "옥골4거리")
             @RequestParam(name="srchCRNm", required = false) @Nullable String srchCRNm,
             HttpServletRequest req, HttpServletResponse res
     ) throws IOException {
-        final String serviceName = "PlanCrossRoadInfoService";
         final String remoteIP = ApiUtils.getRemoteIP(req);
 
         String type_ = (type == null) ? "json" : type;
@@ -64,6 +65,19 @@ public class PlanCrossRoadInfoController extends SigOpenApiCommonController {
             numOfRows_ = 100;
         }
 
+        ServiceHistDto hist = ServiceHistDto.builder()
+                .OPENAPI_ID(1)
+                .OPEN_DATA_KEY(serviceKey)
+                .HOST_IP(remoteIP)
+                .DATA_TYPE(type)
+                .EXECUTE_TIME(0)
+                .STATUS(0)
+                .REGION_CD("".equals(srchCTId_) ? "ALL" : srchCTId_)
+                .startTime(System.currentTimeMillis())
+                .build();
+        StopWatch stopWatch = new StopWatch();
+        stopWatch.start();
+
         Integer [] calcPageReturn = this.service.calcPageStartEndNo(pageNo_, numOfRows_);
         log.info("getPlanCRHDInfo: type_:{}, numOfRows_:{}, pageNo_:{}, srchCTId_:{}, srchCRNm_:{}, startRow:{}, endRow:{}",
                 type_, numOfRows_, pageNo_, srchCTId_, srchCRNm_, calcPageReturn[0], calcPageReturn[1]);
@@ -79,6 +93,8 @@ public class PlanCrossRoadInfoController extends SigOpenApiCommonController {
         SigOpenApiHeaderDto headerVo = this.service.checkServiceKey("/PlanCrossRoadInfoService/getPlanCRHDInfo", remoteIP, serviceKey);
         if (!"0".equalsIgnoreCase(headerVo.getResultCode())) {
             sendErrorResponse(type_, "PlanCrossRoadInfoService", headerVo, res);
+            hist.setSTATUS("30".equals(headerVo.getResultCode()) ? 1 : 2);
+            this.service.saveServiceHistory(hist);
             return;
         }
 
@@ -144,6 +160,7 @@ public class PlanCrossRoadInfoController extends SigOpenApiCommonController {
             }
             sendResponseJson(jsonList, res);
         }
+        this.service.saveServiceHistory(hist);
     }
 
     @SigOpenApiElapsed
@@ -158,13 +175,12 @@ public class PlanCrossRoadInfoController extends SigOpenApiCommonController {
             @RequestParam(name="numOfRows", required = false) @Nullable Integer numOfRows,
             @ApiParam(name = "pageNo", value = "페이지 번호", example = "1")
             @RequestParam(name="pageNo", required = false) @Nullable Integer pageNo,
-            @ApiParam(name = "srchCTId", value = "지역코드", example = "L01")
+            @ApiParam(name = "srchCTId", value = "지역코드", example = "L02")
             @RequestParam(name="srchCTId", required = false) @Nullable String srchCTId,
-            @ApiParam(name = "srchCRNm", value = "교차로명", example = "시청입구")
+            @ApiParam(name = "srchCRNm", value = "교차로명", example = "옥골4거리")
             @RequestParam(name="srchCRNm", required = false) @Nullable String srchCRNm,
             HttpServletRequest req, HttpServletResponse res
     ) throws IOException {
-        final String serviceName = "PlanCrossRoadInfoService";
         final String remoteIP = ApiUtils.getRemoteIP(req);
 
         String type_ = (type == null) ? "json" : type;
@@ -176,6 +192,19 @@ public class PlanCrossRoadInfoController extends SigOpenApiCommonController {
             numOfRows_ = 100;
         }
 
+        ServiceHistDto hist = ServiceHistDto.builder()
+                .OPENAPI_ID(2)
+                .OPEN_DATA_KEY(serviceKey)
+                .HOST_IP(remoteIP)
+                .DATA_TYPE(type)
+                .EXECUTE_TIME(0)
+                .STATUS(0)
+                .REGION_CD("".equals(srchCTId_) ? "ALL" : srchCTId_)
+                .startTime(System.currentTimeMillis())
+                .build();
+        StopWatch stopWatch = new StopWatch();
+        stopWatch.start();
+
         Integer [] calcPageReturn = this.service.calcPageStartEndNo(pageNo_, numOfRows_);
         log.info("getPlanCRWDInfo: type_:{}, numOfRows_:{}, pageNo_:{}, srchCTId_:{}, srchCRNm_:{}, startRow:{}, endRow:{}", 
                 type_, numOfRows_, pageNo_, srchCTId_, srchCRNm_, calcPageReturn[0], calcPageReturn[1]);
@@ -191,6 +220,8 @@ public class PlanCrossRoadInfoController extends SigOpenApiCommonController {
         SigOpenApiHeaderDto headerVo = this.service.checkServiceKey("/PlanCrossRoadInfoService/getPlanCRWDInfo", remoteIP, serviceKey);
         if (!"0".equalsIgnoreCase(headerVo.getResultCode())) {
             sendErrorResponse(type_, "PlanCrossRoadInfoService", headerVo, res);
+            hist.setSTATUS("30".equals(headerVo.getResultCode()) ? 1 : 2);
+            this.service.saveServiceHistory(hist);
             return;
         }
 
@@ -248,6 +279,7 @@ public class PlanCrossRoadInfoController extends SigOpenApiCommonController {
             }
             sendResponseJson(jsonList, res);
         }
+        this.service.saveServiceHistory(hist);
     }
 
     @SigOpenApiElapsed
@@ -262,13 +294,12 @@ public class PlanCrossRoadInfoController extends SigOpenApiCommonController {
             @RequestParam(name="numOfRows", required = false) @Nullable Integer numOfRows,
             @ApiParam(name = "pageNo", value = "페이지 번호", example = "1")
             @RequestParam(name="pageNo", required = false) @Nullable Integer pageNo,
-            @ApiParam(name = "srchCTId", value = "지역코드", example = "L01")
+            @ApiParam(name = "srchCTId", value = "지역코드", example = "L02")
             @RequestParam(name="srchCTId", required = false) @Nullable String srchCTId,
-            @ApiParam(name = "srchCRNm", value = "교차로명", example = "시청입구")
+            @ApiParam(name = "srchCRNm", value = "교차로명", example = "옥골4거리")
             @RequestParam(name="srchCRNm", required = false) @Nullable String srchCRNm,
             HttpServletRequest req, HttpServletResponse res
     ) throws IOException {
-        final String serviceName = "PlanCrossRoadInfoService";
         final String remoteIP = ApiUtils.getRemoteIP(req);
 
         String type_ = (type == null) ? "json" : type;
@@ -280,6 +311,19 @@ public class PlanCrossRoadInfoController extends SigOpenApiCommonController {
             numOfRows_ = 100;
         }
 
+        ServiceHistDto hist = ServiceHistDto.builder()
+                .OPENAPI_ID(3)
+                .OPEN_DATA_KEY(serviceKey)
+                .HOST_IP(remoteIP)
+                .DATA_TYPE(type)
+                .EXECUTE_TIME(0)
+                .STATUS(0)
+                .REGION_CD("".equals(srchCTId_) ? "ALL" : srchCTId_)
+                .startTime(System.currentTimeMillis())
+                .build();
+        StopWatch stopWatch = new StopWatch();
+        stopWatch.start();
+
         Integer [] calcPageReturn = this.service.calcPageStartEndNo(pageNo_, numOfRows_);
         log.info("getPlanCRRSInfo: type_:{}, numOfRows_:{}, pageNo_:{}, srchCTId_:{}, srchCRNm_:{}, startRow:{}, endRow:{}",
                 type_, numOfRows_, pageNo_, srchCTId_, srchCRNm_, calcPageReturn[0], calcPageReturn[1]);
@@ -295,6 +339,8 @@ public class PlanCrossRoadInfoController extends SigOpenApiCommonController {
         SigOpenApiHeaderDto headerVo = this.service.checkServiceKey("/PlanCrossRoadInfoService/getPlanCRRSInfo", remoteIP, serviceKey);
         if (!"0".equalsIgnoreCase(headerVo.getResultCode())) {
             sendErrorResponse(type_, "PlanCrossRoadInfoService", headerVo, res);
+            hist.setSTATUS("30".equals(headerVo.getResultCode()) ? 1 : 2);
+            this.service.saveServiceHistory(hist);
             return;
         }
 
@@ -379,6 +425,7 @@ public class PlanCrossRoadInfoController extends SigOpenApiCommonController {
             }
             sendResponseJson(jsonList, res);
         }
+        this.service.saveServiceHistory(hist);
     }
 
     @SigOpenApiElapsed
@@ -393,13 +440,12 @@ public class PlanCrossRoadInfoController extends SigOpenApiCommonController {
             @RequestParam(name="numOfRows", required = false) @Nullable Integer numOfRows,
             @ApiParam(name = "pageNo", value = "페이지 번호", example = "1")
             @RequestParam(name="pageNo", required = false) @Nullable Integer pageNo,
-            @ApiParam(name = "srchCTId", value = "지역코드", example = "L01")
+            @ApiParam(name = "srchCTId", value = "지역코드", example = "L02")
             @RequestParam(name="srchCTId", required = false) @Nullable String srchCTId,
-            @ApiParam(name = "srchCRNm", value = "교차로명", example = "시청입구")
+            @ApiParam(name = "srchCRNm", value = "교차로명", example = "옥골4거리")
             @RequestParam(name="srchCRNm", required = false) @Nullable String srchCRNm,
             HttpServletRequest req, HttpServletResponse res
     ) throws IOException {
-        final String serviceName = "PlanCrossRoadInfoService";
         final String remoteIP = ApiUtils.getRemoteIP(req);
 
         String type_ = (type == null) ? "json" : type;
@@ -411,6 +457,19 @@ public class PlanCrossRoadInfoController extends SigOpenApiCommonController {
             numOfRows_ = 100;
         }
 
+        ServiceHistDto hist = ServiceHistDto.builder()
+                .OPENAPI_ID(4)
+                .OPEN_DATA_KEY(serviceKey)
+                .HOST_IP(remoteIP)
+                .DATA_TYPE(type)
+                .EXECUTE_TIME(0)
+                .STATUS(0)
+                .REGION_CD("".equals(srchCTId_) ? "ALL" : srchCTId_)
+                .startTime(System.currentTimeMillis())
+                .build();
+        StopWatch stopWatch = new StopWatch();
+        stopWatch.start();
+
         Integer [] calcPageReturn = this.service.calcPageStartEndNo(pageNo_, numOfRows_);
         log.info("getPlanCROPInfo: type_:{}, numOfRows_:{}, pageNo_:{}, srchCTId_:{}, srchCRNm_:{}, startRow:{}, endRow:{}",
                 type_, numOfRows_, pageNo_, srchCTId_, srchCRNm_, calcPageReturn[0], calcPageReturn[1]);
@@ -426,6 +485,8 @@ public class PlanCrossRoadInfoController extends SigOpenApiCommonController {
         SigOpenApiHeaderDto headerVo = this.service.checkServiceKey("/PlanCrossRoadInfoService/getPlanCROPInfo", remoteIP, serviceKey);
         if (!"0".equalsIgnoreCase(headerVo.getResultCode())) {
             sendErrorResponse(type_, serviceName, headerVo, res);
+            hist.setSTATUS("30".equals(headerVo.getResultCode()) ? 1 : 2);
+            this.service.saveServiceHistory(hist);
             return;
         }
 
@@ -558,6 +619,7 @@ public class PlanCrossRoadInfoController extends SigOpenApiCommonController {
             }
             sendResponseJson(jsonList, res);
         }
+        this.service.saveServiceHistory(hist);
     }
 
 }

+ 21 - 3
src/main/java/com/sig/api/controller/sig/SigMapCrossRoadInfoController.java

@@ -1,6 +1,7 @@
 package com.sig.api.controller.sig;
 
 import com.sig.api.aspectj.SigOpenApiElapsed;
+import com.sig.api.dto.sig.ServiceHistDto;
 import com.sig.api.dto.sig.SigOpenApiHeaderDto;
 import com.sig.api.entity.sig.DataCount;
 import com.sig.api.entity.sig.TbIntSignalMap;
@@ -12,6 +13,7 @@ import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.time.StopWatch;
 import org.jdom2.Element;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -33,6 +35,7 @@ import java.util.Map;
 @Api(tags = "03.교차로시그널맵정보서비스")
 public class SigMapCrossRoadInfoController extends SigOpenApiCommonController {
 
+    private final String serviceName = "SigMapCrossRoadInfoService";
     private final SigMapCrossRoadInfoService service;
 
     @SigOpenApiElapsed
@@ -47,13 +50,12 @@ public class SigMapCrossRoadInfoController extends SigOpenApiCommonController {
             @RequestParam(name="numOfRows", required = false) @Nullable Integer numOfRows,
             @ApiParam(name = "pageNo", value = "페이지 번호", example = "1")
             @RequestParam(name="pageNo", required = false) @Nullable Integer pageNo,
-            @ApiParam(name = "srchCTId", value = "지역코드", example = "L01")
+            @ApiParam(name = "srchCTId", value = "지역코드", example = "L02")
             @RequestParam(name="srchCTId", required = false) @Nullable String srchCTId,
-            @ApiParam(name = "srchCRNm", value = "교차로명", example = "시청입구")
+            @ApiParam(name = "srchCRNm", value = "교차로명", example = "옥골4거리")
             @RequestParam(name="srchCRNm", required = false) @Nullable String srchCRNm,
             HttpServletRequest req, HttpServletResponse res
     ) throws IOException {
-        final String serviceName = "SigMapCrossRoadInfoService";
         final String remoteIP = ApiUtils.getRemoteIP(req);
 
         String type_ = (type == null) ? "json" : type;
@@ -65,6 +67,19 @@ public class SigMapCrossRoadInfoController extends SigOpenApiCommonController {
             numOfRows_ = 100;
         }
 
+        ServiceHistDto hist = ServiceHistDto.builder()
+                .OPENAPI_ID(5)
+                .OPEN_DATA_KEY(serviceKey)
+                .HOST_IP(remoteIP)
+                .DATA_TYPE(type)
+                .EXECUTE_TIME(0)
+                .STATUS(0)
+                .REGION_CD("".equals(srchCTId_) ? "ALL" : srchCTId_)
+                .startTime(System.currentTimeMillis())
+                .build();
+        StopWatch stopWatch = new StopWatch();
+        stopWatch.start();
+
         Integer [] calcPageReturn = this.service.calcPageStartEndNo(pageNo_, numOfRows_);
         log.info("getSigMapCRInfo: type_:{}, numOfRows_:{}, pageNo_:{}, srchCTId_:{}, srchCRNm_:{}, startRow:{}, endRow:{}",
                 type_, numOfRows_, pageNo_, srchCTId_, srchCRNm_, calcPageReturn[0], calcPageReturn[1]);
@@ -80,6 +95,8 @@ public class SigMapCrossRoadInfoController extends SigOpenApiCommonController {
         SigOpenApiHeaderDto headerVo = this.service.checkServiceKey("/PlanCrossRoadInfoService/getPlanCRHDInfo", remoteIP, serviceKey);
         if (!"0".equals(headerVo.getResultCode())) {
             sendErrorResponse(type_, "PlanCrossRoadInfoService", headerVo, res);
+            hist.setSTATUS("30".equals(headerVo.getResultCode()) ? 1 : 2);
+            this.service.saveServiceHistory(hist);
             return;
         }
 
@@ -161,6 +178,7 @@ public class SigMapCrossRoadInfoController extends SigOpenApiCommonController {
             }
             sendResponseJson(jsonList, res);
         }
+        this.service.saveServiceHistory(hist);
     }
 
 }

+ 4 - 4
src/main/java/com/sig/api/controller/sig/SigOpenApiTestController.java

@@ -20,7 +20,7 @@ import javax.servlet.http.HttpServletResponse;
 @Api(tags = "99.TEST")
 public class SigOpenApiTestController {
 
-    @GetMapping("/")
+    @GetMapping("")
     public String index() {
         return "UTIC Signal Traffic Open API Service";
     }
@@ -34,9 +34,9 @@ public class SigOpenApiTestController {
 
         log.info("type: {}", type);
         TestVo result = TestVo.builder()
-                .name("정승호")
-                .family("Chung")
-                .age(53)
+                .name("UTIC")
+                .family("Signal Open API")
+                .age(99)
                 .type(type == null ? "json" : type)
                 .build();
 

+ 3 - 0
src/main/java/com/sig/api/dao/mapper/sig/SigOpenApiCommonMapper.java

@@ -1,7 +1,9 @@
 package com.sig.api.dao.mapper.sig;
 
+import com.sig.api.dto.sig.ServiceHistDto;
 import com.sig.api.entity.sig.DataCount;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.Map;
 
@@ -9,5 +11,6 @@ import java.util.Map;
 public interface SigOpenApiCommonMapper {
 
     DataCount selectDataCount(Map<String, Object> param);
+    int insertServiceHist(@Param("obj") ServiceHistDto obj);
 
 }

+ 30 - 0
src/main/java/com/sig/api/dto/sig/ServiceHistDto.java

@@ -0,0 +1,30 @@
+package com.sig.api.dto.sig;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class ServiceHistDto {
+
+    private Integer OPENAPI_ID;     //	N	NUMBER(3)	    N			API ID
+    private String  OPEN_DATA_KEY;  //	N	VARCHAR2(100)	Y			서비스 키
+    private String  HOST_IP;        //	N	VARCHAR2(15)	Y			요청 호스트 IP
+    private Integer EXECUTE_TIME;   //	N	NUMBER(6)	    Y	0		서비스 수행시각(단위: seconds)
+    private Integer STATUS;         //	N	NUMBER(3)	    Y			서비스 수행 상태(0: 정상, 1: 잘못된 서비스 키, 2: 접근불가 호스트 IP, 9: 시스템 내부 오류)
+    private String  DATA_TYPE;      //	N	VARCHAR2(4)	    Y			요청 데이터 유형(xml, json)
+    private String  REGION_CD;      //	N	VARCHAR2(3)	    Y			지역 코드
+
+    private long startTime = 0L;
+
+    public void calExecuteTime() {
+        //this.EXECUTE_TIME = Math.round((float)(System.currentTimeMillis() - this.startTime) / 1000);
+        this.EXECUTE_TIME = Math.toIntExact(System.currentTimeMillis() - this.startTime);
+    }
+}

+ 26 - 1
src/main/java/com/sig/api/service/sig/SigOpenApiCommonService.java

@@ -1,6 +1,7 @@
 package com.sig.api.service.sig;
 
 import com.sig.api.dao.mapper.sig.SigOpenApiCommonMapper;
+import com.sig.api.dto.sig.ServiceHistDto;
 import com.sig.api.dto.sig.SigOpenApiHeaderDto;
 import com.sig.api.dto.sig.TbApiAuthDto;
 import com.sig.api.entity.sig.DataCount;
@@ -10,6 +11,8 @@ import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
 import java.util.Map;
 
 @Slf4j
@@ -28,7 +31,7 @@ public class SigOpenApiCommonService {
         if (dto == null) {
             resultCode = "30";
             resultMsg = "SERVICE_KEY_IS_NOT_REGISTERED_ERROR";
-            SigOpenApiAuthManager.getInstance().debugAuthMap();
+            //SigOpenApiAuthManager.getInstance().debugAuthMap();
         }
         else {
             if (!dto.isValid()) {
@@ -80,4 +83,26 @@ public class SigOpenApiCommonService {
 
         return new Integer[]{ sRow, eRow};
     }
+
+    public String fileNameEncoder(String fileName, String header) {
+        try {
+            if (header.contains("MSIE") || header.contains("Trident") || header.contains("Chrome")) {
+                return URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
+            } else {
+                return  new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+            return fileName;
+        }
+    }
+
+    /**
+     * 서비스 호출 이력 저장
+     * @param histDto
+     */
+    public void saveServiceHistory(ServiceHistDto histDto) {
+        histDto.calExecuteTime();
+        this.mapper.insertServiceHist(histDto);
+    }
 }

+ 1 - 16
src/main/resources/application.yml

@@ -4,7 +4,7 @@ application:
     name: UTIC Signal Open API Server
 
 server:
-  port: 8888
+  port: 7901
   shutdown: graceful
   error:
     whitelabel:
@@ -109,18 +109,3 @@ spring:
     properties:
       hibernate:
         dialect: org.hibernate.dialect.Oracle10gDialect
-
-#db.Driver   = oracle.jdbc.OracleDriver
-#db.Url      = jdbc:oracle:thin:@192.168.10.68:1521:CVIBDB
-#db.Username = siguser
-#db.Password = siguser
-#
-#admin.Driver   = oracle.jdbc.OracleDriver
-#admin.Url      = jdbc:oracle:thin:@(DESCRIPTION=(FAIL_OVER=ON)(LOAD_BALANCE=ON)(ADDRESS_LIST=(ADDRESS=(PROTOCOL = TCP)(HOST=192.168.10.21)(PORT=1521))(ADDRESS=(PROTOCOL = TCP)(HOST=192.168.10.22)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = UTIS)(FAILOVER_MODE=(TYPE=SELECT)(METHOD=BASIC)(RETRY=180)(DELAY=5))))
-#admin.Username = utiadmin
-#admin.Password = utiadmin
-#
-#sigopen.Driver	 = oracle.jdbc.OracleDriver
-#sigopen.Url      = jdbc:oracle:thin:@192.168.10.14:1521:DWDB
-#sigopen.Username = sigopen
-#sigopen.Password = sigopen

+ 27 - 0
src/main/resources/mybatis/mapper/sig/SigOpenApiCommonMapper.xml

@@ -20,4 +20,31 @@
          AND AA.INT_NO_SE = A.INT_NO
     </select>
 
+    <insert id="insertServiceHist" parameterType="com.sig.api.dto.sig.ServiceHistDto">
+    <![CDATA[
+        INSERT INTO TB_OPENAPI_SERVICE_HIST (
+            SERVICE_DTIME,
+            SERVICE_HIST_SEQ,
+            OPENAPI_ID,
+            OPEN_DATA_KEY,
+            HOST_IP,
+            EXECUTE_TIME,
+            STATUS,
+            DATA_TYPE,
+            REGION_CD
+        )
+        VALUES (
+                SYSDATE,
+                OPENAPI_SERVICE_SEQ.NEXTVAL,
+                #{obj.OPENAPI_ID},
+                #{obj.OPEN_DATA_KEY},
+                #{obj.HOST_IP},
+                #{obj.EXECUTE_TIME},
+                #{obj.STATUS},
+                #{obj.DATA_TYPE},
+                SUBSTR(#{obj.REGION_CD}, 1, 3)
+               )
+        ]]>
+    </insert>
+
 </mapper>