diff --git a/src/main/java/contest/collectingbox/module/collectingbox/application/CollectingBoxService.java b/src/main/java/contest/collectingbox/module/collectingbox/application/CollectingBoxService.java index 365b524..800edad 100644 --- a/src/main/java/contest/collectingbox/module/collectingbox/application/CollectingBoxService.java +++ b/src/main/java/contest/collectingbox/module/collectingbox/application/CollectingBoxService.java @@ -1,20 +1,17 @@ package contest.collectingbox.module.collectingbox.application; -import contest.collectingbox.module.collectingbox.domain.CollectingBox; import contest.collectingbox.module.collectingbox.domain.Tags; import contest.collectingbox.module.collectingbox.domain.repository.CollectingBoxRepository; import contest.collectingbox.module.collectingbox.dto.CollectingBoxDetailResponse; import contest.collectingbox.module.collectingbox.dto.CollectingBoxResponse; -import contest.collectingbox.module.location.domain.DongInfo; -import contest.collectingbox.module.location.domain.DongInfoRepository; import contest.collectingbox.module.location.domain.GeoPoint; +import contest.collectingbox.module.location.domain.repository.DongInfoRepository; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -55,18 +52,10 @@ public List searchCollectingBoxes(final String query, fin } private List searchBySigunguNm(String query, Tags tags) { - return dongInfoRepository.findAllBySigunguNm(query).stream() - .flatMap(dongInfo -> - collectingBoxRepository.findAllByDongInfoAndTags(dongInfo, tags.getTags()).stream()) - .map(CollectingBoxResponse::fromEntity) - .collect(Collectors.toList()); + return collectingBoxRepository.searchBySigunguNm(query, tags); } - private List searchByDongNm(String dongNm, Tags tags) { - DongInfo dongInfo = dongInfoRepository.findByDongNm(dongNm); - List boxes = collectingBoxRepository.findAllByDongInfoAndTags(dongInfo, tags.getTags()); - return boxes.stream() - .map(CollectingBoxResponse::fromEntity) - .collect(Collectors.toList()); + private List searchByDongNm(String query, Tags tags) { + return collectingBoxRepository.searchByDongNm(query, tags); } } diff --git a/src/main/java/contest/collectingbox/module/collectingbox/domain/repository/CollectingBoxRepositoryCustom.java b/src/main/java/contest/collectingbox/module/collectingbox/domain/repository/CollectingBoxRepositoryCustom.java index f3afa06..875fb3b 100644 --- a/src/main/java/contest/collectingbox/module/collectingbox/domain/repository/CollectingBoxRepositoryCustom.java +++ b/src/main/java/contest/collectingbox/module/collectingbox/domain/repository/CollectingBoxRepositoryCustom.java @@ -11,4 +11,8 @@ public interface CollectingBoxRepositoryCustom { CollectingBoxDetailResponse findDetailById(Long id); List findAllWithinArea(GeoPoint center, int radius, Tags tags); + + List searchBySigunguNm(String query, Tags tags); + + List searchByDongNm(String query, Tags tags); } diff --git a/src/main/java/contest/collectingbox/module/collectingbox/domain/repository/CollectingBoxRepositoryImpl.java b/src/main/java/contest/collectingbox/module/collectingbox/domain/repository/CollectingBoxRepositoryImpl.java index 68fc5d7..5758ac5 100644 --- a/src/main/java/contest/collectingbox/module/collectingbox/domain/repository/CollectingBoxRepositoryImpl.java +++ b/src/main/java/contest/collectingbox/module/collectingbox/domain/repository/CollectingBoxRepositoryImpl.java @@ -2,6 +2,7 @@ import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.core.types.dsl.Expressions; +import com.querydsl.jpa.JPAExpressions; import com.querydsl.jpa.impl.JPAQueryFactory; import contest.collectingbox.global.exception.CollectingBoxException; import contest.collectingbox.global.utils.GeometryUtil; @@ -20,6 +21,7 @@ import static contest.collectingbox.global.exception.ErrorCode.NOT_FOUND_COLLECTING_BOX; import static contest.collectingbox.module.collectingbox.domain.QCollectingBox.collectingBox; +import static contest.collectingbox.module.location.domain.QDongInfo.dongInfo; import static contest.collectingbox.module.location.domain.QLocation.location; import static contest.collectingbox.module.review.domain.QReview.review; @@ -87,4 +89,46 @@ public CollectingBoxDetailResponse findDetailById(Long id) { return response; } + + @Override + public List searchBySigunguNm(String query, Tags tags) { + return queryFactory + .select(new QCollectingBoxResponse( + collectingBox.id, + Expressions.stringTemplate("function('st_longitude', {0})", location.point) + .castToNum(double.class), + Expressions.stringTemplate("function('st_latitude', {0})", location.point) + .castToNum(double.class), + collectingBox.tag + )) + .from(collectingBox) + .join(collectingBox.location, location) + .where(location.dongInfo.dongCd.in( + JPAExpressions + .select(dongInfo.dongCd) + .from(dongInfo) + .where(dongInfo.sigunguNm.eq(query)))) + .fetch(); + } + + @Override + public List searchByDongNm(String query, Tags tags) { + return queryFactory + .select(new QCollectingBoxResponse( + collectingBox.id, + Expressions.stringTemplate("function('st_longitude', {0})", location.point) + .castToNum(double.class), + Expressions.stringTemplate("function('st_latitude', {0})", location.point) + .castToNum(double.class), + collectingBox.tag + )) + .from(collectingBox) + .join(collectingBox.location, location) + .where(location.dongInfo.dongCd.in( + JPAExpressions + .select(dongInfo.dongCd) + .from(dongInfo) + .where(dongInfo.dongNm.eq(query)))) + .fetch(); + } } diff --git a/src/main/java/contest/collectingbox/module/location/domain/DongInfoRepository.java b/src/main/java/contest/collectingbox/module/location/domain/DongInfoRepository.java deleted file mode 100644 index a38dab0..0000000 --- a/src/main/java/contest/collectingbox/module/location/domain/DongInfoRepository.java +++ /dev/null @@ -1,17 +0,0 @@ -package contest.collectingbox.module.location.domain; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -import java.util.List; - -public interface DongInfoRepository extends JpaRepository { - DongInfo findBySigunguNmAndDongNm(String sigunguNm, String dongNm); - - @Query("select d from DongInfo d where d.dongNm = :dongNm") - DongInfo findByDongNm(@Param("dongNm") String dongNm); - - @Query("select d from DongInfo d where d.sigunguNm = :sigunguNm") - List findAllBySigunguNm(@Param("sigunguNm") String sigungNm); -} diff --git a/src/main/java/contest/collectingbox/module/location/domain/repository/DongInfoRepository.java b/src/main/java/contest/collectingbox/module/location/domain/repository/DongInfoRepository.java new file mode 100644 index 0000000..9147427 --- /dev/null +++ b/src/main/java/contest/collectingbox/module/location/domain/repository/DongInfoRepository.java @@ -0,0 +1,8 @@ +package contest.collectingbox.module.location.domain.repository; + +import contest.collectingbox.module.location.domain.DongInfo; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface DongInfoRepository extends JpaRepository { + DongInfo findBySigunguNmAndDongNm(String sigunguNm, String dongNm); +} diff --git a/src/main/java/contest/collectingbox/module/location/domain/LocationRepository.java b/src/main/java/contest/collectingbox/module/location/domain/repository/LocationRepository.java similarity index 52% rename from src/main/java/contest/collectingbox/module/location/domain/LocationRepository.java rename to src/main/java/contest/collectingbox/module/location/domain/repository/LocationRepository.java index 0f8146d..0e97859 100644 --- a/src/main/java/contest/collectingbox/module/location/domain/LocationRepository.java +++ b/src/main/java/contest/collectingbox/module/location/domain/repository/LocationRepository.java @@ -1,5 +1,6 @@ -package contest.collectingbox.module.location.domain; +package contest.collectingbox.module.location.domain.repository; +import contest.collectingbox.module.location.domain.Location; import org.springframework.data.jpa.repository.JpaRepository; public interface LocationRepository extends JpaRepository { diff --git a/src/main/java/contest/collectingbox/module/publicdata/AddressInfoDto.java b/src/main/java/contest/collectingbox/module/publicdata/AddressInfoDto.java index 889c6e3..4e92ba8 100644 --- a/src/main/java/contest/collectingbox/module/publicdata/AddressInfoDto.java +++ b/src/main/java/contest/collectingbox/module/publicdata/AddressInfoDto.java @@ -3,7 +3,7 @@ import contest.collectingbox.global.utils.GeometryUtil; import contest.collectingbox.module.collectingbox.domain.CollectingBox; import contest.collectingbox.module.collectingbox.domain.Tag; -import contest.collectingbox.module.location.domain.DongInfoRepository; +import contest.collectingbox.module.location.domain.repository.DongInfoRepository; import contest.collectingbox.module.location.domain.Location; import lombok.*; diff --git a/src/main/java/contest/collectingbox/module/publicdata/PublicDataService.java b/src/main/java/contest/collectingbox/module/publicdata/PublicDataService.java index 2362146..e4621df 100644 --- a/src/main/java/contest/collectingbox/module/publicdata/PublicDataService.java +++ b/src/main/java/contest/collectingbox/module/publicdata/PublicDataService.java @@ -4,7 +4,7 @@ import com.opencsv.exceptions.CsvValidationException; import contest.collectingbox.module.collectingbox.domain.repository.CollectingBoxRepository; import contest.collectingbox.module.collectingbox.domain.Tag; -import contest.collectingbox.module.location.domain.DongInfoRepository; +import contest.collectingbox.module.location.domain.repository.DongInfoRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.json.JSONArray;