-
Notifications
You must be signed in to change notification settings - Fork 0
Feat/#59 키워드 기반 장소 검색 기능 구현 및 일부 오류 수정 #60
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Walkthrough상세 게시물 조회 기능을 추가하여 새로운 GetPostDetailResponse DTO와 매퍼 메서드를 도입하고, 장소 이미지 데이터를 처리하며, 장소 검색 기능을 위치 기반 및 키워드 기반으로 분리하였습니다. Changes
Sequence Diagram(s)sequenceDiagram
actor Client
participant Controller as StudentCouncilPostController
participant Service as StudentCouncilPostService
participant Mapper as StudentCouncilPostMapper
participant PlaceImageRepo as PlaceImagesRepository
participant DB as Database
Client->>Controller: GET /posts/{postId}
Controller->>Service: findById(postId, councilId)
Service->>DB: findPost(postId)
DB-->>Service: StudentCouncilPost
Service->>DB: findPlaceImages(place)
DB-->>Service: List<PlaceImages>
Service->>Mapper: toGetPostDetailResponse(post, images, placeImageUrls, councilId)
Mapper->>Mapper: toSavedPlaceInfo(place, placeImageUrls)
Mapper-->>Mapper: SavedPlaceInfo
Mapper-->>Service: GetPostDetailResponse
Service-->>Controller: GetPostDetailResponse
Controller-->>Client: CommonResponse<GetPostDetailResponse>
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (1)
src/main/java/com/campus/campus/domain/place/presentation/PlaceController.java (1)
63-69: 키워드 파라미터에 유효성 검증이 없습니다.빈 문자열이나 공백만 있는 키워드로 검색이 가능합니다.
@NotBlank또는@Size(min=1)어노테이션 추가를 고려해주세요.♻️ 권장 수정안
+import jakarta.validation.constraints.NotBlank; + @GetMapping("/search/keyword") @Operation(summary = "키워드 기반 장소 검색") -public CommonResponse<List<SavedPlaceInfo>> getPlaceInfoWithKeyword(@RequestParam String keyword) { +public CommonResponse<List<SavedPlaceInfo>> getPlaceInfoWithKeyword(@RequestParam @NotBlank String keyword) { List<SavedPlaceInfo> searchResponse = placeService.searchByKeyword(keyword); return CommonResponse.success(PlaceResponseCode.PLACE_SEARCH_SUCCESS, searchResponse); }
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (7)
src/main/java/com/campus/campus/domain/councilpost/application/dto/response/GetPostDetailResponse.javasrc/main/java/com/campus/campus/domain/councilpost/application/mapper/StudentCouncilPostMapper.javasrc/main/java/com/campus/campus/domain/councilpost/application/service/StudentCouncilPostService.javasrc/main/java/com/campus/campus/domain/councilpost/domain/entity/PostCategory.javasrc/main/java/com/campus/campus/domain/councilpost/presentation/StudentCouncilPostController.javasrc/main/java/com/campus/campus/domain/place/application/service/PlaceService.javasrc/main/java/com/campus/campus/domain/place/presentation/PlaceController.java
🧰 Additional context used
🧬 Code graph analysis (5)
src/main/java/com/campus/campus/domain/councilpost/domain/entity/PostCategory.java (1)
src/main/java/com/campus/campus/domain/councilpost/application/dto/response/NormalizedDateTime.java (1)
NormalizedDateTime(5-9)
src/main/java/com/campus/campus/domain/councilpost/application/mapper/StudentCouncilPostMapper.java (1)
src/main/java/com/campus/campus/domain/councilpost/domain/entity/StudentCouncilPost.java (1)
Entity(26-101)
src/main/java/com/campus/campus/domain/councilpost/application/dto/response/GetPostDetailResponse.java (3)
src/main/java/com/campus/campus/domain/councilpost/application/dto/response/GetPostListForCouncilResponse.java (1)
GetPostListForCouncilResponse(10-32)src/main/java/com/campus/campus/domain/councilpost/application/dto/response/GetPostResponse.java (1)
Builder(13-35)src/main/java/com/campus/campus/domain/councilpost/application/dto/response/GetPostForUserResponse.java (1)
Builder(13-36)
src/main/java/com/campus/campus/domain/place/presentation/PlaceController.java (3)
src/main/java/com/campus/campus/domain/place/application/service/PartnershipPlaceService.java (1)
Slf4j(38-194)src/main/java/com/campus/campus/domain/school/presentation/SchoolController.java (1)
RestController(20-55)src/main/java/com/campus/campus/domain/place/domain/repository/PlaceRepository.java (1)
PlaceRepository(10-15)
src/main/java/com/campus/campus/domain/councilpost/application/service/StudentCouncilPostService.java (3)
src/main/java/com/campus/campus/domain/councilpost/domain/repository/PostImageRepository.java (1)
PostImageRepository(12-29)src/main/java/com/campus/campus/domain/councilpost/domain/entity/StudentCouncilPost.java (1)
update(61-83)src/main/java/com/campus/campus/domain/place/domain/entity/PlaceImages.java (1)
Entity(18-40)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: build
🔇 Additional comments (12)
src/main/java/com/campus/campus/domain/place/application/service/PlaceService.java (2)
63-90: 검색 메서드 분리 및 코드 중복 제거가 잘 되었습니다.
searchByLocationAndKeyword와searchByKeyword로 검색 기능을 분리하고, 공통 로직을processSearchResults로 추출하여 DRY 원칙을 잘 적용했습니다.
154-185: 공통 처리 로직이 잘 추출되었습니다.
processSearchResults메서드가 후보 생성, 이미지 조회, 비동기 처리를 깔끔하게 캡슐화했습니다.completeOnTimeout과exceptionally를 통한 타임아웃 및 예외 처리도 적절합니다.src/main/java/com/campus/campus/domain/place/presentation/PlaceController.java (1)
41-61:CommonResponse래핑이 잘 적용되었습니다.기존 raw list 반환에서
CommonResponse.success()로 변경하여 일관된 API 응답 형식을 유지합니다. 단, 기존/search엔드포인트의keyword파라미터에도 동일한 유효성 검증 추가를 고려해주세요.src/main/java/com/campus/campus/domain/councilpost/domain/entity/PostCategory.java (1)
32-36:LocalTime.MAX반올림 문제 수정이 적절합니다.
LocalTime.MAX(23:59:59.999999999)는 나노초 정밀도로 인해 데이터베이스 저장 시 다음 날로 반올림될 수 있습니다.LocalTime.of(23, 59, 59)로 명시적으로 지정하여 안전하게 처리됩니다.src/main/java/com/campus/campus/domain/councilpost/application/dto/response/GetPostDetailResponse.java (1)
14-36: 새로운 상세 조회 응답 DTO가 잘 설계되었습니다.기존
GetPostResponse의placeName(String) 대신SavedPlaceInfo객체를 사용하여 장소 정보를 풍부하게 제공합니다.@JsonInclude(NON_NULL)과@Builder패턴이 기존 DTO들과 일관성 있게 적용되었습니다.src/main/java/com/campus/campus/domain/councilpost/presentation/StudentCouncilPostController.java (1)
171-177: 상세 조회 응답 타입 변경이 적절합니다.
GetPostResponse에서GetPostDetailResponse로 변경하여 장소의 전체 정보(SavedPlaceInfo)를 반환하도록 업데이트되었습니다. PR 목표에 부합하는 변경입니다.src/main/java/com/campus/campus/domain/councilpost/application/mapper/StudentCouncilPostMapper.java (2)
107-132: LGTM!
toGetPostDetailResponse메서드가 기존toGetPostResponse와 일관된 패턴으로 잘 구현되었습니다.SavedPlaceInfo를 통해 Place 객체 전체 정보를 반환하는 구조가 적절하며, null 처리도 올바르게 되어 있습니다.
221-236: LGTM!
toSavedPlaceInfo헬퍼 메서드가 적절하게 구현되었습니다.place에 대한 null 체크와imageUrls에 대한 빈 리스트 폴백 처리가 올바릅니다.src/main/java/com/campus/campus/domain/councilpost/application/service/StudentCouncilPostService.java (4)
104-118: LGTM!
findById메서드가GetPostDetailResponse를 반환하도록 업데이트되었고, Place 이미지 URL을 포함하는 로직이 올바르게 추가되었습니다.
175-194: 이미지 중복 삭제 방지 및 트랜잭션 롤백 문제 수정 확인
Set<String>을 사용하여 중복 이미지 URL 삭제 시도를 방지하고, 일반Exception을 catch하여 OCI 삭제 실패 시 트랜잭션이 롤백되지 않도록 수정되었습니다. PR 목표에 맞게 잘 구현되었습니다.
259-267: LGTM!
getPlaceImageUrls헬퍼 메서드가 적절하게 구현되었습니다.place와placeKey에 대한 null 체크가 방어적으로 잘 처리되어 있습니다.
270-298:cleanupUnusedImages에서 동일한 수정 적용 확인
delete메서드와 동일하게Set<String>으로 중복 삭제 방지 및 일반Exceptioncatch로 트랜잭션 롤백 문제가 수정되었습니다. 두 메서드 간 일관성이 유지되어 좋습니다.
🔀 변경 내용
✅ 작업 항목
추가 작업(수정)
추가 작업(오류 해결)
📸 스크린샷 (선택)
키워드 기반 장소 검색 기능 구현
상세 조회 시 Place 객체가 전부 반환
📎 참고 이슈
관련 이슈 번호 #59
Summary by CodeRabbit
릴리스 노트
New Features
Bug Fixes
Refactor
✏️ Tip: You can customize this high-level summary in your review settings.