From 8945ad325d6aaeb84f6476d4608f6b04f48008a1 Mon Sep 17 00:00:00 2001 From: leejunyeong <140596682+jjuny0326@users.noreply.github.com> Date: Mon, 24 Aug 2026 17:10:26 +0900 Subject: [PATCH] =?UTF-8?q?infra(be):=20develop=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20main=20=EB=B0=98=EC=98=81=20(#181)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../report/service/RiskEvaluationService.java | 53 ++++++++++++++++--- .../service/RiskEvaluationServiceTest.java | 3 +- 2 files changed, 47 insertions(+), 9 deletions(-) diff --git a/backend/src/main/java/com/secondzip/backend/report/service/RiskEvaluationService.java b/backend/src/main/java/com/secondzip/backend/report/service/RiskEvaluationService.java index 21ad94c..d9d7463 100644 --- a/backend/src/main/java/com/secondzip/backend/report/service/RiskEvaluationService.java +++ b/backend/src/main/java/com/secondzip/backend/report/service/RiskEvaluationService.java @@ -223,7 +223,7 @@ private JudgementDTO judgeIllegalBuilding(BuildingData building) { * * 주의 — 이 판정은 "고지된 용도와 실제 용도가 다른가"를 보지 않는다. * 비교할 고지 정보가 없기 때문이다. 유형2-B에서 같은 결과를 재사용하지만 - * 그 항목 이름({@code FALSE_BUILDING_USE_INFORMATION})이 뜻하는 '허위 안내'를 + * 그 항목 이름(FALSE_BUILDING_USE_INFORMATION)이 뜻하는 '허위 안내'를 * 실제로 검증하는 것은 아니다. * * [판정 로직] @@ -232,7 +232,7 @@ private JudgementDTO judgeIllegalBuilding(BuildingData building) { * - 전유부가 업무용·비주거용 -> DANGER * - 주거/업무 구분이 없는 오피스텔·부속용도 -> CAUTION / UNVERIFIED * - * 근생빌라 사기의 판별 기준은 계약 대상 호의 용도이지 건물 전체의 + * 근생빌라 사기의 판별 기준은 계약 대상 호의 용도이지 건물 전체의 * 주용도가 아니다. 1층이 근린생활시설인 정상 다세대·연립은 국내에 흔하므로, * 표제부에만 나타나는 비주거 표기를 그대로 DANGER로 확정하면 정상 매물이 * 대량으로 위험하다고 표시된다. 대신 CAUTION으로 남겨 사용자가 해당 호의 @@ -258,18 +258,55 @@ private boolean hasBuildingLevelNonResidentialUse(BuildingData building) { return uses != null && !uses.isBlank(); } + // 건축물 용도 private Map buildingUseEvidence(BuildingData building) { Map evidence = new LinkedHashMap<>(); - evidence.put("buildingUse", building != null ? building.getBuildingUse() : null); + + String rawBuildingUse = + building != null ? building.getBuildingUse() : null; + + String buildingType = + building != null ? building.getBuildingType() : null; + + // 프론트 화면에 표시할 정규화된 건축물 유형 + evidence.put( + "buildingUse", + buildingTypeLabel(buildingType, rawBuildingUse) + ); + + // 건축물대장에서 받은 원래 용도 + evidence.put("buildingUseRaw", rawBuildingUse); + // 표제부에만 있는 비주거 용도. 전유부 용도와 섞어 적으면 계약 대상 호가 // 비주거인 것처럼 읽히므로 반드시 분리해 남긴다. evidence.put( "buildingLevelNonResidentialUses", - building != null ? building.getBuildingLevelNonResidentialUses() : null + building != null + ? building.getBuildingLevelNonResidentialUses() + : null ); + return evidence; } + private String buildingTypeLabel( + String buildingType, + String fallback + ) { + if (buildingType == null) { + return fallback; + } + + return switch (buildingType) { + case "APARTMENT" -> "아파트"; + case "OFFICETEL" -> "오피스텔"; + case "MULTI_HOUSEHOLD" -> "연립·다세대주택"; + case "MULTI_FAMILY" -> "다가구주택"; + case "SINGLE_FAMILY" -> "단독주택"; + default -> fallback; + }; + } + /** 비주거 표기가 주거 단어를 함께 포함하더라도 반드시 먼저 잡는다. */ private BuildingUseKind classifyBuildingUse(String use) { if (use == null || use.isBlank()) { @@ -424,9 +461,9 @@ private boolean isHugSupportedType(String type) { /** * 실제로 보는 것: 등기 갑구의 압류·가압류·경매개시결정 등 권리제한 표시. * - * 유형2-C({@code RIGHTS_INFRINGEMENT_CONCEALMENT})가 같은 결과를 재사용한다. + * 유형2-C(RIGHTS_INFRINGEMENT_CONCEALMENT)가 같은 결과를 재사용한다. * 다만 그 항목 이름이 뜻하는 "은폐"(고지 내용과 실제가 다름)를 검증하는 - * 것은 아니다 — 비교할 고지 원문이 없어 여기서는 등기부 자체의 권리제한 + * 것은 아니다. 비교할 고지 원문이 없어 여기서는 등기부 자체의 권리제한 * 유무만 본다. */ private JudgementDTO judgeRightsInfringement(RegistryData registry) { @@ -527,7 +564,7 @@ private JudgementDTO judgePriorityDebtBurden(RegistryData registry, PriceData pr /** * 실제로 보는 것: 가격 조건 하나만 본다. * - * 필수점검 4번({@link #judgeHugEligibility})은 여기에 지역별 보증금 한도, + * 필수점검 4번(judgeHugEligibility)은 여기에 지역별 보증금 한도, * 용도·위반건축물·권리침해·신탁·소유관계까지 더해 더 엄격하게 본다. * 그 판정을 여기서 그대로 재사용하면 "보증금이 수도권 한도 7억을 넘는다"는 * 이유만으로 전세가율 30%인 매물이 깡통전세 DANGER로 확정된다. @@ -604,7 +641,7 @@ private FraudTypeResultDTO buildRightsConcealment(RegistryData registry, Buildin * * 집합건물(아파트·다세대·오피스텔 등)은 해당 없음이다. * 대지권이 전유부분에 포함되어 토지 등기를 따로 확인할 필요가 없고, - * 실제로 {@code landOwnerName}도 조회하지 않는다. + * 실제로 landOwnerName도 조회하지 않는다. * 예전에는 이 경우가 CAUTION으로 남아 아파트는 이 항목이 영원히 * "확인 불가"로 표시됐다. * diff --git a/backend/src/test/java/com/secondzip/backend/report/service/RiskEvaluationServiceTest.java b/backend/src/test/java/com/secondzip/backend/report/service/RiskEvaluationServiceTest.java index 839bb34..153bf74 100644 --- a/backend/src/test/java/com/secondzip/backend/report/service/RiskEvaluationServiceTest.java +++ b/backend/src/test/java/com/secondzip/backend/report/service/RiskEvaluationServiceTest.java @@ -291,7 +291,8 @@ void residentialUnitInMixedUseBuildingIsCautionNotDanger() { assertEquals(RiskLevel.CAUTION, result.getRiskLevel()); assertEquals(DataStatus.VERIFIED, result.getDataStatus()); - assertEquals("다세대주택", result.getEvidence().get("buildingUse")); + assertEquals("연립·다세대주택", result.getEvidence().get("buildingUse")); + assertEquals("다세대주택", result.getEvidence().get("buildingUseRaw")); assertEquals( "제2종근린생활시설", result.getEvidence().get("buildingLevelNonResidentialUses")