From 4b9e0fa36af11bc19672cbbc4eaf922ef50f036a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=5BCLOUD4=5D=20=EA=B3=A0=EB=B2=94=EC=84=9D?= Date: Sat, 19 Apr 2025 06:33:50 +0900 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=EA=B3=B5=EA=B3=B5=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EB=A7=A4=ED=95=91=20=EC=98=A4=EB=A5=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PublicServiceDataController.java | 26 ++++++++--- .../dto/PublicServiceConditionsDataDto.java | 41 +++++++++++++++-- .../mapper/PublicServiceDataMapper.java | 2 + .../schedule/PublicServiceDataScheduler.java | 4 +- .../PublicServiceDataProviderService.java | 7 +++ .../service/PublicServiceDataServiceImpl.java | 6 ++- .../publicdata/util/PublicDataPath.java | 4 +- .../util/PublicServiceDataValidate.java | 19 ++++---- .../controller/PublicServiceController.java | 7 ++- .../publicservice/entity/PublicService.java | 46 ++++++++++--------- 10 files changed, 110 insertions(+), 52 deletions(-) diff --git a/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/controller/PublicServiceDataController.java b/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/controller/PublicServiceDataController.java index 8935573..1979f6f 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/controller/PublicServiceDataController.java +++ b/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/controller/PublicServiceDataController.java @@ -41,13 +41,13 @@ public ResponseEntity createAndStoreServiceList() { /** * 공공서비스 상세정보 전체 동기화 (페이징 처리) */ - @PostMapping("/serviceDetailList") + @PostMapping("/serviceDetail") public ResponseEntity createAndStoreServiceDetailList() { validator.validateAndHandleException(() -> { // 전체 상세정보 동기화 (페이징 처리) - publicServiceDataService.syncPublicServiceDetailData(SERVICE_DETAIL_LIST); + publicServiceDataService.syncPublicServiceDetailData(SERVICE_DETAIL); return null; - }, SERVICE_DETAIL_LIST); + }, SERVICE_DETAIL); return ResponseEntity.status(HttpStatus.OK).body("공공서비스 상세정보 데이터 동기화 완료"); } @@ -55,13 +55,13 @@ public ResponseEntity createAndStoreServiceDetailList() { /** * 공공서비스 지원조건 전체 동기화 (페이징 처리) */ - @PostMapping("/supportConditionsList") + @PostMapping("/supportConditions") public ResponseEntity createAndStoreSupportConditionsList() { validator.validateAndHandleException(() -> { // 전체 지원조건 동기화 (페이징 처리) - publicServiceDataService.syncPublicServiceConditionsData(SERVICE_CONDITIONS_LIST); + publicServiceDataService.syncPublicServiceConditionsData(SERVICE_CONDITIONS); return null; - }, SERVICE_CONDITIONS_LIST); + }, SERVICE_CONDITIONS); return ResponseEntity.status(HttpStatus.OK).body("공공서비스 지원조건 데이터 동기화 완료"); } @@ -85,4 +85,18 @@ public ResponseEntity> getServiceListByPage( return ResponseEntity.status(HttpStatus.OK).body(result); } + + // 통합 동기화 + @PostMapping("/sync-all") + public ResponseEntity syncAllPublicServiceData() { + // 순차적으로 실행 + createAndStoreServiceList(); + createAndStoreServiceDetailList(); + createAndStoreSupportConditionsList(); + + // 미사용 데이터 정리 + publicServiceDataService.cleanupObsoleteServices(); + + return ResponseEntity.status(HttpStatus.OK).body("모든 공공서비스 데이터 동기화 완료"); + } } diff --git a/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/dto/PublicServiceConditionsDataDto.java b/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/dto/PublicServiceConditionsDataDto.java index f6f0d2a..505fa88 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/dto/PublicServiceConditionsDataDto.java +++ b/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/dto/PublicServiceConditionsDataDto.java @@ -3,10 +3,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import java.util.List; @@ -23,6 +20,7 @@ public class PublicServiceConditionsDataDto { private long perPage; @Getter + @Setter @NoArgsConstructor @AllArgsConstructor @Builder @@ -54,46 +52,79 @@ public static class Data { private String incomeLevelVeryHigh; // 중위소득 200% 초과 // Special Group + @JsonProperty("JA0401") private String JA0401; // 다문화가족 + @JsonProperty("JA0402") private String JA0402; // 북한이탈주민 + @JsonProperty("JA0403") private String JA0403; // 한부모가정/조손가정 + @JsonProperty("JA0404") private String JA0404; // 1인가구 + @JsonProperty("JA0328") private String JA0328; // 장애인 + @JsonProperty("JA0329") private String JA0329; // 국가보훈대상자 + @JsonProperty("JA0330") private String JA0330; // 질병/질환자 // Family Type - // private String JA0410; // 해당사항 없음 + @JsonProperty("JA0411") private String JA0411; // 다자녀가구 + @JsonProperty("JA0412") private String JA0412; // 무주택세대 + @JsonProperty("JA0413") private String JA0413; // 신규전입 + @JsonProperty("JA0414") private String JA0414; // 확대가족 // Occupation + @JsonProperty("JA0313") private String JA0313; // 농업인 + @JsonProperty("JA0314") private String JA0314; // 어업인 + @JsonProperty("JA0315") private String JA0315; // 축산업인 + @JsonProperty("JA0316") private String JA0316; // 임업인 + @JsonProperty("JA0317") private String JA0317; // 초등학생 + @JsonProperty("JA0318") private String JA0318; // 중학생 + @JsonProperty("JA0319") private String JA0319; // 고등학생 + @JsonProperty("JA0320") private String JA0320; // 대학생/대학원생 + @JsonProperty("JA0326") private String JA0326; // 근로자/직장인 + @JsonProperty("JA0327") private String JA0327; // 구직자/실업자 // Business Type + @JsonProperty("JA1101") private String JA1101; // 예비 창업자 + @JsonProperty("JA1102") private String JA1102; // 영업중 + @JsonProperty("JA1103") private String JA1103; // 생계곤란/폐업예정자 + @JsonProperty("JA1201") private String JA1201; // 음식업 + @JsonProperty("JA1202") private String JA1202; // 제조업 + @JsonProperty("JA1299") private String JA1299; // 기타업종 + @JsonProperty("JA2101") private String JA2101; // 중소기업 + @JsonProperty("JA2102") private String JA2102; // 사회복지시설 + @JsonProperty("JA2103") private String JA2103; // 기관/단체 + @JsonProperty("JA2201") private String JA2201; // 제조업 + @JsonProperty("JA2202") private String JA2202; // 농업, 임업 및 어업 + @JsonProperty("JA2203") private String JA2203; // 정보통신업 + @JsonProperty("JA2299") private String JA2299; // 기타업종 } diff --git a/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/mapper/PublicServiceDataMapper.java b/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/mapper/PublicServiceDataMapper.java index 8c8a333..08ac767 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/mapper/PublicServiceDataMapper.java +++ b/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/mapper/PublicServiceDataMapper.java @@ -30,6 +30,8 @@ public interface PublicServiceDataMapper { PublicService updateFromDetailData(@MappingTarget PublicService publicService, PublicServiceDetailDataDto.Data data); // 공공서비스 지원조건 데이터 매핑 + @Mapping(target = "targetGenderMale", source = "targetGenderMale") + @Mapping(target = "targetGenderFemale", source = "targetGenderFemale") @Mapping(target = "incomeLevel", expression = "java(mapIncomeLevel(data))") PublicService updateFromConditionsData(@MappingTarget PublicService publicService, PublicServiceConditionsDataDto.Data data); diff --git a/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/schedule/PublicServiceDataScheduler.java b/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/schedule/PublicServiceDataScheduler.java index 1499136..e6e7990 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/schedule/PublicServiceDataScheduler.java +++ b/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/schedule/PublicServiceDataScheduler.java @@ -32,11 +32,11 @@ public void syncAllPublicServiceData() { // 2. 공공서비스 상세정보 동기화 log.info("2. 공공서비스 상세정보 동기화 시작"); - publicServiceDataService.syncPublicServiceDetailData(PublicDataPath.SERVICE_DETAIL_LIST); + publicServiceDataService.syncPublicServiceDetailData(PublicDataPath.SERVICE_DETAIL); // 3. 공공서비스 지원조건 동기화 log.info("3. 공공서비스 지원조건 동기화 시작"); - publicServiceDataService.syncPublicServiceConditionsData(PublicDataPath.SERVICE_CONDITIONS_LIST); + publicServiceDataService.syncPublicServiceConditionsData(PublicDataPath.SERVICE_CONDITIONS); // 4. 미사용 데이터 정리 log.info("미사용 공공서비스 데이터 정리 시작"); diff --git a/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/service/PublicServiceDataProviderService.java b/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/service/PublicServiceDataProviderService.java index 6d31222..e67841f 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/service/PublicServiceDataProviderService.java +++ b/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/service/PublicServiceDataProviderService.java @@ -33,24 +33,31 @@ void updateSpecialGroups(PublicService publicService, PublicServiceConditionsDat List specialGroups = new ArrayList<>(); if ("Y".equals(data.getJA0401())) { + log.debug("다문화가족 특수 그룹 추가"); specialGroups.add(createSpecialGroup(publicService, SpecialGroupEnum.IS_MULTI_CULTURAL)); } if ("Y".equals(data.getJA0402())) { + log.debug("북한이탈주민 특수 그룹 추가"); specialGroups.add(createSpecialGroup(publicService, SpecialGroupEnum.IS_NORTH_KOREAN_DEFECTOR)); } if ("Y".equals(data.getJA0403())) { + log.debug("한부모가정/조손가정 특수 그룹 추가"); specialGroups.add(createSpecialGroup(publicService, SpecialGroupEnum.IS_SINGLE_PARENT_FAMILY)); } if ("Y".equals(data.getJA0404())) { + log.debug("1인가구 특수 그룹 추가"); specialGroups.add(createSpecialGroup(publicService, SpecialGroupEnum.IS_SINGLE_MEMBER_HOUSEHOLD)); } if ("Y".equals(data.getJA0328())) { + log.debug("장애인 특수 그룹 추가"); specialGroups.add(createSpecialGroup(publicService, SpecialGroupEnum.IS_DISABLED)); } if ("Y".equals(data.getJA0329())) { + log.debug("국가보훈대상자 특수 그룹 추가"); specialGroups.add(createSpecialGroup(publicService, SpecialGroupEnum.IS_NATIONAL_MERIT_RECIPIENT)); } if ("Y".equals(data.getJA0330())) { + log.debug("질병/질환자 특수 그룹 추가"); specialGroups.add(createSpecialGroup(publicService, SpecialGroupEnum.IS_CHRONIC_ILLNESS)); } diff --git a/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/service/PublicServiceDataServiceImpl.java b/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/service/PublicServiceDataServiceImpl.java index d10a356..39881d7 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/service/PublicServiceDataServiceImpl.java +++ b/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/service/PublicServiceDataServiceImpl.java @@ -8,11 +8,13 @@ import com.hyetaekon.hyetaekon.common.publicdata.util.PublicServiceDataValidate; import com.hyetaekon.hyetaekon.publicservice.entity.*; import com.hyetaekon.hyetaekon.publicservice.repository.PublicServiceRepository; -import jakarta.transaction.Transactional; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.annotation.Propagation; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; import org.springframework.web.client.RestTemplate; @@ -305,7 +307,7 @@ public List upsertServiceDetailData(List upsertSupportConditionsData(List dataList) { List validatedData = new ArrayList<>(); List entitiesToSave = new ArrayList<>(); diff --git a/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/util/PublicDataPath.java b/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/util/PublicDataPath.java index 2cfd539..633c97a 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/util/PublicDataPath.java +++ b/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/util/PublicDataPath.java @@ -7,8 +7,8 @@ @Getter public enum PublicDataPath { SERVICE_LIST("/serviceList"), - SERVICE_DETAIL_LIST("/serviceDetailList"), - SERVICE_CONDITIONS_LIST("/supportConditionsList"); + SERVICE_DETAIL("/serviceDetail"), + SERVICE_CONDITIONS("/supportConditions"); private final String path; } diff --git a/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/util/PublicServiceDataValidate.java b/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/util/PublicServiceDataValidate.java index a1fda6b..6815150 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/util/PublicServiceDataValidate.java +++ b/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/util/PublicServiceDataValidate.java @@ -75,28 +75,28 @@ public boolean validatePublicServiceDetailData(PublicServiceDetailDataDto.Data d } public boolean validatePublicServiceConditionsData(PublicServiceConditionsDataDto.Data data) { - // 성별 조건 확인 (필수) + // 성별 조건 확인 boolean hasGenderCondition = "Y".equals(data.getTargetGenderMale()) || "Y".equals(data.getTargetGenderFemale()); - // 성별 정보가 없으면 유효하지 않은 데이터로 간주 + // 성별 조건이 없는 경우, 기본값으로 모두 Y 설정 if (!hasGenderCondition) { - log.warn("⚠️ 공공 서비스 지원조건 ID {}에 성별 지원 조건이 없습니다.", data.getServiceId()); - return false; + log.info("ℹ️ 공공 서비스 지원조건 ID {}에 성별 지원 조건이 없습니다. 기본값으로 남성/여성 모두 Y로 설정합니다.", data.getServiceId()); + data.setTargetGenderMale("Y"); + data.setTargetGenderFemale("Y"); + // hasGenderCondition = true; } - // 특수 그룹 조건 확인 + // 다른 조건들 검사 (경고만 로깅하고 실제로는 모든 데이터 허용) boolean hasSpecialGroupCondition = "Y".equals(data.getJA0401()) || "Y".equals(data.getJA0402()) || "Y".equals(data.getJA0403()) || "Y".equals(data.getJA0404()) || "Y".equals(data.getJA0328()) || "Y".equals(data.getJA0329()) || "Y".equals(data.getJA0330()); - // 가족 유형 조건 확인 boolean hasFamilyTypeCondition = "Y".equals(data.getJA0411()) || "Y".equals(data.getJA0412()) || "Y".equals(data.getJA0413()) || "Y".equals(data.getJA0414()); - // 직업 유형 조건 확인 boolean hasOccupationCondition = "Y".equals(data.getJA0313()) || "Y".equals(data.getJA0314()) || "Y".equals(data.getJA0315()) || "Y".equals(data.getJA0316()) || @@ -104,7 +104,6 @@ public boolean validatePublicServiceConditionsData(PublicServiceConditionsDataDt "Y".equals(data.getJA0319()) || "Y".equals(data.getJA0320()) || "Y".equals(data.getJA0326()) || "Y".equals(data.getJA0327()); - // 사업체 유형 조건 확인 boolean hasBusinessTypeCondition = "Y".equals(data.getJA1101()) || "Y".equals(data.getJA1102()) || "Y".equals(data.getJA1103()) || "Y".equals(data.getJA1201()) || @@ -114,13 +113,13 @@ public boolean validatePublicServiceConditionsData(PublicServiceConditionsDataDt "Y".equals(data.getJA2202()) || "Y".equals(data.getJA2203()) || "Y".equals(data.getJA2299()); - // 성별 외에 다른 지원 조건이 하나라도 있어야 함 if (!(hasSpecialGroupCondition || hasFamilyTypeCondition || hasOccupationCondition || hasBusinessTypeCondition)) { log.warn("⚠️ 공공 서비스 지원조건 ID {}에 성별 외 다른 지원 조건이 없습니다.", data.getServiceId()); - return false; + // 경고만 로깅하고 데이터는 허용 } + // 항상 true 반환하여 모든 데이터 허용 return true; } diff --git a/src/main/java/com/hyetaekon/hyetaekon/publicservice/controller/PublicServiceController.java b/src/main/java/com/hyetaekon/hyetaekon/publicservice/controller/PublicServiceController.java index f91e02d..cc35578 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/publicservice/controller/PublicServiceController.java +++ b/src/main/java/com/hyetaekon/hyetaekon/publicservice/controller/PublicServiceController.java @@ -2,7 +2,6 @@ import com.hyetaekon.hyetaekon.publicservice.dto.PublicServiceDetailResponseDto; import com.hyetaekon.hyetaekon.publicservice.dto.PublicServiceListResponseDto; -import com.hyetaekon.hyetaekon.publicservice.entity.ServiceCategory; import com.hyetaekon.hyetaekon.publicservice.service.PublicServiceHandler; import com.hyetaekon.hyetaekon.common.util.AuthenticateUser; import jakarta.validation.constraints.Max; @@ -34,7 +33,7 @@ public ResponseEntity> getAllServices( @RequestParam(required = false) List familyTypes, @RequestParam(required = false) List categories, @RequestParam(name = "page", defaultValue = "0") @Min(0) int page, - @RequestParam(name = "size", defaultValue = "9") @Positive @Max(30) int size) { + @RequestParam(name = "size", defaultValue = "9") @Positive @Max(50) int size) { Long userId = authenticateUser.authenticateUserId(); @@ -43,7 +42,7 @@ public ResponseEntity> getAllServices( } // 서비스 분야별 공공서비스 목록 조회 - @GetMapping("/category/{category}") + /*@GetMapping("/category/{category}") public ResponseEntity> getServicesByCategory ( @PathVariable("category") String categoryName, @RequestParam(name = "page", defaultValue = "0") @Min(0) int page, @@ -52,7 +51,7 @@ public ResponseEntity> getServicesByCategory ServiceCategory category = publicServiceHandler.getServiceCategory(categoryName); return ResponseEntity.ok(publicServiceHandler.getServicesByCategory(category, PageRequest.of(page, size), userId)); - } + }*/ // 공공서비스 상세 조회 @GetMapping("/detail/{serviceId}") diff --git a/src/main/java/com/hyetaekon/hyetaekon/publicservice/entity/PublicService.java b/src/main/java/com/hyetaekon/hyetaekon/publicservice/entity/PublicService.java index 6038465..b4f4a44 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/publicservice/entity/PublicService.java +++ b/src/main/java/com/hyetaekon/hyetaekon/publicservice/entity/PublicService.java @@ -29,62 +29,62 @@ public class PublicService { @Column(name = "summary_purpose", columnDefinition = "TEXT") private String summaryPurpose; // 서비스 목적 요약 - @Column(name = "governing_agency", nullable = false, length = 100) + @Column(name = "governing_agency", length = 100) private String governingAgency; // 소관기관명 - @Column(name = "department", nullable = false, length = 100) + @Column(name = "department", length = 100) private String department; // 부서명 - @Column(name = "user_type", nullable = false, length = 50) + @Column(name = "user_type", length = 50) private String userType; // 사용자 구분 // 지원 대상 필드 - @Column(name = "support_target", nullable = false, columnDefinition = "TEXT") + @Column(name = "support_target", columnDefinition = "TEXT") private String supportTarget; // 지원 대상 - @Column(name = "selection_criteria", nullable = false, columnDefinition = "TEXT") + @Column(name = "selection_criteria", columnDefinition = "TEXT") private String selectionCriteria; // 선정 기준 // 지원 관련 필드 - @Column(name = "service_purpose", nullable = false, columnDefinition = "TEXT") + @Column(name = "service_purpose", columnDefinition = "TEXT") private String servicePurpose; // 서비스 목적 - @Column(name = "support_detail", nullable = false, columnDefinition = "TEXT") + @Column(name = "support_detail", columnDefinition = "TEXT") private String supportDetail; // 지원 내용 - @Column(name = "support_type", nullable = false, length = 100) + @Column(name = "support_type", length = 100) private String supportType; // 지원 유형 // 신청 내용 필드 - @Column(name = "application_method", nullable = false, columnDefinition = "TEXT") + @Column(name = "application_method", columnDefinition = "TEXT") private String applicationMethod; // 신청 방법(상세) - @Column(name = "application_deadline", nullable = false, columnDefinition = "TEXT") + @Column(name = "application_deadline", columnDefinition = "TEXT") private String applicationDeadline; // 신청 기한(상세) // 추가정보 필드 - @Column(name = "required_documents", columnDefinition = "TEXT") - private String requiredDocuments; // 구비 서류 +// @Column(name = "required_documents", columnDefinition = "TEXT") +// private String requiredDocuments; // 구비 서류 - @Column(name = "contact_info", length = 255) + @Column(name = "contact_info", columnDefinition = "TEXT") private String contactInfo; // 문의처 @Column(name = "online_application_url", columnDefinition = "TEXT") private String onlineApplicationUrl; // 온라인 경로 url - @Column(name = "related_laws", columnDefinition = "TEXT") - private String relatedLaws; // 관련 법률 +// @Column(name = "related_laws", columnDefinition = "TEXT") +// private String relatedLaws; // 관련 법률 // 지원조건 필드 - 유저 정보 비교용 - @Column(name = "target_gender_male", nullable = false) + @Column(name = "target_gender_male") private String targetGenderMale; - @Column(name = "target_gender_Female", nullable = false) + @Column(name = "target_gender_female") private String targetGenderFemale; @Column(name = "target_age_start") @@ -118,19 +118,23 @@ public class PublicService { private Integer bookmarkCnt = 0; - @OneToMany(mappedBy = "publicService",cascade = CascadeType.ALL,fetch = FetchType.LAZY) + @OneToMany(mappedBy = "publicService", cascade = {CascadeType.ALL}, + orphanRemoval = true, fetch = FetchType.LAZY) @Builder.Default private List specialGroups = new ArrayList<>(); - @OneToMany(mappedBy = "publicService",cascade = CascadeType.ALL,fetch = FetchType.LAZY) + @OneToMany(mappedBy = "publicService", cascade = {CascadeType.ALL}, + orphanRemoval = true, fetch = FetchType.LAZY) @Builder.Default private List familyTypes = new ArrayList<>(); - @OneToMany(mappedBy = "publicService",cascade = CascadeType.ALL,fetch = FetchType.LAZY) + @OneToMany(mappedBy = "publicService", cascade = {CascadeType.ALL}, + orphanRemoval = true, fetch = FetchType.LAZY) @Builder.Default private List occupations = new ArrayList<>(); - @OneToMany(mappedBy = "publicService",cascade = CascadeType.ALL,fetch = FetchType.LAZY) + @OneToMany(mappedBy = "publicService", cascade = {CascadeType.ALL}, + orphanRemoval = true, fetch = FetchType.LAZY) @Builder.Default private List businessTypes = new ArrayList<>(); From 39eb0d70dac416f1eae8fcde2a713221d502f480 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=5BCLOUD4=5D=20=EA=B3=A0=EB=B2=94=EC=84=9D?= Date: Sat, 19 Apr 2025 06:34:32 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=EA=B3=B5=EA=B3=B5=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=20=EC=A0=84=EC=B2=B4=20=EC=A1=B0=ED=9A=8C=20=EC=A0=95?= =?UTF-8?q?=EB=A0=AC=20=EB=B0=A9=EC=8B=9D=EA=B3=BC=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=20=EB=B6=84=EC=95=BC=20=EB=B0=98=ED=99=98=20=EB=A7=A4?= =?UTF-8?q?=ED=95=91=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/PublicServiceDetailDataDto.java | 5 +---- .../mapper/PublicServiceMapper.java | 1 + .../service/PublicServiceHandler.java | 21 +++++++++---------- .../util/PublicServiceValidate.java | 8 ++++++- 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/dto/PublicServiceDetailDataDto.java b/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/dto/PublicServiceDetailDataDto.java index 7fb8317..147f3ca 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/dto/PublicServiceDetailDataDto.java +++ b/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/dto/PublicServiceDetailDataDto.java @@ -3,10 +3,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import java.util.List; diff --git a/src/main/java/com/hyetaekon/hyetaekon/publicservice/mapper/PublicServiceMapper.java b/src/main/java/com/hyetaekon/hyetaekon/publicservice/mapper/PublicServiceMapper.java index 5f910f0..f116a50 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/publicservice/mapper/PublicServiceMapper.java +++ b/src/main/java/com/hyetaekon/hyetaekon/publicservice/mapper/PublicServiceMapper.java @@ -12,6 +12,7 @@ @Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE) public interface PublicServiceMapper { @Mapping(source = "id", target = "publicServiceId") + @Mapping(target = "serviceCategory", expression = "java(publicService.getServiceCategory().getType())") PublicServiceListResponseDto toListDto(PublicService publicService); @Mapping(source = "id", target = "publicServiceId") diff --git a/src/main/java/com/hyetaekon/hyetaekon/publicservice/service/PublicServiceHandler.java b/src/main/java/com/hyetaekon/hyetaekon/publicservice/service/PublicServiceHandler.java index ec63664..1d1c76f 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/publicservice/service/PublicServiceHandler.java +++ b/src/main/java/com/hyetaekon/hyetaekon/publicservice/service/PublicServiceHandler.java @@ -35,7 +35,7 @@ public class PublicServiceHandler { private final BookmarkRepository bookmarkRepository; // 서비스분야별 서비스목록 조회(페이지) - public Page getServicesByCategory(ServiceCategory category, Pageable pageable, Long userId) { + /*public Page getServicesByCategory(ServiceCategory category, Pageable pageable, Long userId) { Page services = publicServiceRepository.findByServiceCategory(category, pageable); return services.map(service -> { @@ -46,7 +46,7 @@ public Page getServicesByCategory(ServiceCategory } return dto; }); - } + }*/ // 서비스 상세 조회 @Transactional @@ -99,18 +99,17 @@ public Page getAllServices( Long userId) { // 정렬 기준 설정 (기본값: 가나다순) - Sort.Direction direction = Sort.Direction.ASC; - String sortField = "serviceName"; + Sort sorts = Sort.by(Sort.Order.asc("serviceName")); if (sort != null) { switch (sort.toLowerCase()) { case "bookmark": - sortField = "bookmarkCnt"; - direction = Sort.Direction.DESC; + // 북마크 수 기준 내림차순 정렬, 동일하면 서비스명 오름차순 + sorts = Sort.by(Sort.Order.desc("bookmarkCnt"), Sort.Order.asc("serviceName")); break; case "view": - sortField = "views"; - direction = Sort.Direction.DESC; + // 조회수 기준 내림차순 정렬, 동일하면 서비스명 오름차순 + sorts = Sort.by(Sort.Order.desc("views"), Sort.Order.asc("serviceName")); break; default: // 기본 가나다순 유지 @@ -122,7 +121,7 @@ public Page getAllServices( PageRequest pageRequest = PageRequest.of( pageable.getPageNumber(), pageable.getPageSize(), - Sort.by(direction, sortField) + sorts ); // 필터링 조건에 따른 서비스 조회 @@ -184,7 +183,7 @@ public Page getAllServices( }); } - public Page getBookmarkedServices(Long userId, Pageable pageable) { + public Page getBookmarkedServices(Long userId, Pageable pageable) { Page bookmarkedServices = publicServiceRepository.findByBookmarks_User_Id(userId, pageable); List serviceDtos = bookmarkedServices.getContent().stream() @@ -197,5 +196,5 @@ public Page getBookmarkedServices(Long userId, Pag return new PageImpl<>(serviceDtos, pageable, bookmarkedServices.getTotalElements()); - } + } } diff --git a/src/main/java/com/hyetaekon/hyetaekon/publicservice/util/PublicServiceValidate.java b/src/main/java/com/hyetaekon/hyetaekon/publicservice/util/PublicServiceValidate.java index 3b92454..22c0a6b 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/publicservice/util/PublicServiceValidate.java +++ b/src/main/java/com/hyetaekon/hyetaekon/publicservice/util/PublicServiceValidate.java @@ -28,10 +28,16 @@ public User validateUserById(Long userId) { } public ServiceCategory validateServiceCategory(String categoryName) { - try { + /*try { return ServiceCategory.valueOf(categoryName); } catch (IllegalArgumentException e) { throw new GlobalException(ErrorCode.SERVICE_CATEGORY_NOT_FOUND); + }*/ + for (ServiceCategory category : ServiceCategory.values()) { + if (category.getType().equals(categoryName)) { + return category; + } } + throw new GlobalException(ErrorCode.SERVICE_CATEGORY_NOT_FOUND); } }