From 91431d02685e6b4ce8fa89e3047d01b2d4389e41 Mon Sep 17 00:00:00 2001 From: leehaneum Date: Sat, 7 Feb 2026 17:45:15 +0900 Subject: [PATCH 1/2] feat: add landmark category enum field --- .../src/main/kotlin/com/pida/client/map/KakaoMapClient.kt | 2 ++ .../core-domain/src/main/kotlin/com/pida/place/Landmark.kt | 5 +++++ .../src/main/kotlin/com/pida/place/NewLandmark.kt | 2 ++ .../pida/storage/db/core/landmark/LandmarkCoreRepository.kt | 1 + .../com/pida/storage/db/core/landmark/LandmarkEntity.kt | 5 +++++ 5 files changed, 15 insertions(+) diff --git a/pida-clients/map-client/src/main/kotlin/com/pida/client/map/KakaoMapClient.kt b/pida-clients/map-client/src/main/kotlin/com/pida/client/map/KakaoMapClient.kt index a7bcfcc..e356460 100644 --- a/pida-clients/map-client/src/main/kotlin/com/pida/client/map/KakaoMapClient.kt +++ b/pida-clients/map-client/src/main/kotlin/com/pida/client/map/KakaoMapClient.kt @@ -1,5 +1,6 @@ package com.pida.client.map +import com.pida.place.LandmarkCategory import com.pida.place.LandmarkSearchClient import com.pida.place.NewLandmark import com.pida.support.extension.logger @@ -33,6 +34,7 @@ class KakaoMapClient internal constructor( x = document.x.toDouble(), y = document.y.toDouble(), region = document.addressName.toRegion(), + category = LandmarkCategory.SUBWAY, ) } } diff --git a/pida-core/core-domain/src/main/kotlin/com/pida/place/Landmark.kt b/pida-core/core-domain/src/main/kotlin/com/pida/place/Landmark.kt index 2d7bac6..acc0280 100644 --- a/pida-core/core-domain/src/main/kotlin/com/pida/place/Landmark.kt +++ b/pida-core/core-domain/src/main/kotlin/com/pida/place/Landmark.kt @@ -4,11 +4,16 @@ import com.pida.support.geo.GeoJson import com.pida.support.geo.Region import java.time.LocalDateTime +enum class LandmarkCategory { + SUBWAY, +} + data class Landmark( val id: Long, val name: String, val address: String?, val pinPoint: GeoJson, // Point GeoJson val region: Region, + val category: LandmarkCategory, val deletedAt: LocalDateTime?, ) diff --git a/pida-core/core-domain/src/main/kotlin/com/pida/place/NewLandmark.kt b/pida-core/core-domain/src/main/kotlin/com/pida/place/NewLandmark.kt index 7dd14e7..a6ae2c5 100644 --- a/pida-core/core-domain/src/main/kotlin/com/pida/place/NewLandmark.kt +++ b/pida-core/core-domain/src/main/kotlin/com/pida/place/NewLandmark.kt @@ -9,6 +9,7 @@ data class NewLandmark( val x: Double, val y: Double, val region: Region, + val category: LandmarkCategory, ) { fun toLandmark(): Landmark = Landmark( @@ -17,6 +18,7 @@ data class NewLandmark( address = address, pinPoint = GeoJson.Point(listOf(x, y)), region = region, + category = category, deletedAt = null, ) } diff --git a/pida-storage/db-core/src/main/kotlin/com/pida/storage/db/core/landmark/LandmarkCoreRepository.kt b/pida-storage/db-core/src/main/kotlin/com/pida/storage/db/core/landmark/LandmarkCoreRepository.kt index 0ed0d08..abbcc8e 100644 --- a/pida-storage/db-core/src/main/kotlin/com/pida/storage/db/core/landmark/LandmarkCoreRepository.kt +++ b/pida-storage/db-core/src/main/kotlin/com/pida/storage/db/core/landmark/LandmarkCoreRepository.kt @@ -34,6 +34,7 @@ class LandmarkCoreRepository( address = it.address, pinPoint = GEOMETRY_FACTORY.createPoint(Coordinate(it.x, it.y)), region = it.region, + category = it.category, ) } landmarkJpaRepository.saveAll(entities) diff --git a/pida-storage/db-core/src/main/kotlin/com/pida/storage/db/core/landmark/LandmarkEntity.kt b/pida-storage/db-core/src/main/kotlin/com/pida/storage/db/core/landmark/LandmarkEntity.kt index eaac097..5354d9e 100644 --- a/pida-storage/db-core/src/main/kotlin/com/pida/storage/db/core/landmark/LandmarkEntity.kt +++ b/pida-storage/db-core/src/main/kotlin/com/pida/storage/db/core/landmark/LandmarkEntity.kt @@ -1,6 +1,7 @@ package com.pida.storage.db.core.landmark import com.pida.place.Landmark +import com.pida.place.LandmarkCategory import com.pida.storage.db.core.support.BaseEntity import com.pida.support.geo.GeoJson import com.pida.support.geo.Region @@ -28,6 +29,9 @@ class LandmarkEntity( @Enumerated(value = EnumType.STRING) @Column(columnDefinition = "varchar(50)") val region: Region, + @Enumerated(value = EnumType.STRING) + @Column(columnDefinition = "varchar(50)") + val category: LandmarkCategory, ) : BaseEntity() { fun toLandmark(): Landmark = Landmark( @@ -36,6 +40,7 @@ class LandmarkEntity( address = address, pinPoint = GeoJson.Point(listOf(pinPoint.x, pinPoint.y)), region = region, + category = category, deletedAt = deletedAt, ) } From 366a8a94873967d53d885c5ec2d137cec12104ef Mon Sep 17 00:00:00 2001 From: leehaneum Date: Sat, 7 Feb 2026 18:32:30 +0900 Subject: [PATCH 2/2] feat: prioritize subway results in place search --- .../com/pida/client/map/KakaoCategoryCode.kt | 21 +++++++++++++++++++ .../com/pida/client/map/KakaoMapClient.kt | 3 +-- .../main/kotlin/com/pida/place/Landmark.kt | 6 +----- .../kotlin/com/pida/place/LandmarkCategory.kt | 8 +++++++ .../main/kotlin/com/pida/place/NewLandmark.kt | 2 +- .../main/kotlin/com/pida/place/PlaceFacade.kt | 11 +++++++++- .../db/core/landmark/LandmarkEntity.kt | 2 +- 7 files changed, 43 insertions(+), 10 deletions(-) create mode 100644 pida-clients/map-client/src/main/kotlin/com/pida/client/map/KakaoCategoryCode.kt create mode 100644 pida-core/core-domain/src/main/kotlin/com/pida/place/LandmarkCategory.kt diff --git a/pida-clients/map-client/src/main/kotlin/com/pida/client/map/KakaoCategoryCode.kt b/pida-clients/map-client/src/main/kotlin/com/pida/client/map/KakaoCategoryCode.kt new file mode 100644 index 0000000..9abc706 --- /dev/null +++ b/pida-clients/map-client/src/main/kotlin/com/pida/client/map/KakaoCategoryCode.kt @@ -0,0 +1,21 @@ +package com.pida.client.map + +import com.pida.place.LandmarkCategory + +private enum class KakaoCategoryCode( + val landmarkCategory: LandmarkCategory, +) { + SW8(LandmarkCategory.SUBWAY), + AT4(LandmarkCategory.TOUR_SPOT), + CE7(LandmarkCategory.CAFE), + FD6(LandmarkCategory.RESTAURANT), + ; + + companion object { + private val CODE_MAP = entries.associateBy { it.name } + + fun from(code: String): KakaoCategoryCode? = CODE_MAP[code] + } +} + +fun KakaoPlaceDocument.toLandmarkCategory(): LandmarkCategory? = KakaoCategoryCode.from(categoryGroupCode)?.landmarkCategory diff --git a/pida-clients/map-client/src/main/kotlin/com/pida/client/map/KakaoMapClient.kt b/pida-clients/map-client/src/main/kotlin/com/pida/client/map/KakaoMapClient.kt index e356460..317b4d1 100644 --- a/pida-clients/map-client/src/main/kotlin/com/pida/client/map/KakaoMapClient.kt +++ b/pida-clients/map-client/src/main/kotlin/com/pida/client/map/KakaoMapClient.kt @@ -1,6 +1,5 @@ package com.pida.client.map -import com.pida.place.LandmarkCategory import com.pida.place.LandmarkSearchClient import com.pida.place.NewLandmark import com.pida.support.extension.logger @@ -34,7 +33,7 @@ class KakaoMapClient internal constructor( x = document.x.toDouble(), y = document.y.toDouble(), region = document.addressName.toRegion(), - category = LandmarkCategory.SUBWAY, + category = document.toLandmarkCategory(), ) } } diff --git a/pida-core/core-domain/src/main/kotlin/com/pida/place/Landmark.kt b/pida-core/core-domain/src/main/kotlin/com/pida/place/Landmark.kt index acc0280..b629324 100644 --- a/pida-core/core-domain/src/main/kotlin/com/pida/place/Landmark.kt +++ b/pida-core/core-domain/src/main/kotlin/com/pida/place/Landmark.kt @@ -4,16 +4,12 @@ import com.pida.support.geo.GeoJson import com.pida.support.geo.Region import java.time.LocalDateTime -enum class LandmarkCategory { - SUBWAY, -} - data class Landmark( val id: Long, val name: String, val address: String?, val pinPoint: GeoJson, // Point GeoJson val region: Region, - val category: LandmarkCategory, + val category: LandmarkCategory?, val deletedAt: LocalDateTime?, ) diff --git a/pida-core/core-domain/src/main/kotlin/com/pida/place/LandmarkCategory.kt b/pida-core/core-domain/src/main/kotlin/com/pida/place/LandmarkCategory.kt new file mode 100644 index 0000000..3f7e074 --- /dev/null +++ b/pida-core/core-domain/src/main/kotlin/com/pida/place/LandmarkCategory.kt @@ -0,0 +1,8 @@ +package com.pida.place + +enum class LandmarkCategory { + SUBWAY, + RESTAURANT, + CAFE, + TOUR_SPOT, +} diff --git a/pida-core/core-domain/src/main/kotlin/com/pida/place/NewLandmark.kt b/pida-core/core-domain/src/main/kotlin/com/pida/place/NewLandmark.kt index a6ae2c5..bc78cdc 100644 --- a/pida-core/core-domain/src/main/kotlin/com/pida/place/NewLandmark.kt +++ b/pida-core/core-domain/src/main/kotlin/com/pida/place/NewLandmark.kt @@ -9,7 +9,7 @@ data class NewLandmark( val x: Double, val y: Double, val region: Region, - val category: LandmarkCategory, + val category: LandmarkCategory?, ) { fun toLandmark(): Landmark = Landmark( diff --git a/pida-core/core-domain/src/main/kotlin/com/pida/place/PlaceFacade.kt b/pida-core/core-domain/src/main/kotlin/com/pida/place/PlaceFacade.kt index 23a1242..0ce371d 100644 --- a/pida-core/core-domain/src/main/kotlin/com/pida/place/PlaceFacade.kt +++ b/pida-core/core-domain/src/main/kotlin/com/pida/place/PlaceFacade.kt @@ -22,6 +22,11 @@ class PlaceFacade( private const val MIN_LANDMARK_SEARCH_COUNT = 2 private const val MAX_LANDMARK_SEARCH_COUNT = 5 private val SEARCH_REGIONS = setOf(Region.SEOUL, Region.GYEONGGI) + private val LANDMARK_CATEGORY_PRIORITY = + listOf( + LandmarkCategory.SUBWAY, + // 정렬 우선순위 여기에 추가 + ) } suspend fun search( @@ -50,7 +55,11 @@ class PlaceFacade( PlaceSearchResult( districts = districtsDeferred.await().take(MAX_DISTRICT_SEARCH_COUNT), - landmarks = landmarks.filter { it.region in SEARCH_REGIONS }.take(MAX_LANDMARK_SEARCH_COUNT), + landmarks = + landmarks + .filter { it.region in SEARCH_REGIONS } + .sortedBy { LANDMARK_CATEGORY_PRIORITY.indexOf(it.category).takeIf { i -> i >= 0 } ?: Int.MAX_VALUE } + .take(MAX_LANDMARK_SEARCH_COUNT), flowerSpots = flowerSpotsDeferred.await(), ) } diff --git a/pida-storage/db-core/src/main/kotlin/com/pida/storage/db/core/landmark/LandmarkEntity.kt b/pida-storage/db-core/src/main/kotlin/com/pida/storage/db/core/landmark/LandmarkEntity.kt index 5354d9e..149c986 100644 --- a/pida-storage/db-core/src/main/kotlin/com/pida/storage/db/core/landmark/LandmarkEntity.kt +++ b/pida-storage/db-core/src/main/kotlin/com/pida/storage/db/core/landmark/LandmarkEntity.kt @@ -31,7 +31,7 @@ class LandmarkEntity( val region: Region, @Enumerated(value = EnumType.STRING) @Column(columnDefinition = "varchar(50)") - val category: LandmarkCategory, + val category: LandmarkCategory? = null, ) : BaseEntity() { fun toLandmark(): Landmark = Landmark(