Browse Source

feat: 하위 행정구역 조회기능 추가

feature/address-coordinate
lkd9125(이경도) 2 months ago
parent
commit
2def472ba0
  1. 41
      pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/controller/ComnCoordinateController.java
  2. 12
      pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/model/SearchLowAddressRS.java
  3. 161
      pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/service/ComnCoordinateService.java
  4. 7
      pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltCptAuthAdmDistrictRelRepository.java
  5. 25
      pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltCptAuthAdminDistrictBasQueryRepository.java

41
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<? extends BasicResponse> 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<String, Object> 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));
}
}

12
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<String> lowAddressList;
}

161
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> fltCptAuthBas = new HashSet<FltCptAuthBas>();
Set<FltCptAuthBas> 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<String> 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<String, String[]> patternMap = new HashMap<>();
patternMap.put("ctprvn", new String[]{
@ -304,5 +344,4 @@ public class ComnCoordinateService {
}
return result;
}
}

7
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<FltCptAuthAdmDistrictRel, FltCptAuthAdmDistrictRelPk> {
@Query(value = "SELECT LOWEST_ADM_SECT_NM FROM COM_ADM_DISTRICT_BAS CADB WHERE CADB.ADM_SECT_NM REGEXP :pattern", nativeQuery = true)
public List<String> findLowestAdmSectNmByPattren(@Param("pattern") String pattern);
}

25
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<FltCptAuthBas> getFltCptAuthBas(String cd){
QFltCptAuthAdmDistrictRel qFltCptAuthAdmDistrictRel = QFltCptAuthAdmDistrictRel.fltCptAuthAdmDistrictRel;
@ -59,4 +65,23 @@ public class FltCptAuthAdminDistrictBasQueryRepository {
.fetchOne();
}
public List<String> findAdmCdByAddressAndRegexp(String address, List<String> 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();
}
}

Loading…
Cancel
Save