From f2fcf329cea64d71c671f1ab17f17d1634d1464d Mon Sep 17 00:00:00 2001
From: 이민희 <mhlee@maprex.co.kr>
Date: 월, 07 3월 2022 17:08:23 +0900
Subject: [PATCH] - API로 이슈 추가 시 하위이슈처리기준 항목으로 동일한 업체 정보로 이슈 생성하여 하위이슈로 넣기 - 업체 테이블에 ip_start, ip_end 컬럼 추가

---
 src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java            |  153 ++++++++++++---
 src/main/java/kr/wisestone/owl/util/ConvertUtil.java                         |   15 +
 src/main/java/kr/wisestone/owl/mapper/CompanyFieldMapper.java                |    6 
 src/main/java/kr/wisestone/owl/domain/CompanyField.java                      |   18 +
 src/main/resources/mybatis/query-template/companyField-template.xml          |   56 +++++
 src/main/webapp/scripts/app/companyField/companyFieldModify.controller.js    |   18 +
 src/main/webapp/scripts/app/companyField/companyFieldList.controller.js      |   16 +
 src/main/webapp/scripts/app/companyField/companyFieldAdd.controller.js       |   14 +
 src/main/java/kr/wisestone/owl/vo/CompanyFieldVo.java                        |   27 ++
 src/main/java/kr/wisestone/owl/constant/MsgConstants.java                    |    2 
 src/main/webapp/WEB-INF/i18n/messages_ko_KR.properties                       |    2 
 src/main/webapp/views/companyField/companyFieldModify.html                   |   51 ++++
 src/main/webapp/assets/styles/main.css                                       |    4 
 src/main/java/kr/wisestone/owl/web/condition/CompanyFieldCondition.java      |   16 +
 src/main/resources/migration/V1_9__alter_data.sql                            |    4 
 src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java     |  114 +++++++++-
 src/main/java/kr/wisestone/owl/web/form/CompanyFieldForm.java                |   18 +
 src/main/webapp/i18n/ko/global.json                                          |    5 
 src/main/webapp/WEB-INF/i18n/code_ko_KR.properties                           |    2 
 src/main/webapp/custom_components/js-table/tableColumnGenerator.directive.js |    6 
 src/main/webapp/views/companyField/companyFieldAdd.html                      |   47 ++++
 src/main/java/kr/wisestone/owl/service/impl/IssueHistoryServiceImpl.java     |    3 
 22 files changed, 538 insertions(+), 59 deletions(-)

diff --git a/src/main/java/kr/wisestone/owl/constant/MsgConstants.java b/src/main/java/kr/wisestone/owl/constant/MsgConstants.java
index a63f7bd..9e00613 100644
--- a/src/main/java/kr/wisestone/owl/constant/MsgConstants.java
+++ b/src/main/java/kr/wisestone/owl/constant/MsgConstants.java
@@ -288,6 +288,8 @@
     public static final String CODE_NOT_INVALID = "CODE_NOT_INVALID";   // 肄붾뱶紐낆뿉�뒗 �듅�닔臾몄옄瑜� �엯�젰 �븷 �닔 �뾾�뒿�땲�떎.
     public static final String TEL_NOT_INVALID = "TEL_NOT_INVALID";   // �뿰�씫泥섏뿉�뒗 �닽�옄留� �삉�뒗 �닽�옄 + �븯�씠�뵂('-')留� �엯�젰 �븷 �닔 �엳�뒿�땲�떎.
     public static final String EMAIL_NOT_INVALID = "EMAIL_NOT_INVALID";   //  �씠硫붿씪 �삎�떇�씠 留욎� �븡�뒿�땲�떎.
+    public static final String IP_NOT_INVALID = "IP_NOT_INVALID";   //  IP二쇱냼 �삎�떇�씠 留욎� �븡�뒿�땲�떎.
+    public static final String IP_START_NOT_LARGER_THAN_END = "IP_START_NOT_LARGER_THAN_END";   //  �떆�옉 IP媛� �걹 IP 蹂대떎 �겢 �닔 �뾾�뒿�땲�떎.
 
     public static final String PROJECT_NOT_INCLUDE_DEPARTMENT = "PROJECT_NOT_INCLUDE_DEPARTMENT";   // �꽑�깮�븳 遺��꽌 以� �봽濡쒖젥�듃�뿉 李몄뿬�븯怨� �엳吏� �븡�� 遺��꽌媛� �엳�뒿�땲�떎.
     public static final String PROJECT_DEPARTMENT_NOT_EQUAL_WORKFLOW = "PROJECT_DEPARTMENT_NOT_EQUAL_WORKFLOW"; // �빐�떦 �봽濡쒖젥�듃�뿉 �냽�빐�엳�뒗 �썙�겕�뵆濡쒖슦�쓽 �떞�떦遺��꽌�뒗 �봽濡쒖젥�듃�쓽 �떞�떦遺��꽌�뿉�꽌 �젣�쇅�떆�궗 �닔 �뾾�뒿�땲�떎.
diff --git a/src/main/java/kr/wisestone/owl/domain/CompanyField.java b/src/main/java/kr/wisestone/owl/domain/CompanyField.java
index db28cbc..9d2ee72 100644
--- a/src/main/java/kr/wisestone/owl/domain/CompanyField.java
+++ b/src/main/java/kr/wisestone/owl/domain/CompanyField.java
@@ -14,6 +14,8 @@
     private String manager;
     private String tel;
     private String url;
+    private String ipStart;
+    private String ipEnd;
     private String email;
     private String memo;
     private Long ispId;
@@ -84,6 +86,22 @@
         this.url = url;
     }
 
+    public String getIpStart() {
+        return ipStart;
+    }
+
+    public void setIpStart(String ipStart) {
+        this.ipStart = ipStart;
+    }
+
+    public String getIpEnd() {
+        return ipEnd;
+    }
+
+    public void setIpEnd(String ipEnd) {
+        this.ipEnd = ipEnd;
+    }
+
     public Long getIspId() {
         return ispId;
     }
diff --git a/src/main/java/kr/wisestone/owl/mapper/CompanyFieldMapper.java b/src/main/java/kr/wisestone/owl/mapper/CompanyFieldMapper.java
index 1cb87aa..4632105 100644
--- a/src/main/java/kr/wisestone/owl/mapper/CompanyFieldMapper.java
+++ b/src/main/java/kr/wisestone/owl/mapper/CompanyFieldMapper.java
@@ -1,5 +1,6 @@
 package kr.wisestone.owl.mapper;
 
+import kr.wisestone.owl.domain.CompanyField;
 import kr.wisestone.owl.web.condition.CompanyFieldCondition;
 import org.springframework.stereotype.Repository;
 
@@ -18,4 +19,9 @@
     List<Map<String, Object>> findEvent();
 
     Long findByCompany(Long id);
+
+    List<CompanyField> findByUrls(CompanyFieldCondition companyFieldCondition);
+
+    List<CompanyField> findByUrlsAndIdNot(CompanyFieldCondition companyFieldCondition);
+
 }
diff --git a/src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java
index 6f5da98..9b50065 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java
@@ -84,6 +84,11 @@
         //  �뾽泥대챸 以묐났 泥댄겕
         this.verifyTitle(companyFieldForm.getName(), null);
 
+        if (companyFieldForm.getIpStart() != null && companyFieldForm.getIpEnd() != null) {
+            //  �븘�씠�뵾 �쑀�슚�꽦 泥댄겕
+            this.verifyIp(companyFieldForm.getIpStart(), companyFieldForm.getIpEnd());
+        }
+
         if (companyFieldForm.getUrl() != null) {
             //  url �쑀�슚�꽦 泥댄겕
             this.verifyUrl(companyFieldForm.getUrl(), null);
@@ -110,6 +115,29 @@
         return companyField;
     }
 
+    /**
+     * IP �쑀�슚�꽦 泥댄겕
+     * @param ip String
+     */
+    private void verifyIp(String ip, String ip2) {
+        if (ip2 == null) {
+            if (!StringUtils.isEmpty(ip)) {
+                if (!Pattern.matches("^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\" +
+                        ".(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$", ip)) {
+                    throw new OwlRuntimeException(this.messageAccessor.getMessage(MsgConstants.IP_NOT_INVALID));
+                }
+            }
+        } else {
+            if (!StringUtils.isEmpty(ip)) {
+                long ipStart = ConvertUtil.ipToLong(ip);
+                long ipEnd = ConvertUtil.ipToLong(ip2);
+                if (ipEnd < ipStart) {
+                    throw new OwlRuntimeException(this.messageAccessor.getMessage(MsgConstants.IP_START_NOT_LARGER_THAN_END));
+                }
+            }
+        }
+    }
+
     //  url �쑀�슚�꽦 泥댄겕
     private void verifyUrl(String url, Long id) {
         /*if (StringUtils.isEmpty(url)) {
@@ -117,14 +145,33 @@
                     this.messageAccessor.getMessage(MsgConstants.COMPANY_NOT_URL));
         }*/
         if (!StringUtils.isEmpty(url)) {
-            CompanyField companyField;
-            if(id == null){
-                companyField = this.companyFieldRepository.findByUrl(url);
+            List<CompanyField> companyFieldList = Lists.newArrayList();
+            CompanyFieldCondition condition = new CompanyFieldCondition();
+            String[] urlArr = null;
+            List<String> urls = Lists.newArrayList();
+
+            if (url.contains(" ")) {
+                url = url.replace(" ","");
+            }
+            if (url.contains(",")) {
+                urlArr = url.split(",");
+                urls.addAll(Arrays.asList(urlArr));
             } else {
-                companyField = this.companyFieldRepository.findByUrlAndIdNot(url,id);
+                urls.add(url);
             }
 
-            if (companyField != null) {
+            if (urls.size() > 0) {
+                condition.setUrl(urls);
+
+                if(id == null){
+                    companyFieldList = this.companyFieldMapper.findByUrls(condition);
+                } else {
+                    condition.setId(id);
+                    companyFieldList = this.companyFieldMapper.findByUrlsAndIdNot(condition);
+                }
+            }
+
+            if (companyFieldList != null && companyFieldList.size() > 0) {
                 throw new OwlRuntimeException(
                         this.messageAccessor.getMessage(MsgConstants.COMPANY_USED_URL));
             }
@@ -286,6 +333,8 @@
         excelInfo.setFileName(this.messageAccessor.message("common.registerExcelCompanyField")); // �뿊��濡� �뾽泥� �벑濡앺븯湲�
         excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("companyField.companyName"), 20, ExportExcelAttrVo.ALIGN_CENTER)); // �뾽泥대챸
         excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("companyField.companyUrl"), 10, ExportExcelAttrVo.ALIGN_CENTER)); // url
+        excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("companyField.companyIpStart"), 10, ExportExcelAttrVo.ALIGN_CENTER)); // ip �떆�옉 二쇱냼
+        excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("companyField.companyIpEnd"), 10, ExportExcelAttrVo.ALIGN_CENTER)); // ip 醫낅즺 二쇱냼
         excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("isp.ispName"), 20, ExportExcelAttrVo.ALIGN_CENTER)); // isp紐�
         excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("Hosting.HostingName"), 20, ExportExcelAttrVo.ALIGN_CENTER)); // �샇�뒪�똿紐�
         excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("companyField.companyTel"), 10, ExportExcelAttrVo.ALIGN_CENTER)); // �뿰�씫泥�
@@ -422,6 +471,8 @@
                 if (rowIndex > 1) {
                     //  �뾽泥대줈 �벑濡앺븯湲� �쐞�빐 CompanyFieldForm �뿉 �뜲�씠�꽣瑜� �뀑�똿�븳�떎.
                     CompanyFieldForm newCompanyFieldForm = this.setCompanyFieldFormToExcelField(row, (rowIndex + 1), ispFieldMaps, hostingFieldMaps, companyTypeMaps, parentSectorMaps, childSectorMaps, regionMaps, statusMaps, headers);
+                    //  ip �쑀�슚�꽦 泥댄겕
+                    this.verifyIp(newCompanyFieldForm.getIpStart(), newCompanyFieldForm.getIpEnd());
 
                     companyFieldForms.add(newCompanyFieldForm);
                 }
@@ -526,63 +577,95 @@
                     break;
 
                 case 2:
+                    //  ip�떆�옉二쇱냼
+                    this.setCompanyFormIpStart(cellStr, companyFieldForm, isNull);
+                    break;
+
+                case 3:
+                    //  ip醫낅즺二쇱냼
+                    this.setCompanyFormIpEnd(cellStr, companyFieldForm, isNull);
+                    break;
+
+                case 4:
                     // isp紐�
                     this.setCompanyFormIspName(cellStr, ispFieldMaps, companyFieldForm, rowIndex, isNull);
                     break;
 
-                case 3:
+                case 5:
                     // �샇�뒪�똿紐�
                     this.setCompanyFormHostingName(cellStr, hostingFieldMaps, companyFieldForm, rowIndex, isNull);
                     break;
 
-                case 4:
+                case 6:
                     // �뿰�씫泥�
                     telTypeCheck(cell, rowIndex);
                     this.setCompanyFormTel(cellStr, companyFieldForm, isNull);
                     break;
 
-                case 5:
+                case 7:
                     // �씠硫붿씪
                     this.setCompanyFormEmail(cellStr, companyFieldForm, isNull);
                     break;
 
-                case 6:
+                case 8:
                     // �떞�떦�옄
                     this.setCompanyFormManager(cellStr, companyFieldForm, isNull);
                     break;
 
-                case 7:
+                case 9:
                     // 湲곗뾽援щ텇
                     this.setCompanyFormCompanyType(cellStr, companyTypeMaps, companyFieldForm, rowIndex, isNull);
                     break;
 
-                case 8:
+                case 10:
                     // �뾽醫�(��遺꾨쪟)
                     this.setCompanyFormParentSector(cellStr, parentSectorMaps, companyFieldForm, rowIndex, isNull);
                     break;
 
-                case 9:
+                case 11:
                     // �뾽醫�(以묐텇瑜�)
                     this.setCompanyFormChildSector(cellStr, childSectorMaps, companyFieldForm, rowIndex, isNull);
                     break;
 
-                case 10:
+                case 12:
                     // 吏��뿭
                     this.setCompanyFormRegion(cellStr, regionMaps, companyFieldForm, rowIndex, isNull);
                     break;
 
-                case 11:
+                case 13:
                     // �긽�깭
                     this.setCompanyFormStatus(cellStr, statusMaps, companyFieldForm, isNull);
                     break;
 
-                case 12:
+                case 14:
                     // 鍮꾧퀬
                     this.setCompanyFormMemo(cellStr, companyFieldForm, isNull);
             }
         }
 
         return companyFieldForm;
+    }
+
+    private void setCompanyFormIpEnd(String ipEnd, CompanyFieldForm companyFieldForm, boolean isNull) {
+        if (!isNull) {
+            if (ipEnd.contains(" ")) {
+                ipEnd = ipEnd.replace(" ", "");
+            }
+            this.verifyIp(ipEnd, null); //ip �쑀�슚�꽦 寃��궗
+
+            companyFieldForm.setIpEnd(ipEnd);
+        }
+    }
+
+    private void setCompanyFormIpStart(String ipStart, CompanyFieldForm companyFieldForm, boolean isNull) {
+        if (!isNull) {
+            if (ipStart.contains(" ")) {
+                ipStart = ipStart.replace(" ", "");
+            }
+            this.verifyIp(ipStart, null); //ip �쑀�슚�꽦 寃��궗
+
+            companyFieldForm.setIpStart(ipStart);
+        }
     }
 
     private void setCompanyFormMemo(String cellStr, CompanyFieldForm companyFieldForm, boolean isNull) {
@@ -823,6 +906,7 @@
         excelInfo.addAttrInfos(new ExportExcelAttrVo("tel", this.messageAccessor.message("companyField.companyTel"), 10, ExportExcelAttrVo.ALIGN_CENTER));
         excelInfo.addAttrInfos(new ExportExcelAttrVo("email", this.messageAccessor.message("companyField.companyEmail"), 10, ExportExcelAttrVo.ALIGN_CENTER));
         excelInfo.addAttrInfos(new ExportExcelAttrVo("url", this.messageAccessor.message("companyField.companyUrl"), 10, ExportExcelAttrVo.ALIGN_CENTER));
+        excelInfo.addAttrInfos(new ExportExcelAttrVo("ipRange", this.messageAccessor.message("companyField.companyIp"), 10, ExportExcelAttrVo.ALIGN_CENTER));
         excelInfo.addAttrInfos(new ExportExcelAttrVo("companyTypeName", this.messageAccessor.message("companyField.companyTypeName"), 10, ExportExcelAttrVo.ALIGN_CENTER));
         excelInfo.addAttrInfos(new ExportExcelAttrVo("parentSectorName", this.messageAccessor.message("companyField.parentSectorName"), 10, ExportExcelAttrVo.ALIGN_CENTER));
         excelInfo.addAttrInfos(new ExportExcelAttrVo("childSectorName", this.messageAccessor.message("companyField.childSectorName"), 10, ExportExcelAttrVo.ALIGN_CENTER));
diff --git a/src/main/java/kr/wisestone/owl/service/impl/IssueHistoryServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/IssueHistoryServiceImpl.java
index 08c1f04..24a2655 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/IssueHistoryServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/IssueHistoryServiceImpl.java
@@ -556,6 +556,7 @@
 
     // �뾽泥� �젙蹂� 蹂�寃� �젙蹂대�� 湲곕줉�븳�떎.
     @Override
+    @Transactional
     public void detectIssueCompany(IssueHistoryType type, Map<String, Object> param, CompanyFieldForm companyFieldForm, IssueCompany issueCompany, StringBuilder description) {
         Long companyFieldId = 0L;
         Long id = 0L;
@@ -614,7 +615,7 @@
             companyFieldId = issueCompany.getCompanyField().getId();
         }
 
-        if (type == IssueHistoryType.ADD) { //異붽� �븷 寃쎌슦
+        if (type == IssueHistoryType.ADD && issueCompany.getCompanyField() != null) { //異붽� �븷 寃쎌슦
             description.append("<span translate=\"issue.issueCompanyAddHistory\">�뾽泥� �젙蹂닿� 異붽��릺�뿀�뒿�땲�떎. </span>");
             description.append("<span class=\"text-primary bold\">&nbsp;>&nbsp;" + issueCompany.getCompanyField().getName() + "</span>");
         } else if (type == IssueHistoryType.MODIFY) { //�닔�젙 �븷 寃쎌슦
diff --git a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
index e5c057b..058e7b7 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -310,7 +310,7 @@
                 }
 
                 // 以묐났�맂 �긽�쐞 �씠�뒋寃��깋
-                List<Issue> issues = this.findIssue(issueApiForm, customFieldApiOverlaps, user.getId());
+                List<Issue> issues = this.findIssue(issueApiForm, issueForm, customFieldApiOverlaps, user.getId());
                 int size = issues.size();
                 if (size > 0) {
                     Issue targetIssue = issues.get(0);
@@ -327,7 +327,6 @@
             // �궗�슜�옄 �젙�쓽 �븘�뱶 �꽕�젙
             issueForm.setIssueCustomFields(issueApiForm.getCustomFieldValues());
             //  媛숈� �룄硫붿씤 �뾽泥� 李얘린
-            this.findCompanyField(issueForm);
 
             // api �엯�젰媛� �쟻�슜
             ConvertUtil.copyProperties(issueApiForm, issueForm);
@@ -339,10 +338,15 @@
         }
     }
 
+    /**
+     * �룄硫붿씤�씠 �룞�씪�븳 �뾽泥� 李얘린
+     * @param issueForm IssueForm
+     * @return IssueForm
+     */
     private IssueForm findCompanyField(IssueForm issueForm) {
         if(issueForm.getIssueCustomFields() != null && issueForm.getIssueCustomFields().size() > 0) {
             CompanyFieldCondition condition = new CompanyFieldCondition();
-            List<Map<String, Object>> companyFields = this.companyFieldService.find(condition);
+            List<Map<String, Object>> companyFields = Lists.newArrayList();
             List<Map<String, Object>> issueCompanyFields = Lists.newArrayList();
             List<Map<String, Object>> issueIspFields = Lists.newArrayList();
             List<Map<String, Object>> issueHostingFields = Lists.newArrayList();
@@ -350,27 +354,36 @@
             for (Map<String, Object> issueCustomField : issueForm.getIssueCustomFields()) {
                 Long customFieldId = MapUtil.getLong(issueCustomField, "customFieldId");
                 CustomField customField = this.customFieldService.getCustomField(customFieldId);
-                if(customField != null && customField.getCustomFieldType().toString().equals("SITE") && customField.getName().equals("�룄硫붿씤")) {
+                if(customField != null && customField.getCustomFieldType().equals(SITE) && customField.getName().equals("�룄硫붿씤")) {
                     String useValue = issueCustomField.get("useValue").toString();
+                    String[] urlArr = null;
+                    List<String> urls = Lists.newArrayList();
+                    if (useValue.contains(",")) {
+                        urlArr = useValue.split(",");
+                        urls.addAll(Arrays.asList(urlArr));
+                    } else {
+                        urls.add(useValue);
+                    }
+                    condition.setUrl(urls);
+                    companyFields = this.companyFieldService.find(condition);
+
                     if(companyFields != null && companyFields.size() > 0) {
                         for (Map<String, Object> companyField : companyFields) {
                             CompanyFieldVo companyFieldVo = ConvertUtil.convertMapToClass(companyField, CompanyFieldVo.class);
-                            if(companyFieldVo.getUrl() != null && useValue.equals(companyFieldVo.getUrl())) {
-                                companyField.put("companyId", companyField.get("id"));
-                                issueCompanyFields.add(companyField);
-                                if(companyFieldVo.getIspId() != null && companyFieldVo.getIspId() != -1) {
-                                    Map<String, Object> ispField = this.ispFieldService.find(companyFieldVo.getIspId());
-                                    if (ispField != null) {
-                                        ispField.put("ispId", ispField.get("id"));
-                                        issueIspFields.add(ispField);
-                                    }
+                            companyField.put("companyId", companyField.get("id"));
+                            issueCompanyFields.add(companyField);
+                            if(companyFieldVo.getIspId() != null && companyFieldVo.getIspId() != -1) {
+                                Map<String, Object> ispField = this.ispFieldService.find(companyFieldVo.getIspId());
+                                if (ispField != null) {
+                                    ispField.put("ispId", ispField.get("id"));
+                                    issueIspFields.add(ispField);
                                 }
-                                if(companyFieldVo.getHostingId() != null && companyFieldVo.getHostingId() != -1) {
-                                    Map<String, Object> hostingField = this.hostingFieldService.find(companyFieldVo.getHostingId());
-                                    if (hostingField != null) {
-                                        hostingField.put("hostingId", hostingField.get("id"));
-                                        issueHostingFields.add(hostingField);
-                                    }
+                            }
+                            if(companyFieldVo.getHostingId() != null && companyFieldVo.getHostingId() != -1) {
+                                Map<String, Object> hostingField = this.hostingFieldService.find(companyFieldVo.getHostingId());
+                                if (hostingField != null) {
+                                    hostingField.put("hostingId", hostingField.get("id"));
+                                    issueHostingFields.add(hostingField);
                                 }
                             }
                         }
@@ -383,6 +396,41 @@
         }
 
         return issueForm;
+    }
+
+    /**
+     * 議곌굔�뿉 留욌뒗 �뙆�듃�꼫 �젙蹂� 李얘린
+     * @param condition CompanyFieldCondition
+     * @param issueCompanyFields List<Map<String, Object>>
+     * @param issueIspFields List<Map<String, Object>>
+     * @param issueHostingFields List<Map<String, Object>>
+     */
+    private void findPartner(CompanyFieldCondition condition, List<Map<String, Object>> issueCompanyFields
+            , List<Map<String, Object>> issueIspFields, List<Map<String, Object>> issueHostingFields) {
+
+        List<Map<String, Object>> companyFields = this.companyFieldService.find(condition);
+
+        if(companyFields != null && companyFields.size() > 0) {
+            for (Map<String, Object> companyField : companyFields) {
+                CompanyFieldVo companyFieldVo = ConvertUtil.convertMapToClass(companyField, CompanyFieldVo.class);
+                companyField.put("companyId", companyField.get("id"));
+                issueCompanyFields.add(companyField);
+                if(companyFieldVo.getIspId() != null && companyFieldVo.getIspId() != -1) {
+                    Map<String, Object> ispField = this.ispFieldService.find(companyFieldVo.getIspId());
+                    if (ispField != null) {
+                        ispField.put("ispId", ispField.get("id"));
+                        issueIspFields.add(ispField);
+                    }
+                }
+                if(companyFieldVo.getHostingId() != null && companyFieldVo.getHostingId() != -1) {
+                    Map<String, Object> hostingField = this.hostingFieldService.find(companyFieldVo.getHostingId());
+                    if (hostingField != null) {
+                        hostingField.put("hostingId", hostingField.get("id"));
+                        issueHostingFields.add(hostingField);
+                    }
+                }
+            }
+        }
     }
 
     private User convertToUser(String token) {
@@ -436,7 +484,7 @@
     }
 
     // 以묐났�맂 �긽�쐞 �씠�뒋 寃��깋
-    private List<Issue> findIssue(IssueApiForm issueApiform, List<CustomFieldApiOverlap> customFieldApiOverlaps, Long userId) {
+    private List<Issue> findIssue(IssueApiForm issueApiform, IssueForm issueForm, List<CustomFieldApiOverlap> customFieldApiOverlaps, Long userId) {
         List<IssueCustomFieldValueForm> issueCustomFieldValueForms = issueApiform.getIssueCustomFieldValues();
         List<Issue> resultIssueVos = Lists.newArrayList();
         String comma = ",";
@@ -444,15 +492,52 @@
         if (issueCustomFieldValueForms.size() > 0) {
             String concatUseValue = "";
             int useIdx = 0;
+            int cntIp = 0;
+            int cntSite = 0;
 
             IssueCustomFieldValueFormComparator comp = new IssueCustomFieldValueFormComparator();
             Collections.sort(issueCustomFieldValueForms, comp);
 
             List<String> userValues = Lists.newArrayList();
+            CompanyFieldCondition condition = new CompanyFieldCondition();
+            List<Map<String, Object>> issueCompanyFields = Lists.newArrayList();
+            List<Map<String, Object>> issueIspFields = Lists.newArrayList();
+            List<Map<String, Object>> issueHostingFields = Lists.newArrayList();
+
             for (IssueCustomFieldValueForm issueCustomFieldValueForm : issueCustomFieldValueForms) {
                 userValues.add(issueCustomFieldValueForm.getUseValue());
+
                 for(CustomFieldApiOverlap customFieldApiOverlap : customFieldApiOverlaps) {
                     if (customFieldApiOverlap.getCustomField().getId().equals(issueCustomFieldValueForm.getCustomFieldId())) {
+
+                        String useValue = issueCustomFieldValueForm.getUseValue();
+                        if (useValue.contains(" ")) {
+                            useValue = useValue.replace(" ","");
+                        }
+
+                        if (customFieldApiOverlap.getCustomField().getCustomFieldType().equals(IP_ADDRESS)) {
+                            long ip = ConvertUtil.ipToLong(useValue);
+                            if (cntIp == 0){
+                                condition.setIp(ip);
+                            }
+                            cntIp ++;
+                        }
+
+                        if(customFieldApiOverlap.getCustomField().getCustomFieldType().equals(SITE)) {
+                            String[] urlArr = null;
+                            List<String> urls = Lists.newArrayList();
+                            if (useValue.contains(",")) {
+                                urlArr = useValue.split(",");
+                                urls.addAll(Arrays.asList(urlArr));
+                            } else {
+                                urls.add(useValue);
+                            }
+                            if (cntSite == 0) {
+                                condition.setUrl(urls);
+                            }
+                            cntSite ++;
+                        }
+
                         if (useIdx > 0) {
                             concatUseValue = concatUseValue.concat(comma);
                         }
@@ -461,6 +546,13 @@
                     }
                 }
             }
+
+            // 異붽� �븷 url or ip�뿉 �룷�븿�릺�뼱�엳�뒗 �뙆�듃�꼫 李얘린
+            this.findPartner(condition, issueCompanyFields, issueIspFields, issueHostingFields);
+
+            issueForm.setIssueCompanyFields(issueCompanyFields);
+            issueForm.setIssueIspFields(issueIspFields);
+            issueForm.setIssueHostingFields(issueHostingFields);
 
             IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition();
             issueCustomFieldValueCondition.setUseValue(concatUseValue);
@@ -534,6 +626,16 @@
         issue = this.issueRepository.saveAndFlush(issue);
 
         issue.setReverseIndex(issue.getId() * -1);  //  荑쇰━ �냽�룄 媛쒖꽑�쓣 �쐞�빐 由щ쾭�뒪 �씤�뜳�뒪 �깮�꽦
+
+        if (issueForm.getParentIssueId() != null){
+            Issue parentIssue = this.getIssue(issueForm.getParentIssueId());
+            if (issueForm.getIsApi().equals(Issue.IS_API_YES)
+                    || (issueForm.getInheritYn() != null && issueForm.getInheritYn())) {
+                //  �븯�쐞�씠�뒋�뿉 �긽�쐞�씠�뒋�쓽 �뙆�듃�꼫 �젙蹂� �쟻�슜
+                this.inheritPartners(issue, parentIssue);
+            }
+        }
+
         //  �떞�떦�옄 吏��젙
         //this.issueUserService.modifyIssueUser(issue, project.getWorkspace(), issueForm.getUserIds());
         //  �떞�떦遺��꽌 吏��젙
@@ -544,15 +646,6 @@
         this.issueIspService.modifyIssueIspField(issue, issueForm, detectIssueChange);
         //  HOSTING �젙蹂� ���옣
         this.issueHostingService.modifyIssueHostingField(issue, issueForm, detectIssueChange);
-
-        if (issueForm.getParentIssueId() != null){
-            Issue parentIssue = this.getIssue(issueForm.getParentIssueId());
-            if (issueForm.getIsApi().equals(Issue.IS_API_YES)
-                    || (issueForm.getInheritYn() != null && issueForm.getInheritYn())) {
-                //  �븯�쐞�씠�뒋�뿉 �긽�쐞�씠�뒋�쓽 �뙆�듃�꼫 �젙蹂� �쟻�슜
-                this.inheritPartners(issue, parentIssue);
-            }
-        }
 
         //  泥⑤� �뙆�씪 ���옣
         //  multipartFile �쓣 file Map List 媛앹껜濡� 蹂�寃쏀븳�떎.
@@ -3208,7 +3301,7 @@
                 }
 
                 saveIssueForm.setId(issue.getId());
-                
+
                 //  �썙�겕�뵆濡쒖슦 ��湲� �긽�깭�쓽 遺��꽌 異붽�
                 List<Long> departmentsIds = this.workflowDepartmentService.findFirstDepartmentIds(workflow);
                 if (departmentsIds != null && departmentsIds.size() > 0) {
diff --git a/src/main/java/kr/wisestone/owl/util/ConvertUtil.java b/src/main/java/kr/wisestone/owl/util/ConvertUtil.java
index fadaa0f..4ad54b3 100644
--- a/src/main/java/kr/wisestone/owl/util/ConvertUtil.java
+++ b/src/main/java/kr/wisestone/owl/util/ConvertUtil.java
@@ -558,4 +558,19 @@
         return  list.toArray(new String[list.size()]);
     }
 
+    /**
+     * ip二쇱냼 long�쑝濡� 蹂��솚
+     * @param ipAddress String
+     * @return long
+     */
+    public static long ipToLong(String ipAddress) {
+        long result = 0;
+        String[] ipAddressArr = ipAddress.split("\\.");
+
+        for (int i=0; i<ipAddressArr.length; i++) {
+            result += Integer.parseInt(ipAddressArr[i]) * Math.pow(256, 3-i);
+        }
+        return result;
+    }
+
 }
diff --git a/src/main/java/kr/wisestone/owl/vo/CompanyFieldVo.java b/src/main/java/kr/wisestone/owl/vo/CompanyFieldVo.java
index ddc0c89..1bc01d6 100644
--- a/src/main/java/kr/wisestone/owl/vo/CompanyFieldVo.java
+++ b/src/main/java/kr/wisestone/owl/vo/CompanyFieldVo.java
@@ -10,6 +10,9 @@
     private String tel;
     private String email;
     private String url;
+    private String ipStart;
+    private String ipEnd;
+    private String ipRange;
     private String memo;
     private Long ispId;
     private Long hostingId;
@@ -80,6 +83,30 @@
         this.url = url;
     }
 
+    public String getIpStart() {
+        return ipStart;
+    }
+
+    public void setIpStart(String ipStart) {
+        this.ipStart = ipStart;
+    }
+
+    public String getIpEnd() {
+        return ipEnd;
+    }
+
+    public void setIpEnd(String ipEnd) {
+        this.ipEnd = ipEnd;
+    }
+
+    public String getIpRange() {
+        return ipRange;
+    }
+
+    public void setIpRange(String ipRange) {
+        this.ipRange = ipRange;
+    }
+
     public IspFieldVo getIspFieldVo() {
         return ispFieldVo;
     }
diff --git a/src/main/java/kr/wisestone/owl/web/condition/CompanyFieldCondition.java b/src/main/java/kr/wisestone/owl/web/condition/CompanyFieldCondition.java
index a87a5af..12c9984 100644
--- a/src/main/java/kr/wisestone/owl/web/condition/CompanyFieldCondition.java
+++ b/src/main/java/kr/wisestone/owl/web/condition/CompanyFieldCondition.java
@@ -2,6 +2,7 @@
 
 import kr.wisestone.owl.util.ConvertUtil;
 
+import java.util.List;
 import java.util.Map;
 
 public class CompanyFieldCondition {
@@ -10,7 +11,8 @@
     private String manager;
     private String tel;
     private String email;
-    private String url;
+    private List<String> url;
+    private long ip;
     private String memo;
     private Long ispId;
     private Long hostingId;
@@ -86,14 +88,22 @@
         PageSize = pageSize;
     }
 
-    public String getUrl() {
+    public List<String> getUrl() {
         return url;
     }
 
-    public void setUrl(String url) {
+    public void setUrl(List<String> url) {
         this.url = url;
     }
 
+    public long getIp() {
+        return ip;
+    }
+
+    public void setIp(long ip) {
+        this.ip = ip;
+    }
+
     public Long getIspId() {
         return ispId;
     }
diff --git a/src/main/java/kr/wisestone/owl/web/form/CompanyFieldForm.java b/src/main/java/kr/wisestone/owl/web/form/CompanyFieldForm.java
index 92f6634..dbd1d3f 100644
--- a/src/main/java/kr/wisestone/owl/web/form/CompanyFieldForm.java
+++ b/src/main/java/kr/wisestone/owl/web/form/CompanyFieldForm.java
@@ -11,6 +11,8 @@
 public class CompanyFieldForm extends UsePartnerForm {
     private String manager;
     private String url;
+    private String ipStart;
+    private String ipEnd;
     private String memo;
     private String tel;
     private Long ispId;
@@ -73,6 +75,22 @@
         this.url = url;
     }
 
+    public String getIpStart() {
+        return ipStart;
+    }
+
+    public void setIpStart(String ipStart) {
+        this.ipStart = ipStart;
+    }
+
+    public String getIpEnd() {
+        return ipEnd;
+    }
+
+    public void setIpEnd(String ipEnd) {
+        this.ipEnd = ipEnd;
+    }
+
     public String getMemo() {
         return memo;
     }
diff --git a/src/main/resources/migration/V1_9__alter_data.sql b/src/main/resources/migration/V1_9__alter_data.sql
new file mode 100644
index 0000000..818bc56
--- /dev/null
+++ b/src/main/resources/migration/V1_9__alter_data.sql
@@ -0,0 +1,4 @@
+
+/* �뾽泥� IP ���뿭�� 而щ읆 異붽� */
+ALTER TABLE `company_field` ADD COLUMN `ip_start` varchar(15) NULL;
+ALTER TABLE `company_field` ADD COLUMN `ip_end` varchar(15) NULL;
\ No newline at end of file
diff --git a/src/main/resources/mybatis/query-template/companyField-template.xml b/src/main/resources/mybatis/query-template/companyField-template.xml
index 61f27e8..4973732 100644
--- a/src/main/resources/mybatis/query-template/companyField-template.xml
+++ b/src/main/resources/mybatis/query-template/companyField-template.xml
@@ -11,6 +11,9 @@
         cf.tel as tel,
         cf.email as email,
         cf.url as url,
+        cf.ip_start as ipStart,
+        cf.ip_end as ipEnd,
+        concat(cf.ip_start, "~", cf.ip_end) AS ipRange,
         cf.memo as memo,
         cf.isp_id as ispId,
         cf.hosting_id as hostingId,
@@ -33,8 +36,16 @@
         <if test="id != '' and id != null">
             AND cf.id like CONCAT('%',#{id},'%')
         </if>
-        <if test="url != '' and id != url">
-            AND cf.url like CONCAT('%',#{url},'%')
+        <choose>
+            <when test="url != null and url.size != 0">
+                AND
+                <foreach collection="url" item="item" index="index" separator="or" open="(" close=")">
+                    cf.url LIKE CONCAT('%',#{item},'%')
+                </foreach>
+            </when>
+        </choose>
+        <if test="ip != '' and ip != null">
+            AND INET_ATON(cf.ip_start) <![CDATA[ <= ]]> #{ip} AND INET_ATON(cf.ip_end) >= #{ip}
         </if>
         ORDER BY cf.register_date DESC
         <if test="pageSize != '' and pageSize != null">
@@ -55,4 +66,45 @@
             AND cf.id like CONCAT('%',#{id},'%')
         </if>
     </select>
+
+    <select id="findByUrls" resultType="kr.wisestone.owl.domain.CompanyField" parameterType="kr.wisestone.owl.web.condition.CompanyFieldCondition">
+        SELECT
+        cf.id as id,
+        cf.name as name,
+        cf.email as email,
+        cf.url as url
+        FROM
+        company_field cf
+        WHERE 1=1
+        <choose>
+            <when test="url != null and url.size != 0">
+                AND
+                <foreach collection="url" item="item" index="index" separator="or" open="(" close=")">
+                    cf.url LIKE CONCAT('%',#{item},'%')
+                </foreach>
+            </when>
+        </choose>
+    </select>
+
+    <select id="findByUrlsAndIdNot" resultType="kr.wisestone.owl.domain.CompanyField" parameterType="kr.wisestone.owl.web.condition.CompanyFieldCondition">
+        SELECT
+        cf.id as id,
+        cf.name as name,
+        cf.email as email,
+        cf.url as url
+        FROM
+        company_field cf
+        WHERE 1=1
+        <choose>
+            <when test="url != null and url.size != 0">
+                AND
+                <foreach collection="url" item="item" index="index" separator="or" open="(" close=")">
+                    cf.url LIKE CONCAT('%',#{item},'%')
+                </foreach>
+            </when>
+        </choose>
+        <if test="id != '' and id != null">
+            AND cf.id not like CONCAT('%',#{id},'%')
+        </if>
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/i18n/code_ko_KR.properties b/src/main/webapp/WEB-INF/i18n/code_ko_KR.properties
index 666dc4c..29b596e 100644
--- a/src/main/webapp/WEB-INF/i18n/code_ko_KR.properties
+++ b/src/main/webapp/WEB-INF/i18n/code_ko_KR.properties
@@ -147,6 +147,8 @@
 companyField.companyTel=\uC804\uD654\uBC88\uD638
 companyField.companyEmail=\uC774\uBA54\uC77C
 companyField.companyUrl=url
+companyField.companyIpStart=ip \uC2DC\uC791\uC8FC\uC18C
+companyField.companyIpEnd=ip \uC885\uB8CC\uC8FC\uC18C
 companyField.companyTypeName=\uAE30\uC5C5\uAD6C\uBD84
 companyField.parentSectorName=\uC5C5\uC885(\uB300\uBD84\uB958)
 companyField.childSectorName=\uC5C5\uC885(\uC911\uBD84\uB958)
diff --git a/src/main/webapp/WEB-INF/i18n/messages_ko_KR.properties b/src/main/webapp/WEB-INF/i18n/messages_ko_KR.properties
index 58f3b6f..c55a9da 100644
--- a/src/main/webapp/WEB-INF/i18n/messages_ko_KR.properties
+++ b/src/main/webapp/WEB-INF/i18n/messages_ko_KR.properties
@@ -270,3 +270,5 @@
 CODE_NOT_INVALID=\uCF54\uB4DC\uBA85\uC5D0\uB294 \uD2B9\uC218\uBB38\uC790\uB97C \uC785\uB825 \uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
 TEL_NOT_INVALID=\uC5F0\uB77D\uCC98\uC5D0\uB294 \uC22B\uC790\uB9CC \uB610\uB294 \uC22B\uC790 + \uD558\uC774\uD508('-')\uB9CC \uC785\uB825 \uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.
 EMAIL_NOT_INVALID=\uC774\uBA54\uC77C \uD615\uC2DD\uC774 \uB9DE\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
+IP_NOT_INVALID=IP\uC8FC\uC18C \uD615\uC2DD\uC774 \uB9DE\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
+IP_START_NOT_LARGER_THAN_END=\uC2DC\uC791 IP\uAC00 \uB05D IP \uBCF4\uB2E4 \uD074 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
diff --git a/src/main/webapp/assets/styles/main.css b/src/main/webapp/assets/styles/main.css
index 733c972..6c82a30 100644
--- a/src/main/webapp/assets/styles/main.css
+++ b/src/main/webapp/assets/styles/main.css
@@ -7617,6 +7617,10 @@
     height: 100% !important;
 }
 
+.mw-49 {
+    max-width: 49% !important;
+}
+
 .mw-100 {
     max-width: 100% !important;
 }
diff --git a/src/main/webapp/custom_components/js-table/tableColumnGenerator.directive.js b/src/main/webapp/custom_components/js-table/tableColumnGenerator.directive.js
index 62cee08..e33066e 100644
--- a/src/main/webapp/custom_components/js-table/tableColumnGenerator.directive.js
+++ b/src/main/webapp/custom_components/js-table/tableColumnGenerator.directive.js
@@ -691,6 +691,12 @@
                                             }
                                             break;
 
+                                        case "COMPANYFIELD_IP" :
+                                            if ($rootScope.isDefined(scope.data.ipStart) && $rootScope.isDefined(scope.data.ipEnd)) {
+                                                makeTag += "<span>" + scope.data.ipStart + "<br>~<br>" + scope.data.ipEnd + "</span>";
+                                            }
+                                            break;
+
                                         case "ISPFIELD_MODIFY" :
                                             if ($rootScope.checkMngPermission('USER_PERMISSION_MNG_CUSTOME_FIELD')) {
                                                 makeTag += "<span class='titlename cursor table-word-break-all' ng-click='event.modify(data.id)'>" + scope.data.name.replace(/</gi, '&lt;') + "</span>";
diff --git a/src/main/webapp/i18n/ko/global.json b/src/main/webapp/i18n/ko/global.json
index 30db5a6..045c675 100644
--- a/src/main/webapp/i18n/ko/global.json
+++ b/src/main/webapp/i18n/ko/global.json
@@ -996,7 +996,7 @@
         "industry" : "�궛�뾽 遺꾨쪟",
         "domain" : "�룄硫붿씤",
         "url"   : "url",
-        "ipAdress" : "ip二쇱냼",
+        "ipRange" : "ip ���뿭��",
         "tel" : "�뿰�씫泥�",
         "code" : "肄붾뱶",
         "email" : "�씠硫붿씪",
@@ -1019,7 +1019,8 @@
         "writeTel": "�쟾�솕踰덊샇瑜� �엯�젰�븯�뀛�빞 異붽��븷�닔 �엳�뒿�땲�떎.",
         "registerExcelCompanyFields": "�뿊��濡� �뾽泥� �벑濡앺븯湲�",
         "registerExcelUploadCompanyField": "�뿊�� �뾽濡쒕뱶 �뾽泥� �벑濡�",
-        "succeededCompanyFieldRegistration": "�뾽泥� �벑濡� �꽦怨�"
+        "succeededCompanyFieldRegistration": "�뾽泥� �벑濡� �꽦怨�",
+        "multiUrlWithComma": "�뿬�윭媛쒖쓽 url�쓣 �엯�젰 �븷 �닔 �엳�뒿�땲�떎. (援щ텇: 肄ㅻ쭏 ',') ex: www.test.com, www.test2.com"
     },
     "ispField" : {
         "info": "ISP�젙蹂�",
diff --git a/src/main/webapp/scripts/app/companyField/companyFieldAdd.controller.js b/src/main/webapp/scripts/app/companyField/companyFieldAdd.controller.js
index 6c70239..e2a2c5c 100644
--- a/src/main/webapp/scripts/app/companyField/companyFieldAdd.controller.js
+++ b/src/main/webapp/scripts/app/companyField/companyFieldAdd.controller.js
@@ -38,6 +38,8 @@
                         tel : "",  //�쟾�솕踰덊샇
                         email : "",  //�씠硫붿씪
                         url : "", // url
+                        ipStart : "", //ip�떆�옉二쇱냼
+                        ipEnd : "", //ip醫낅즺二쇱냼
                         memo : "",  //鍮꾧퀬
                         companyTypeId : "",
                         companyType : "", //湲곗뾽援щ텇
@@ -249,7 +251,17 @@
                             }
                             return emailList;
                         })(),
-                        url : $scope.vm.form.url, // url
+                        url : (function () {
+                            //  紐⑤뱺 怨듬갚 �젣嫄�
+                            var regex = / /gi;
+                            let url = $scope.vm.form.url;
+                            if ($rootScope.isDefined(url) && url.indexOf(" ") !== -1) {
+                                url = url.replace(regex, "");
+                            }
+                            return url;
+                        })(),
+                        ipStart : $scope.vm.form.ipStart, // ip�떆�옉二쇱냼
+                        ipEnd : $scope.vm.form.ipEnd, // ip醫낅즺二쇱냼
                         memo : $scope.vm.form.memo,  //鍮꾧퀬
                         companyTypeId : (function () {
                             var companyTypeId = null;
diff --git a/src/main/webapp/scripts/app/companyField/companyFieldList.controller.js b/src/main/webapp/scripts/app/companyField/companyFieldList.controller.js
index 69207f3..f3534dd 100644
--- a/src/main/webapp/scripts/app/companyField/companyFieldList.controller.js
+++ b/src/main/webapp/scripts/app/companyField/companyFieldList.controller.js
@@ -105,9 +105,16 @@
                         .setDAlign("text-center"));
                     $scope.vm.tableConfigs.push($tableProvider.config()
                         .setHName("companyField.url")
-                        .setHWidth("bold")
+                        .setHWidth("width-200-p bold")
                         .setDName("url")
                         .setDAlign("text-center"));
+                    $scope.vm.tableConfigs.push($tableProvider.config()
+                        .setHName("companyField.ipRange")
+                        .setHWidth("width-120-p bold")
+                        .setDName("ipRange")
+                        .setDType("renderer")
+                        .setDAlign("text-center")
+                        .setDRenderer("COMPANYFIELD_IP"));
                     $scope.vm.tableConfigs.push($tableProvider.config()
                         .setHName("common.isp")
                         .setHWidth("bold")
@@ -203,6 +210,13 @@
                                         data.email = data.email.replace(/\,/g,"</br>");
                                     }
                                 }
+                                // url 議고쉶�떆 肄ㅻ쭏 湲곗��쑝濡� 以꾨컮轅�
+                                if ($rootScope.isDefined(data.url)) {
+                                    data.url = data.url.trim();
+                                    if (data.url.indexOf(",") !== -1) {
+                                        data.url = data.url.replace(/\,/g,"</br>");
+                                    }
+                                }
                             });
 
                             $scope.vm.responseData = result.data;
diff --git a/src/main/webapp/scripts/app/companyField/companyFieldModify.controller.js b/src/main/webapp/scripts/app/companyField/companyFieldModify.controller.js
index 549adff..de4a45f 100644
--- a/src/main/webapp/scripts/app/companyField/companyFieldModify.controller.js
+++ b/src/main/webapp/scripts/app/companyField/companyFieldModify.controller.js
@@ -41,6 +41,8 @@
                         tel : "",  //�쟾�솕踰덊샇
                         email : "",  //�씠硫붿씪
                         url : "", // url
+                        ipStart : "", //ip�떆�옉二쇱냼
+                        ipEnd : "", //ip醫낅즺二쇱냼
                         memo : "",  //硫붾え(鍮꾧퀬)
                         companyTypeId : "",
                         companyType : "", //湲곗뾽援щ텇
@@ -259,8 +261,18 @@
                             }
                             return emailList;
                         })(),
-                        url : $rootScope.preventXss($scope.vm.form.url), // url
-                        memo : $rootScope.preventXss($scope.vm.form.memo),
+                        url : (function () {
+                            //  紐⑤뱺 怨듬갚 �젣嫄�
+                            var regex = / /gi;
+                            let url = $scope.vm.form.url;
+                            if ($rootScope.isDefined(url) && url.indexOf(" ") !== -1) {
+                                url = url.replace(regex, "");
+                            }
+                            return url;
+                        })(),
+                        ipStart : $scope.vm.form.ipStart, // ip�떆�옉二쇱냼
+                        ipEnd : $scope.vm.form.ipEnd, // ip醫낅즺二쇱냼
+                        memo : $scope.vm.form.memo,
                         companyTypeId : (function () {
                             var companyTypeId = null;
                             if ($scope.vm.form.companyTypes != null && $scope.vm.form.companyTypes.length > 0) {
@@ -442,6 +454,8 @@
                                 }
 
                                 $scope.vm.form.url = result.data.content.url;
+                                $scope.vm.form.ipStart = result.data.content.ipStart;
+                                $scope.vm.form.ipEnd = result.data.content.ipEnd;
                                 $scope.vm.form.memo = result.data.content.memo;
                                 $scope.vm.form.companyTypeId = result.data.content.companyTypeId;
                                 $scope.vm.form.companyType = result.data.content.companyTypeName;
diff --git a/src/main/webapp/views/companyField/companyFieldAdd.html b/src/main/webapp/views/companyField/companyFieldAdd.html
index 4fe5b6d..2f7d840 100644
--- a/src/main/webapp/views/companyField/companyFieldAdd.html
+++ b/src/main/webapp/views/companyField/companyFieldAdd.html
@@ -34,6 +34,9 @@
                 <label for="companyFieldAddForm10" class="issue-label">
                     <span translate="companyField.url">url</span>
                 </label>
+                <div class="help-block form-text text-danger fs-09">
+                    <small translate="companyField.multiUrlWithComma">�뿬�윭媛쒖쓽 url�쓣 �엯�젰 �븷 �닔 �엳�뒿�땲�떎. (援щ텇: ',') ex: www.test.com, www.test2.com</small>
+                </div>
                 <input id="companyFieldAddForm10"
                        name="url"
                        type="text"
@@ -50,6 +53,50 @@
             </div>
 
             <div class="row">
+                <div class="col-lg-6 mw-49">
+                    <div class="form-group">
+                        <label for="companyFieldAddForm11" class="issue-label">
+                            <span translate="companyField.ipRange">ip ���뿭��</span>
+                        </label>
+                        <input id="companyFieldAddForm11"
+                               name="ipStart"
+                               type="text"
+                               class="form-control"
+                               kr-input
+                               ng-pattern="/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/"
+                               placeholder="IP 二쇱냼 �삎�떇留� �엯�젰 媛��뒫�빀�땲�떎."
+                               autocomplete="off"
+                               ng-model="vm.form.ipStart"
+                        >
+                        <div ng-if="companyFieldAddForm.ipStart.$error.pattern" class="help-block form-text text-danger"
+                             translate="common.invalidipAdressFormat">IP二쇱냼 �삎�떇�씠 留욎� �븡�뒿�땲�떎.
+                        </div>
+                    </div>
+                </div>
+                <div class="mt-30">
+                    <label class="issue-label">~</label>
+                </div>
+                <div class="col-lg-6 mw-49">
+                    <div class="form-group">
+                        <label for="companyFieldAddForm12" class="issue-label"></label>
+                        <input id="companyFieldAddForm12"
+                               name="ipEnd"
+                               type="text"
+                               class="form-control"
+                               kr-input
+                               ng-pattern="/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/"
+                               placeholder="IP 二쇱냼 �삎�떇留� �엯�젰 媛��뒫�빀�땲�떎."
+                               autocomplete="off"
+                               ng-model="vm.form.ipEnd"
+                        >
+                        <div ng-if="companyFieldAddForm.ipEnd.$error.pattern" class="help-block form-text text-danger"
+                             translate="common.invalidipAdressFormat">IP二쇱냼 �삎�떇�씠 留욎� �븡�뒿�땲�떎.
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row">
                 <div class="col-lg-6">
                     <div class="form-group">
                         <label class="issue-label">
diff --git a/src/main/webapp/views/companyField/companyFieldModify.html b/src/main/webapp/views/companyField/companyFieldModify.html
index 5f5dc8c..33ed903 100644
--- a/src/main/webapp/views/companyField/companyFieldModify.html
+++ b/src/main/webapp/views/companyField/companyFieldModify.html
@@ -29,10 +29,13 @@
                 <!--<small translate="companyField.enterSpecialCharacters">�뾽泥� �씠由꾩뿉�뒗 �듅�닔 臾몄옄瑜� �엯�젰 �븷�닔 �뾾�뒿�땲�떎.</small>-->
             </div>
             <div class="form-group">
-                <label for="companyFieldAddForm10" class="issue-label">
+                <label for="companyFieldModifyForm10" class="issue-label">
                     <span translate="companyField.url">url</span>
                 </label>
-                <input id="companyFieldAddForm10"
+                <div class="help-block form-text text-danger fs-09">
+                    <small translate="companyField.multiUrlWithComma">�뿬�윭媛쒖쓽 url�쓣 �엯�젰 �븷 �닔 �엳�뒿�땲�떎. (援щ텇: ',') ex: www.test.com, www.test2.com</small>
+                </div>
+                <input id="companyFieldModifyForm10"
                        name="url"
                        type="text"
                        class="form-control"
@@ -47,6 +50,50 @@
                 </div>-->
             </div>
             <div class="row">
+                <div class="col-lg-6 mw-49">
+                    <div class="form-group">
+                        <label for="companyFieldModifyForm11" class="issue-label">
+                            <span translate="companyField.ipRange">ip ���뿭��</span>
+                        </label>
+                        <input id="companyFieldModifyForm11"
+                               name="ipStart"
+                               type="text"
+                               class="form-control"
+                               kr-input
+                               ng-pattern="/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/"
+                               placeholder="IP 二쇱냼 �삎�떇留� �엯�젰 媛��뒫�빀�땲�떎."
+                               autocomplete="off"
+                               ng-model="vm.form.ipStart"
+                        >
+                        <div ng-if="companyFieldModifyForm.ipStart.$error.pattern" class="help-block form-text text-danger"
+                             translate="common.invalidipAdressFormat">IP二쇱냼 �삎�떇�씠 留욎� �븡�뒿�땲�떎.
+                        </div>
+                    </div>
+                </div>
+                <div class="mt-30">
+                    <label class="issue-label">~</label>
+                </div>
+                <div class="col-lg-6 mw-49">
+                    <div class="form-group">
+                        <label for="companyFieldModifyForm12" class="issue-label">
+                        </label>
+                        <input id="companyFieldModifyForm12"
+                               name="ipEnd"
+                               type="text"
+                               class="form-control"
+                               kr-input
+                               ng-pattern="/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/"
+                               placeholder="IP 二쇱냼 �삎�떇留� �엯�젰 媛��뒫�빀�땲�떎."
+                               autocomplete="off"
+                               ng-model="vm.form.ipEnd"
+                        >
+                        <div ng-if="companyFieldModifyForm.ipEnd.$error.pattern" class="help-block form-text text-danger"
+                             translate="common.invalidipAdressFormat">IP二쇱냼 �삎�떇�씠 留욎� �븡�뒿�땲�떎.
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="row">
                 <div class="col-lg-6">
                     <div class="form-group">
                         <label class="issue-label">

--
Gitblit v1.8.0