Explorar el Código

vms symbol management add

shjung hace 3 años
padre
commit
451feb4014
Se han modificado 32 ficheros con 2383 adiciones y 67 borrados
  1. 0 8
      src/main/java/com/its/op/common/dto/TbAtrdDto.java
  2. 5 0
      src/main/java/com/its/op/common/entity/TbAtrd.java
  3. 65 0
      src/main/java/com/its/op/controller/vms/TbVmsCtlrController.java
  4. 65 0
      src/main/java/com/its/op/controller/vms/TbVmsIfscController.java
  5. 66 0
      src/main/java/com/its/op/controller/vms/TbVmsIfscRltnController.java
  6. 13 9
      src/main/java/com/its/op/controller/vms/TbVmsSymbLibControllerVMP0.java
  7. 29 15
      src/main/java/com/its/op/controller/vms/TbVmsSymbLibControllerVMP1.java
  8. 22 17
      src/main/java/com/its/op/controller/vms/TbVmsSymbLibControllerVMP2.java
  9. 555 0
      src/main/java/com/its/op/model/dto/vms/TbVmsCtlrDto.java
  10. 148 0
      src/main/java/com/its/op/model/dto/vms/TbVmsIfscDto.java
  11. 82 0
      src/main/java/com/its/op/model/dto/vms/TbVmsIfscRltnDto.java
  12. 14 8
      src/main/java/com/its/op/model/dto/vms/TbVmsSymbIfscDto.java
  13. 179 0
      src/main/java/com/its/op/model/dto/vms/TbVmsSymbLibIfscVMP1Dto.java
  14. 178 0
      src/main/java/com/its/op/model/dto/vms/TbVmsSymbLibIfscVMP2Dto.java
  15. 299 0
      src/main/java/com/its/op/model/entity/vms/TbVmsCtlr.java
  16. 95 0
      src/main/java/com/its/op/model/entity/vms/TbVmsIfsc.java
  17. 72 0
      src/main/java/com/its/op/model/entity/vms/TbVmsIfscRltn.java
  18. 25 0
      src/main/java/com/its/op/model/entity/vms/TbVmsIfscRltnKey.java
  19. 4 4
      src/main/java/com/its/op/model/entity/vms/TbVmsSymbIfsc.java
  20. 1 1
      src/main/java/com/its/op/model/entity/vms/TbVmsSymbIfscKey.java
  21. 11 0
      src/main/java/com/its/op/repository/vms/TbVmsCtlrRepository.java
  22. 11 0
      src/main/java/com/its/op/repository/vms/TbVmsIfscRepository.java
  23. 17 0
      src/main/java/com/its/op/repository/vms/TbVmsIfscRltnRepository.java
  24. 10 0
      src/main/java/com/its/op/repository/vms/TbVmsSymbIfscRepository.java
  25. 90 0
      src/main/java/com/its/op/service/vms/TbVmsCtlrService.java
  26. 105 0
      src/main/java/com/its/op/service/vms/TbVmsIfscRltnService.java
  27. 90 0
      src/main/java/com/its/op/service/vms/TbVmsIfscService.java
  28. 16 1
      src/main/java/com/its/op/service/vms/TbVmsSymbIfscService.java
  29. 5 1
      src/main/java/com/its/op/service/vms/TbVmsSymbLibService.java
  30. 12 0
      src/main/java/com/its/op/service/vms/TbVmsSymbLibServiceVMP0.java
  31. 49 2
      src/main/java/com/its/op/service/vms/TbVmsSymbLibServiceVMP1.java
  32. 50 1
      src/main/java/com/its/op/service/vms/TbVmsSymbLibServiceVMP2.java

+ 0 - 8
src/main/java/com/its/op/common/dto/TbAtrdDto.java

@@ -44,14 +44,6 @@ public class TbAtrdDto implements Serializable {
     @JsonProperty("drct_desc")    // DRCT_CD
     private String drctDesc;
 
-    @ApiModelProperty("지역 코드 설명")
-    @JsonProperty("area_desc")    // AREA_CD
-    private String areaDesc;
-
-    @ApiModelProperty("삭제 여부 설명")
-    @JsonProperty("del_desc")    // DEL_YN
-    private String delDesc;
-
     @ApiModel("TbAtrdUpdReq(간선도로 정보변경)")
     @Getter
     @Setter

+ 5 - 0
src/main/java/com/its/op/common/entity/TbAtrd.java

@@ -54,6 +54,11 @@ public class TbAtrd implements Serializable {
                 .delYn(this.delYn)
                 .build();
 
+        if (dto.getDrctCd().equals("0"))
+            dto.setDrctDesc("상행");
+        else
+            dto.setDrctDesc("하행");
+
         return dto;
     }
 

+ 65 - 0
src/main/java/com/its/op/controller/vms/TbVmsCtlrController.java

@@ -0,0 +1,65 @@
+package com.its.op.controller.vms;
+
+import com.its.op.model.dto.vms.TbVmsCtlrDto;
+import com.its.op.service.vms.TbVmsCtlrService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "VMS 제어기")
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/tb_vms_ctlr")
+public class TbVmsCtlrController {
+
+    private final TbVmsCtlrService service;
+
+    @ApiOperation(value = "VMS 제어기 전체조회(TB_VMS_CTLR)", response = TbVmsCtlrDto.class)
+    @GetMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbVmsCtlrDto> findAll() {
+        return service.findAll();
+    }
+
+    @ApiOperation(value = "VMS 제어기 개별조회(TB_VMS_CTLR)", response = TbVmsCtlrDto.class)
+    @GetMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
+    public TbVmsCtlrDto findById(@PathVariable final Long id) {
+        return this.service.findById(id);
+    }
+
+    @ApiOperation(value = "VMS 제어기 정보변경(TB_VMS_CTLR)", response = TbVmsCtlrDto.class)
+    @PutMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
+    public TbVmsCtlrDto updateById(@PathVariable final Long id, @RequestBody @Valid final TbVmsCtlrDto.TbVmsCtlrUpdReq req) {
+        return this.service.updateById(id, req);
+    }
+
+    @ApiOperation(value = "VMS 제어기 정보변경/생성-목록(TB_VMS_CTLR)", response = TbVmsCtlrDto.class)
+    @PostMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbVmsCtlrDto> mergeInfoList(@RequestBody @Valid final List<TbVmsCtlrDto.TbVmsCtlrUpdReq> listReq) {
+        return this.service.mergeInfoList(listReq);
+    }
+
+    @ApiOperation(value = "VMS 제어기 정보변경/생성-개별(TB_VMS_CTLR)", response = TbVmsCtlrDto.class)
+    @PostMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
+    public TbVmsCtlrDto mergeInfo(@PathVariable("id") Long id, @RequestBody @Valid final TbVmsCtlrDto.TbVmsCtlrUpdReq req) {
+        return this.service.mergeInfo(req);
+    }
+
+    @ApiOperation(value = "VMS 제어기 정보삭제-개별(TB_VMS_CTLR)", response = TbVmsCtlrDto.class)
+    @DeleteMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
+    public TbVmsCtlrDto deleteDataById(@PathVariable("id") Long id) {
+        return this.service.deleteById(id);
+    }
+
+    @ApiOperation(value = "VMS 제어기 정보삭제-목록(TB_VMS_CTLR)", response = TbVmsCtlrDto.class)
+    @DeleteMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbVmsCtlrDto> deleteDataByIds(@RequestBody @Valid final List<Long> ids) {
+        return this.service.deleteByIds(ids);
+    }
+
+}

+ 65 - 0
src/main/java/com/its/op/controller/vms/TbVmsIfscController.java

@@ -0,0 +1,65 @@
+package com.its.op.controller.vms;
+
+import com.its.op.model.dto.vms.TbVmsIfscDto;
+import com.its.op.service.vms.TbVmsIfscService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "VMS 정보제공구간")
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/tb_vms_ifsc")
+public class TbVmsIfscController {
+
+    private final TbVmsIfscService service;
+
+    @ApiOperation(value = "VMS 정보제공구간 전체조회(TB_VMS_IFSC)", response = TbVmsIfscDto.class)
+    @GetMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbVmsIfscDto> findAll() {
+        return service.findAll();
+    }
+
+    @ApiOperation(value = "VMS 정보제공구간 개별조회(TB_VMS_IFSC)", response = TbVmsIfscDto.class)
+    @GetMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
+    public TbVmsIfscDto findById(@PathVariable final Long id) {
+        return this.service.findById(id);
+    }
+
+    @ApiOperation(value = "VMS 정보제공구간 정보변경(TB_VMS_IFSC)", response = TbVmsIfscDto.class)
+    @PutMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
+    public TbVmsIfscDto updateById(@PathVariable final Long id, @RequestBody @Valid final TbVmsIfscDto.TbVmsIfscUpdReq req) {
+        return this.service.updateById(id, req);
+    }
+
+    @ApiOperation(value = "VMS 정보제공구간 정보변경/생성-목록(TB_VMS_IFSC)", response = TbVmsIfscDto.class)
+    @PostMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbVmsIfscDto> mergeInfoList(@RequestBody @Valid final List<TbVmsIfscDto.TbVmsIfscUpdReq> listReq) {
+        return this.service.mergeInfoList(listReq);
+    }
+
+    @ApiOperation(value = "VMS 정보제공구간 정보변경/생성-개별(TB_VMS_IFSC)", response = TbVmsIfscDto.class)
+    @PostMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
+    public TbVmsIfscDto mergeInfo(@PathVariable("id") Long id, @RequestBody @Valid final TbVmsIfscDto.TbVmsIfscUpdReq req) {
+        return this.service.mergeInfo(req);
+    }
+
+    @ApiOperation(value = "VMS 정보제공구간 정보삭제-개별(TB_VMS_IFSC)", response = TbVmsIfscDto.class)
+    @DeleteMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
+    public TbVmsIfscDto deleteDataById(@PathVariable("id") Long id) {
+        return this.service.deleteById(id);
+    }
+
+    @ApiOperation(value = "VMS 정보제공구간 정보삭제-목록(TB_VMS_IFSC)", response = TbVmsIfscDto.class)
+    @DeleteMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbVmsIfscDto> deleteDataByIds(@RequestBody @Valid final List<Long> ids) {
+        return this.service.deleteByIds(ids);
+    }
+
+}

+ 66 - 0
src/main/java/com/its/op/controller/vms/TbVmsIfscRltnController.java

@@ -0,0 +1,66 @@
+package com.its.op.controller.vms;
+
+import com.its.op.model.dto.vms.TbVmsIfscRltnDto;
+import com.its.op.model.entity.vms.TbVmsIfscRltnKey;
+import com.its.op.service.vms.TbVmsIfscRltnService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "VMS 정보제공구간 관계")
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/tb_vms_ifsc_rltn")
+public class TbVmsIfscRltnController {
+
+    private final TbVmsIfscRltnService service;
+
+    @ApiOperation(value = "VMS 정보제공구간 관계 전체조회(TB_VMS_IFSC_RLTN)", response = TbVmsIfscRltnDto.class)
+    @GetMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbVmsIfscRltnDto> findAll() {
+        return service.findAll();
+    }
+
+    @ApiOperation(value = "VMS 정보제공구간 관계 개별조회(TB_VMS_IFSC_RLTN)", response = TbVmsIfscRltnDto.class)
+    @GetMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
+    public TbVmsIfscRltnDto findById(@PathVariable final TbVmsIfscRltnKey id) {
+        return this.service.findById(id);
+    }
+
+    @ApiOperation(value = "VMS 정보제공구간 관계 정보변경(TB_VMS_IFSC_RLTN)", response = TbVmsIfscRltnDto.class)
+    @PutMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
+    public TbVmsIfscRltnDto updateById(@PathVariable final TbVmsIfscRltnKey id, @RequestBody @Valid final TbVmsIfscRltnDto.TbVmsIfscRltnUpdReq req) {
+        return this.service.updateById(id, req);
+    }
+
+    @ApiOperation(value = "VMS 정보제공구간 관계 정보변경/생성-목록(TB_VMS_IFSC_RLTN)", response = TbVmsIfscRltnDto.class)
+    @PostMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbVmsIfscRltnDto> mergeInfoList(@RequestBody @Valid final List<TbVmsIfscRltnDto.TbVmsIfscRltnUpdReq> listReq) {
+        return this.service.mergeInfoList(listReq);
+    }
+
+    @ApiOperation(value = "VMS 정보제공구간 관계 정보변경/생성-개별(TB_VMS_IFSC_RLTN)", response = TbVmsIfscRltnDto.class)
+    @PostMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
+    public TbVmsIfscRltnDto mergeInfo(@PathVariable("id") TbVmsIfscRltnKey id, @RequestBody @Valid final TbVmsIfscRltnDto.TbVmsIfscRltnUpdReq req) {
+        return this.service.mergeInfo(req);
+    }
+
+    @ApiOperation(value = "VMS 정보제공구간 관계 정보삭제-개별(TB_VMS_IFSC_RLTN)", response = TbVmsIfscRltnDto.class)
+    @DeleteMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
+    public TbVmsIfscRltnDto deleteDataById(@PathVariable("id") TbVmsIfscRltnKey id) {
+        return this.service.deleteById(id);
+    }
+
+    @ApiOperation(value = "VMS 정보제공구간 관계 정보삭제-목록(TB_VMS_IFSC_RLTN)", response = TbVmsIfscRltnDto.class)
+    @DeleteMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbVmsIfscRltnDto> deleteDataByIds(@RequestBody @Valid final List<TbVmsIfscRltnKey> ids) {
+        return this.service.deleteByIds(ids);
+    }
+
+}

+ 13 - 9
src/main/java/com/its/op/controller/vms/TbVmsSymbLibControllerVMP0.java

@@ -32,17 +32,13 @@ public class TbVmsSymbLibControllerVMP0 {
         return this.service.findById(id);
     }
 
+/*
     @ApiOperation(value = "VMS 심벌이미지 정보변경(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
     @PutMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
     public TbVmsSymbLibDto updateById(@PathVariable final Short id, @RequestBody @Valid final TbVmsSymbLibDto.TbVmsSymbLibUpdReq req) {
         return this.service.updateById(id, req);
     }
-
-    @ApiOperation(value = "VMS 심벌이미지 정보변경/생성-목록(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
-    @PostMapping(value = "", produces = {"application/json; charset=utf8"})
-    public List<TbVmsSymbLibDto> mergeInfoList(@RequestBody @Valid final List<TbVmsSymbLibDto.TbVmsSymbLibUpdReq> listReq) {
-        return this.service.mergeInfoList(listReq);
-    }
+*/
 
     @ApiOperation(value = "VMS 심벌이미지 정보변경/생성-개별(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
     @PostMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
@@ -53,7 +49,14 @@ public class TbVmsSymbLibControllerVMP0 {
     @ApiOperation(value = "VMS 심벌이미지 정보삭제-개별(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
     @DeleteMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
     public TbVmsSymbLibDto deleteDataById(@PathVariable("id") Short id) {
-        return this.service.deleteById(id);
+        return this.service.deleteDataById(id);
+    }
+
+/*
+    @ApiOperation(value = "VMS 심벌이미지 정보변경/생성-목록(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
+    @PostMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbVmsSymbLibDto> mergeInfoList(@RequestBody @Valid final List<TbVmsSymbLibDto.TbVmsSymbLibUpdReq> listReq) {
+        return this.service.mergeInfoList(listReq);
     }
 
     @ApiOperation(value = "VMS 심벌이미지 정보삭제-목록(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
@@ -61,14 +64,15 @@ public class TbVmsSymbLibControllerVMP0 {
     public List<TbVmsSymbLibDto> deleteDataByIds(@RequestBody @Valid final List<Short> ids) {
         return this.service.deleteByIds(ids);
     }
+*/
 
-    @ApiOperation(value = "VMS 심벌이미지 사용여부 조회(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
+    @ApiOperation(value = "VMS 심벌이미지 사용여부 조회(TB_VMS_SYMB_LIB)", response = Integer.class)
     @GetMapping(value = "/usage/{id}", produces = {"application/json; charset=utf8"})
     public Integer findUsageCountBySymbolId(@PathVariable final Short id) {
         return this.service.findUsageCountBySymbolId(id);
     }
 
-    @ApiOperation(value = "VMS 심벌이미지 신규 ID 조회(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
+    @ApiOperation(value = "VMS 심벌이미지 신규 ID 조회(TB_VMS_SYMB_LIB)", response = Short.class)
     @GetMapping(value = "/new-id", produces = {"application/json; charset=utf8"})
     public Short getNewSymbolId() {
         return this.service.getNewSymbolId();

+ 29 - 15
src/main/java/com/its/op/controller/vms/TbVmsSymbLibControllerVMP1.java

@@ -1,6 +1,9 @@
 package com.its.op.controller.vms;
 
+import com.its.op.model.dto.vms.TbVmsIfscRltnDto;
 import com.its.op.model.dto.vms.TbVmsSymbLibDto;
+import com.its.op.model.dto.vms.TbVmsSymbLibIfscVMP1Dto;
+import com.its.op.service.vms.TbVmsIfscRltnService;
 import com.its.op.service.vms.TbVmsSymbLibServiceVMP1;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -19,6 +22,13 @@ import java.util.List;
 public class TbVmsSymbLibControllerVMP1 {
 
     private final TbVmsSymbLibServiceVMP1 service;
+    private final TbVmsIfscRltnService vmsIfscRltnService;
+
+    @ApiOperation(value = "VMS 도형식 정보제공구간 전체조회(TB_VMS_CTLR, TB_VMS_IFSC, TB_VMS_IFSC_RLTN)", response = TbVmsIfscRltnDto.class)
+    @GetMapping(value = "/figure-ifsc", produces = {"application/json; charset=utf8"})
+    public List<TbVmsIfscRltnDto> findFigureIfscAll() {
+        return this.vmsIfscRltnService.findFigureIfscAll();
+    }
 
     @ApiOperation(value = "VMS 소통정보 배경이미지 전체조회(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
     @GetMapping(value = "", produces = {"application/json; charset=utf8"})
@@ -26,34 +36,37 @@ public class TbVmsSymbLibControllerVMP1 {
         return service.findAll();
     }
 
-    @ApiOperation(value = "VMS 소통정보 배경이미지 개별조회(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
+    @ApiOperation(value = "VMS 소통정보 배경이미지 개별조회(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibIfscVMP1Dto.class)
     @GetMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
-    public TbVmsSymbLibDto findById(@PathVariable final Short id) {
-        return this.service.findById(id);
+    public TbVmsSymbLibIfscVMP1Dto findById(@PathVariable final Short id) {
+        return this.service.findAllById(id);
     }
 
+/*
     @ApiOperation(value = "VMS 소통정보 배경이미지 정보변경(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
     @PutMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
     public TbVmsSymbLibDto updateById(@PathVariable final Short id, @RequestBody @Valid final TbVmsSymbLibDto.TbVmsSymbLibUpdReq req) {
         return this.service.updateById(id, req);
     }
+*/
 
-    @ApiOperation(value = "VMS 소통정보 배경이미지 정보변경/생성-목록(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
-    @PostMapping(value = "", produces = {"application/json; charset=utf8"})
-    public List<TbVmsSymbLibDto> mergeInfoList(@RequestBody @Valid final List<TbVmsSymbLibDto.TbVmsSymbLibUpdReq> listReq) {
-        return this.service.mergeInfoList(listReq);
-    }
-
-    @ApiOperation(value = "VMS 소통정보 배경이미지 정보변경/생성-개별(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
+    @ApiOperation(value = "VMS 소통정보 배경이미지 정보변경/생성-개별(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibIfscVMP1Dto.class)
     @PostMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
-    public TbVmsSymbLibDto mergeInfo(@PathVariable("id") Short id, @RequestBody @Valid final TbVmsSymbLibDto.TbVmsSymbLibUpdReq req) {
-        return this.service.mergeInfo(req);
+    public TbVmsSymbLibIfscVMP1Dto mergeInfo(@PathVariable("id") Short id, @RequestBody @Valid final TbVmsSymbLibIfscVMP1Dto.TbVmsSymbLibIfscVMP1UpdReq req) {
+        return this.service.mergeSymbIfscInfo(req);
     }
 
     @ApiOperation(value = "VMS 소통정보 배경이미지 정보삭제-개별(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
     @DeleteMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
     public TbVmsSymbLibDto deleteDataById(@PathVariable("id") Short id) {
-        return this.service.deleteById(id);
+        return this.service.deleteDataById(id);
+    }
+
+/*
+    @ApiOperation(value = "VMS 소통정보 배경이미지 정보변경/생성-목록(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
+    @PostMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbVmsSymbLibDto> mergeInfoList(@RequestBody @Valid final List<TbVmsSymbLibDto.TbVmsSymbLibUpdReq> listReq) {
+        return this.service.mergeInfoList(listReq);
     }
 
     @ApiOperation(value = "VMS 소통정보 배경이미지 정보삭제-목록(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
@@ -61,14 +74,15 @@ public class TbVmsSymbLibControllerVMP1 {
     public List<TbVmsSymbLibDto> deleteDataByIds(@RequestBody @Valid final List<Short> ids) {
         return this.service.deleteByIds(ids);
     }
+*/
 
-    @ApiOperation(value = "VMS 소통정보 배경이미지 사용여부 조회(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
+    @ApiOperation(value = "VMS 소통정보 배경이미지 사용여부 조회(TB_VMS_SYMB_LIB)", response = Integer.class)
     @GetMapping(value = "/usage/{id}", produces = {"application/json; charset=utf8"})
     public Integer findUsageCountBySymbolId(@PathVariable final Short id) {
         return this.service.findUsageCountBySymbolId(id);
     }
 
-    @ApiOperation(value = "VMS 소통정보 배경이미지 신규 ID 조회(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
+    @ApiOperation(value = "VMS 소통정보 배경이미지 신규 ID 조회(TB_VMS_SYMB_LIB)", response = Short.class)
     @GetMapping(value = "/new-id", produces = {"application/json; charset=utf8"})
     public Short getNewSymbolId() {
         return this.service.getNewSymbolId();

+ 22 - 17
src/main/java/com/its/op/controller/vms/TbVmsSymbLibControllerVMP2.java

@@ -1,6 +1,7 @@
 package com.its.op.controller.vms;
 
 import com.its.op.model.dto.vms.TbVmsSymbLibDto;
+import com.its.op.model.dto.vms.TbVmsSymbLibIfscVMP2Dto;
 import com.its.op.service.vms.TbVmsSymbLibServiceVMP2;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -26,34 +27,37 @@ public class TbVmsSymbLibControllerVMP2 {
         return service.findAll();
     }
 
-    @ApiOperation(value = "VMS 소통정보 이미지 개별조회(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
+    @ApiOperation(value = "VMS 소통정보 이미지 개별조회(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibIfscVMP2Dto.class)
     @GetMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
-    public TbVmsSymbLibDto findById(@PathVariable final Short id) {
-        return this.service.findById(id);
+    public TbVmsSymbLibIfscVMP2Dto findById(@PathVariable final Short id) {
+        return this.service.findAllById(id);
     }
 
-    @ApiOperation(value = "VMS 소통정보 이미지 정보변경(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
+/*
+    @ApiOperation(value = "VMS 소통정보 이미지 정보변경(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibIfscVMP2Dto.class)
     @PutMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
     public TbVmsSymbLibDto updateById(@PathVariable final Short id, @RequestBody @Valid final TbVmsSymbLibDto.TbVmsSymbLibUpdReq req) {
         return this.service.updateById(id, req);
     }
+*/
 
-    @ApiOperation(value = "VMS 소통정보 이미지 정보변경/생성-목록(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
-    @PostMapping(value = "", produces = {"application/json; charset=utf8"})
-    public List<TbVmsSymbLibDto> mergeInfoList(@RequestBody @Valid final List<TbVmsSymbLibDto.TbVmsSymbLibUpdReq> listReq) {
-        return this.service.mergeInfoList(listReq);
-    }
-
-    @ApiOperation(value = "VMS 소통정보 이미지 정보변경/생성-개별(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
+    @ApiOperation(value = "VMS 소통정보 이미지 정보변경/생성-개별(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibIfscVMP2Dto.class)
     @PostMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
-    public TbVmsSymbLibDto mergeInfo(@PathVariable("id") Short id, @RequestBody @Valid final TbVmsSymbLibDto.TbVmsSymbLibUpdReq req) {
-        return this.service.mergeInfo(req);
+    public TbVmsSymbLibIfscVMP2Dto mergeInfo(@PathVariable("id") Short id, @RequestBody @Valid final TbVmsSymbLibIfscVMP2Dto.TbVmsSymbLibIfscVMP2UpdReq req) {
+        return this.service.mergeSymbIfscInfo(req);
     }
 
-    @ApiOperation(value = "VMS 소통정보 이미지 정보삭제-개별(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
+    @ApiOperation(value = "VMS 소통정보 이미지 정보삭제-개별(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibIfscVMP2Dto.class)
     @DeleteMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
     public TbVmsSymbLibDto deleteDataById(@PathVariable("id") Short id) {
-        return this.service.deleteById(id);
+        return this.service.deleteDataById(id);
+    }
+
+/*
+    @ApiOperation(value = "VMS 소통정보 이미지 정보변경/생성-목록(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
+    @PostMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbVmsSymbLibDto> mergeInfoList(@RequestBody @Valid final List<TbVmsSymbLibDto.TbVmsSymbLibUpdReq> listReq) {
+        return this.service.mergeInfoList(listReq);
     }
 
     @ApiOperation(value = "VMS 소통정보 이미지 정보삭제-목록(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
@@ -61,14 +65,15 @@ public class TbVmsSymbLibControllerVMP2 {
     public List<TbVmsSymbLibDto> deleteDataByIds(@RequestBody @Valid final List<Short> ids) {
         return this.service.deleteByIds(ids);
     }
+*/
 
-    @ApiOperation(value = "VMS 소통정보 이미지 사용여부 조회(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
+    @ApiOperation(value = "VMS 소통정보 이미지 사용여부 조회(TB_VMS_SYMB_LIB)", response = Integer.class)
     @GetMapping(value = "/usage/{id}", produces = {"application/json; charset=utf8"})
     public Integer findUsageCountBySymbolId(@PathVariable final Short id) {
         return this.service.findUsageCountBySymbolId(id);
     }
 
-    @ApiOperation(value = "VMS 소통정보 이미지 신규 ID 조회(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
+    @ApiOperation(value = "VMS 소통정보 이미지 신규 ID 조회(TB_VMS_SYMB_LIB)", response = Short.class)
     @GetMapping(value = "/new-id", produces = {"application/json; charset=utf8"})
     public Short getNewSymbolId() {
         return this.service.getNewSymbolId();

+ 555 - 0
src/main/java/com/its/op/model/dto/vms/TbVmsCtlrDto.java

@@ -0,0 +1,555 @@
+package com.its.op.model.dto.vms;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.its.op.model.entity.vms.TbVmsCtlr;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Positive;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+
+/**
+ * VMS 제어기 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbVmsCtlrDto(VMS 제어기)")
+public class TbVmsCtlrDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("VMS 제어기 번호")  // N NUMBER(10)
+    @JsonProperty("vms_ctlr_nmbr")
+    private Long vmsCtlrNmbr;
+
+    @ApiModelProperty("VMS ID")  // Y VARCHAR(4)
+    @JsonProperty("vms_id")
+    private String vmsId;
+
+    @ApiModelProperty("VMS 제어기 ID")  // Y VARCHAR(30)
+    @JsonProperty("vms_ctlr_id")
+    private String vmsCtlrId;
+
+    @ApiModelProperty("VMS 명")  // Y VARCHAR(40)
+    @JsonProperty("vms_nm")
+    private String vmsNm;
+
+    @ApiModelProperty("VMS 제어기 아이피")  // Y VARCHAR(20)
+    @JsonProperty("vms_ctlr_ip")
+    private String vmsCtlrIp;
+
+    @ApiModelProperty("VMS 용도 유형 코드")  // Y VARCHAR(7)
+    @JsonProperty("vms_usag_type_cd")
+    private String vmsUsagTypeCd;
+
+    @ApiModelProperty("VMS 형식 유형 코드")  // Y VARCHAR(7)
+    @JsonProperty("vms_frm_type_cd")
+    private String vmsFrmTypeCd;
+
+    @ApiModelProperty("VMS 유형 코드")  // Y VARCHAR(7)
+    @JsonProperty("vms_type_cd")
+    private String vmsTypeCd;
+
+    @ApiModelProperty("VMS 모듈 유형 코드")  // Y VARCHAR(7)
+    @JsonProperty("vms_modl_type_cd")
+    private String vmsModlTypeCd;
+
+    @ApiModelProperty("VMS 통신 포트")  // Y VARCHAR(5)
+    @JsonProperty("vms_cmnc_port")
+    private String vmsCmncPort;
+
+    @ApiModelProperty("운영 모드")  // Y VARCHAR(7)
+    @JsonProperty("oper_mode")
+    private String operMode;
+
+    @ApiModelProperty("VMS 통신 오류 기본 값")  // Y NUMBER(3)
+    @JsonProperty("vms_cmnc_err_bass_val")
+    private Short vmsCmncErrBassVal;
+
+    @ApiModelProperty("VMS 야간 휘도 단계")  // Y NUMBER(2)
+    @JsonProperty("vms_nght_brgh_step")
+    private Short vmsNghtBrghStep;
+
+    @ApiModelProperty("VMS 주간 휘도 단계")  // Y NUMBER(2)
+    @JsonProperty("vms_week_brgh_step")
+    private Short vmsWeekBrghStep;
+
+    @ApiModelProperty("VMS 표출면 변경 주기")  // Y NUMBER(3)
+    @JsonProperty("vms_phse_chng_cycl")
+    private Short vmsPhseChngCycl;
+
+    @ApiModelProperty("VMS 모듈 오류 율")  // Y NUMBER(3)
+    @JsonProperty("vms_modl_err_rate")
+    private Short vmsModlErrRate;
+
+    @ApiModelProperty("통신장애 SLOT 번호")  // Y NUMBER(4)
+    @JsonProperty("cmncfail_slot_nmbr")
+    private Short cmncfailSlotNmbr;
+
+    @ApiModelProperty("전원 장애 SLOT 번호")  // Y NUMBER(4)
+    @JsonProperty("pwer_fail_slot_nmbr")
+    private Short pwerFailSlotNmbr;
+
+    @ApiModelProperty("삭제 여부")  // Y CHAR(1)
+    @JsonProperty("del_yn")
+    private String delYn;
+
+    @ApiModelProperty("소통정보 연계 여부")  // Y CHAR(1)
+    @JsonProperty("cmtrinfr_cnct_yn")
+    private String cmtrinfrCnctYn;
+
+    @ApiModelProperty("기상정보 연계 여부")  // Y CHAR(1)
+    @JsonProperty("wthrinfr_cnct_yn")
+    private String wthrinfrCnctYn;
+
+    @ApiModelProperty("환경정보 연계 여부")  // Y CHAR(1)
+    @JsonProperty("envrinfr_cnct_yn")
+    private String envrinfrCnctYn;
+
+    @ApiModelProperty("VMS 최대 표출면 개수")  // Y NUMBER(2)
+    @JsonProperty("vms_max_phse_num")
+    private Short vmsMaxPhseNum;
+
+    @ApiModelProperty("최초 등록자 번호")  // Y VARCHAR(20)
+    @JsonProperty("frst_regr_nmbr")
+    private String frstRegrNmbr;
+
+    @ApiModelProperty("최초 등록 일시")  // Y VARCHAR(14)
+    @JsonProperty("frst_rgst_dt")
+    private String frstRgstDt;
+
+    @ApiModelProperty("최종 수정자 번호")  // Y VARCHAR(20)
+    @JsonProperty("last_crpr_nmbr")
+    private String lastCrprNmbr;
+
+    @ApiModelProperty("최종 수정 일시")  // Y VARCHAR(14)
+    @JsonProperty("last_crct_dt")
+    private String lastCrctDt;
+
+    @ApiModelProperty("전광판 ON TIME")  // Y VARCHAR(4)
+    @JsonProperty("panl_on_time")
+    private String panlOnTime;
+
+    @ApiModelProperty("전광판 OFF TIME")  // Y VARCHAR(4)
+    @JsonProperty("panl_off_time")
+    private String panlOffTime;
+
+    @ApiModelProperty("전광판 전원 모드")  // Y VARCHAR(7)
+    @JsonProperty("panl_pwer_mode")
+    private String panlPwerMode;
+
+    @ApiModelProperty("휘도 모드")  // Y VARCHAR(7)
+    @JsonProperty("brgh_mode")
+    private String brghMode;
+
+    @ApiModelProperty("웹 카메라 아이피")  // Y VARCHAR(20)
+    @JsonProperty("web_cmra_ip")
+    private String webCmraIp;
+
+    @ApiModelProperty("X 좌표")  // Y NUMBER(11,8)
+    @JsonProperty("x_crdn")
+    private Long xCrdn;
+
+    @ApiModelProperty("Y 좌표")  // Y NUMBER(10,8)
+    @JsonProperty("y_crdn")
+    private Long yCrdn;
+
+    @ApiModelProperty("설치 위치 명")  // Y VARCHAR(40)
+    @JsonProperty("istl_lctn_nm")
+    private String istlLctnNm;
+
+    @ApiModelProperty("교통 전략 사용 여부")  // Y CHAR(1)
+    @JsonProperty("trfc_strg_use_yn")
+    private String trfcStrgUseYn;
+
+    @ApiModelProperty("VMS 위치 정보제공구간 ID")  // Y NUMBER(10)
+    @JsonProperty("vms_loc_ifsc_id")
+    private Long vmsLocIfscId;
+
+    @ApiModelProperty("팬 동작 온도")  // Y NUMBER(6,3)
+    @JsonProperty("fan_mtns_tmpr")
+    private Short fanMtnsTmpr;
+
+    @ApiModelProperty("히터 동작 온도")  // Y NUMBER(6,3)
+    @JsonProperty("hetr_mtns_tmpr")
+    private Short hetrMtnsTmpr;
+
+    @ApiModelProperty("웹 카메라 포트")  // Y VARCHAR(5)
+    @JsonProperty("web_cmra_port")
+    private String webCmraPort;
+
+    @ApiModelProperty("웹 카메라 ID")  // Y VARCHAR(30)
+    @JsonProperty("web_cmra_id")
+    private String webCmraId;
+
+    @ApiModelProperty("웹 카메라 암호")  // Y VARCHAR(64)
+    @JsonProperty("web_cmra_pwd")
+    private String webCmraPwd;
+
+    @ApiModelProperty("스트리밍 세션 명")  // Y VARCHAR(200)
+    @JsonProperty("strm_sesn_nm")
+    private String strmSesnNm;
+
+    // Code Description Field
+    @ApiModelProperty("VMS 용도 유형 코드 설명")
+    @JsonProperty("vms_usag_type_desc")    // VMS_USAG_TYPE_CD
+    private String vmsUsagTypeDesc;
+
+    @ApiModelProperty("VMS 형식 유형 코드 설명")
+    @JsonProperty("vms_frm_type_desc")    // VMS_FRM_TYPE_CD
+    private String vmsFrmTypeDesc;
+
+    @ApiModelProperty("VMS 유형 코드 설명")
+    @JsonProperty("vms_type_desc")    // VMS_TYPE_CD
+    private String vmsTypeDesc;
+
+    @ApiModelProperty("VMS 모듈 유형 코드 설명")
+    @JsonProperty("vms_modl_type_desc")    // VMS_MODL_TYPE_CD
+    private String vmsModlTypeDesc;
+
+    @ApiModelProperty("삭제 여부 설명")
+    @JsonProperty("del_desc")    // DEL_YN
+    private String delDesc;
+
+    @ApiModelProperty("소통정보 연계 여부 설명")
+    @JsonProperty("cmtrinfr_cnct_desc")    // CMTRINFR_CNCT_YN
+    private String cmtrinfrCnctDesc;
+
+    @ApiModelProperty("기상정보 연계 여부 설명")
+    @JsonProperty("wthrinfr_cnct_desc")    // WTHRINFR_CNCT_YN
+    private String wthrinfrCnctDesc;
+
+    @ApiModelProperty("환경정보 연계 여부 설명")
+    @JsonProperty("envrinfr_cnct_desc")    // ENVRINFR_CNCT_YN
+    private String envrinfrCnctDesc;
+
+    @ApiModelProperty("교통 전략 사용 여부 설명")
+    @JsonProperty("trfc_strg_use_desc")    // TRFC_STRG_USE_YN
+    private String trfcStrgUseDesc;
+
+    @ApiModel("TbVmsCtlrUpdReq(VMS 제어기 정보변경)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor(access = AccessLevel.PROTECTED)
+    public static class TbVmsCtlrUpdReq {
+
+        @ApiModelProperty("VMS 제어기 번호, Nullable = N, NUMBER(10)")  // N NUMBER(10)
+        @JsonProperty("vms_ctlr_nmbr")
+        @Positive
+        private Long vmsCtlrNmbr;
+
+        @ApiModelProperty("VMS ID, Nullable = Y, VARCHAR(4)")  // Y VARCHAR(4)
+        @JsonProperty("vms_id")
+        @Size(min=1, max=4)
+        private String vmsId;
+
+        @ApiModelProperty("VMS 제어기 ID, Nullable = Y, VARCHAR(30)")  // Y VARCHAR(30)
+        @JsonProperty("vms_ctlr_id")
+        @Size(min=1, max=30)
+        private String vmsCtlrId;
+
+        @ApiModelProperty("VMS 명, Nullable = Y, VARCHAR(40)")  // Y VARCHAR(40)
+        @JsonProperty("vms_nm")
+        @Size(min=1, max=40)
+        private String vmsNm;
+
+        @ApiModelProperty("VMS 제어기 아이피, Nullable = Y, VARCHAR(20)")  // Y VARCHAR(20)
+        @JsonProperty("vms_ctlr_ip")
+        @Size(min=1, max=20)
+        private String vmsCtlrIp;
+
+        @ApiModelProperty("VMS 용도 유형 코드, Nullable = Y, VARCHAR(7)")  // Y VARCHAR(7)
+        @JsonProperty("vms_usag_type_cd")
+        @Size(min=1, max=7)
+        private String vmsUsagTypeCd;
+
+        @ApiModelProperty("VMS 형식 유형 코드, Nullable = Y, VARCHAR(7)")  // Y VARCHAR(7)
+        @JsonProperty("vms_frm_type_cd")
+        @Size(min=1, max=7)
+        private String vmsFrmTypeCd;
+
+        @ApiModelProperty("VMS 유형 코드, Nullable = Y, VARCHAR(7)")  // Y VARCHAR(7)
+        @JsonProperty("vms_type_cd")
+        @Size(min=1, max=7)
+        private String vmsTypeCd;
+
+        @ApiModelProperty("VMS 모듈 유형 코드, Nullable = Y, VARCHAR(7)")  // Y VARCHAR(7)
+        @JsonProperty("vms_modl_type_cd")
+        @Size(min=1, max=7)
+        private String vmsModlTypeCd;
+
+        @ApiModelProperty("VMS 통신 포트, Nullable = Y, VARCHAR(5)")  // Y VARCHAR(5)
+        @JsonProperty("vms_cmnc_port")
+        @Size(min=1, max=5)
+        private String vmsCmncPort;
+
+        @ApiModelProperty("운영 모드, Nullable = Y, VARCHAR(7)")  // Y VARCHAR(7)
+        @JsonProperty("oper_mode")
+        @Size(min=1, max=7)
+        private String operMode;
+
+        @ApiModelProperty("VMS 통신 오류 기본 값, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("vms_cmnc_err_bass_val")
+        @Positive
+        private Short vmsCmncErrBassVal;
+
+        @ApiModelProperty("VMS 야간 휘도 단계, Nullable = Y, NUMBER(2)")  // Y NUMBER(2)
+        @JsonProperty("vms_nght_brgh_step")
+        @Positive
+        private Short vmsNghtBrghStep;
+
+        @ApiModelProperty("VMS 주간 휘도 단계, Nullable = Y, NUMBER(2)")  // Y NUMBER(2)
+        @JsonProperty("vms_week_brgh_step")
+        @Positive
+        private Short vmsWeekBrghStep;
+
+        @ApiModelProperty("VMS 표출면 변경 주기, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("vms_phse_chng_cycl")
+        @Positive
+        private Short vmsPhseChngCycl;
+
+        @ApiModelProperty("VMS 모듈 오류 율, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("vms_modl_err_rate")
+        @Positive
+        private Short vmsModlErrRate;
+
+        @ApiModelProperty("통신장애 SLOT 번호, Nullable = Y, NUMBER(4)")  // Y NUMBER(4)
+        @JsonProperty("cmncfail_slot_nmbr")
+        @Positive
+        private Short cmncfailSlotNmbr;
+
+        @ApiModelProperty("전원 장애 SLOT 번호, Nullable = Y, NUMBER(4)")  // Y NUMBER(4)
+        @JsonProperty("pwer_fail_slot_nmbr")
+        @Positive
+        private Short pwerFailSlotNmbr;
+
+        @ApiModelProperty("삭제 여부, Nullable = Y, CHAR(1)")  // Y CHAR(1)
+        @JsonProperty("del_yn")
+        @Size(min=1, max=1)
+        @Pattern(regexp = "[YN]")
+        private String delYn;
+
+        @ApiModelProperty("소통정보 연계 여부, Nullable = Y, CHAR(1)")  // Y CHAR(1)
+        @JsonProperty("cmtrinfr_cnct_yn")
+        @Size(min=1, max=1)
+        @Pattern(regexp = "[YN]")
+        private String cmtrinfrCnctYn;
+
+        @ApiModelProperty("기상정보 연계 여부, Nullable = Y, CHAR(1)")  // Y CHAR(1)
+        @JsonProperty("wthrinfr_cnct_yn")
+        @Size(min=1, max=1)
+        @Pattern(regexp = "[YN]")
+        private String wthrinfrCnctYn;
+
+        @ApiModelProperty("환경정보 연계 여부, Nullable = Y, CHAR(1)")  // Y CHAR(1)
+        @JsonProperty("envrinfr_cnct_yn")
+        @Size(min=1, max=1)
+        @Pattern(regexp = "[YN]")
+        private String envrinfrCnctYn;
+
+        @ApiModelProperty("VMS 최대 표출면 개수, Nullable = Y, NUMBER(2)")  // Y NUMBER(2)
+        @JsonProperty("vms_max_phse_num")
+        @Positive
+        private Short vmsMaxPhseNum;
+
+        @ApiModelProperty("최초 등록자 번호, Nullable = Y, VARCHAR(20)")  // Y VARCHAR(20)
+        @JsonProperty("frst_regr_nmbr")
+        @Size(min=1, max=20)
+        private String frstRegrNmbr;
+
+        @ApiModelProperty("최초 등록 일시, Nullable = Y, VARCHAR(14)")  // Y VARCHAR(14)
+        @JsonProperty("frst_rgst_dt")
+        @Size(min=1, max=14)
+        private String frstRgstDt;
+
+        @ApiModelProperty("최종 수정자 번호, Nullable = Y, VARCHAR(20)")  // Y VARCHAR(20)
+        @JsonProperty("last_crpr_nmbr")
+        @Size(min=1, max=20)
+        private String lastCrprNmbr;
+
+        @ApiModelProperty("최종 수정 일시, Nullable = Y, VARCHAR(14)")  // Y VARCHAR(14)
+        @JsonProperty("last_crct_dt")
+        @Size(min=1, max=14)
+        private String lastCrctDt;
+
+        @ApiModelProperty("전광판 ON TIME, Nullable = Y, VARCHAR(4)")  // Y VARCHAR(4)
+        @JsonProperty("panl_on_time")
+        @Size(min=1, max=4)
+        private String panlOnTime;
+
+        @ApiModelProperty("전광판 OFF TIME, Nullable = Y, VARCHAR(4)")  // Y VARCHAR(4)
+        @JsonProperty("panl_off_time")
+        @Size(min=1, max=4)
+        private String panlOffTime;
+
+        @ApiModelProperty("전광판 전원 모드, Nullable = Y, VARCHAR(7)")  // Y VARCHAR(7)
+        @JsonProperty("panl_pwer_mode")
+        @Size(min=1, max=7)
+        private String panlPwerMode;
+
+        @ApiModelProperty("휘도 모드, Nullable = Y, VARCHAR(7)")  // Y VARCHAR(7)
+        @JsonProperty("brgh_mode")
+        @Size(min=1, max=7)
+        private String brghMode;
+
+        @ApiModelProperty("웹 카메라 아이피, Nullable = Y, VARCHAR(20)")  // Y VARCHAR(20)
+        @JsonProperty("web_cmra_ip")
+        @Size(min=1, max=20)
+        private String webCmraIp;
+
+        @ApiModelProperty("X 좌표, , NUMBER(11,8)")  // Y NUMBER(11,8)
+        @JsonProperty("x_crdn")
+        private Long xCrdn;
+
+        @ApiModelProperty("Y 좌표, , NUMBER(10,8)")  // Y NUMBER(10,8)
+        @JsonProperty("y_crdn")
+        private Long yCrdn;
+
+        @ApiModelProperty("설치 위치 명, Nullable = Y, VARCHAR(40)")  // Y VARCHAR(40)
+        @JsonProperty("istl_lctn_nm")
+        @Size(min=1, max=40)
+        private String istlLctnNm;
+
+        @ApiModelProperty("교통 전략 사용 여부, Nullable = Y, CHAR(1)")  // Y CHAR(1)
+        @JsonProperty("trfc_strg_use_yn")
+        @Size(min=1, max=1)
+        @Pattern(regexp = "[YN]")
+        private String trfcStrgUseYn;
+
+        @ApiModelProperty("VMS 위치 정보제공구간 ID, Nullable = Y, NUMBER(10)")  // Y NUMBER(10)
+        @JsonProperty("vms_loc_ifsc_id")
+        @Positive
+        private Long vmsLocIfscId;
+
+        @ApiModelProperty("팬 동작 온도, , NUMBER(6,3)")  // Y NUMBER(6,3)
+        @JsonProperty("fan_mtns_tmpr")
+        private Short fanMtnsTmpr;
+
+        @ApiModelProperty("히터 동작 온도, , NUMBER(6,3)")  // Y NUMBER(6,3)
+        @JsonProperty("hetr_mtns_tmpr")
+        private Short hetrMtnsTmpr;
+
+        @ApiModelProperty("웹 카메라 포트, Nullable = Y, VARCHAR(5)")  // Y VARCHAR(5)
+        @JsonProperty("web_cmra_port")
+        @Size(min=1, max=5)
+        private String webCmraPort;
+
+        @ApiModelProperty("웹 카메라 ID, Nullable = Y, VARCHAR(30)")  // Y VARCHAR(30)
+        @JsonProperty("web_cmra_id")
+        @Size(min=1, max=30)
+        private String webCmraId;
+
+        @ApiModelProperty("웹 카메라 암호, Nullable = Y, VARCHAR(64)")  // Y VARCHAR(64)
+        @JsonProperty("web_cmra_pwd")
+        @Size(min=1, max=64)
+        private String webCmraPwd;
+
+        @ApiModelProperty("스트리밍 세션 명, Nullable = Y, VARCHAR(200)")  // Y VARCHAR(200)
+        @JsonProperty("strm_sesn_nm")
+        @Size(min=1, max=200)
+        private String strmSesnNm;
+
+        @Builder
+        public TbVmsCtlrUpdReq(Long vms_ctlr_nmbr, String vms_id, String vms_ctlr_id, String vms_nm, String vms_ctlr_ip, String vms_usag_type_cd, String vms_frm_type_cd, String vms_type_cd, String vms_modl_type_cd, String vms_cmnc_port, String oper_mode, Short vms_cmnc_err_bass_val, Short vms_nght_brgh_step, Short vms_week_brgh_step, Short vms_phse_chng_cycl, Short vms_modl_err_rate, Short cmncfail_slot_nmbr, Short pwer_fail_slot_nmbr, String del_yn, String cmtrinfr_cnct_yn, String wthrinfr_cnct_yn, String envrinfr_cnct_yn, Short vms_max_phse_num, String frst_regr_nmbr, String frst_rgst_dt, String last_crpr_nmbr, String last_crct_dt, String panl_on_time, String panl_off_time, String panl_pwer_mode, String brgh_mode, String web_cmra_ip, Long x_crdn, Long y_crdn, String istl_lctn_nm, String trfc_strg_use_yn, Long vms_loc_ifsc_id, Short fan_mtns_tmpr, Short hetr_mtns_tmpr, String web_cmra_port, String web_cmra_id, String web_cmra_pwd, String strm_sesn_nm) {
+            this.vmsCtlrNmbr = vms_ctlr_nmbr;
+            this.vmsId = vms_id;
+            this.vmsCtlrId = vms_ctlr_id;
+            this.vmsNm = vms_nm;
+            this.vmsCtlrIp = vms_ctlr_ip;
+            this.vmsUsagTypeCd = vms_usag_type_cd;
+            this.vmsFrmTypeCd = vms_frm_type_cd;
+            this.vmsTypeCd = vms_type_cd;
+            this.vmsModlTypeCd = vms_modl_type_cd;
+            this.vmsCmncPort = vms_cmnc_port;
+            this.operMode = oper_mode;
+            this.vmsCmncErrBassVal = vms_cmnc_err_bass_val;
+            this.vmsNghtBrghStep = vms_nght_brgh_step;
+            this.vmsWeekBrghStep = vms_week_brgh_step;
+            this.vmsPhseChngCycl = vms_phse_chng_cycl;
+            this.vmsModlErrRate = vms_modl_err_rate;
+            this.cmncfailSlotNmbr = cmncfail_slot_nmbr;
+            this.pwerFailSlotNmbr = pwer_fail_slot_nmbr;
+            this.delYn = del_yn;
+            this.cmtrinfrCnctYn = cmtrinfr_cnct_yn;
+            this.wthrinfrCnctYn = wthrinfr_cnct_yn;
+            this.envrinfrCnctYn = envrinfr_cnct_yn;
+            this.vmsMaxPhseNum = vms_max_phse_num;
+            this.frstRegrNmbr = frst_regr_nmbr;
+            this.frstRgstDt = frst_rgst_dt;
+            this.lastCrprNmbr = last_crpr_nmbr;
+            this.lastCrctDt = last_crct_dt;
+            this.panlOnTime = panl_on_time;
+            this.panlOffTime = panl_off_time;
+            this.panlPwerMode = panl_pwer_mode;
+            this.brghMode = brgh_mode;
+            this.webCmraIp = web_cmra_ip;
+            this.xCrdn = x_crdn;
+            this.yCrdn = y_crdn;
+            this.istlLctnNm = istl_lctn_nm;
+            this.trfcStrgUseYn = trfc_strg_use_yn;
+            this.vmsLocIfscId = vms_loc_ifsc_id;
+            this.fanMtnsTmpr = fan_mtns_tmpr;
+            this.hetrMtnsTmpr = hetr_mtns_tmpr;
+            this.webCmraPort = web_cmra_port;
+            this.webCmraId = web_cmra_id;
+            this.webCmraPwd = web_cmra_pwd;
+            this.strmSesnNm = strm_sesn_nm;
+        }
+
+
+        public TbVmsCtlr toEntity() {
+            TbVmsCtlr entity = TbVmsCtlr.builder()
+                    .vmsCtlrNmbr(this.vmsCtlrNmbr)
+                    .vmsId(this.vmsId)
+                    .vmsCtlrId(this.vmsCtlrId)
+                    .vmsNm(this.vmsNm)
+                    .vmsCtlrIp(this.vmsCtlrIp)
+                    .vmsUsagTypeCd(this.vmsUsagTypeCd)
+                    .vmsFrmTypeCd(this.vmsFrmTypeCd)
+                    .vmsTypeCd(this.vmsTypeCd)
+                    .vmsModlTypeCd(this.vmsModlTypeCd)
+                    .vmsCmncPort(this.vmsCmncPort)
+                    .operMode(this.operMode)
+                    .vmsCmncErrBassVal(this.vmsCmncErrBassVal)
+                    .vmsNghtBrghStep(this.vmsNghtBrghStep)
+                    .vmsWeekBrghStep(this.vmsWeekBrghStep)
+                    .vmsPhseChngCycl(this.vmsPhseChngCycl)
+                    .vmsModlErrRate(this.vmsModlErrRate)
+                    .cmncfailSlotNmbr(this.cmncfailSlotNmbr)
+                    .pwerFailSlotNmbr(this.pwerFailSlotNmbr)
+                    .delYn(this.delYn)
+                    .cmtrinfrCnctYn(this.cmtrinfrCnctYn)
+                    .wthrinfrCnctYn(this.wthrinfrCnctYn)
+                    .envrinfrCnctYn(this.envrinfrCnctYn)
+                    .vmsMaxPhseNum(this.vmsMaxPhseNum)
+                    .frstRegrNmbr(this.frstRegrNmbr)
+                    .frstRgstDt(this.frstRgstDt)
+                    .lastCrprNmbr(this.lastCrprNmbr)
+                    .lastCrctDt(this.lastCrctDt)
+                    .panlOnTime(this.panlOnTime)
+                    .panlOffTime(this.panlOffTime)
+                    .panlPwerMode(this.panlPwerMode)
+                    .brghMode(this.brghMode)
+                    .webCmraIp(this.webCmraIp)
+                    .xCrdn(this.xCrdn)
+                    .yCrdn(this.yCrdn)
+                    .istlLctnNm(this.istlLctnNm)
+                    .trfcStrgUseYn(this.trfcStrgUseYn)
+                    .vmsLocIfscId(this.vmsLocIfscId)
+                    .fanMtnsTmpr(this.fanMtnsTmpr)
+                    .hetrMtnsTmpr(this.hetrMtnsTmpr)
+                    .webCmraPort(this.webCmraPort)
+                    .webCmraId(this.webCmraId)
+                    .webCmraPwd(this.webCmraPwd)
+                    .strmSesnNm(this.strmSesnNm)
+                    .build();
+
+            return entity;
+        }
+
+    }
+
+}

+ 148 - 0
src/main/java/com/its/op/model/dto/vms/TbVmsIfscDto.java

@@ -0,0 +1,148 @@
+package com.its.op.model.dto.vms;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.its.op.model.entity.vms.TbVmsIfsc;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Positive;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+
+/**
+ * VMS 정보제공구간 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbVmsIfscDto(VMS 정보제공구간)")
+public class TbVmsIfscDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("VMS 정보제공구간 ID")  // N NUMBER(10)
+    @JsonProperty("vms_ifsc_id")
+    private Long vmsIfscId;
+
+    @ApiModelProperty("VMS 정보제공구간 명")  // Y VARCHAR(60)
+    @JsonProperty("vms_ifsc_nm")
+    private String vmsIfscNm;
+
+    @ApiModelProperty("편집 코드")  // Y VARCHAR(7)
+    @JsonProperty("edtn_cd")
+    private String edtnCd;
+
+    @ApiModelProperty("표출 시작 노드 명")  // Y VARCHAR(30)
+    @JsonProperty("dspl_strt_node_nm")
+    private String dsplStrtNodeNm;
+
+    @ApiModelProperty("표출 종료 노드 명")  // Y VARCHAR(30)
+    @JsonProperty("dspl_end_node_nm")
+    private String dsplEndNodeNm;
+
+    @ApiModelProperty("우회도로 ID")  // Y NUMBER(10)
+    @JsonProperty("detr_id")
+    private Long detrId;
+
+    @ApiModelProperty("도로명")  // Y VARCHAR(30)
+    @JsonProperty("road_nm")
+    private String roadNm;
+
+    @ApiModelProperty("지점명")  // Y VARCHAR(30)
+    @JsonProperty("spot_nm")
+    private String spotNm;
+
+    @ApiModelProperty("축정보 생성용")  // Y CHAR(1)
+    @JsonProperty("axis_yn")
+    private String axisYn;
+
+    // Code Description Field
+    @ApiModelProperty("편집 코드 설명")
+    @JsonProperty("edtn_desc")    // EDTN_CD
+    private String edtnDesc;
+
+    @ApiModel("TbVmsIfscUpdReq(VMS 정보제공구간 정보변경)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor(access = AccessLevel.PROTECTED)
+    public static class TbVmsIfscUpdReq {
+
+        @ApiModelProperty("VMS 정보제공구간 ID, Nullable = N, NUMBER(10)")  // N NUMBER(10)
+        @JsonProperty("vms_ifsc_id")
+        @Positive
+        private Long vmsIfscId;
+
+        @ApiModelProperty("VMS 정보제공구간 명, Nullable = Y, VARCHAR(60)")  // Y VARCHAR(60)
+        @JsonProperty("vms_ifsc_nm")
+        @Size(min=1, max=60)
+        private String vmsIfscNm;
+
+        @ApiModelProperty("편집 코드, Nullable = Y, VARCHAR(7)")  // Y VARCHAR(7)
+        @JsonProperty("edtn_cd")
+        @Size(min=1, max=7)
+        private String edtnCd;
+
+        @ApiModelProperty("표출 시작 노드 명, Nullable = Y, VARCHAR(30)")  // Y VARCHAR(30)
+        @JsonProperty("dspl_strt_node_nm")
+        @Size(min=1, max=30)
+        private String dsplStrtNodeNm;
+
+        @ApiModelProperty("표출 종료 노드 명, Nullable = Y, VARCHAR(30)")  // Y VARCHAR(30)
+        @JsonProperty("dspl_end_node_nm")
+        @Size(min=1, max=30)
+        private String dsplEndNodeNm;
+
+        @ApiModelProperty("우회도로 ID, Nullable = Y, NUMBER(10)")  // Y NUMBER(10)
+        @JsonProperty("detr_id")
+        @Positive
+        private Long detrId;
+
+        @ApiModelProperty("도로명, Nullable = Y, VARCHAR(30)")  // Y VARCHAR(30)
+        @JsonProperty("road_nm")
+        @Size(min=1, max=30)
+        private String roadNm;
+
+        @ApiModelProperty("지점명, Nullable = Y, VARCHAR(30)")  // Y VARCHAR(30)
+        @JsonProperty("spot_nm")
+        @Size(min=1, max=30)
+        private String spotNm;
+
+        @ApiModelProperty("축정보 생성용, Nullable = Y, CHAR(1)")  // Y CHAR(1)
+        @JsonProperty("axis_yn")
+        @Size(min=1, max=1)
+        @Pattern(regexp = "[YN]")
+        private String axisYn;
+
+        @Builder
+        public TbVmsIfscUpdReq(Long vms_ifsc_id, String vms_ifsc_nm, String edtn_cd, String dspl_strt_node_nm, String dspl_end_node_nm, Long detr_id, String road_nm, String spot_nm, String axis_yn) {
+            this.vmsIfscId = vms_ifsc_id;
+            this.vmsIfscNm = vms_ifsc_nm;
+            this.edtnCd = edtn_cd;
+            this.dsplStrtNodeNm = dspl_strt_node_nm;
+            this.dsplEndNodeNm = dspl_end_node_nm;
+            this.detrId = detr_id;
+            this.roadNm = road_nm;
+            this.spotNm = spot_nm;
+            this.axisYn = axis_yn;
+        }
+
+        public TbVmsIfsc toEntity() {
+            TbVmsIfsc entity = TbVmsIfsc.builder()
+                    .vmsIfscId(this.vmsIfscId)
+                    .vmsIfscNm(this.vmsIfscNm)
+                    .edtnCd(this.edtnCd)
+                    .dsplStrtNodeNm(this.dsplStrtNodeNm)
+                    .dsplEndNodeNm(this.dsplEndNodeNm)
+                    .detrId(this.detrId)
+                    .roadNm(this.roadNm)
+                    .spotNm(this.spotNm)
+                    .axisYn(this.axisYn)
+                    .build();
+
+            return entity;
+        }
+
+    }
+
+}

+ 82 - 0
src/main/java/com/its/op/model/dto/vms/TbVmsIfscRltnDto.java

@@ -0,0 +1,82 @@
+package com.its.op.model.dto.vms;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.its.op.model.entity.vms.TbVmsIfscRltn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.validation.constraints.Positive;
+import java.io.Serializable;
+
+/**
+ * VMS 정보제공구간 관계 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbVmsIfscRltnDto(VMS 정보제공구간 관계)")
+public class TbVmsIfscRltnDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("VMS 제어기 번호")  // N NUMBER(10)
+    @JsonProperty("vms_ctlr_nmbr")
+    private Long vmsCtlrNmbr;
+
+    @ApiModelProperty("VMS 정보제공구간 ID")  // N NUMBER(10)
+    @JsonProperty("vms_ifsc_id")
+    private Long vmsIfscId;
+
+    @ApiModelProperty("표출 우선순위")  // Y NUMBER(2)
+    @JsonProperty("dspl_prrt")
+    private Short dsplPrrt;
+
+    @ApiModelProperty("VMS 정보")  // Y NUMBER(2)
+    TbVmsCtlrDto vms = null;
+
+    @ApiModelProperty("VMS 정보제공구간 정보")  // Y NUMBER(2)
+    TbVmsIfscDto ifsc = null;
+
+    // Code Description Field
+    @ApiModel("TbVmsIfscRltnUpdReq(VMS 정보제공구간 관계 정보변경)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor(access = AccessLevel.PROTECTED)
+    public static class TbVmsIfscRltnUpdReq {
+
+        @ApiModelProperty("VMS 제어기 번호, Nullable = N, NUMBER(10)")  // N NUMBER(10)
+        @JsonProperty("vms_ctlr_nmbr")
+        @Positive
+        private Long vmsCtlrNmbr;
+
+        @ApiModelProperty("VMS 정보제공구간 ID, Nullable = N, NUMBER(10)")  // N NUMBER(10)
+        @JsonProperty("vms_ifsc_id")
+        @Positive
+        private Long vmsIfscId;
+
+        @ApiModelProperty("표출 우선순위, Nullable = Y, NUMBER(2)")  // Y NUMBER(2)
+        @JsonProperty("dspl_prrt")
+        @Positive
+        private Short dsplPrrt;
+
+        @Builder
+        public TbVmsIfscRltnUpdReq(Long vms_ctlr_nmbr, Long vms_ifsc_id, Short dspl_prrt) {
+            this.vmsCtlrNmbr = vms_ctlr_nmbr;
+            this.vmsIfscId = vms_ifsc_id;
+            this.dsplPrrt = dspl_prrt;
+        }
+
+
+        public TbVmsIfscRltn toEntity() {
+            TbVmsIfscRltn entity = TbVmsIfscRltn.builder()
+                    .vmsCtlrNmbr(this.vmsCtlrNmbr)
+                    .vmsIfscId(this.vmsIfscId)
+                    .dsplPrrt(this.dsplPrrt)
+                    .build();
+
+            return entity;
+        }
+
+    }
+
+}

+ 14 - 8
src/main/java/com/its/op/model/dto/vms/TbVmsSymbIfscDto.java

@@ -6,6 +6,8 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.*;
 
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
 import javax.validation.constraints.Positive;
 import java.io.Serializable;
 
@@ -19,8 +21,8 @@ public class TbVmsSymbIfscDto implements Serializable {
     private static final long serialVersionUID = 1L;
 
     @ApiModelProperty("심벌라이브러리 번호")  // N NUMBER(4)
-    @JsonProperty("symblib_nmbr")
-    private Short symblibNmbr;
+    @JsonProperty("symb_lib_nmbr")
+    private Short symbLibNmbr;
 
     @ApiModelProperty("셀 ID")  // N NUMBER(4)
     @JsonProperty("cell_id")
@@ -47,9 +49,9 @@ public class TbVmsSymbIfscDto implements Serializable {
     public static class TbVmsSymbIfscUpdReq {
 
         @ApiModelProperty("심벌라이브러리 번호, Nullable = N, NUMBER(4)")  // N NUMBER(4)
-        @JsonProperty("symblib_nmbr")
+        @JsonProperty("symb_lib_nmbr")
         @Positive
-        private Short symblibNmbr;
+        private Short symbLibNmbr;
 
         @ApiModelProperty("셀 ID, Nullable = N, NUMBER(4)")  // N NUMBER(4)
         @JsonProperty("cell_id")
@@ -58,12 +60,16 @@ public class TbVmsSymbIfscDto implements Serializable {
 
         @ApiModelProperty("이미지내 셀좌표 X, Nullable = Y, NUMBER(4)")  // Y NUMBER(4)
         @JsonProperty("posx")
-        @Positive
+        //@Positive
+        @Min(value = 0)
+        @Max(value = 9999)
         private Short posx;
 
         @ApiModelProperty("이미지내 셀좌표 Y, Nullable = Y, NUMBER(4)")  // Y NUMBER(4)
         @JsonProperty("posy")
-        @Positive
+        //@Positive
+        @Min(value = 0)
+        @Max(value = 9999)
         private Short posy;
 
         @ApiModelProperty("VMS 정보제공구간 ID, Nullable = Y, NUMBER(10)")  // Y NUMBER(10)
@@ -73,7 +79,7 @@ public class TbVmsSymbIfscDto implements Serializable {
 
         @Builder
         public TbVmsSymbIfscUpdReq(Short symblib_nmbr, Short cell_id, Short posx, Short posy, Long vms_ifsc_id) {
-            this.symblibNmbr = symblib_nmbr;
+            this.symbLibNmbr = symblib_nmbr;
             this.cellId = cell_id;
             this.posx = posx;
             this.posy = posy;
@@ -83,7 +89,7 @@ public class TbVmsSymbIfscDto implements Serializable {
 
         public TbVmsSymbIfsc toEntity() {
             TbVmsSymbIfsc entity = TbVmsSymbIfsc.builder()
-                    .symblibNmbr(this.symblibNmbr)
+                    .symbLibNmbr(this.symbLibNmbr)
                     .cellId(this.cellId)
                     .posx(this.posx)
                     .posy(this.posy)

+ 179 - 0
src/main/java/com/its/op/model/dto/vms/TbVmsSymbLibIfscVMP1Dto.java

@@ -0,0 +1,179 @@
+package com.its.op.model.dto.vms;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.validation.constraints.Positive;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * VMS 심벌 라이브러리 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbVmsSymbLibIfscVMP1Dto(VMS 심벌 라이브러리 소통정보 배경 이미지 관계)")
+public class TbVmsSymbLibIfscVMP1Dto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("심벌라이브러리 번호")  // N NUMBER(4)
+    @JsonProperty("symb_lib_nmbr")
+    private Short symbLibNmbr;
+
+    @ApiModelProperty("등록 일시")  // Y VARCHAR(14)
+    @JsonProperty("rgst_dt")
+    private String rgstDt;
+
+    @JsonIgnore
+    //@ApiModelProperty("RED 데이터")  // Y BLOB
+    //@JsonProperty("red_data")
+    private byte[] redData;
+
+    @JsonIgnore
+    //@ApiModelProperty("GREEN 데이터")  // Y BLOB
+    //@JsonProperty("green_data")
+    private byte[] greenData;
+
+    @ApiModelProperty("심벌 설명")  // Y VARCHAR(200)
+    @JsonProperty("symb_expl")
+    private String symbExpl;
+
+    @ApiModelProperty("이미지 데이터")  // Y BLOB
+    @JsonProperty("imag_data")
+    private byte[] imagData;
+
+    @JsonIgnore
+    //@ApiModelProperty("VMS 유형 코드")  // Y VARCHAR(7)
+    //@JsonProperty("vms_type_cd")
+    private String vmsTypeCd;
+
+    @JsonIgnore
+    //@ApiModelProperty("심벌 이미지 유형")  // Y VARCHAR(7)
+    //@JsonProperty("symb_imag_type")
+    private String symbImagType;
+
+    @JsonIgnore
+    //@ApiModelProperty("심벌 파일 명")  // Y VARCHAR(40)
+    //@JsonProperty("symb_file_nm")
+    private String symbFileNm;
+
+    // Code Description Field
+    //@JsonIgnore
+    //@ApiModelProperty("VMS 유형 코드 설명")
+    //@JsonProperty("vms_type_desc")    // VMS_TYPE_CD
+    //private String vmsTypeDesc;
+
+    // 소통정보 이미지 셀정보(여러개 존재)
+    List<TbVmsSymbIfscDto> cells;
+
+    public static TbVmsSymbLibIfscVMP1Dto toDto(TbVmsSymbLibDto lib, List<TbVmsSymbIfscDto> cells) {
+        TbVmsSymbLibIfscVMP1Dto dto = TbVmsSymbLibIfscVMP1Dto.builder()
+                .symbLibNmbr(lib.getSymbLibNmbr())
+                .rgstDt(lib.getRgstDt())
+                .redData(lib.getRedData())
+                .greenData(lib.getGreenData())
+                .symbExpl(lib.getSymbExpl())
+                .imagData(lib.getImagData())
+                .vmsTypeCd(lib.getVmsTypeCd())
+                .symbImagType(lib.getSymbImagType())
+                .symbFileNm(lib.getSymbFileNm())
+                .cells(cells)
+                .build();
+
+        return dto;
+    }
+
+    @ApiModel("TbVmsSymbLibIfscVMP1UpdReq(VMS 심벌 라이브러리 소통정보 배경 이미지 정보변경)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor(access = AccessLevel.PROTECTED)
+    public static class TbVmsSymbLibIfscVMP1UpdReq {
+
+        @ApiModelProperty("심벌라이브러리 번호, Nullable = N, NUMBER(4)")  // N NUMBER(4)
+        @JsonProperty("symb_lib_nmbr")
+        @Positive
+        private Short symbLibNmbr;
+
+        @ApiModelProperty("등록 일시, Nullable = Y, VARCHAR(14)")  // Y VARCHAR(14)
+        @JsonProperty("rgst_dt")
+        @Size(min=1, max=14)
+        private String rgstDt;
+
+        @JsonIgnore
+        //@ApiModelProperty("RED 데이터, Nullable = Y, Image Data")  // Y BLOB
+        //@JsonProperty("red_data")
+        private byte[] redData;
+
+        @JsonIgnore
+        //@ApiModelProperty("GREEN 데이터, Nullable = Y, Image Data")  // Y BLOB
+        //@JsonProperty("green_data")
+        private byte[] greenData;
+
+        @ApiModelProperty("심벌 설명, Nullable = Y, VARCHAR(200)")  // Y VARCHAR(200)
+        @JsonProperty("symb_expl")
+        @Size(min=1, max=200)
+        private String symbExpl;
+
+        @ApiModelProperty("이미지 데이터, Nullable = Y, Image Data")  // Y BLOB
+        @JsonProperty("imag_data")
+        private byte[] imagData;
+
+        @JsonIgnore
+        //@ApiModelProperty("VMS 유형 코드, Nullable = Y, VARCHAR(7)")  // Y VARCHAR(7)
+        //@JsonProperty("vms_type_cd")
+        //@Size(min=1, max=7)
+        private String vmsTypeCd;
+
+        @JsonIgnore
+        //@ApiModelProperty("심벌 이미지 유형, Nullable = Y, VARCHAR(7)")  // Y VARCHAR(7)
+        //@JsonProperty("symb_imag_type")
+        //@Size(min=1, max=7)
+        private String symbImagType;
+
+        @JsonIgnore
+        //@ApiModelProperty("심벌 파일 명, Nullable = Y, VARCHAR(40)")  // Y VARCHAR(40)
+        //@JsonProperty("symb_file_nm")
+        //@Size(min=1, max=40)
+        private String symbFileNm;
+
+        // 소통정보 이미지 셀정보(여러개 존재)
+        @ApiModelProperty("이미지 셀 설정 정보 목록")
+        List<TbVmsSymbIfscDto> cells;
+
+        @Builder
+        public TbVmsSymbLibIfscVMP1UpdReq(Short symb_lib_nmbr, String rgst_dt, byte[] red_data, byte[] green_data, String symb_expl, byte[] imag_data, String vms_type_cd, String symb_imag_type, String symb_file_nm, List<TbVmsSymbIfscDto> cells) {
+            this.symbLibNmbr = symb_lib_nmbr;
+            this.rgstDt = rgst_dt;
+            this.redData = red_data;
+            this.greenData = green_data;
+            this.symbExpl = symb_expl;
+            this.imagData = imag_data;
+            this.vmsTypeCd = vms_type_cd;
+            this.symbImagType = symb_imag_type;
+            this.symbFileNm = symb_file_nm;
+            this.cells = cells;
+        }
+
+        public TbVmsSymbLibDto.TbVmsSymbLibUpdReq toLibReq() {
+            TbVmsSymbLibDto.TbVmsSymbLibUpdReq req = TbVmsSymbLibDto.TbVmsSymbLibUpdReq.builder()
+                    .symb_lib_nmbr(this.symbLibNmbr)
+                    .rgst_dt(this.rgstDt)
+                    .red_data(this.redData)
+                    .green_data(this.greenData)
+                    .symb_expl(this.symbExpl)
+                    .imag_data(this.imagData)
+                    .vms_type_cd(this.vmsTypeCd)
+                    .symb_imag_type(this.symbImagType)
+                    .symb_file_nm(this.symbFileNm)
+                    .build();
+            return req;
+        }
+
+    }
+
+}

+ 178 - 0
src/main/java/com/its/op/model/dto/vms/TbVmsSymbLibIfscVMP2Dto.java

@@ -0,0 +1,178 @@
+package com.its.op.model.dto.vms;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.validation.constraints.Positive;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+
+/**
+ * VMS 심벌 라이브러리 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbVmsSymbLibIfscVMP2Dto(VMS 심벌 라이브러리 소통정보 이미지 관계)")
+public class TbVmsSymbLibIfscVMP2Dto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("심벌라이브러리 번호")  // N NUMBER(4)
+    @JsonProperty("symb_lib_nmbr")
+    private Short symbLibNmbr;
+
+    @ApiModelProperty("등록 일시")  // Y VARCHAR(14)
+    @JsonProperty("rgst_dt")
+    private String rgstDt;
+
+    @JsonIgnore
+    //@ApiModelProperty("RED 데이터")  // Y BLOB
+    //@JsonProperty("red_data")
+    private byte[] redData;
+
+    @JsonIgnore
+    //@ApiModelProperty("GREEN 데이터")  // Y BLOB
+    //@JsonProperty("green_data")
+    private byte[] greenData;
+
+    @ApiModelProperty("심벌 설명")  // Y VARCHAR(200)
+    @JsonProperty("symb_expl")
+    private String symbExpl;
+
+    @ApiModelProperty("이미지 데이터")  // Y BLOB
+    @JsonProperty("imag_data")
+    private byte[] imagData;
+
+    @JsonIgnore
+    //@ApiModelProperty("VMS 유형 코드")  // Y VARCHAR(7)
+    //@JsonProperty("vms_type_cd")
+    private String vmsTypeCd;
+
+    @JsonIgnore
+    //@ApiModelProperty("심벌 이미지 유형")  // Y VARCHAR(7)
+    //@JsonProperty("symb_imag_type")
+    private String symbImagType;
+
+    @JsonIgnore
+    //@ApiModelProperty("심벌 파일 명")  // Y VARCHAR(40)
+    //@JsonProperty("symb_file_nm")
+    private String symbFileNm;
+
+    // Code Description Field
+    //@JsonIgnore
+    //@ApiModelProperty("VMS 유형 코드 설명")
+    //@JsonProperty("vms_type_desc")    // VMS_TYPE_CD
+    //private String vmsTypeDesc;
+
+    // 소통정보 이미지 셀정보(셀은 1개 만 존재)
+    @ApiModelProperty("이미지 셀 설정 정보")
+    TbVmsSymbIfscDto cell;
+
+    public static TbVmsSymbLibIfscVMP2Dto toDto(TbVmsSymbLibDto lib, TbVmsSymbIfscDto cell) {
+        TbVmsSymbLibIfscVMP2Dto dto = TbVmsSymbLibIfscVMP2Dto.builder()
+                .symbLibNmbr(lib.getSymbLibNmbr())
+                .rgstDt(lib.getRgstDt())
+                .redData(lib.getRedData())
+                .greenData(lib.getGreenData())
+                .symbExpl(lib.getSymbExpl())
+                .imagData(lib.getImagData())
+                .vmsTypeCd(lib.getVmsTypeCd())
+                .symbImagType(lib.getSymbImagType())
+                .symbFileNm(lib.getSymbFileNm())
+                .cell(cell)
+                .build();
+
+        return dto;
+    }
+
+    @ApiModel("TbVmsSymbLibIfscVMP2UpdReq(VMS 심벌 라이브러리 소통정보 이미지 정보변경)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor(access = AccessLevel.PROTECTED)
+    public static class TbVmsSymbLibIfscVMP2UpdReq {
+
+        @ApiModelProperty("심벌라이브러리 번호, Nullable = N, NUMBER(4)")  // N NUMBER(4)
+        @JsonProperty("symb_lib_nmbr")
+        @Positive
+        private Short symbLibNmbr;
+
+        @ApiModelProperty("등록 일시, Nullable = Y, VARCHAR(14)")  // Y VARCHAR(14)
+        @JsonProperty("rgst_dt")
+        @Size(min=1, max=14)
+        private String rgstDt;
+
+        @JsonIgnore
+        //@ApiModelProperty("RED 데이터, Nullable = Y, Image Data")  // Y BLOB
+        //@JsonProperty("red_data")
+        private byte[] redData;
+
+        @JsonIgnore
+        //@ApiModelProperty("GREEN 데이터, Nullable = Y, Image Data")  // Y BLOB
+        //@JsonProperty("green_data")
+        private byte[] greenData;
+
+        @ApiModelProperty("심벌 설명, Nullable = Y, VARCHAR(200)")  // Y VARCHAR(200)
+        @JsonProperty("symb_expl")
+        @Size(min=1, max=200)
+        private String symbExpl;
+
+        @ApiModelProperty("이미지 데이터, Nullable = Y, Image Data")  // Y BLOB
+        @JsonProperty("imag_data")
+        private byte[] imagData;
+
+        @JsonIgnore
+        //@ApiModelProperty("VMS 유형 코드, Nullable = Y, VARCHAR(7)")  // Y VARCHAR(7)
+        //@JsonProperty("vms_type_cd")
+        //@Size(min=1, max=7)
+        private String vmsTypeCd;
+
+        @JsonIgnore
+        //@ApiModelProperty("심벌 이미지 유형, Nullable = Y, VARCHAR(7)")  // Y VARCHAR(7)
+        //@JsonProperty("symb_imag_type")
+        //@Size(min=1, max=7)
+        private String symbImagType;
+
+        @JsonIgnore
+        //@ApiModelProperty("심벌 파일 명, Nullable = Y, VARCHAR(40)")  // Y VARCHAR(40)
+        //@JsonProperty("symb_file_nm")
+        //@Size(min=1, max=40)
+        private String symbFileNm;
+
+        // 소통정보 이미지 셀정보(셀은 1개 만 존재)
+        TbVmsSymbIfscDto cell;
+
+        @Builder
+        public TbVmsSymbLibIfscVMP2UpdReq(Short symb_lib_nmbr, String rgst_dt, byte[] red_data, byte[] green_data, String symb_expl, byte[] imag_data, String vms_type_cd, String symb_imag_type, String symb_file_nm, TbVmsSymbIfscDto cell) {
+            this.symbLibNmbr = symb_lib_nmbr;
+            this.rgstDt = rgst_dt;
+            this.redData = red_data;
+            this.greenData = green_data;
+            this.symbExpl = symb_expl;
+            this.imagData = imag_data;
+            this.vmsTypeCd = vms_type_cd;
+            this.symbImagType = symb_imag_type;
+            this.symbFileNm = symb_file_nm;
+            this.cell = cell;
+        }
+
+        public TbVmsSymbLibDto.TbVmsSymbLibUpdReq toLibReq() {
+            TbVmsSymbLibDto.TbVmsSymbLibUpdReq req = TbVmsSymbLibDto.TbVmsSymbLibUpdReq.builder()
+                    .symb_lib_nmbr(this.symbLibNmbr)
+                    .rgst_dt(this.rgstDt)
+                    .red_data(this.redData)
+                    .green_data(this.greenData)
+                    .symb_expl(this.symbExpl)
+                    .imag_data(this.imagData)
+                    .vms_type_cd(this.vmsTypeCd)
+                    .symb_imag_type(this.symbImagType)
+                    .symb_file_nm(this.symbFileNm)
+                    .build();
+            return req;
+        }
+
+    }
+
+}

+ 299 - 0
src/main/java/com/its/op/model/entity/vms/TbVmsCtlr.java

@@ -0,0 +1,299 @@
+package com.its.op.model.entity.vms;
+
+import com.its.op.model.dto.vms.TbVmsCtlrDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.io.Serializable;
+
+/**
+ * VMS 제어기 Entity Class
+ */
+@Getter
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@Builder
+@AllArgsConstructor
+@ApiModel("VMS 제어기")
+@Entity
+@Table(name = "TB_VMS_CTLR")
+public class TbVmsCtlr implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("VMS 제어기 번호")  // N NUMBER(10)
+    @Id
+    @Column(name = "VMS_CTLR_NMBR", nullable = false, columnDefinition = "NUMBER", length = 10)
+    private Long vmsCtlrNmbr;
+
+    @ApiModelProperty("VMS ID")  // Y VARCHAR(4)
+    @Column(name = "VMS_ID", length = 4)
+    private String vmsId;
+
+    @ApiModelProperty("VMS 제어기 ID")  // Y VARCHAR(30)
+    @Column(name = "VMS_CTLR_ID", length = 30)
+    private String vmsCtlrId;
+
+    @ApiModelProperty("VMS 명")  // Y VARCHAR(40)
+    @Column(name = "VMS_NM", length = 40)
+    private String vmsNm;
+
+    @ApiModelProperty("VMS 제어기 아이피")  // Y VARCHAR(20)
+    @Column(name = "VMS_CTLR_IP", length = 20)
+    private String vmsCtlrIp;
+
+    @ApiModelProperty("VMS 용도 유형 코드")  // Y VARCHAR(7)
+    @Column(name = "VMS_USAG_TYPE_CD", length = 7)
+    private String vmsUsagTypeCd;
+
+    @ApiModelProperty("VMS 형식 유형 코드")  // Y VARCHAR(7)
+    @Column(name = "VMS_FRM_TYPE_CD", length = 7)
+    private String vmsFrmTypeCd;
+
+    @ApiModelProperty("VMS 유형 코드")  // Y VARCHAR(7)
+    @Column(name = "VMS_TYPE_CD", length = 7)
+    private String vmsTypeCd;
+
+    @ApiModelProperty("VMS 모듈 유형 코드")  // Y VARCHAR(7)
+    @Column(name = "VMS_MODL_TYPE_CD", length = 7)
+    private String vmsModlTypeCd;
+
+    @ApiModelProperty("VMS 통신 포트")  // Y VARCHAR(5)
+    @Column(name = "VMS_CMNC_PORT", length = 5)
+    private String vmsCmncPort;
+
+    @ApiModelProperty("운영 모드")  // Y VARCHAR(7)
+    @Column(name = "OPER_MODE", length = 7)
+    private String operMode;
+
+    @ApiModelProperty("VMS 통신 오류 기본 값")  // Y NUMBER(3)
+    @Column(name = "VMS_CMNC_ERR_BASS_VAL", columnDefinition = "NUMBER", length = 3)
+    private Short vmsCmncErrBassVal;
+
+    @ApiModelProperty("VMS 야간 휘도 단계")  // Y NUMBER(2)
+    @Column(name = "VMS_NGHT_BRGH_STEP", columnDefinition = "NUMBER", length = 2)
+    private Short vmsNghtBrghStep;
+
+    @ApiModelProperty("VMS 주간 휘도 단계")  // Y NUMBER(2)
+    @Column(name = "VMS_WEEK_BRGH_STEP", columnDefinition = "NUMBER", length = 2)
+    private Short vmsWeekBrghStep;
+
+    @ApiModelProperty("VMS 표출면 변경 주기")  // Y NUMBER(3)
+    @Column(name = "VMS_PHSE_CHNG_CYCL", columnDefinition = "NUMBER", length = 3)
+    private Short vmsPhseChngCycl;
+
+    @ApiModelProperty("VMS 모듈 오류 율")  // Y NUMBER(3)
+    @Column(name = "VMS_MODL_ERR_RATE", columnDefinition = "NUMBER", length = 3)
+    private Short vmsModlErrRate;
+
+    @ApiModelProperty("통신장애 SLOT 번호")  // Y NUMBER(4)
+    @Column(name = "CMNCFAIL_SLOT_NMBR", columnDefinition = "NUMBER", length = 4)
+    private Short cmncfailSlotNmbr;
+
+    @ApiModelProperty("전원 장애 SLOT 번호")  // Y NUMBER(4)
+    @Column(name = "PWER_FAIL_SLOT_NMBR", columnDefinition = "NUMBER", length = 4)
+    private Short pwerFailSlotNmbr;
+
+    @ApiModelProperty("삭제 여부")  // Y CHAR(1)
+    @Column(name = "DEL_YN", columnDefinition = "CHAR", length = 1)
+    private String delYn;
+
+    @ApiModelProperty("소통정보 연계 여부")  // Y CHAR(1)
+    @Column(name = "CMTRINFR_CNCT_YN", columnDefinition = "CHAR", length = 1)
+    private String cmtrinfrCnctYn;
+
+    @ApiModelProperty("기상정보 연계 여부")  // Y CHAR(1)
+    @Column(name = "WTHRINFR_CNCT_YN", columnDefinition = "CHAR", length = 1)
+    private String wthrinfrCnctYn;
+
+    @ApiModelProperty("환경정보 연계 여부")  // Y CHAR(1)
+    @Column(name = "ENVRINFR_CNCT_YN", columnDefinition = "CHAR", length = 1)
+    private String envrinfrCnctYn;
+
+    @ApiModelProperty("VMS 최대 표출면 개수")  // Y NUMBER(2)
+    @Column(name = "VMS_MAX_PHSE_NUM", columnDefinition = "NUMBER", length = 2)
+    private Short vmsMaxPhseNum;
+
+    @ApiModelProperty("최초 등록자 번호")  // Y VARCHAR(20)
+    @Column(name = "FRST_REGR_NMBR", length = 20)
+    private String frstRegrNmbr;
+
+    @ApiModelProperty("최초 등록 일시")  // Y VARCHAR(14)
+    @Column(name = "FRST_RGST_DT", length = 14)
+    private String frstRgstDt;
+
+    @ApiModelProperty("최종 수정자 번호")  // Y VARCHAR(20)
+    @Column(name = "LAST_CRPR_NMBR", length = 20)
+    private String lastCrprNmbr;
+
+    @ApiModelProperty("최종 수정 일시")  // Y VARCHAR(14)
+    @Column(name = "LAST_CRCT_DT", length = 14)
+    private String lastCrctDt;
+
+    @ApiModelProperty("전광판 ON TIME")  // Y VARCHAR(4)
+    @Column(name = "PANL_ON_TIME", length = 4)
+    private String panlOnTime;
+
+    @ApiModelProperty("전광판 OFF TIME")  // Y VARCHAR(4)
+    @Column(name = "PANL_OFF_TIME", length = 4)
+    private String panlOffTime;
+
+    @ApiModelProperty("전광판 전원 모드")  // Y VARCHAR(7)
+    @Column(name = "PANL_PWER_MODE", length = 7)
+    private String panlPwerMode;
+
+    @ApiModelProperty("휘도 모드")  // Y VARCHAR(7)
+    @Column(name = "BRGH_MODE", length = 7)
+    private String brghMode;
+
+    @ApiModelProperty("웹 카메라 아이피")  // Y VARCHAR(20)
+    @Column(name = "WEB_CMRA_IP", length = 20)
+    private String webCmraIp;
+
+    @ApiModelProperty("X 좌표")  // Y NUMBER(11,8)
+    @Column(name = "X_CRDN", columnDefinition = "NUMBER", length = 11, precision = 8)
+    private Long xCrdn;
+
+    @ApiModelProperty("Y 좌표")  // Y NUMBER(10,8)
+    @Column(name = "Y_CRDN", columnDefinition = "NUMBER", length = 10, precision = 8)
+    private Long yCrdn;
+
+    @ApiModelProperty("설치 위치 명")  // Y VARCHAR(40)
+    @Column(name = "ISTL_LCTN_NM", length = 40)
+    private String istlLctnNm;
+
+    @ApiModelProperty("교통 전략 사용 여부")  // Y CHAR(1)
+    @Column(name = "TRFC_STRG_USE_YN", columnDefinition = "CHAR", length = 1)
+    private String trfcStrgUseYn;
+
+    @ApiModelProperty("VMS 위치 정보제공구간 ID")  // Y NUMBER(10)
+    @Column(name = "VMS_LOC_IFSC_ID", columnDefinition = "NUMBER", length = 10)
+    private Long vmsLocIfscId;
+
+    @ApiModelProperty("팬 동작 온도")  // Y NUMBER(6,3)
+    @Column(name = "FAN_MTNS_TMPR", columnDefinition = "NUMBER", length = 6, precision = 3)
+    private Short fanMtnsTmpr;
+
+    @ApiModelProperty("히터 동작 온도")  // Y NUMBER(6,3)
+    @Column(name = "HETR_MTNS_TMPR", columnDefinition = "NUMBER", length = 6, precision = 3)
+    private Short hetrMtnsTmpr;
+
+    @ApiModelProperty("웹 카메라 포트")  // Y VARCHAR(5)
+    @Column(name = "WEB_CMRA_PORT", length = 5)
+    private String webCmraPort;
+
+    @ApiModelProperty("웹 카메라 ID")  // Y VARCHAR(30)
+    @Column(name = "WEB_CMRA_ID", length = 30)
+    private String webCmraId;
+
+    @ApiModelProperty("웹 카메라 암호")  // Y VARCHAR(64)
+    @Column(name = "WEB_CMRA_PWD", length = 64)
+    private String webCmraPwd;
+
+    @ApiModelProperty("스트리밍 세션 명")  // Y VARCHAR(200)
+    @Column(name = "STRM_SESN_NM", length = 200)
+    private String strmSesnNm;
+
+    public TbVmsCtlrDto toDto() {
+        TbVmsCtlrDto dto = TbVmsCtlrDto.builder()
+                .vmsCtlrNmbr(this.vmsCtlrNmbr)
+                .vmsId(this.vmsId)
+                .vmsCtlrId(this.vmsCtlrId)
+                .vmsNm(this.vmsNm)
+                .vmsCtlrIp(this.vmsCtlrIp)
+                .vmsUsagTypeCd(this.vmsUsagTypeCd)
+                .vmsFrmTypeCd(this.vmsFrmTypeCd)
+                .vmsTypeCd(this.vmsTypeCd)
+                .vmsModlTypeCd(this.vmsModlTypeCd)
+                .vmsCmncPort(this.vmsCmncPort)
+                .operMode(this.operMode)
+                .vmsCmncErrBassVal(this.vmsCmncErrBassVal)
+                .vmsNghtBrghStep(this.vmsNghtBrghStep)
+                .vmsWeekBrghStep(this.vmsWeekBrghStep)
+                .vmsPhseChngCycl(this.vmsPhseChngCycl)
+                .vmsModlErrRate(this.vmsModlErrRate)
+                .cmncfailSlotNmbr(this.cmncfailSlotNmbr)
+                .pwerFailSlotNmbr(this.pwerFailSlotNmbr)
+                .delYn(this.delYn)
+                .cmtrinfrCnctYn(this.cmtrinfrCnctYn)
+                .wthrinfrCnctYn(this.wthrinfrCnctYn)
+                .envrinfrCnctYn(this.envrinfrCnctYn)
+                .vmsMaxPhseNum(this.vmsMaxPhseNum)
+                .frstRegrNmbr(this.frstRegrNmbr)
+                .frstRgstDt(this.frstRgstDt)
+                .lastCrprNmbr(this.lastCrprNmbr)
+                .lastCrctDt(this.lastCrctDt)
+                .panlOnTime(this.panlOnTime)
+                .panlOffTime(this.panlOffTime)
+                .panlPwerMode(this.panlPwerMode)
+                .brghMode(this.brghMode)
+                .webCmraIp(this.webCmraIp)
+                .xCrdn(this.xCrdn)
+                .yCrdn(this.yCrdn)
+                .istlLctnNm(this.istlLctnNm)
+                .trfcStrgUseYn(this.trfcStrgUseYn)
+                .vmsLocIfscId(this.vmsLocIfscId)
+                .fanMtnsTmpr(this.fanMtnsTmpr)
+                .hetrMtnsTmpr(this.hetrMtnsTmpr)
+                .webCmraPort(this.webCmraPort)
+                .webCmraId(this.webCmraId)
+                .webCmraPwd(this.webCmraPwd)
+                .strmSesnNm(this.strmSesnNm)
+                .build();
+
+        return dto;
+    }
+
+    public TbVmsCtlr(Long vmsCtlrNmbr) {
+        this.vmsCtlrNmbr = vmsCtlrNmbr;
+    }
+
+    public void updateInfo(TbVmsCtlrDto.TbVmsCtlrUpdReq req) {
+        this.vmsId = req.getVmsId();
+        this.vmsCtlrId = req.getVmsCtlrId();
+        this.vmsNm = req.getVmsNm();
+        this.vmsCtlrIp = req.getVmsCtlrIp();
+        this.vmsUsagTypeCd = req.getVmsUsagTypeCd();
+        this.vmsFrmTypeCd = req.getVmsFrmTypeCd();
+        this.vmsTypeCd = req.getVmsTypeCd();
+        this.vmsModlTypeCd = req.getVmsModlTypeCd();
+        this.vmsCmncPort = req.getVmsCmncPort();
+        this.operMode = req.getOperMode();
+        this.vmsCmncErrBassVal = req.getVmsCmncErrBassVal();
+        this.vmsNghtBrghStep = req.getVmsNghtBrghStep();
+        this.vmsWeekBrghStep = req.getVmsWeekBrghStep();
+        this.vmsPhseChngCycl = req.getVmsPhseChngCycl();
+        this.vmsModlErrRate = req.getVmsModlErrRate();
+        this.cmncfailSlotNmbr = req.getCmncfailSlotNmbr();
+        this.pwerFailSlotNmbr = req.getPwerFailSlotNmbr();
+        this.delYn = req.getDelYn();
+        this.cmtrinfrCnctYn = req.getCmtrinfrCnctYn();
+        this.wthrinfrCnctYn = req.getWthrinfrCnctYn();
+        this.envrinfrCnctYn = req.getEnvrinfrCnctYn();
+        this.vmsMaxPhseNum = req.getVmsMaxPhseNum();
+        this.frstRegrNmbr = req.getFrstRegrNmbr();
+        this.frstRgstDt = req.getFrstRgstDt();
+        this.lastCrprNmbr = req.getLastCrprNmbr();
+        this.lastCrctDt = req.getLastCrctDt();
+        this.panlOnTime = req.getPanlOnTime();
+        this.panlOffTime = req.getPanlOffTime();
+        this.panlPwerMode = req.getPanlPwerMode();
+        this.brghMode = req.getBrghMode();
+        this.webCmraIp = req.getWebCmraIp();
+        this.xCrdn = req.getXCrdn();
+        this.yCrdn = req.getYCrdn();
+        this.istlLctnNm = req.getIstlLctnNm();
+        this.trfcStrgUseYn = req.getTrfcStrgUseYn();
+        this.vmsLocIfscId = req.getVmsLocIfscId();
+        this.fanMtnsTmpr = req.getFanMtnsTmpr();
+        this.hetrMtnsTmpr = req.getHetrMtnsTmpr();
+        this.webCmraPort = req.getWebCmraPort();
+        this.webCmraId = req.getWebCmraId();
+        this.webCmraPwd = req.getWebCmraPwd();
+        this.strmSesnNm = req.getStrmSesnNm();
+    }
+
+}

+ 95 - 0
src/main/java/com/its/op/model/entity/vms/TbVmsIfsc.java

@@ -0,0 +1,95 @@
+package com.its.op.model.entity.vms;
+
+import com.its.op.model.dto.vms.TbVmsIfscDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.io.Serializable;
+
+/**
+ * VMS 정보제공구간 Entity Class
+ */
+@Getter
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@Builder
+@AllArgsConstructor
+@ApiModel("VMS 정보제공구간")
+@Entity
+@Table(name = "TB_VMS_IFSC")
+public class TbVmsIfsc implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("VMS 정보제공구간 ID")  // N NUMBER(10)
+    @Id
+    @Column(name = "VMS_IFSC_ID", nullable = false, columnDefinition = "NUMBER", length = 10)
+    private Long vmsIfscId;
+
+    @ApiModelProperty("VMS 정보제공구간 명")  // Y VARCHAR(60)
+    @Column(name = "VMS_IFSC_NM", length = 60)
+    private String vmsIfscNm;
+
+    @ApiModelProperty("편집 코드")  // Y VARCHAR(7)
+    @Column(name = "EDTN_CD", length = 7)
+    private String edtnCd;
+
+    @ApiModelProperty("표출 시작 노드 명")  // Y VARCHAR(30)
+    @Column(name = "DSPL_STRT_NODE_NM", length = 30)
+    private String dsplStrtNodeNm;
+
+    @ApiModelProperty("표출 종료 노드 명")  // Y VARCHAR(30)
+    @Column(name = "DSPL_END_NODE_NM", length = 30)
+    private String dsplEndNodeNm;
+
+    @ApiModelProperty("우회도로 ID")  // Y NUMBER(10)
+    @Column(name = "DETR_ID", columnDefinition = "NUMBER", length = 10)
+    private Long detrId;
+
+    @ApiModelProperty("도로명")  // Y VARCHAR(30)
+    @Column(name = "ROAD_NM", length = 30)
+    private String roadNm;
+
+    @ApiModelProperty("지점명")  // Y VARCHAR(30)
+    @Column(name = "SPOT_NM", length = 30)
+    private String spotNm;
+
+    @ApiModelProperty("축정보 생성용")  // Y CHAR(1)
+    @Column(name = "AXIS_YN", columnDefinition = "CHAR", length = 1)
+    private String axisYn;
+
+    public TbVmsIfscDto toDto() {
+        TbVmsIfscDto dto = TbVmsIfscDto.builder()
+                .vmsIfscId(this.vmsIfscId)
+                .vmsIfscNm(this.vmsIfscNm)
+                .edtnCd(this.edtnCd)
+                .dsplStrtNodeNm(this.dsplStrtNodeNm)
+                .dsplEndNodeNm(this.dsplEndNodeNm)
+                .detrId(this.detrId)
+                .roadNm(this.roadNm)
+                .spotNm(this.spotNm)
+                .axisYn(this.axisYn)
+                .build();
+
+        return dto;
+    }
+
+    public TbVmsIfsc(Long vmsIfscId) {
+        this.vmsIfscId = vmsIfscId;
+    }
+
+    public void updateInfo(TbVmsIfscDto.TbVmsIfscUpdReq req) {
+        this.vmsIfscNm = req.getVmsIfscNm();
+        this.edtnCd = req.getEdtnCd();
+        this.dsplStrtNodeNm = req.getDsplStrtNodeNm();
+        this.dsplEndNodeNm = req.getDsplEndNodeNm();
+        this.detrId = req.getDetrId();
+        this.roadNm = req.getRoadNm();
+        this.spotNm = req.getSpotNm();
+        this.axisYn = req.getAxisYn();
+    }
+
+}

+ 72 - 0
src/main/java/com/its/op/model/entity/vms/TbVmsIfscRltn.java

@@ -0,0 +1,72 @@
+package com.its.op.model.entity.vms;
+
+import com.its.op.model.dto.vms.TbVmsIfscRltnDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+import org.hibernate.annotations.NotFound;
+import org.hibernate.annotations.NotFoundAction;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+/**
+ * VMS 정보제공구간 관계 Entity Class
+ */
+@Getter
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@Builder
+@AllArgsConstructor
+@ApiModel("VMS 정보제공구간 관계")
+@Entity
+@Table(name = "TB_VMS_IFSC_RLTN")
+@IdClass(TbVmsIfscRltnKey.class)
+public class TbVmsIfscRltn implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("VMS 제어기 번호")  // N NUMBER(10)
+    @Id
+    @Column(name = "VMS_CTLR_NMBR", nullable = false, columnDefinition = "NUMBER", length = 10)
+    private Long vmsCtlrNmbr;
+
+    @ApiModelProperty("VMS 정보제공구간 ID")  // N NUMBER(10)
+    @Id
+    @Column(name = "VMS_IFSC_ID", nullable = false, columnDefinition = "NUMBER", length = 10)
+    private Long vmsIfscId;
+
+    @ApiModelProperty("표출 우선순위")  // Y NUMBER(2)
+    @Column(name = "DSPL_PRRT", columnDefinition = "NUMBER", length = 2)
+    private Short dsplPrrt;
+
+    @OneToOne
+    @JoinColumn(insertable=false, updatable=false, name="VMS_CTLR_NMBR", referencedColumnName = "VMS_CTLR_NMBR")
+    @NotFound(action = NotFoundAction.IGNORE)
+    private TbVmsCtlr vms = new TbVmsCtlr();
+
+    @OneToOne
+    @JoinColumn(insertable=false, updatable=false, name="VMS_IFSC_ID", referencedColumnName = "VMS_IFSC_ID")
+    @NotFound(action = NotFoundAction.IGNORE)
+    private TbVmsIfsc ifsc = new TbVmsIfsc();
+
+    public TbVmsIfscRltnDto toDto() {
+        TbVmsIfscRltnDto dto = TbVmsIfscRltnDto.builder()
+                .vmsCtlrNmbr(this.vmsCtlrNmbr)
+                .vmsIfscId(this.vmsIfscId)
+                .dsplPrrt(this.dsplPrrt)
+                .vms(this.vms == null ? null : this.vms.toDto())
+                .ifsc(this.ifsc == null ? null : this.ifsc.toDto())
+                .build();
+
+        return dto;
+    }
+
+    public TbVmsIfscRltn(Long vmsCtlrNmbr, Long vmsIfscId) {
+        this.vmsCtlrNmbr = vmsCtlrNmbr;
+        this.vmsIfscId = vmsIfscId;
+    }
+
+    public void updateInfo(TbVmsIfscRltnDto.TbVmsIfscRltnUpdReq req) {
+        this.dsplPrrt = req.getDsplPrrt();
+    }
+
+}

+ 25 - 0
src/main/java/com/its/op/model/entity/vms/TbVmsIfscRltnKey.java

@@ -0,0 +1,25 @@
+package com.its.op.model.entity.vms;
+
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * VMS 정보제공구간 관계 Key Class
+ */
+@Data
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@AllArgsConstructor
+public class TbVmsIfscRltnKey implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    // VMS_CTLR_NMBR, VMS 제어기 번호  // N NUMBER(10)
+    private Long vmsCtlrNmbr;
+
+    // VMS_IFSC_ID, VMS 정보제공구간 ID  // N NUMBER(10)
+    private Long vmsIfscId;
+
+}

+ 4 - 4
src/main/java/com/its/op/model/entity/vms/TbVmsSymbIfsc.java

@@ -25,7 +25,7 @@ public class TbVmsSymbIfsc implements Serializable {
     @ApiModelProperty("심벌라이브러리 번호")  // N NUMBER(4)
     @Id
     @Column(name = "SYMBLIB_NMBR", nullable = false, columnDefinition = "NUMBER", length = 4)
-    private Short symblibNmbr;
+    private Short symbLibNmbr;
 
     @ApiModelProperty("셀 ID")  // N NUMBER(4)
     @Id
@@ -46,7 +46,7 @@ public class TbVmsSymbIfsc implements Serializable {
 
     public TbVmsSymbIfscDto toDto() {
         TbVmsSymbIfscDto dto = TbVmsSymbIfscDto.builder()
-                .symblibNmbr(this.symblibNmbr)
+                .symbLibNmbr(this.symbLibNmbr)
                 .cellId(this.cellId)
                 .posx(this.posx)
                 .posy(this.posy)
@@ -56,8 +56,8 @@ public class TbVmsSymbIfsc implements Serializable {
         return dto;
     }
 
-    public TbVmsSymbIfsc(Short symblibNmbr, Short cellId) {
-        this.symblibNmbr = symblibNmbr;
+    public TbVmsSymbIfsc(Short symbLibNmbr, Short cellId) {
+        this.symbLibNmbr = symbLibNmbr;
         this.cellId = cellId;
     }
 

+ 1 - 1
src/main/java/com/its/op/model/entity/vms/TbVmsSymbIfscKey.java

@@ -17,7 +17,7 @@ public class TbVmsSymbIfscKey implements Serializable {
     private static final long serialVersionUID = 1L;
 
     // SYMBLIB_NMBR, 심벌라이브러리 번호  // N NUMBER(4)
-    private Short symblibNmbr;
+    private Short symbLibNmbr;
 
     // CELL_ID, 셀 ID  // N NUMBER(4)
     private Short cellId;

+ 11 - 0
src/main/java/com/its/op/repository/vms/TbVmsCtlrRepository.java

@@ -0,0 +1,11 @@
+package com.its.op.repository.vms;
+
+import com.its.op.model.entity.vms.TbVmsCtlr;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface TbVmsCtlrRepository extends JpaRepository<TbVmsCtlr, Long>, JpaSpecificationExecutor<TbVmsCtlr> {
+
+}

+ 11 - 0
src/main/java/com/its/op/repository/vms/TbVmsIfscRepository.java

@@ -0,0 +1,11 @@
+package com.its.op.repository.vms;
+
+import com.its.op.model.entity.vms.TbVmsIfsc;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface TbVmsIfscRepository extends JpaRepository<TbVmsIfsc, Long>, JpaSpecificationExecutor<TbVmsIfsc> {
+
+}

+ 17 - 0
src/main/java/com/its/op/repository/vms/TbVmsIfscRltnRepository.java

@@ -0,0 +1,17 @@
+package com.its.op.repository.vms;
+
+import com.its.op.model.entity.vms.TbVmsIfscRltn;
+import com.its.op.model.entity.vms.TbVmsIfscRltnKey;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface TbVmsIfscRltnRepository extends JpaRepository<TbVmsIfscRltn, TbVmsIfscRltnKey>, JpaSpecificationExecutor<TbVmsIfscRltn> {
+
+    @Query("select p from TbVmsIfscRltn p inner join fetch p.vms inner join fetch p.ifsc")
+    List<TbVmsIfscRltn> findDataAll();
+}

+ 10 - 0
src/main/java/com/its/op/repository/vms/TbVmsSymbIfscRepository.java

@@ -4,9 +4,19 @@ import com.its.op.model.entity.vms.TbVmsSymbIfsc;
 import com.its.op.model.entity.vms.TbVmsSymbIfscKey;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 @Repository
 public interface TbVmsSymbIfscRepository extends JpaRepository<TbVmsSymbIfsc, TbVmsSymbIfscKey>, JpaSpecificationExecutor<TbVmsSymbIfsc> {
 
+    @Query("select p from TbVmsSymbIfsc p where p.symbLibNmbr = :id")
+    List<TbVmsSymbIfsc> findDataById(Short id);
+
+    @Modifying // select 문이 아님을 나타낸다
+    @Query("delete from TbVmsSymbIfsc p where p.symbLibNmbr = :id")
+    void deleteDataById(Short id);
 }

+ 90 - 0
src/main/java/com/its/op/service/vms/TbVmsCtlrService.java

@@ -0,0 +1,90 @@
+package com.its.op.service.vms;
+
+import com.its.op.model.dto.vms.TbVmsCtlrDto;
+import com.its.op.model.entity.vms.TbVmsCtlr;
+import com.its.op.repository.vms.TbVmsCtlrRepository;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class TbVmsCtlrService {
+
+    private final TbVmsCtlrRepository repo;
+
+    // 데이터 1건 조회, 없으면 exception
+    private TbVmsCtlr requireOne(Long id) {
+        return repo.findById(id)
+                .orElseThrow(() -> new NoSuchElementException("데이터가 존재하지 않습니다: " + id));
+    }
+
+    // 전체 데이터 조회
+    public List<TbVmsCtlrDto> findAll() {
+        List<TbVmsCtlrDto> result = new ArrayList<>();
+        List<TbVmsCtlr> data = this.repo.findAll();
+        for (TbVmsCtlr entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    // 데이터 1건 조회(기존 데이터가 반드시 존재해야 함)
+    public TbVmsCtlrDto findById(Long id) {
+        TbVmsCtlr entity = requireOne(id);
+        return entity.toDto();
+    }
+
+    // 데이터 변경
+    public TbVmsCtlrDto updateById(Long id, TbVmsCtlrDto.TbVmsCtlrUpdReq req) {
+        TbVmsCtlr entity = requireOne(id);
+        entity.updateInfo(req);
+        this.repo.save(entity);
+        return entity.toDto();
+    }
+
+    // 데이터 변경 또는 생성-목록(데이터가 존재하면 업데이트 없으면 신규로 생성)
+    public List<TbVmsCtlrDto> mergeInfoList(List<TbVmsCtlrDto.TbVmsCtlrUpdReq> reqList) {
+        List<TbVmsCtlrDto> result = new ArrayList<>();
+        for (TbVmsCtlrDto.TbVmsCtlrUpdReq req : reqList) {
+            TbVmsCtlr obj = req.toEntity();
+            this.repo.save(obj);
+            result.add(obj.toDto());
+        }
+        return result;
+    }
+
+    // 데이터 변경 또는 생성-개별(데이터가 존재하면 업데이트 없으면 신규로 생성)
+    public TbVmsCtlrDto mergeInfo(TbVmsCtlrDto.TbVmsCtlrUpdReq req) {
+        TbVmsCtlr obj = req.toEntity();
+        this.repo.save(obj);
+        return obj.toDto();
+    }
+
+    // 정보 삭제-개별, 데이터 존재하지 않으면 Exception
+    public TbVmsCtlrDto deleteById(Long id) {
+        TbVmsCtlr entity = requireOne(id);
+        this.repo.deleteById(id);
+        return entity.toDto();
+    }
+
+    // 정보 삭제-목록, 존재하는 데이터 만 삭제
+    public List<TbVmsCtlrDto> deleteByIds(List<Long> ids) {
+        List<TbVmsCtlrDto> result = new ArrayList<>();
+        for (Long id : ids) {
+            Optional<TbVmsCtlr> obj = this.repo.findById(id);
+            if (obj.isPresent()) {
+                this.repo.deleteById(id);
+                result.add(obj.get().toDto());
+            }
+        }
+        return result;
+    }
+
+}

+ 105 - 0
src/main/java/com/its/op/service/vms/TbVmsIfscRltnService.java

@@ -0,0 +1,105 @@
+package com.its.op.service.vms;
+
+import com.its.op.model.dto.vms.TbVmsIfscRltnDto;
+import com.its.op.model.entity.vms.TbVmsIfscRltn;
+import com.its.op.model.entity.vms.TbVmsIfscRltnKey;
+import com.its.op.repository.vms.TbVmsIfscRltnRepository;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class TbVmsIfscRltnService {
+
+    private final TbVmsIfscRltnRepository repo;
+
+    // 데이터 1건 조회, 없으면 exception
+    private TbVmsIfscRltn requireOne(TbVmsIfscRltnKey id) {
+        return repo.findById(id)
+                .orElseThrow(() -> new NoSuchElementException("데이터가 존재하지 않습니다: " + id));
+    }
+
+    // 전체 데이터 조회
+    public List<TbVmsIfscRltnDto> findAll() {
+        List<TbVmsIfscRltnDto> result = new ArrayList<>();
+        List<TbVmsIfscRltn> data = this.repo.findAll();
+        for (TbVmsIfscRltn entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    // 데이터 1건 조회(기존 데이터가 반드시 존재해야 함)
+    public TbVmsIfscRltnDto findById(TbVmsIfscRltnKey id) {
+        TbVmsIfscRltn entity = requireOne(id);
+        return entity.toDto();
+    }
+
+    // 데이터 변경
+    public TbVmsIfscRltnDto updateById(TbVmsIfscRltnKey id, TbVmsIfscRltnDto.TbVmsIfscRltnUpdReq req) {
+        TbVmsIfscRltn entity = requireOne(id);
+        entity.updateInfo(req);
+        this.repo.save(entity);
+        return entity.toDto();
+    }
+
+    // 데이터 변경 또는 생성-목록(데이터가 존재하면 업데이트 없으면 신규로 생성)
+    public List<TbVmsIfscRltnDto> mergeInfoList(List<TbVmsIfscRltnDto.TbVmsIfscRltnUpdReq> reqList) {
+        List<TbVmsIfscRltnDto> result = new ArrayList<>();
+        for (TbVmsIfscRltnDto.TbVmsIfscRltnUpdReq req : reqList) {
+            TbVmsIfscRltn obj = req.toEntity();
+            this.repo.save(obj);
+            result.add(obj.toDto());
+        }
+        return result;
+    }
+
+    // 데이터 변경 또는 생성-개별(데이터가 존재하면 업데이트 없으면 신규로 생성)
+    public TbVmsIfscRltnDto mergeInfo(TbVmsIfscRltnDto.TbVmsIfscRltnUpdReq req) {
+        TbVmsIfscRltn obj = req.toEntity();
+        this.repo.save(obj);
+        return obj.toDto();
+    }
+
+    // 정보 삭제-개별, 데이터 존재하지 않으면 Exception
+    public TbVmsIfscRltnDto deleteById(TbVmsIfscRltnKey id) {
+        TbVmsIfscRltn entity = requireOne(id);
+        this.repo.deleteById(id);
+        return entity.toDto();
+    }
+
+    // 정보 삭제-목록, 존재하는 데이터 만 삭제
+    public List<TbVmsIfscRltnDto> deleteByIds(List<TbVmsIfscRltnKey> ids) {
+        List<TbVmsIfscRltnDto> result = new ArrayList<>();
+        for (TbVmsIfscRltnKey id : ids) {
+            Optional<TbVmsIfscRltn> obj = this.repo.findById(id);
+            if (obj.isPresent()) {
+                this.repo.deleteById(id);
+                result.add(obj.get().toDto());
+            }
+        }
+        return result;
+    }
+
+    // 도형식 VMS 에 설정된 정보제공 구간 목록 전체를 리턴
+    public List<TbVmsIfscRltnDto> findFigureIfscAll() {
+        List<TbVmsIfscRltnDto> result = new ArrayList<>();
+        List<TbVmsIfscRltn> list = this.repo.findDataAll();
+        for (TbVmsIfscRltn obj : list) {
+            if (obj.getIfsc() != null && obj.getVms() != null && obj.getVms().getVmsTypeCd().equals("VMP1")) {
+                if (!obj.getVms().getDelYn().equals("Y") && !obj.getIfsc().getEdtnCd().equals("EDI2")) {
+                    // 삭제 된것 제외
+                    result.add(obj.toDto());
+                }
+            }
+        }
+        return result;
+    }
+}

+ 90 - 0
src/main/java/com/its/op/service/vms/TbVmsIfscService.java

@@ -0,0 +1,90 @@
+package com.its.op.service.vms;
+
+import com.its.op.model.dto.vms.TbVmsIfscDto;
+import com.its.op.model.entity.vms.TbVmsIfsc;
+import com.its.op.repository.vms.TbVmsIfscRepository;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class TbVmsIfscService {
+
+    private final TbVmsIfscRepository repo;
+
+    // 데이터 1건 조회, 없으면 exception
+    private TbVmsIfsc requireOne(Long id) {
+        return repo.findById(id)
+                .orElseThrow(() -> new NoSuchElementException("데이터가 존재하지 않습니다: " + id));
+    }
+
+    // 전체 데이터 조회
+    public List<TbVmsIfscDto> findAll() {
+        List<TbVmsIfscDto> result = new ArrayList<>();
+        List<TbVmsIfsc> data = this.repo.findAll();
+        for (TbVmsIfsc entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    // 데이터 1건 조회(기존 데이터가 반드시 존재해야 함)
+    public TbVmsIfscDto findById(Long id) {
+        TbVmsIfsc entity = requireOne(id);
+        return entity.toDto();
+    }
+
+    // 데이터 변경
+    public TbVmsIfscDto updateById(Long id, TbVmsIfscDto.TbVmsIfscUpdReq req) {
+        TbVmsIfsc entity = requireOne(id);
+        entity.updateInfo(req);
+        this.repo.save(entity);
+        return entity.toDto();
+    }
+
+    // 데이터 변경 또는 생성-목록(데이터가 존재하면 업데이트 없으면 신규로 생성)
+    public List<TbVmsIfscDto> mergeInfoList(List<TbVmsIfscDto.TbVmsIfscUpdReq> reqList) {
+        List<TbVmsIfscDto> result = new ArrayList<>();
+        for (TbVmsIfscDto.TbVmsIfscUpdReq req : reqList) {
+            TbVmsIfsc obj = req.toEntity();
+            this.repo.save(obj);
+            result.add(obj.toDto());
+        }
+        return result;
+    }
+
+    // 데이터 변경 또는 생성-개별(데이터가 존재하면 업데이트 없으면 신규로 생성)
+    public TbVmsIfscDto mergeInfo(TbVmsIfscDto.TbVmsIfscUpdReq req) {
+        TbVmsIfsc obj = req.toEntity();
+        this.repo.save(obj);
+        return obj.toDto();
+    }
+
+    // 정보 삭제-개별, 데이터 존재하지 않으면 Exception
+    public TbVmsIfscDto deleteById(Long id) {
+        TbVmsIfsc entity = requireOne(id);
+        this.repo.deleteById(id);
+        return entity.toDto();
+    }
+
+    // 정보 삭제-목록, 존재하는 데이터 만 삭제
+    public List<TbVmsIfscDto> deleteByIds(List<Long> ids) {
+        List<TbVmsIfscDto> result = new ArrayList<>();
+        for (Long id : ids) {
+            Optional<TbVmsIfsc> obj = this.repo.findById(id);
+            if (obj.isPresent()) {
+                this.repo.deleteById(id);
+                result.add(obj.get().toDto());
+            }
+        }
+        return result;
+    }
+
+}

+ 16 - 1
src/main/java/com/its/op/service/vms/TbVmsSymbIfscService.java

@@ -21,7 +21,7 @@ public class TbVmsSymbIfscService {
     private final TbVmsSymbIfscRepository repo;
 
     // 데이터 1건 조회, 없으면 exception
-    private TbVmsSymbIfsc requireOne(TbVmsSymbIfscKey id) {
+    public TbVmsSymbIfsc requireOne(TbVmsSymbIfscKey id) {
         return repo.findById(id)
                 .orElseThrow(() -> new NoSuchElementException("데이터가 존재하지 않습니다: " + id));
     }
@@ -42,6 +42,16 @@ public class TbVmsSymbIfscService {
         return entity.toDto();
     }
 
+    // 데이터 1건 조회(기존 데이터가 반드시 존재해야 함)
+    public List<TbVmsSymbIfscDto> findDataById(Short id) {
+        List<TbVmsSymbIfscDto> result = new ArrayList<>();
+        List<TbVmsSymbIfsc> list = this.repo.findDataById(id);
+        for (TbVmsSymbIfsc obj : list) {
+            result.add(obj.toDto());
+        }
+        return result;
+    }
+
     // 데이터 변경
     public TbVmsSymbIfscDto updateById(TbVmsSymbIfscKey id, TbVmsSymbIfscDto.TbVmsSymbIfscUpdReq req) {
         TbVmsSymbIfsc entity = requireOne(id);
@@ -75,6 +85,11 @@ public class TbVmsSymbIfscService {
         return entity.toDto();
     }
 
+    // 정보 삭제-개별, 데이터 존재하지 않으면 Exception
+    public void deleteDataById(Short id) {
+        this.repo.deleteDataById(id);
+    }
+
     // 정보 삭제-목록, 존재하는 데이터 만 삭제
     public List<TbVmsSymbIfscDto> deleteByIds(List<TbVmsSymbIfscKey> ids) {
         List<TbVmsSymbIfscDto> result = new ArrayList<>();

+ 5 - 1
src/main/java/com/its/op/service/vms/TbVmsSymbLibService.java

@@ -38,7 +38,7 @@ public class TbVmsSymbLibService {
         List<TbVmsSymbLibDto> result = new ArrayList<>();
         List<TbVmsSymbLib> data = this.repo.findAll();
         for (TbVmsSymbLib entity : data) {
-            if (entity.getVmsTypeCd().equals(this.VMP_TYPE_CD)) {
+            if (entity.getVmsTypeCd() != null && entity.getVmsTypeCd().equals(this.VMP_TYPE_CD)) {
                 result.add(entity.toDto());
             }
         }
@@ -54,6 +54,7 @@ public class TbVmsSymbLibService {
     // 데이터 변경
     public TbVmsSymbLibDto updateById(Short id, TbVmsSymbLibDto.TbVmsSymbLibUpdReq req) {
         TbVmsSymbLib entity = requireOne(id);
+        req.setVmsTypeCd(this.VMP_TYPE_CD);
         req.setRgstDt(ItsUtils.getSysTime());   // 현재시각으로 업데이트
         entity.updateInfo(req);
         this.repo.save(entity);
@@ -64,6 +65,7 @@ public class TbVmsSymbLibService {
     public List<TbVmsSymbLibDto> mergeInfoList(List<TbVmsSymbLibDto.TbVmsSymbLibUpdReq> reqList) {
         List<TbVmsSymbLibDto> result = new ArrayList<>();
         for (TbVmsSymbLibDto.TbVmsSymbLibUpdReq req : reqList) {
+            req.setVmsTypeCd(this.VMP_TYPE_CD);
             req.setRgstDt(ItsUtils.getSysTime());   // 현재시각으로 업데이트
             TbVmsSymbLib obj = req.toEntity();
             this.repo.save(obj);
@@ -74,6 +76,8 @@ public class TbVmsSymbLibService {
 
     // 데이터 변경 또는 생성-개별(데이터가 존재하면 업데이트 없으면 신규로 생성)
     public TbVmsSymbLibDto mergeInfo(TbVmsSymbLibDto.TbVmsSymbLibUpdReq req) {
+        req.setVmsTypeCd(this.VMP_TYPE_CD);
+        req.setRgstDt(ItsUtils.getSysTime());   // 현재시각으로 업데이트
         TbVmsSymbLib obj = req.toEntity();
         this.repo.save(obj);
         return obj.toDto();

+ 12 - 0
src/main/java/com/its/op/service/vms/TbVmsSymbLibServiceVMP0.java

@@ -1,10 +1,14 @@
 package com.its.op.service.vms;
 
+import com.its.op.model.dto.vms.TbVmsSymbLibDto;
 import com.its.op.repository.vms.TbVmsFormObjectRepository;
 import com.its.op.repository.vms.TbVmsSymbLibRepository;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import javax.transaction.Transactional;
+import java.util.ConcurrentModificationException;
+
 @Slf4j
 @Service
 public class TbVmsSymbLibServiceVMP0 extends TbVmsSymbLibService {
@@ -17,4 +21,12 @@ public class TbVmsSymbLibServiceVMP0 extends TbVmsSymbLibService {
         return getNewSymbolId((short)6000, (short)6999);
     }
 
+    @Transactional
+    public TbVmsSymbLibDto deleteDataById(Short id) {
+        int usageCount = findUsageCountBySymbolId(id);
+        if (usageCount > 0) {
+            throw new ConcurrentModificationException("사용중인 심볼 라이브러리 입니다. 삭제할 수 없습니다: " + id);
+        }
+        return deleteById(id);
+    }
 }

+ 49 - 2
src/main/java/com/its/op/service/vms/TbVmsSymbLibServiceVMP1.java

@@ -1,20 +1,67 @@
 package com.its.op.service.vms;
 
+import com.its.op.model.dto.vms.TbVmsSymbIfscDto;
+import com.its.op.model.dto.vms.TbVmsSymbLibDto;
+import com.its.op.model.dto.vms.TbVmsSymbLibIfscVMP1Dto;
+import com.its.op.model.entity.vms.TbVmsSymbLib;
 import com.its.op.repository.vms.TbVmsFormObjectRepository;
 import com.its.op.repository.vms.TbVmsSymbLibRepository;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import javax.transaction.Transactional;
+import java.util.ArrayList;
+import java.util.ConcurrentModificationException;
+import java.util.List;
+
 @Slf4j
 @Service
 public class TbVmsSymbLibServiceVMP1 extends TbVmsSymbLibService {
 
-    public TbVmsSymbLibServiceVMP1(TbVmsSymbLibRepository repo, TbVmsFormObjectRepository formObjectRepository) {
+    private final TbVmsSymbIfscService ifscService;
+
+    public TbVmsSymbLibServiceVMP1(TbVmsSymbLibRepository repo, TbVmsFormObjectRepository formObjectRepository, TbVmsSymbIfscService ifscService) {
         super("VMP1", repo, formObjectRepository);
+        this.ifscService = ifscService;
     }
 
     public Short getNewSymbolId() {
-        return getNewSymbolId((short)7000, (short)7999);
+        return getNewSymbolId((short) 7000, (short) 7999);
+    }
+
+    public TbVmsSymbLibIfscVMP1Dto findAllById(Short id) {
+        TbVmsSymbLib lib = requireOne(id);
+        List<TbVmsSymbIfscDto> list = ifscService.findDataById(id);
+        return TbVmsSymbLibIfscVMP1Dto.toDto(lib.toDto(), list);
+    }
+
+    @Transactional
+    public TbVmsSymbLibDto deleteDataById(Short id) {
+        int usageCount = findUsageCountBySymbolId(id);
+        if (usageCount > 0) {
+            throw new ConcurrentModificationException("사용중인 심볼 라이브러리 입니다. 삭제할 수 없습니다: " + id);
+        }
+        this.ifscService.deleteDataById(id);
+
+        return deleteById(id);
     }
 
+    @Transactional
+    public TbVmsSymbLibIfscVMP1Dto mergeSymbIfscInfo(TbVmsSymbLibIfscVMP1Dto.TbVmsSymbLibIfscVMP1UpdReq req) {
+
+        // 셀 데이터를 전체 삭제
+        this.ifscService.deleteDataById(req.getSymbLibNmbr());
+
+        // 심볼 정보 저장
+        TbVmsSymbLibDto libDto = mergeInfo(req.toLibReq());
+        // 셀 정보 저장
+        List<TbVmsSymbIfscDto> cells = new ArrayList<>();
+        for (TbVmsSymbIfscDto ifscDto : req.getCells()) {
+            TbVmsSymbIfscDto.TbVmsSymbIfscUpdReq ifscReq = new TbVmsSymbIfscDto.TbVmsSymbIfscUpdReq(
+                    req.getSymbLibNmbr(), ifscDto.getCellId(), ifscDto.getPosx(), ifscDto.getPosy(), ifscDto.getVmsIfscId()
+            );
+            cells.add(this.ifscService.mergeInfo(ifscReq));
+        }
+        return TbVmsSymbLibIfscVMP1Dto.toDto(libDto, cells);
+    }
 }

+ 50 - 1
src/main/java/com/its/op/service/vms/TbVmsSymbLibServiceVMP2.java

@@ -1,20 +1,69 @@
 package com.its.op.service.vms;
 
+import com.its.op.model.dto.vms.TbVmsSymbIfscDto;
+import com.its.op.model.dto.vms.TbVmsSymbLibDto;
+import com.its.op.model.dto.vms.TbVmsSymbLibIfscVMP2Dto;
+import com.its.op.model.entity.vms.TbVmsSymbIfsc;
+import com.its.op.model.entity.vms.TbVmsSymbIfscKey;
+import com.its.op.model.entity.vms.TbVmsSymbLib;
 import com.its.op.repository.vms.TbVmsFormObjectRepository;
 import com.its.op.repository.vms.TbVmsSymbLibRepository;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import javax.transaction.Transactional;
+import java.util.ConcurrentModificationException;
+
 @Slf4j
 @Service
 public class TbVmsSymbLibServiceVMP2 extends TbVmsSymbLibService {
 
-    public TbVmsSymbLibServiceVMP2(TbVmsSymbLibRepository repo, TbVmsFormObjectRepository formObjectRepository) {
+    private final TbVmsSymbIfscService ifscService;
+
+    public TbVmsSymbLibServiceVMP2(TbVmsSymbLibRepository repo, TbVmsFormObjectRepository formObjectRepository, TbVmsSymbIfscService ifscService) {
         super("VMP2", repo, formObjectRepository);
+        this.ifscService = ifscService;
     }
 
     public Short getNewSymbolId() {
         return getNewSymbolId((short)8000, (short)8999);
     }
 
+    public TbVmsSymbLibIfscVMP2Dto findAllById(Short id) {
+        TbVmsSymbLib lib = requireOne(id);
+
+        Short cellId =  1;
+        TbVmsSymbIfscKey key = new TbVmsSymbIfscKey(id, cellId);
+        TbVmsSymbIfsc ifsc = ifscService.requireOne(key);
+
+        return TbVmsSymbLibIfscVMP2Dto.toDto(lib.toDto(), ifsc.toDto());
+    }
+
+    // 데이터 변경 또는 생성-개별(데이터가 존재하면 업데이트 없으면 신규로 생성)
+    @Transactional
+    public TbVmsSymbLibIfscVMP2Dto mergeSymbIfscInfo(TbVmsSymbLibIfscVMP2Dto.TbVmsSymbLibIfscVMP2UpdReq req) {
+
+        // 심볼 정보 저장
+        TbVmsSymbLibDto libDto = mergeInfo(req.toLibReq());
+        // 셀 정보 저장
+        TbVmsSymbIfscDto.TbVmsSymbIfscUpdReq ifscReq = new TbVmsSymbIfscDto.TbVmsSymbIfscUpdReq(
+                req.getSymbLibNmbr(), req.getCell().getCellId(), req.getCell().getPosx(), req.getCell().getPosy(), req.getCell().getVmsIfscId()
+        );
+        TbVmsSymbIfscDto ifscDto = this.ifscService.mergeInfo(ifscReq);
+
+        return TbVmsSymbLibIfscVMP2Dto.toDto(libDto, ifscDto);
+    }
+
+    @Transactional
+    public TbVmsSymbLibDto deleteDataById(Short id) {
+        int usageCount = findUsageCountBySymbolId(id);
+        if (usageCount > 0) {
+            throw new ConcurrentModificationException("사용중인 심볼 라이브러리 입니다. 삭제할 수 없습니다: " + id);
+        }
+        Short cellId = 1;
+        TbVmsSymbIfscKey key = new TbVmsSymbIfscKey(id, cellId);
+        this.ifscService.deleteById(key);
+
+        return deleteById(id);
+    }
 }