diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/controller/ComnCoordinateController.java b/pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/controller/ComnCoordinateController.java index aba060af..c36313f2 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/controller/ComnCoordinateController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/controller/ComnCoordinateController.java @@ -1,15 +1,14 @@ package com.palnet.biz.api.comn.coordinate.controller; -import com.palnet.biz.api.comn.coordinate.model.CompotentAuthorityRQ; -import com.palnet.biz.api.comn.coordinate.model.CompotentAuthorityRS; -import com.palnet.biz.api.comn.coordinate.model.SearchAddressCoordinateRQ; -import com.palnet.biz.api.comn.coordinate.model.SearchAddressCoordinateRS; +import com.palnet.biz.api.comn.coordinate.model.*; import com.palnet.biz.api.comn.coordinate.service.ComnCoordinateService; import com.palnet.biz.api.comn.response.BasicResponse; import com.palnet.biz.api.comn.response.ErrorResponse; import com.palnet.biz.api.comn.response.SuccessResponse; import com.palnet.comn.exception.CustomException; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -88,4 +87,38 @@ public class ComnCoordinateController { return ResponseEntity.ok().body(new SuccessResponse<>(result)); } + + /** + * 하위 행정구역 조회 + * @param address 검색할 주소 문자열 + * @return 하위 행정구역리스트 반환 + */ + @Operation(summary = "하위 행정구역 조회", description = "현주소의 하위 행정구역 조회") + @GetMapping("/low-address") + public ResponseEntity getLowAddress( + @RequestParam(name = "address", required = false) + @Parameter(name="address", description = "하위행정구역을 검색할 주소", in = ParameterIn.QUERY, example = "서울특별시") + String address){ + + log.warn("address => {}", address); + + SearchLowAddressRS result = null; + try { + result = comnCoordinateService.getLowAddress(address); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } catch (Exception e) { + log.error("IGNORE : ", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + } + + return ResponseEntity.ok().body(new SuccessResponse<>(result)); + } + } diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/model/SearchLowAddressRS.java b/pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/model/SearchLowAddressRS.java new file mode 100644 index 00000000..55d29424 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/model/SearchLowAddressRS.java @@ -0,0 +1,12 @@ +package com.palnet.biz.api.comn.coordinate.model; + +import lombok.Data; + +import java.util.List; + +@Data +public class SearchLowAddressRS { + + private List lowAddressList; + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/service/ComnCoordinateService.java b/pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/service/ComnCoordinateService.java index b85d4b96..7a433bc8 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/service/ComnCoordinateService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/service/ComnCoordinateService.java @@ -7,8 +7,8 @@ import java.io.InputStreamReader; import java.util.*; import java.util.regex.Pattern; -import com.palnet.biz.api.comn.coordinate.model.SearchAddressCoordinateRQ; -import com.palnet.biz.api.comn.coordinate.model.SearchAddressCoordinateRS; +import com.palnet.biz.api.comn.coordinate.model.*; +import com.palnet.biz.jpa.repository.flt.FltCptAuthAdmDistrictRelRepository; import com.palnet.comn.code.ErrorCode; import com.palnet.comn.exception.CustomException; import lombok.extern.slf4j.Slf4j; @@ -20,8 +20,6 @@ import org.locationtech.jts.geom.Coordinate; import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Service; -import com.palnet.biz.api.comn.coordinate.model.CompotentAuthorityRQ; -import com.palnet.biz.api.comn.coordinate.model.CompotentAuthorityRS; import com.palnet.biz.jpa.entity.FltCptAuthBas; import com.palnet.biz.jpa.repository.flt.FltCptAuthAdminDistrictBasQueryRepository; import com.palnet.comn.utils.CoordUtils; @@ -34,6 +32,8 @@ import lombok.RequiredArgsConstructor; @Slf4j public class ComnCoordinateService { + private final FltCptAuthAdmDistrictRelRepository fltCptAuthAdmDistrictRelRepository; + private final FltCptAuthAdminDistrictBasQueryRepository fltCptAuthAdminDistrictBasQueryRepository; @@ -55,7 +55,7 @@ public class ComnCoordinateService { String[] scope = {"ctprvn", "sig", "emd", "li"}; final String cd = (String) code.get("CD"); - Set fltCptAuthBas = new HashSet(); + Set fltCptAuthBas = new HashSet<>(); for(int i = 0; i < scope.length; i++){ String cdParam = this.codeParsing(cd, scope[i]); @@ -73,64 +73,12 @@ public class ComnCoordinateService { return result; } - private String codeParsing(String cd, String scope){ - switch (scope) { - case "ctprvn": - - if(cd.length() < 2) break; - - cd = cd.substring(0, 2); - break; - case "sig": - - if(cd.length() < 5) break; - - cd = cd.substring(0, 5); - break; - case "emd": - - if(cd.length() < 8) break; - - cd = cd.substring(0, 8); - break; - case "li": - - if(cd.length() < 10) break; - - cd = cd.substring(0, 10); - break; - } - - int length = cd.length(); - int maxLength = 10; - - int difference = maxLength - length; - - StringBuilder sb = new StringBuilder(); - sb.append(cd); - - for(int i = 0; i < difference; i++){ - sb.append("0"); - } - - return sb.toString(); - } - - public SearchAddressCoordinateRS getCoordinateByAddress(SearchAddressCoordinateRQ rq) { - String[] addressArray = rq.getAddress().split(" "); - StringBuilder address = new StringBuilder(); - - for(int i = 0; i < addressArray.length; i++){ - String addressNode = addressArray[i].replace(" ", ""); - - address.append(addressNode); - if((addressArray.length - 1) != i) address.append(" "); - } + String address = rq.getAddress(); - String searchAdmCd = fltCptAuthAdminDistrictBasQueryRepository.findAdmCdByAddress(address.toString()); - String scope = this.getScope(address.toString()); + String searchAdmCd = fltCptAuthAdminDistrictBasQueryRepository.findAdmCdByAddress(address); + String scope = this.getScope(address); if(searchAdmCd == null) { throw new CustomException(ErrorCode.DATA_NOTFIND); @@ -201,6 +149,98 @@ public class ComnCoordinateService { return result; } + public SearchLowAddressRS getLowAddress(String address) { + + String regexp = this.getLowScopeRegexp(address); + + List lowAddress = fltCptAuthAdmDistrictRelRepository.findLowestAdmSectNmByPattren(regexp); + + SearchLowAddressRS result = new SearchLowAddressRS(); + result.setLowAddressList(lowAddress); + + return result; + } + + private String getLowScopeRegexp(String address){ + + String regexp = ""; + + if(address == null || address.isEmpty()){ + regexp = "^[^ ]+(시|도)$"; + return regexp; + } + + String scope = this.getScope(address); + + String[] addressNode = address.split(" "); + + if(address.equals("세종특별자치시")){ + scope = "sig"; + } + + switch (scope){ + case "ctprvn": + regexp = "^" + address + " [^ ]+(구|군|시)$|" + "^" + address + " [^ ]+시 [^ ]+구$"; + break; + case "sig": + regexp = "^" + address + " [^ ]+(동|읍|면)$"; + break; + case "emd": + regexp = "^" + address + " [^ ]+리$"; + break; + case "li": + throw new CustomException(ErrorCode.DATA_NO); + default: + throw new CustomException(ErrorCode.NON_VALID_PARAMETER); + } + + return regexp; + } + + + private String codeParsing(String cd, String scope){ + switch (scope) { + case "ctprvn": + + if(cd.length() < 2) break; + + cd = cd.substring(0, 2); + break; + case "sig": + + if(cd.length() < 5) break; + + cd = cd.substring(0, 5); + break; + case "emd": + + if(cd.length() < 8) break; + + cd = cd.substring(0, 8); + break; + case "li": + + if(cd.length() < 10) break; + + cd = cd.substring(0, 10); + break; + } + + int length = cd.length(); + int maxLength = 10; + + int difference = maxLength - length; + + StringBuilder sb = new StringBuilder(); + sb.append(cd); + + for(int i = 0; i < difference; i++){ + sb.append("0"); + } + + return sb.toString(); + } + private String getScope(String address) { Map patternMap = new HashMap<>(); patternMap.put("ctprvn", new String[]{ @@ -304,5 +344,4 @@ public class ComnCoordinateService { } return result; } - } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltCptAuthAdmDistrictRelRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltCptAuthAdmDistrictRelRepository.java index c6f7be47..d58280b5 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltCptAuthAdmDistrictRelRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltCptAuthAdmDistrictRelRepository.java @@ -3,8 +3,12 @@ package com.palnet.biz.jpa.repository.flt; import com.palnet.biz.jpa.entity.FltCptAuthAdmDistrictRel; import com.palnet.biz.jpa.entity.FltCptAuthAdmDistrictRelPk; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.util.List; + /** * packageName : com.palnet.biz.jpa.repository.flt * fileName : FltCptAuthAdmDistrictRelRepository @@ -18,4 +22,7 @@ import org.springframework.stereotype.Repository; */ @Repository public interface FltCptAuthAdmDistrictRelRepository extends JpaRepository { + + @Query(value = "SELECT LOWEST_ADM_SECT_NM FROM COM_ADM_DISTRICT_BAS CADB WHERE CADB.ADM_SECT_NM REGEXP :pattern", nativeQuery = true) + public List findLowestAdmSectNmByPattren(@Param("pattern") String pattern); } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltCptAuthAdminDistrictBasQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltCptAuthAdminDistrictBasQueryRepository.java index 1aba4306..7d9a730e 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltCptAuthAdminDistrictBasQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltCptAuthAdminDistrictBasQueryRepository.java @@ -5,6 +5,7 @@ import java.util.Map; import com.palnet.biz.jpa.entity.QComAdmDistrictBas; import com.querydsl.core.types.Projections; +import com.querydsl.core.types.dsl.BooleanTemplate; import com.querydsl.core.types.dsl.Expressions; import com.querydsl.core.types.dsl.StringTemplate; import org.springframework.stereotype.Repository; @@ -17,12 +18,17 @@ import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.RequiredArgsConstructor; +import javax.persistence.EntityManager; +import javax.persistence.Query; + @Repository @RequiredArgsConstructor public class FltCptAuthAdminDistrictBasQueryRepository { private final JPAQueryFactory query; + private final EntityManager entityManager; + public List getFltCptAuthBas(String cd){ QFltCptAuthAdmDistrictRel qFltCptAuthAdmDistrictRel = QFltCptAuthAdmDistrictRel.fltCptAuthAdmDistrictRel; @@ -59,4 +65,23 @@ public class FltCptAuthAdminDistrictBasQueryRepository { .fetchOne(); } + public List findAdmCdByAddressAndRegexp(String address, List regexps){ + + QComAdmDistrictBas qComAdmDistrictBas = QComAdmDistrictBas.comAdmDistrictBas; + + BooleanBuilder builder = new BooleanBuilder(); + for(String regexp: regexps){ + BooleanTemplate template = Expressions.booleanTemplate("{0} REGEXP {1}", qComAdmDistrictBas.admSectNm , Expressions.constant(regexp)); + builder.or(template); + } + + String sql = "SELECT LOWEST_ADM_SECT_NM " + + "FROM COM_ADM_DISTRICT_BAS " + + "WHERE " + builder.getValue().toString(); + + Query nativeQuery = entityManager.createNativeQuery(sql); + + return nativeQuery.getResultList(); + } + }