diff --git a/build.gradle b/build.gradle index d19b993..baf0348 100644 --- a/build.gradle +++ b/build.gradle @@ -66,9 +66,9 @@ dependencies { runtimeOnly 'com.mysql:mysql-connector-j' // MongoDB - /*implementation 'org.springframework.boot:spring-boot-starter-data-mongodb' - implementation 'org.mongodb:mongodb-driver-sync' - implementation 'org.mongodb:mongodb-driver-core'*/ + implementation 'org.springframework.boot:spring-boot-starter-data-mongodb' +// implementation 'org.mongodb:mongodb-driver-sync' +// implementation 'org.mongodb:mongodb-driver-core' // redis implementation 'org.springframework.boot:spring-boot-starter-data-redis' diff --git a/src/main/java/com/hyetaekon/hyetaekon/HyetaekonApplication.java b/src/main/java/com/hyetaekon/hyetaekon/HyetaekonApplication.java index 2c2faad..8578902 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/HyetaekonApplication.java +++ b/src/main/java/com/hyetaekon/hyetaekon/HyetaekonApplication.java @@ -4,10 +4,12 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; @EnableJpaAuditing @SpringBootApplication @EnableScheduling +@EnableMongoRepositories public class HyetaekonApplication { public static void main(String[] args) { diff --git a/src/main/java/com/hyetaekon/hyetaekon/common/config/SecurityConfig.java b/src/main/java/com/hyetaekon/hyetaekon/common/config/SecurityConfig.java index 0d10bf8..719bb1e 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/common/config/SecurityConfig.java +++ b/src/main/java/com/hyetaekon/hyetaekon/common/config/SecurityConfig.java @@ -50,9 +50,9 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { // 경로별 인가 작업 http .authorizeHttpRequests((auth) -> auth + .requestMatchers("/api/posts/type", "/api/posts/type/**", "/api/posts/search").permitAll() .requestMatchers(SecurityPath.ADMIN_ENDPOINTS).hasRole("ADMIN") .requestMatchers(SecurityPath.USER_ENDPOINTS).hasAnyRole("USER", "ADMIN") - .requestMatchers(HttpMethod.GET, SecurityPath.PUBLIC_GET_ENDPOINTS).permitAll() .requestMatchers(SecurityPath.PUBLIC_ENDPOINTS).permitAll() .anyRequest().permitAll() ); diff --git a/src/main/java/com/hyetaekon/hyetaekon/common/config/SecurityPath.java b/src/main/java/com/hyetaekon/hyetaekon/common/config/SecurityPath.java index 8a1f191..325e229 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/common/config/SecurityPath.java +++ b/src/main/java/com/hyetaekon/hyetaekon/common/config/SecurityPath.java @@ -11,25 +11,17 @@ public class SecurityPath { "/api/users/check-duplicate", "/", "/api/services", + "/api/services/popular", "/api/services/category/*", - "/api/services/detail/*" - }; - - // GET 메소드에 대해 permitAll - public static final String[] PUBLIC_GET_ENDPOINTS = { - "/api/public-data/serviceList/test", - "/api/posts", - "/api/posts/search" + "/api/services/detail/*", + "/api/public-data/serviceList/test" }; - // hasRole("USER") public static final String[] USER_ENDPOINTS = { "/api/users/me", "/api/users/me/**", - "/users/me/recommended/posts", "/api/logout", - "/api/services/popular", "/api/services/*/bookmark", "/api/interests", "/api/interests/me", diff --git a/src/main/java/com/hyetaekon/hyetaekon/common/exception/ErrorCode.java b/src/main/java/com/hyetaekon/hyetaekon/common/exception/ErrorCode.java index 52b2349..824cab0 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/common/exception/ErrorCode.java +++ b/src/main/java/com/hyetaekon/hyetaekon/common/exception/ErrorCode.java @@ -51,7 +51,8 @@ public enum ErrorCode { // 공공서비스 // 유효 JACODE 확인 - INVALID_ENUM_CODE(HttpStatus.BAD_REQUEST, "ENUM-001", "유효하지 않은 코드 값입니다."), + INVALID_ENUM_CODE(HttpStatus.BAD_REQUEST, "SERVICE-001", "유효하지 않은 코드 값입니다."), + INCOMPLETE_SERVICE_DETAIL(HttpStatus.BAD_REQUEST, "SERVICE-002","서비스 상세 정보가 불완전합니다."), SERVICE_CATEGORY_NOT_FOUND(HttpStatus.NOT_FOUND, "SERVICE-001", "해당 서비스 분야를 찾을 수 없습니다."), SERVICE_NOT_FOUND_BY_ID(HttpStatus.NOT_FOUND,"SERVICE-002", "해당 아이디의 서비스를 찾을 수 없습니다"), diff --git a/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/mongodb/document/PublicData.java b/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/mongodb/document/PublicData.java new file mode 100644 index 0000000..6681011 --- /dev/null +++ b/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/mongodb/document/PublicData.java @@ -0,0 +1,37 @@ +package com.hyetaekon.hyetaekon.common.publicdata.mongodb.document; + +import java.time.LocalDateTime; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Document(collection = "service_info") +public class PublicData { + @Id + private String id; + + private String publicServiceId; + private String serviceName; + private String summaryPurpose; + private String serviceCategory; + private List specialGroup; + private List familyType; + + private List occupations; + private List businessTypes; + + // Support conditions fields + private String targetGenderMale; + private String targetGenderFemale; + private Integer targetAgeStart; + private Integer targetAgeEnd; + private String incomeLevel; +} diff --git a/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/mongodb/repository/PublicDataMongoRepository.java b/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/mongodb/repository/PublicDataMongoRepository.java new file mode 100644 index 0000000..ac8f87d --- /dev/null +++ b/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/mongodb/repository/PublicDataMongoRepository.java @@ -0,0 +1,13 @@ +package com.hyetaekon.hyetaekon.common.publicdata.mongodb.repository; + +import com.hyetaekon.hyetaekon.common.publicdata.mongodb.document.PublicData; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public interface PublicDataMongoRepository extends MongoRepository { + Optional findByPublicServiceId(String publicServiceId); +} diff --git a/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/mongodb/service/PublicDataMongoService.java b/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/mongodb/service/PublicDataMongoService.java new file mode 100644 index 0000000..a03cf59 --- /dev/null +++ b/src/main/java/com/hyetaekon/hyetaekon/common/publicdata/mongodb/service/PublicDataMongoService.java @@ -0,0 +1,137 @@ +package com.hyetaekon.hyetaekon.common.publicdata.mongodb.service; + +import com.hyetaekon.hyetaekon.common.publicdata.mongodb.document.PublicData; +import com.hyetaekon.hyetaekon.common.publicdata.mongodb.repository.PublicDataMongoRepository; +import com.hyetaekon.hyetaekon.publicservice.entity.PublicService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +@Slf4j +@Service +@RequiredArgsConstructor +public class PublicDataMongoService { + + private final PublicDataMongoRepository mongoRepository; + private final MongoTemplate mongoTemplate; + + /** + * 단일 공공서비스 엔티티를 MongoDB에 저장 + */ + public PublicData saveToMongo(PublicService publicService) { + PublicData document = convertToDocument(publicService); + return mongoRepository.save(document); + } + + /** + * 여러 공공서비스 엔티티를 MongoDB에 저장 + */ + public List saveAllToMongo(List publicServices) { + List documents = publicServices.stream() + .map(this::convertToDocument) + .collect(Collectors.toList()); + + return mongoRepository.saveAll(documents); + } + + /** + * 공공서비스 엔티티를 MongoDB 문서로 변환 + */ + private PublicData convertToDocument(PublicService publicService) { + // 특수 그룹 정보 추출 + List specialGroups = publicService.getSpecialGroups().stream() + .map(sg -> sg.getSpecialGroupEnum().getType()) + .collect(Collectors.toList()); + + // 가족 유형 정보 추출 + List familyTypes = publicService.getFamilyTypes().stream() + .map(ft -> ft.getFamilyTypeEnum().getType()) + .collect(Collectors.toList()); + + // 직업 정보 추출 + List occupations = publicService.getOccupations().stream() + .map(occ -> occ.getOccupationEnum().getType()) + .collect(Collectors.toList()); + + // 사업체 유형 정보 추출 + List businessTypes = publicService.getBusinessTypes().stream() + .map(bt -> bt.getBusinessTypeEnum().getType()) + .collect(Collectors.toList()); + + // MongoDB 문서 생성 및 반환 + return PublicData.builder() + .publicServiceId(publicService.getId()) + .serviceName(publicService.getServiceName()) + .summaryPurpose(publicService.getSummaryPurpose()) + .serviceCategory(publicService.getServiceCategory().getType()) + .specialGroup(specialGroups) + .familyType(familyTypes) + .occupations(occupations) + .businessTypes(businessTypes) + .targetGenderMale(publicService.getTargetGenderMale()) + .targetGenderFemale(publicService.getTargetGenderFemale()) + .targetAgeStart(publicService.getTargetAgeStart()) + .targetAgeEnd(publicService.getTargetAgeEnd()) + .incomeLevel(publicService.getIncomeLevel()) + .build(); + } + + /** + * 서비스 ID로 문서 조회 + */ + public Optional findByPublicServiceId(String publicServiceId) { + return mongoRepository.findByPublicServiceId(publicServiceId); + } + + /** + * 기존 문서 업데이트 또는 새 문서 생성 + */ + public PublicData updateOrCreateDocument(PublicService publicService) { + Optional existingDoc = mongoRepository.findByPublicServiceId(publicService.getId()); + + if (existingDoc.isPresent()) { + // 기존 문서의 ID 유지하면서 데이터 업데이트 + PublicData newData = convertToDocument(publicService); + newData.setId(existingDoc.get().getId()); + return mongoRepository.save(newData); + } else { + // 새 문서 생성 + return saveToMongo(publicService); + } + } + + /** + * 여러 서비스 문서 업데이트 또는 생성 + */ + public List updateOrCreateBulkDocuments(List services) { + // 기존 ID 목록 가져오기 + List serviceIds = services.stream() + .map(PublicService::getId) + .collect(Collectors.toList()); + + // ID에 해당하는 문서 맵 생성 + Map existingDocsMap = mongoRepository.findAllById(serviceIds).stream() + .collect(Collectors.toMap(PublicData::getPublicServiceId, doc -> doc, (a, b) -> a)); + + // 각 서비스 처리 + List docsToSave = services.stream() + .map(service -> { + PublicData doc = convertToDocument(service); + if (existingDocsMap.containsKey(service.getId())) { + // 기존 문서 ID 유지 + doc.setId(existingDocsMap.get(service.getId()).getId()); + } + return doc; + }) + .collect(Collectors.toList()); + + // 일괄 저장 + return mongoRepository.saveAll(docsToSave); + } +} \ No newline at end of file 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 39881d7..8f23761 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 @@ -4,6 +4,7 @@ import com.hyetaekon.hyetaekon.common.publicdata.dto.PublicServiceDataDto; import com.hyetaekon.hyetaekon.common.publicdata.dto.PublicServiceDetailDataDto; import com.hyetaekon.hyetaekon.common.publicdata.mapper.PublicServiceDataMapper; +import com.hyetaekon.hyetaekon.common.publicdata.mongodb.service.PublicDataMongoService; import com.hyetaekon.hyetaekon.common.publicdata.util.PublicDataPath; import com.hyetaekon.hyetaekon.common.publicdata.util.PublicServiceDataValidate; import com.hyetaekon.hyetaekon.publicservice.entity.*; @@ -30,7 +31,7 @@ @Service @RequiredArgsConstructor public class PublicServiceDataServiceImpl implements PublicServiceDataService { - + private final PublicDataMongoService publicDataMongoService; private final PublicServiceRepository publicServiceRepository; private final PublicServiceDataMapper publicServiceDataMapper; private final PublicServiceDataProviderService publicServiceDataProviderService; @@ -238,14 +239,18 @@ public List upsertServiceData(List= 1000) { - publicServiceRepository.saveAll(entitiesToSave); + List savedEntities = publicServiceRepository.saveAll(entitiesToSave); + + publicDataMongoService.saveAllToMongo(savedEntities); entitiesToSave.clear(); } } // 나머지 데이터 저장 if (!entitiesToSave.isEmpty()) { - publicServiceRepository.saveAll(entitiesToSave); + List savedEntities = publicServiceRepository.saveAll(entitiesToSave); + + publicDataMongoService.saveAllToMongo(savedEntities); } log.info("공공서비스 목록 데이터 {}건 저장 완료", validatedData.size()); @@ -290,14 +295,18 @@ public List upsertServiceDetailData(List= 1000) { - publicServiceRepository.saveAll(entitiesToSave); + List savedEntities = publicServiceRepository.saveAll(entitiesToSave); + + publicDataMongoService.saveAllToMongo(savedEntities); entitiesToSave.clear(); } } // 나머지 데이터 저장 if (!entitiesToSave.isEmpty()) { - publicServiceRepository.saveAll(entitiesToSave); + List savedEntities = publicServiceRepository.saveAll(entitiesToSave); + + publicDataMongoService.saveAllToMongo(savedEntities); } log.info("공공서비스 상세정보 데이터 {}건 저장 완료", validatedData.size()); @@ -346,14 +355,18 @@ public List upsertSupportConditionsData(Lis // 배치 처리 최적화: 1000개 단위로 저장 if (entitiesToSave.size() >= 1000) { - publicServiceRepository.saveAll(entitiesToSave); + List savedEntities = publicServiceRepository.saveAll(entitiesToSave); + + publicDataMongoService.saveAllToMongo(savedEntities); entitiesToSave.clear(); } } // 나머지 데이터 저장 if (!entitiesToSave.isEmpty()) { - publicServiceRepository.saveAll(entitiesToSave); + List savedEntities = publicServiceRepository.saveAll(entitiesToSave); + + publicDataMongoService.saveAllToMongo(savedEntities); } log.info("공공서비스 지원조건 데이터 {}건 저장 완료", validatedData.size()); 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 6815150..c177ea5 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 @@ -60,14 +60,19 @@ public boolean validatePublicServiceData(PublicServiceDataDto.Data data) { return true; } + // PublicServiceDataValidate.java 수정 public boolean validatePublicServiceDetailData(PublicServiceDetailDataDto.Data data) { - if (data.getServicePurpose() == null || data.getServicePurpose().isEmpty() || - data.getSupportTarget() == null || data.getSupportTarget().isEmpty() || - data.getSupportDetail() == null || data.getSupportDetail().isEmpty() || - data.getSupportType() == null || data.getSupportType().isEmpty() || - data.getApplicationMethod() == null || data.getApplicationMethod().isEmpty() || - data.getApplicationDeadline() == null || data.getApplicationDeadline().isEmpty() || - data.getGoverningAgency() == null || data.getGoverningAgency().isEmpty()) { + // 필수 필드 리스트를 먼저 확인 + boolean isValid = data.getServicePurpose() != null && !data.getServicePurpose().isEmpty() && + data.getSupportTarget() != null && !data.getSupportTarget().isEmpty() && + data.getSupportDetail() != null && !data.getSupportDetail().isEmpty() && + data.getSupportType() != null && !data.getSupportType().isEmpty() && + data.getApplicationMethod() != null && !data.getApplicationMethod().isEmpty() && + data.getApplicationDeadline() != null && !data.getApplicationDeadline().isEmpty() && + data.getGoverningAgency() != null && !data.getGoverningAgency().isEmpty() && + data.getContactInfo() != null && !data.getContactInfo().isEmpty(); + + if (!isValid) { log.warn("⚠️ 공공 서비스 상세내용 ID {}에 필수 데이터가 누락되었습니다.", data.getServiceId()); return false; } diff --git a/src/main/java/com/hyetaekon/hyetaekon/post/controller/PostController.java b/src/main/java/com/hyetaekon/hyetaekon/post/controller/PostController.java index d2310b4..7e36aab 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/post/controller/PostController.java +++ b/src/main/java/com/hyetaekon/hyetaekon/post/controller/PostController.java @@ -23,7 +23,7 @@ public class PostController { private final PostService postService; // PostType에 해당하는 게시글 목록 조회 - @GetMapping + @GetMapping("/type") public ResponseEntity> getPosts( @RequestParam(required = false, defaultValue = "전체") String postType, @PageableDefault(page = 0, size = 10) Pageable pageable) { diff --git a/src/main/java/com/hyetaekon/hyetaekon/post/mapper/PostMapper.java b/src/main/java/com/hyetaekon/hyetaekon/post/mapper/PostMapper.java index fbeb91a..e993c25 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/post/mapper/PostMapper.java +++ b/src/main/java/com/hyetaekon/hyetaekon/post/mapper/PostMapper.java @@ -10,9 +10,7 @@ import java.util.Objects; import java.util.stream.Collectors; -@Mapper(componentModel = "spring", - unmappedTargetPolicy = ReportingPolicy.IGNORE, - uses = {PostImageMapper.class}) +@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE) public interface PostMapper { // Post -> PostListResponseDto 변환 @@ -34,10 +32,12 @@ public interface PostMapper { // PostCreateRequestDto -> Post 변환 (새 게시글 생성) @Mapping(target = "createdAt", expression = "java(java.time.LocalDateTime.now())") + @Mapping(target = "postType", ignore = true) Post toEntity(PostCreateRequestDto createDto); // null 아닌 값만 업데이트 @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE) + @Mapping(target = "postType", ignore = true) void updatePostFromDto(PostUpdateRequestDto updateDto, @MappingTarget Post post); // 이미지만 URL 리스트로 변환 (soft delete 처리된 것 제외) diff --git a/src/main/java/com/hyetaekon/hyetaekon/post/service/PostService.java b/src/main/java/com/hyetaekon/hyetaekon/post/service/PostService.java index 0fd7e8b..32fde9e 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/post/service/PostService.java +++ b/src/main/java/com/hyetaekon/hyetaekon/post/service/PostService.java @@ -102,7 +102,7 @@ public PostDetailResponseDto createPost(PostCreateRequestDto requestDto, Long us .orElseThrow(() -> new EntityNotFoundException("사용자를 찾을 수 없습니다: " + userId)); // PostType Enum 변환 - PostType postType = findPostTypeByName(requestDto.getPostType()); + PostType postType = PostType.fromKoreanName(requestDto.getPostType()); // DTO -> Entity 변환 Post post = postMapper.toEntity(requestDto); @@ -138,7 +138,7 @@ public PostDetailResponseDto updatePost(Long postId, PostUpdateRequestDto update // PostType 변환 if (updateDto.getPostType() != null) { - PostType postType = findPostTypeByName(updateDto.getPostType()); + PostType postType = PostType.fromKoreanName(updateDto.getPostType()); post.setPostType(postType); } @@ -233,14 +233,6 @@ private void validateImages(List images) { } } - /** - * 게시글 타입명으로 Enum 조회 - */ - private PostType findPostTypeByName(String postTypeName) { - // 한글명으로 PostType 찾기 - return PostType.fromKoreanName(postTypeName); - } - /** * 사용자가 작성한 게시글 목록 조회 */ 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 f116a50..cd6982c 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/publicservice/mapper/PublicServiceMapper.java +++ b/src/main/java/com/hyetaekon/hyetaekon/publicservice/mapper/PublicServiceMapper.java @@ -13,6 +13,8 @@ public interface PublicServiceMapper { @Mapping(source = "id", target = "publicServiceId") @Mapping(target = "serviceCategory", expression = "java(publicService.getServiceCategory().getType())") + @Mapping(target = "specialGroup", expression = "java(publicService.getSpecialGroups().stream().map(sg -> sg.getSpecialGroupEnum().getType()).collect(java.util.stream.Collectors.toList()))") + @Mapping(target = "familyType", expression = "java(publicService.getFamilyTypes().stream().map(ft -> ft.getFamilyTypeEnum().getType()).collect(java.util.stream.Collectors.toList()))") PublicServiceListResponseDto toListDto(PublicService publicService); @Mapping(source = "id", target = "publicServiceId") diff --git a/src/main/java/com/hyetaekon/hyetaekon/publicservice/repository/PublicServiceRepository.java b/src/main/java/com/hyetaekon/hyetaekon/publicservice/repository/PublicServiceRepository.java index c2128b0..ebe778f 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/publicservice/repository/PublicServiceRepository.java +++ b/src/main/java/com/hyetaekon/hyetaekon/publicservice/repository/PublicServiceRepository.java @@ -29,8 +29,8 @@ public interface PublicServiceRepository extends JpaRepository findWithFilters( @Param("categories") List categories, @Param("specialGroupEnums") List specialGroupEnums, 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 441261b..9f8d892 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/publicservice/service/PublicServiceHandler.java +++ b/src/main/java/com/hyetaekon/hyetaekon/publicservice/service/PublicServiceHandler.java @@ -53,6 +53,11 @@ public class PublicServiceHandler { public PublicServiceDetailResponseDto getServiceDetail(String serviceId, Long userId) { PublicService service = publicServiceValidate.validateServiceById(serviceId); + // 필수 필드가 null인지 검증하는 로직 추가 + if (publicServiceValidate.isDetailInformationIncomplete(service)) { + throw new GlobalException(ErrorCode.INCOMPLETE_SERVICE_DETAIL); + } + // 조회수 증가 service.updateViewsUp(); publicServiceRepository.save(service); 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 22c0a6b..daae86f 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/publicservice/util/PublicServiceValidate.java +++ b/src/main/java/com/hyetaekon/hyetaekon/publicservice/util/PublicServiceValidate.java @@ -40,4 +40,26 @@ public ServiceCategory validateServiceCategory(String categoryName) { } throw new GlobalException(ErrorCode.SERVICE_CATEGORY_NOT_FOUND); } + + /** + * 서비스 상세 정보의 완전성 검증 + * @param service 검증할 공공서비스 객체 + * @return 상세 정보가 불완전하면 true, 충분히 완전하면 false 반환 + */ + public boolean isDetailInformationIncomplete(PublicService service) { + // 필수 필드 중 일정 개수 이상 누락된 경우 true 반환 + int nullCount = 0; + + if (service.getServicePurpose() == null || service.getServicePurpose().isEmpty()) nullCount++; + if (service.getSupportTarget() == null || service.getSupportTarget().isEmpty()) nullCount++; + if (service.getSupportDetail() == null || service.getSupportDetail().isEmpty()) nullCount++; + if (service.getSupportType() == null || service.getSupportType().isEmpty()) nullCount++; + if (service.getApplicationMethod() == null || service.getApplicationMethod().isEmpty()) nullCount++; + if (service.getApplicationDeadline() == null || service.getApplicationDeadline().isEmpty()) nullCount++; + if (service.getGoverningAgency() == null || service.getGoverningAgency().isEmpty()) nullCount++; + if (service.getContactInfo() == null || service.getContactInfo().isEmpty()) nullCount++; + + // 필수 필드 중 3개 이상 누락되면 불완전한 데이터로 판단 + return nullCount >= 3; + } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 315d5b6..ea60cb6 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,8 +1,8 @@ spring: data: -# mongodb: -# uri: mongodb+srv://${MONGODB_USERNAME}:${MONGODB_PASSWORD}@${MONGODB_URL}/${MONGODB_NAME}?retryWrites=true&w=majority&appName=HyetaekOn -# auto-index-creation: true + mongodb: + uri: mongodb+srv://${MONGODB_USERNAME}:${MONGODB_PASSWORD}@${MONGODB_URL}/${MONGODB_NAME}?retryWrites=true&w=majority&appName=HyetaekOn + auto-index-creation: true redis: port: 6379 timeout: 2000