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 a7bcfcc..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 @@ -33,6 +33,7 @@ class KakaoMapClient internal constructor( x = document.x.toDouble(), y = document.y.toDouble(), region = document.addressName.toRegion(), + 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 2d7bac6..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 @@ -10,5 +10,6 @@ data class Landmark( 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/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 7dd14e7..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,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-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/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..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 @@ -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? = null, ) : 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, ) }