From 8ce0faffb6cd79c60ef019b65e5fb06c7f27a5b7 Mon Sep 17 00:00:00 2001 From: KiSeungMin Date: Sat, 19 Jul 2025 15:03:42 +0900 Subject: [PATCH 01/15] =?UTF-8?q?[chore]=20AWS=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.gradle b/build.gradle index 75c77adf..e5dcc740 100644 --- a/build.gradle +++ b/build.gradle @@ -35,6 +35,8 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'io.jsonwebtoken:jjwt-api:0.11.5' implementation 'jakarta.servlet:jakarta.servlet-api:6.0.0' + implementation 'com.amazonaws:aws-java-sdk-core:1.12.698' + implementation 'com.amazonaws:aws-java-sdk-s3:1.12.698' runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5' runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5' From 45aa64586836ebdef40086218c9e16342086b5f5 Mon Sep 17 00:00:00 2001 From: KiSeungMin Date: Sat, 19 Jul 2025 15:04:43 +0900 Subject: [PATCH 02/15] =?UTF-8?q?[feat]=20=EC=9B=A8=EC=9D=B4=EB=B8=94?= =?UTF-8?q?=EC=A1=B4=20=EC=83=81=EC=84=B8=20=EC=A0=95=EB=B3=B4=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EC=8B=9C=20=EB=B0=A9=EB=AC=B8=20=EA=B8=B0=EB=A1=9D?= =?UTF-8?q?=20=EC=A0=80=EC=9E=A5=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/wayblezone/controller/WaybleZoneController.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/wayble/server/wayblezone/controller/WaybleZoneController.java b/src/main/java/com/wayble/server/wayblezone/controller/WaybleZoneController.java index a64923a1..51063d3c 100644 --- a/src/main/java/com/wayble/server/wayblezone/controller/WaybleZoneController.java +++ b/src/main/java/com/wayble/server/wayblezone/controller/WaybleZoneController.java @@ -13,6 +13,7 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -57,7 +58,8 @@ public CommonResponse getWaybleZoneDetail( ) { // TODO: JWT에서 userId 추출해서 상세 조회 기록 남기기 - // waybleZoneVisitLogService.saveVisitLog(null, waybleZoneId); + Long userId = (Long) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + waybleZoneVisitLogService.saveVisitLog(userId, waybleZoneId); return CommonResponse.success(waybleZoneService.getWaybleZoneDetail(waybleZoneId)); } } \ No newline at end of file From 3a6af0d20b30b74b3a320ce1f1139ee5432c2cf8 Mon Sep 17 00:00:00 2001 From: KiSeungMin Date: Sat, 19 Jul 2025 15:32:53 +0900 Subject: [PATCH 03/15] =?UTF-8?q?[feat]=20=EC=9B=A8=EC=9D=B4=EB=B8=94?= =?UTF-8?q?=EC=A1=B4=20=EC=B6=94=EC=B2=9C=20=EA=B8=B0=EB=8A=A5=20JWT=20?= =?UTF-8?q?=EC=9D=B8=EC=A6=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...WaybleZoneRecommendApiIntegrationTest.java | 34 +++++++++++++++---- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/test/java/com/wayble/server/explore/WaybleZoneRecommendApiIntegrationTest.java b/src/test/java/com/wayble/server/explore/WaybleZoneRecommendApiIntegrationTest.java index 61b09b63..484bb785 100644 --- a/src/test/java/com/wayble/server/explore/WaybleZoneRecommendApiIntegrationTest.java +++ b/src/test/java/com/wayble/server/explore/WaybleZoneRecommendApiIntegrationTest.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.wayble.server.common.config.security.jwt.JwtTokenProvider; import com.wayble.server.common.entity.Address; import com.wayble.server.explore.dto.recommend.WaybleZoneRecommendResponseDto; import com.wayble.server.explore.dto.search.WaybleZoneDocumentRegisterDto; @@ -25,8 +26,11 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.test.annotation.Rollback; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; +import org.springframework.transaction.annotation.Transactional; import java.nio.charset.StandardCharsets; import java.time.LocalDate; @@ -46,6 +50,9 @@ public class WaybleZoneRecommendApiIntegrationTest { @Autowired private MockMvc mockMvc; + @Autowired + private JwtTokenProvider jwtTokenProvider; + @Autowired private UserRepository userRepository; @@ -70,11 +77,13 @@ public class WaybleZoneRecommendApiIntegrationTest { private static final double RADIUS = 50.0; - private static final Long SAMPLES = 1000L; + private static final Long SAMPLES = 100L; private static final String baseUrl = "/api/v1/wayble-zones/recommend"; - private final Long userId = 1L; + private Long userId; + + private String token; List nameList = new ArrayList<>(Arrays.asList( "던킨도너츠", @@ -91,6 +100,14 @@ public class WaybleZoneRecommendApiIntegrationTest { @BeforeAll public void setup() { + User testUser = User.createUser( + "testUser", "testUsername", "test@email.com", "password", + generateRandomBirthDate(), Gender.MALE, LoginType.KAKAO, UserType.DISABLED + ); + userRepository.save(testUser); + userId = testUser.getId(); + token = jwtTokenProvider.generateToken(userId, "ROLE_USER"); + for (int i = 1; i <= SAMPLES / 2; i++) { Long zoneId = (long) (Math.random() * SAMPLES) + 1; if(!recommendLogDocumentRepository.existsByUserIdAndZoneId(userId, zoneId)) { @@ -135,12 +152,12 @@ public void setup() { User user = User.createUser( "user" + i, - "user" + i, - "user email" + i, - "user password" + i, + "username" + i, + "user" + i + "@email", + "password" + i, generateRandomBirthDate(), Gender.values()[i % 2], - LoginType.BASIC, + LoginType.values()[i % LoginType.values().length], UserType.DISABLED ); userRepository.save(user); @@ -167,6 +184,7 @@ public void teardown() { waybleZoneVisitLogDocumentRepository.deleteAll(); recommendLogDocumentRepository.deleteAll(); userRepository.deleteAll(); + //SecurityContextHolder.getContext().setAuthentication(null); } @Test @@ -197,6 +215,7 @@ public void checkDataExists() { @DisplayName("추천 기록 저장 테스트") public void saveRecommendLogTest() throws Exception { MvcResult result = mockMvc.perform(get(baseUrl) + .header("Authorization", "Bearer " + token) .param("userId", String.valueOf(userId)) .param("latitude", String.valueOf(LATITUDE)) .param("longitude", String.valueOf(LONGITUDE)) @@ -235,8 +254,8 @@ public void saveRecommendLogTest() throws Exception { @Test @DisplayName("추천 기능 테스트") public void recommendWaybleZone() throws Exception { - MvcResult result = mockMvc.perform(get(baseUrl) + .header("Authorization", "Bearer " + token) .param("userId", String.valueOf(userId)) .param("latitude", String.valueOf(LATITUDE)) .param("longitude", String.valueOf(LONGITUDE)) @@ -281,6 +300,7 @@ public void recommendWaybleZone() throws Exception { @DisplayName("추천 결과 상위 N개 값 테스트") public void recommendWaybleZoneTop20() throws Exception { MvcResult result = mockMvc.perform(get(baseUrl) + .header("Authorization", "Bearer " + token) .param("userId", String.valueOf(userId)) .param("latitude", String.valueOf(LATITUDE)) .param("longitude", String.valueOf(LONGITUDE)) From 469de36a79aae46a48a665cdc20670ad115c5553 Mon Sep 17 00:00:00 2001 From: KiSeungMin Date: Sat, 19 Jul 2025 15:53:40 +0900 Subject: [PATCH 04/15] =?UTF-8?q?[feat]=20soft=20delete=EB=90=9C=20?= =?UTF-8?q?=ED=95=84=EB=93=9C=EB=A5=BC=20=EB=90=98=EC=82=B4=EB=A6=AC?= =?UTF-8?q?=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/wayble/server/common/entity/BaseEntity.java | 4 ++++ .../com/wayble/server/user/repository/UserRepository.java | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/main/java/com/wayble/server/common/entity/BaseEntity.java b/src/main/java/com/wayble/server/common/entity/BaseEntity.java index be3badb6..9044360d 100644 --- a/src/main/java/com/wayble/server/common/entity/BaseEntity.java +++ b/src/main/java/com/wayble/server/common/entity/BaseEntity.java @@ -23,4 +23,8 @@ public class BaseEntity { @Column(name = "deleted_at") private LocalDateTime deletedAt; + + public void restore() { + this.deletedAt = null; + } } diff --git a/src/main/java/com/wayble/server/user/repository/UserRepository.java b/src/main/java/com/wayble/server/user/repository/UserRepository.java index b375ea87..83853df5 100644 --- a/src/main/java/com/wayble/server/user/repository/UserRepository.java +++ b/src/main/java/com/wayble/server/user/repository/UserRepository.java @@ -3,6 +3,8 @@ import com.wayble.server.user.entity.LoginType; import com.wayble.server.user.entity.User; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.Optional; @@ -10,4 +12,6 @@ public interface UserRepository extends JpaRepository { boolean existsByEmailAndLoginType(String email, LoginType loginType); Optional findByEmailAndLoginType(String email, LoginType loginType); + @Query(value = "SELECT * FROM user WHERE email = :email AND login_type = :#{#loginType.name()} AND deleted_at IS NOT NULL", nativeQuery = true) + Optional findDeletedUserByEmailAndLoginType(String email, @Param("loginType") LoginType loginType); } From 5d74fb26394b0024ababe053b1b95945ceefc23a Mon Sep 17 00:00:00 2001 From: KiSeungMin Date: Mon, 21 Jul 2025 15:20:18 +0900 Subject: [PATCH 05/15] =?UTF-8?q?[fix]=20user=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EC=A4=91=EB=B3=B5=EC=9C=BC=EB=A1=9C=20=EC=9D=B8?= =?UTF-8?q?=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/repository/UserRepository.java | 2 - ...WaybleZoneRecommendApiIntegrationTest.java | 9 ++-- .../WaybleZoneSearchApiIntegrationTest.java | 44 +++++++++++++++++++ 3 files changed, 47 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/wayble/server/user/repository/UserRepository.java b/src/main/java/com/wayble/server/user/repository/UserRepository.java index 83853df5..01289862 100644 --- a/src/main/java/com/wayble/server/user/repository/UserRepository.java +++ b/src/main/java/com/wayble/server/user/repository/UserRepository.java @@ -12,6 +12,4 @@ public interface UserRepository extends JpaRepository { boolean existsByEmailAndLoginType(String email, LoginType loginType); Optional findByEmailAndLoginType(String email, LoginType loginType); - @Query(value = "SELECT * FROM user WHERE email = :email AND login_type = :#{#loginType.name()} AND deleted_at IS NOT NULL", nativeQuery = true) - Optional findDeletedUserByEmailAndLoginType(String email, @Param("loginType") LoginType loginType); } diff --git a/src/test/java/com/wayble/server/explore/WaybleZoneRecommendApiIntegrationTest.java b/src/test/java/com/wayble/server/explore/WaybleZoneRecommendApiIntegrationTest.java index 484bb785..04f1ce4c 100644 --- a/src/test/java/com/wayble/server/explore/WaybleZoneRecommendApiIntegrationTest.java +++ b/src/test/java/com/wayble/server/explore/WaybleZoneRecommendApiIntegrationTest.java @@ -26,11 +26,8 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.test.annotation.Rollback; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; -import org.springframework.transaction.annotation.Transactional; import java.nio.charset.StandardCharsets; import java.time.LocalDate; @@ -101,9 +98,10 @@ public class WaybleZoneRecommendApiIntegrationTest { @BeforeAll public void setup() { User testUser = User.createUser( - "testUser", "testUsername", "test@email.com", "password", + "testUser", "testUsername", UUID.randomUUID() + "@email", "password", generateRandomBirthDate(), Gender.MALE, LoginType.KAKAO, UserType.DISABLED ); + userRepository.save(testUser); userId = testUser.getId(); token = jwtTokenProvider.generateToken(userId, "ROLE_USER"); @@ -153,7 +151,7 @@ public void setup() { User user = User.createUser( "user" + i, "username" + i, - "user" + i + "@email", + UUID.randomUUID() + "@email", "password" + i, generateRandomBirthDate(), Gender.values()[i % 2], @@ -184,7 +182,6 @@ public void teardown() { waybleZoneVisitLogDocumentRepository.deleteAll(); recommendLogDocumentRepository.deleteAll(); userRepository.deleteAll(); - //SecurityContextHolder.getContext().setAuthentication(null); } @Test diff --git a/src/test/java/com/wayble/server/explore/WaybleZoneSearchApiIntegrationTest.java b/src/test/java/com/wayble/server/explore/WaybleZoneSearchApiIntegrationTest.java index ad299b58..8c409094 100644 --- a/src/test/java/com/wayble/server/explore/WaybleZoneSearchApiIntegrationTest.java +++ b/src/test/java/com/wayble/server/explore/WaybleZoneSearchApiIntegrationTest.java @@ -3,11 +3,17 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.wayble.server.common.config.security.jwt.JwtTokenProvider; import com.wayble.server.common.entity.Address; import com.wayble.server.explore.dto.search.WaybleZoneDocumentRegisterDto; import com.wayble.server.explore.dto.search.WaybleZoneSearchResponseDto; import com.wayble.server.explore.entity.WaybleZoneDocument; import com.wayble.server.explore.repository.WaybleZoneDocumentRepository; +import com.wayble.server.user.entity.Gender; +import com.wayble.server.user.entity.LoginType; +import com.wayble.server.user.entity.User; +import com.wayble.server.user.entity.UserType; +import com.wayble.server.user.repository.UserRepository; import com.wayble.server.wayblezone.entity.WaybleZoneType; import org.junit.jupiter.api.*; import org.springframework.beans.factory.annotation.Autowired; @@ -18,7 +24,10 @@ import org.springframework.test.web.servlet.MvcResult; import java.nio.charset.StandardCharsets; +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; import java.util.*; +import java.util.concurrent.ThreadLocalRandom; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.offset; @@ -36,6 +45,12 @@ public class WaybleZoneSearchApiIntegrationTest { @Autowired private WaybleZoneDocumentRepository waybleZoneDocumentRepository; + @Autowired + private UserRepository userRepository; + + @Autowired + private JwtTokenProvider jwtTokenProvider; + @Autowired private ObjectMapper objectMapper; @@ -47,6 +62,10 @@ public class WaybleZoneSearchApiIntegrationTest { private static final String baseUrl = "/api/v1/wayble-zones/search"; + private Long userId; + + private String token; + List nameList = new ArrayList<>(Arrays.asList( "던킨도너츠", "베스킨라빈스", @@ -62,6 +81,15 @@ public class WaybleZoneSearchApiIntegrationTest { @BeforeAll public void setup() { + User testUser = User.createUser( + "testUser", "testUsername", UUID.randomUUID() + "@email", "password", + generateRandomBirthDate(), Gender.MALE, LoginType.KAKAO, UserType.DISABLED + ); + + userRepository.save(testUser); + userId = testUser.getId(); + token = jwtTokenProvider.generateToken(userId, "ROLE_USER"); + for (int i = 1; i <= 1000; i++) { Map points = makeRandomPoint(); Address address = Address.builder() @@ -92,6 +120,7 @@ public void setup() { @AfterAll public void teardown() { waybleZoneDocumentRepository.deleteAll(); + userRepository.deleteAll(); } @Test @@ -114,6 +143,7 @@ public void checkDataExists() { @DisplayName("좌표를 전달받아 반경 이내의 웨이블 존을 거리 순으로 조회") public void findWaybleZoneByDistanceAscending() throws Exception{ MvcResult result = mockMvc.perform(get(baseUrl) + .header("Authorization", "Bearer " + token) .param("latitude", String.valueOf(LATITUDE)) .param("longitude", String.valueOf(LONGITUDE)) .param("radiusKm", String.valueOf(RADIUS)) @@ -162,6 +192,7 @@ public void findWaybleZoneByDistanceAscending() throws Exception{ public void findWaybleZoneByNameAscending() throws Exception{ final String word = nameList.get((int) (Math.random() * nameList.size())).substring(0, 2); MvcResult result = mockMvc.perform(get(baseUrl) + .header("Authorization", "Bearer " + token) .param("latitude", String.valueOf(LATITUDE)) .param("longitude", String.valueOf(LONGITUDE)) .param("radiusKm", String.valueOf(RADIUS)) @@ -215,6 +246,7 @@ public void findWaybleZoneByNameAscending() throws Exception{ public void findWaybleZoneByZoneTypeAscending() throws Exception{ final WaybleZoneType zoneType = WaybleZoneType.CAFE; MvcResult result = mockMvc.perform(get(baseUrl) + .header("Authorization", "Bearer " + token) .param("latitude", String.valueOf(LATITUDE)) .param("longitude", String.valueOf(LONGITUDE)) .param("radiusKm", String.valueOf(RADIUS)) @@ -269,6 +301,7 @@ public void findWaybleZoneByNameAndZoneTypeAscending() throws Exception{ final String word = nameList.get((int) (Math.random() * nameList.size())).substring(0, 2); final WaybleZoneType zoneType = WaybleZoneType.CAFE; MvcResult result = mockMvc.perform(get(baseUrl) + .header("Authorization", "Bearer " + token) .param("latitude", String.valueOf(LATITUDE)) .param("longitude", String.valueOf(LONGITUDE)) .param("radiusKm", String.valueOf(RADIUS)) @@ -348,5 +381,16 @@ private Map makeRandomPoint() { return Map.of("latitude", randomLat, "longitude", randomLng); } + + private LocalDate generateRandomBirthDate() { + LocalDate today = LocalDate.now(); + LocalDate start = today.minusYears(90); // 90세 + LocalDate end = today.minusYears(10); // 10세 + + long daysBetween = ChronoUnit.DAYS.between(start, end); + long randomDays = ThreadLocalRandom.current().nextLong(daysBetween + 1); + + return start.plusDays(randomDays); + } } From 5243f3f5eca761cbbe8812cebba3a578cbac64bf Mon Sep 17 00:00:00 2001 From: KiSeungMin Date: Mon, 21 Jul 2025 15:34:28 +0900 Subject: [PATCH 06/15] =?UTF-8?q?[chore]=20=EC=9B=A8=EC=9D=B4=EB=B8=94?= =?UTF-8?q?=EC=A1=B4=20=EC=B6=94=EC=B2=9C=20service=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=EC=9D=98=20=EC=9D=BC=EB=B6=80=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=EB=A5=BC=20private=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/explore/service/WaybleZoneRecommendService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/wayble/server/explore/service/WaybleZoneRecommendService.java b/src/main/java/com/wayble/server/explore/service/WaybleZoneRecommendService.java index de826816..a9195d46 100644 --- a/src/main/java/com/wayble/server/explore/service/WaybleZoneRecommendService.java +++ b/src/main/java/com/wayble/server/explore/service/WaybleZoneRecommendService.java @@ -57,7 +57,7 @@ public List getWaybleZonePersonalRecommend(Long return recommendResponseDtoList; } - public Optional getTodayRecommendZone(Long userId) { + private Optional getTodayRecommendZone(Long userId) { LocalDate today = LocalDate.now(); Optional recommendLogDocument = recommendLogDocumentRepository.findByUserIdAndRecommendationDate(userId, today); @@ -72,7 +72,7 @@ public Optional getTodayRecommendZone(Long userI } } - public void saveRecommendLog(Long userId, Long zoneId) { + private void saveRecommendLog(Long userId, Long zoneId) { String logId = UUID.randomUUID().toString(); LocalDate dateNow = LocalDate.now(); @@ -88,7 +88,7 @@ public void saveRecommendLog(Long userId, Long zoneId) { recommendLogDocumentRepository.save(recommendLogDocument); } - public void updateRecommendLog(Long userId, Long zoneId) { + private void updateRecommendLog(Long userId, Long zoneId) { RecommendLogDocument recommendLogDocument = recommendLogDocumentRepository.findByUserIdAndZoneId(userId, zoneId) .orElseThrow(() -> new ApplicationException(RecommendErrorCase.RECOMMEND_LOG_NOT_EXIST)); From 00f1bb15026b278a966a64b0e4d7dbce2f94b7a0 Mon Sep 17 00:00:00 2001 From: KiSeungMin Date: Mon, 21 Jul 2025 22:09:36 +0900 Subject: [PATCH 07/15] =?UTF-8?q?[chore]=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=EC=97=90=EC=84=9C=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=B6=9C=EB=A0=A5=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...WaybleZoneRecommendApiIntegrationTest.java | 19 +++---------------- .../WaybleZoneSearchApiIntegrationTest.java | 6 ++---- 2 files changed, 5 insertions(+), 20 deletions(-) diff --git a/src/test/java/com/wayble/server/explore/WaybleZoneRecommendApiIntegrationTest.java b/src/test/java/com/wayble/server/explore/WaybleZoneRecommendApiIntegrationTest.java index 04f1ce4c..5afd5eda 100644 --- a/src/test/java/com/wayble/server/explore/WaybleZoneRecommendApiIntegrationTest.java +++ b/src/test/java/com/wayble/server/explore/WaybleZoneRecommendApiIntegrationTest.java @@ -188,24 +188,17 @@ public void teardown() { @DisplayName("데이터 저장 테스트") public void checkDataExists() { List waybleZoneDocumentList = waybleZoneDocumentRepository.findAll(); - System.out.println("=== 웨이블존 목록 ==="); - assertThat(waybleZoneDocumentList.size()).isGreaterThan(0); + System.out.println("Total documents: " + waybleZoneDocumentList.size()); for (WaybleZoneDocument doc : waybleZoneDocumentList) { assertThat(doc.getZoneId()).isNotNull(); assertThat(doc.getZoneName()).isNotNull(); assertThat(doc.getAddress().getLocation()).isNotNull(); - System.out.println("존 정보: " + doc.toString()); - System.out.println("주소: " + doc.getAddress().toString()); } List waybleZoneVisitLogList = waybleZoneVisitLogDocumentRepository.findAll(); - System.out.println("=== 웨이블존 방문 목록 ==="); - assertThat(waybleZoneVisitLogList.size()).isGreaterThan(0); - for (WaybleZoneVisitLogDocument doc : waybleZoneVisitLogList) { - System.out.println("방문 정보" + doc.toString()); - } + System.out.println("visit log size: " + waybleZoneVisitLogList.size()); } @Test @@ -240,12 +233,6 @@ public void saveRecommendLogTest() throws Exception { assertThat(recommendLogDocument.get().getUserId()).isEqualTo(userId); assertThat(recommendLogDocument.get().getZoneId()).isEqualTo(zoneId); assertThat(recommendLogDocument.get().getRecommendationDate()).isEqualTo(LocalDate.now()); - System.out.println("===recommend log==="); - System.out.println("id = " + recommendLogDocument.get().getId()); - System.out.println("userId = " +recommendLogDocument.get().getUserId()); - System.out.println("zoneId = " +recommendLogDocument.get().getZoneId()); - System.out.println("recommendationDate = " +recommendLogDocument.get().getRecommendationDate()); - System.out.println("recommendCount " +recommendLogDocument.get().getRecommendCount()); } @Test @@ -301,7 +288,7 @@ public void recommendWaybleZoneTop20() throws Exception { .param("userId", String.valueOf(userId)) .param("latitude", String.valueOf(LATITUDE)) .param("longitude", String.valueOf(LONGITUDE)) - .param("count", String.valueOf(20)) + .param("size", String.valueOf(20)) .accept(MediaType.APPLICATION_JSON) ) .andExpect(status().is2xxSuccessful()) diff --git a/src/test/java/com/wayble/server/explore/WaybleZoneSearchApiIntegrationTest.java b/src/test/java/com/wayble/server/explore/WaybleZoneSearchApiIntegrationTest.java index 8c409094..fb87cf4c 100644 --- a/src/test/java/com/wayble/server/explore/WaybleZoneSearchApiIntegrationTest.java +++ b/src/test/java/com/wayble/server/explore/WaybleZoneSearchApiIntegrationTest.java @@ -126,16 +126,14 @@ public void teardown() { @Test public void checkDataExists() { List all = waybleZoneDocumentRepository.findAll(); - System.out.println("=== 저장된 데이터 확인 ==="); - System.out.println("Total documents: " + all.size()); + assertThat(all.size()).isGreaterThan(0); + System.out.println("Total documents: " + all.size()); for (WaybleZoneDocument doc : all) { assertThat(doc.getZoneId()).isNotNull(); assertThat(doc.getZoneName()).isNotNull(); assertThat(doc.getAddress().getLocation()).isNotNull(); - System.out.println("존 정보: " + doc.toString()); - System.out.println("주소: " + doc.getAddress().toString()); } } From 841ccacf44a13e00b01cb4d9155ff13273dd645e Mon Sep 17 00:00:00 2001 From: KiSeungMin Date: Mon, 21 Jul 2025 22:29:50 +0900 Subject: [PATCH 08/15] =?UTF-8?q?[feat]=20Elastic=20Search=20=EC=9B=A8?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=EC=A1=B4=20=EA=B0=9D=EC=B2=B4=20=EC=9E=A5?= =?UTF-8?q?=EC=95=A0=20=EC=8B=9C=EC=84=A4=20=EC=A0=95=EB=B3=B4=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../explore/entity/EsWaybleZoneFacility.java | 34 +++++++++++++++++++ .../explore/entity/WaybleZoneDocument.java | 5 +++ 2 files changed, 39 insertions(+) create mode 100644 src/main/java/com/wayble/server/explore/entity/EsWaybleZoneFacility.java diff --git a/src/main/java/com/wayble/server/explore/entity/EsWaybleZoneFacility.java b/src/main/java/com/wayble/server/explore/entity/EsWaybleZoneFacility.java new file mode 100644 index 00000000..d1268c84 --- /dev/null +++ b/src/main/java/com/wayble/server/explore/entity/EsWaybleZoneFacility.java @@ -0,0 +1,34 @@ +package com.wayble.server.explore.entity; + +import com.wayble.server.wayblezone.entity.WaybleZoneFacility; +import lombok.*; + +@ToString +@Builder(access = AccessLevel.PRIVATE) +@Getter +@AllArgsConstructor(access = AccessLevel.PROTECTED) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class EsWaybleZoneFacility { + + private boolean hasSlope; + private boolean hasNoDoorStep; + private boolean hasElevator; + private boolean hasTableSeat; + private boolean hasDisabledToilet; + private String floorInfo; + + public static EsWaybleZoneFacility from(WaybleZoneFacility facility) { + if (facility == null) { + return null; + } + + return EsWaybleZoneFacility.builder() + .hasSlope(facility.isHasSlope()) + .hasNoDoorStep(facility.isHasNoDoorStep()) + .hasElevator(facility.isHasElevator()) + .hasTableSeat(facility.isHasTableSeat()) + .hasDisabledToilet(facility.isHasDisabledToilet()) + .floorInfo(facility.getFloorInfo()) + .build(); + } +} diff --git a/src/main/java/com/wayble/server/explore/entity/WaybleZoneDocument.java b/src/main/java/com/wayble/server/explore/entity/WaybleZoneDocument.java index 09ad5e90..f5cdce4d 100644 --- a/src/main/java/com/wayble/server/explore/entity/WaybleZoneDocument.java +++ b/src/main/java/com/wayble/server/explore/entity/WaybleZoneDocument.java @@ -33,6 +33,9 @@ public class WaybleZoneDocument { @Field(type = FieldType.Object) private EsAddress address; + @Field(type = FieldType.Object) + private EsWaybleZoneFacility facility; + private double averageRating; private long reviewCount; @@ -44,6 +47,7 @@ public static WaybleZoneDocument fromEntity(WaybleZone waybleZone) { .zoneType(waybleZone.getZoneType()) .thumbnailImageUrl("thumbnail image url") // TODO: 이미지 경로 추가 .address(EsAddress.from(waybleZone.getAddress())) + .facility(EsWaybleZoneFacility.from(waybleZone.getFacility())) .averageRating(0.0) .reviewCount(0L) .build(); @@ -56,6 +60,7 @@ public static WaybleZoneDocument fromDto(WaybleZoneDocumentRegisterDto dto) { .zoneType(dto.waybleZoneType()) .thumbnailImageUrl(dto.thumbnailImageUrl()) .address(EsAddress.from(dto.address())) + .facility(EsWaybleZoneFacility.from(dto.facility())) .averageRating(dto.averageRating() != null ? dto.averageRating() : 0.0) .reviewCount(dto.reviewCount() != null ? dto.reviewCount() : 0L) .build(); From 946727497a4cec58eb80de119e2443e07ec1c1bf Mon Sep 17 00:00:00 2001 From: KiSeungMin Date: Mon, 21 Jul 2025 22:30:12 +0900 Subject: [PATCH 09/15] =?UTF-8?q?[feat]=20Elastic=20Search=20dto=EC=97=90?= =?UTF-8?q?=20=EC=9E=A5=EC=95=A0=20=EC=8B=9C=EC=84=A4=20=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=20=EC=97=94=ED=8B=B0=ED=8B=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../explore/dto/FacilityResponseDto.java | 29 +++++++++++++++++++ .../WaybleZoneRecommendResponseDto.java | 4 +++ .../search/WaybleZoneDocumentRegisterDto.java | 2 ++ .../search/WaybleZoneSearchResponseDto.java | 6 +++- 4 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/wayble/server/explore/dto/FacilityResponseDto.java diff --git a/src/main/java/com/wayble/server/explore/dto/FacilityResponseDto.java b/src/main/java/com/wayble/server/explore/dto/FacilityResponseDto.java new file mode 100644 index 00000000..b80eb4b9 --- /dev/null +++ b/src/main/java/com/wayble/server/explore/dto/FacilityResponseDto.java @@ -0,0 +1,29 @@ +package com.wayble.server.explore.dto; + +import com.wayble.server.explore.entity.EsWaybleZoneFacility; +import lombok.Builder; + +@Builder +public record FacilityResponseDto( + Boolean hasSlope, + Boolean hasNoDoorStep, + Boolean hasElevator, + Boolean hasTableSeat, + Boolean hasDisabledToilet, + String floorInfo +) { + public static FacilityResponseDto from(EsWaybleZoneFacility facility) { + if (facility == null) { + return null; + } + + return FacilityResponseDto.builder() + .hasSlope(facility.isHasSlope()) + .hasNoDoorStep(facility.isHasNoDoorStep()) + .hasElevator(facility.isHasElevator()) + .hasTableSeat(facility.isHasTableSeat()) + .hasDisabledToilet(facility.isHasDisabledToilet()) + .floorInfo(facility.getFloorInfo()) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/wayble/server/explore/dto/recommend/WaybleZoneRecommendResponseDto.java b/src/main/java/com/wayble/server/explore/dto/recommend/WaybleZoneRecommendResponseDto.java index 051c0495..743519b1 100644 --- a/src/main/java/com/wayble/server/explore/dto/recommend/WaybleZoneRecommendResponseDto.java +++ b/src/main/java/com/wayble/server/explore/dto/recommend/WaybleZoneRecommendResponseDto.java @@ -1,5 +1,6 @@ package com.wayble.server.explore.dto.recommend; +import com.wayble.server.explore.dto.FacilityResponseDto; import com.wayble.server.explore.entity.WaybleZoneDocument; import com.wayble.server.wayblezone.entity.WaybleZoneType; import lombok.Builder; @@ -23,6 +24,8 @@ public record WaybleZoneRecommendResponseDto( Long reviewCount, + FacilityResponseDto facility, + Double distanceScore, Double similarityScore, @@ -42,6 +45,7 @@ public static WaybleZoneRecommendResponseDto from(WaybleZoneDocument waybleZoneD .reviewCount(waybleZoneDocument.getReviewCount()) .latitude(waybleZoneDocument.getAddress().getLocation().getLat()) .longitude(waybleZoneDocument.getAddress().getLocation().getLon()) + .facility(FacilityResponseDto.from(waybleZoneDocument.getFacility())) .distanceScore(0.0) .similarityScore(0.0) .recencyScore(0.0) diff --git a/src/main/java/com/wayble/server/explore/dto/search/WaybleZoneDocumentRegisterDto.java b/src/main/java/com/wayble/server/explore/dto/search/WaybleZoneDocumentRegisterDto.java index 67120fce..9017ca7f 100644 --- a/src/main/java/com/wayble/server/explore/dto/search/WaybleZoneDocumentRegisterDto.java +++ b/src/main/java/com/wayble/server/explore/dto/search/WaybleZoneDocumentRegisterDto.java @@ -1,6 +1,7 @@ package com.wayble.server.explore.dto.search; import com.wayble.server.common.entity.Address; +import com.wayble.server.wayblezone.entity.WaybleZoneFacility; import com.wayble.server.wayblezone.entity.WaybleZoneType; import lombok.Builder; @@ -11,6 +12,7 @@ public record WaybleZoneDocumentRegisterDto( WaybleZoneType waybleZoneType, String thumbnailImageUrl, Address address, + WaybleZoneFacility facility, Double averageRating, Long reviewCount ) { diff --git a/src/main/java/com/wayble/server/explore/dto/search/WaybleZoneSearchResponseDto.java b/src/main/java/com/wayble/server/explore/dto/search/WaybleZoneSearchResponseDto.java index aebf57ea..a6b10d48 100644 --- a/src/main/java/com/wayble/server/explore/dto/search/WaybleZoneSearchResponseDto.java +++ b/src/main/java/com/wayble/server/explore/dto/search/WaybleZoneSearchResponseDto.java @@ -1,5 +1,6 @@ package com.wayble.server.explore.dto.search; +import com.wayble.server.explore.dto.FacilityResponseDto; import com.wayble.server.explore.entity.WaybleZoneDocument; import com.wayble.server.wayblezone.entity.WaybleZoneType; import lombok.AccessLevel; @@ -24,7 +25,9 @@ public record WaybleZoneSearchResponseDto( Double averageRating, - Long reviewCount + Long reviewCount, + + FacilityResponseDto facility ) { public static WaybleZoneSearchResponseDto from(WaybleZoneDocument waybleZoneDocument, Double distance) { return WaybleZoneSearchResponseDto.builder() @@ -37,6 +40,7 @@ public static WaybleZoneSearchResponseDto from(WaybleZoneDocument waybleZoneDocu .distance(distance) .latitude(waybleZoneDocument.getAddress().getLocation().getLat()) .longitude(waybleZoneDocument.getAddress().getLocation().getLon()) + .facility(FacilityResponseDto.from(waybleZoneDocument.getFacility())) .build(); } } From 9a17da30c5099aedf134a9b7e7efcf5eb31701d0 Mon Sep 17 00:00:00 2001 From: KiSeungMin Date: Mon, 21 Jul 2025 22:38:52 +0900 Subject: [PATCH 10/15] =?UTF-8?q?[feat]=20Wayble=20Zone=20mapping.json=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=EC=97=90=20=EC=9E=A5=EC=95=A0=20=EC=8B=9C?= =?UTF-8?q?=EC=84=A4=20=EC=A0=95=EB=B3=B4=20=EC=9D=B8=EB=8D=B1=EC=8A=A4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../settings/wayble_zone_mappings.json | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/main/resources/elasticsearch/settings/wayble_zone_mappings.json b/src/main/resources/elasticsearch/settings/wayble_zone_mappings.json index cf56946e..48a09902 100644 --- a/src/main/resources/elasticsearch/settings/wayble_zone_mappings.json +++ b/src/main/resources/elasticsearch/settings/wayble_zone_mappings.json @@ -7,6 +7,29 @@ }, "address.location": { "type": "geo_point" + }, + "facility": { + "type": "object", + "properties": { + "hasSlope": { + "type": "boolean" + }, + "hasNoDoorStep": { + "type": "boolean" + }, + "hasElevator": { + "type": "boolean" + }, + "hasTableSeat": { + "type": "boolean" + }, + "hasDisabledToilet": { + "type": "boolean" + }, + "floorInfo": { + "type": "keyword" + } + } } } } \ No newline at end of file From 47b220eea14b0a6cd6dc97f98795bd5532cf7f01 Mon Sep 17 00:00:00 2001 From: KiSeungMin Date: Mon, 21 Jul 2025 22:47:54 +0900 Subject: [PATCH 11/15] =?UTF-8?q?[feat]=20=EA=B2=80=EC=83=89,=20=EC=B6=94?= =?UTF-8?q?=EC=B2=9C=20=EC=BF=BC=EB=A6=AC=20=EB=A1=9C=EC=A7=81=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=9E=A5=EC=95=A0=20=EC=8B=9C=EC=84=A4=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/recommend/WaybleZoneQueryRecommendRepository.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/wayble/server/explore/repository/recommend/WaybleZoneQueryRecommendRepository.java b/src/main/java/com/wayble/server/explore/repository/recommend/WaybleZoneQueryRecommendRepository.java index 8a2d65eb..0bd4f435 100644 --- a/src/main/java/com/wayble/server/explore/repository/recommend/WaybleZoneQueryRecommendRepository.java +++ b/src/main/java/com/wayble/server/explore/repository/recommend/WaybleZoneQueryRecommendRepository.java @@ -139,6 +139,7 @@ public List searchPersonalWaybleZones(User user, .longitude(zone.getAddress().getLocation().getLon()) .averageRating(zone.getAverageRating()) .reviewCount(zone.getReviewCount()) + .facility(com.wayble.server.explore.dto.FacilityResponseDto.from(zone.getFacility())) .distanceScore(distanceScore) .similarityScore(similarityScore) .recencyScore(recencyScore) From 350df6c6af8c11474a397275f9acec3e5e0c2253 Mon Sep 17 00:00:00 2001 From: KiSeungMin Date: Mon, 21 Jul 2025 23:02:45 +0900 Subject: [PATCH 12/15] =?UTF-8?q?[feat]=20=EC=9E=A5=EC=95=A0=20=EC=8B=9C?= =?UTF-8?q?=EC=84=A4=20=EC=A0=95=EB=B3=B4=20api=20=EC=9D=91=EB=8B=B5=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...WaybleZoneRecommendApiIntegrationTest.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/test/java/com/wayble/server/explore/WaybleZoneRecommendApiIntegrationTest.java b/src/test/java/com/wayble/server/explore/WaybleZoneRecommendApiIntegrationTest.java index 5afd5eda..83fe14f5 100644 --- a/src/test/java/com/wayble/server/explore/WaybleZoneRecommendApiIntegrationTest.java +++ b/src/test/java/com/wayble/server/explore/WaybleZoneRecommendApiIntegrationTest.java @@ -20,6 +20,7 @@ import com.wayble.server.user.entity.User; import com.wayble.server.user.entity.UserType; import com.wayble.server.user.repository.UserRepository; +import com.wayble.server.wayblezone.entity.WaybleZoneFacility; import com.wayble.server.wayblezone.entity.WaybleZoneType; import org.junit.jupiter.api.*; import org.springframework.beans.factory.annotation.Autowired; @@ -134,6 +135,8 @@ public void setup() { .longitude(points.get("longitude")) .build(); + WaybleZoneFacility facility = createRandomFacility(i); + WaybleZoneDocumentRegisterDto dto = WaybleZoneDocumentRegisterDto .builder() .zoneId((long) i) @@ -141,6 +144,7 @@ public void setup() { .address(address) .thumbnailImageUrl("thumbnail url" + i) .waybleZoneType(WaybleZoneType.values()[i % WaybleZoneType.values().length]) + .facility(facility) .averageRating(Math.random() * 5) .reviewCount((long)(Math.random() * 500)) .build(); @@ -264,6 +268,13 @@ public void recommendWaybleZone() throws Exception { assertThat(dto.zoneType()).isNotNull(); assertThat(dto.latitude()).isNotNull(); assertThat(dto.longitude()).isNotNull(); + assertThat(dto.facility()).isNotNull(); + assertThat(dto.facility().hasSlope()).isNotNull(); + assertThat(dto.facility().hasNoDoorStep()).isNotNull(); + assertThat(dto.facility().hasElevator()).isNotNull(); + assertThat(dto.facility().hasTableSeat()).isNotNull(); + assertThat(dto.facility().hasDisabledToilet()).isNotNull(); + assertThat(dto.facility().floorInfo()).isNotNull(); System.out.println("zoneId = " + dto.zoneId()); System.out.println("zoneName = " + dto.zoneName()); @@ -278,6 +289,17 @@ public void recommendWaybleZone() throws Exception { System.out.println("similarityScore = " + dto.similarityScore()); System.out.println("recencyScore = " + dto.recencyScore()); System.out.println("totalScore = " + dto.totalScore()); + System.out.println("=== Facility Info ==="); + if (dto.facility() != null) { + System.out.println("hasSlope = " + dto.facility().hasSlope()); + System.out.println("hasNoDoorStep = " + dto.facility().hasNoDoorStep()); + System.out.println("hasElevator = " + dto.facility().hasElevator()); + System.out.println("hasTableSeat = " + dto.facility().hasTableSeat()); + System.out.println("hasDisabledToilet = " + dto.facility().hasDisabledToilet()); + System.out.println("floorInfo = " + dto.facility().floorInfo()); + } else { + System.out.println("facility info is null"); + } } @Test @@ -377,4 +399,19 @@ private LocalDate generateRandomBirthDate() { return start.plusDays(randomDays); } + + private WaybleZoneFacility createRandomFacility(int i) { + Random random = new Random(i); // 시드 고정으로 재현 가능한 랜덤 + + String[] floors = {"B1", "1층", "2층", "3층"}; + + return WaybleZoneFacility.builder() + .hasSlope(random.nextBoolean()) + .hasNoDoorStep(random.nextBoolean()) + .hasElevator(random.nextBoolean()) + .hasTableSeat(random.nextBoolean()) + .hasDisabledToilet(random.nextBoolean()) + .floorInfo(floors[random.nextInt(floors.length)]) + .build(); + } } From f33972f170af1fcf36d8777dc24cfbdfe1e71f24 Mon Sep 17 00:00:00 2001 From: KiSeungMin Date: Mon, 21 Jul 2025 23:02:49 +0900 Subject: [PATCH 13/15] =?UTF-8?q?[feat]=20=EC=9E=A5=EC=95=A0=20=EC=8B=9C?= =?UTF-8?q?=EC=84=A4=20=EC=A0=95=EB=B3=B4=20api=20=EC=9D=91=EB=8B=B5=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WaybleZoneSearchApiIntegrationTest.java | 46 ++++++++++++++++++- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/wayble/server/explore/WaybleZoneSearchApiIntegrationTest.java b/src/test/java/com/wayble/server/explore/WaybleZoneSearchApiIntegrationTest.java index fb87cf4c..dd561d35 100644 --- a/src/test/java/com/wayble/server/explore/WaybleZoneSearchApiIntegrationTest.java +++ b/src/test/java/com/wayble/server/explore/WaybleZoneSearchApiIntegrationTest.java @@ -14,6 +14,7 @@ import com.wayble.server.user.entity.User; import com.wayble.server.user.entity.UserType; import com.wayble.server.user.repository.UserRepository; +import com.wayble.server.wayblezone.entity.WaybleZoneFacility; import com.wayble.server.wayblezone.entity.WaybleZoneType; import org.junit.jupiter.api.*; import org.springframework.beans.factory.annotation.Autowired; @@ -102,12 +103,15 @@ public void setup() { .longitude(points.get("longitude")) .build(); + WaybleZoneFacility facility = createRandomFacility(i); + WaybleZoneDocumentRegisterDto dto = WaybleZoneDocumentRegisterDto .builder() .zoneId((long) i) .zoneName(nameList.get((int) (Math.random() * nameList.size()))) .address(address) .waybleZoneType(WaybleZoneType.values()[i % WaybleZoneType.values().length]) + .facility(facility) .averageRating(Math.random() * 5) .reviewCount((long)(Math.random() * 500)) .build(); @@ -178,10 +182,33 @@ public void findWaybleZoneByDistanceAscending() throws Exception{ dto.distance(), dtoList.get(i-1).distance()) .isGreaterThanOrEqualTo(dtoList.get(i - 1).distance()); } + + // facility 검증 추가 + assertThat(dto.facility()).isNotNull(); + assertThat(dto.facility().hasSlope()).isNotNull(); + assertThat(dto.facility().hasNoDoorStep()).isNotNull(); + assertThat(dto.facility().hasElevator()).isNotNull(); + assertThat(dto.facility().hasTableSeat()).isNotNull(); + assertThat(dto.facility().hasDisabledToilet()).isNotNull(); + assertThat(dto.facility().floorInfo()).isNotNull(); } - for (WaybleZoneSearchResponseDto dto : dtoList) { - System.out.println(dto.toString()); + + if (!dtoList.isEmpty()) { + WaybleZoneSearchResponseDto firstDto = dtoList.get(0); + System.out.println("=== Search Result - Facility Info ==="); + System.out.println("zoneId = " + firstDto.zoneId()); + System.out.println("zoneName = " + firstDto.zoneName()); + if (firstDto.facility() != null) { + System.out.println("hasSlope = " + firstDto.facility().hasSlope()); + System.out.println("hasNoDoorStep = " + firstDto.facility().hasNoDoorStep()); + System.out.println("hasElevator = " + firstDto.facility().hasElevator()); + System.out.println("hasTableSeat = " + firstDto.facility().hasTableSeat()); + System.out.println("hasDisabledToilet = " + firstDto.facility().hasDisabledToilet()); + System.out.println("floorInfo = " + firstDto.facility().floorInfo()); + } else { + System.out.println("facility info is null"); + } } } @@ -390,5 +417,20 @@ private LocalDate generateRandomBirthDate() { return start.plusDays(randomDays); } + + private WaybleZoneFacility createRandomFacility(int i) { + Random random = new Random(i); // 시드 고정으로 재현 가능한 랜덤 + + String[] floors = {"B1", "1층", "2층", "3층"}; + + return WaybleZoneFacility.builder() + .hasSlope(random.nextBoolean()) + .hasNoDoorStep(random.nextBoolean()) + .hasElevator(random.nextBoolean()) + .hasTableSeat(random.nextBoolean()) + .hasDisabledToilet(random.nextBoolean()) + .floorInfo(floors[random.nextInt(floors.length)]) + .build(); + } } From 49aac1ad5ecda55cdc735af2b80047c1ea4c3ed1 Mon Sep 17 00:00:00 2001 From: KiSeungMin Date: Mon, 21 Jul 2025 23:15:45 +0900 Subject: [PATCH 14/15] =?UTF-8?q?[feat]=20=EC=A7=80=EB=8F=84=20=EA=B2=80?= =?UTF-8?q?=EC=83=89=20=EA=B8=B0=EB=B0=98=20=EA=B2=80=EC=83=89=20api?= =?UTF-8?q?=EC=9D=98=20=EC=97=94=EB=93=9C=ED=8F=AC=EC=9D=B8=ED=8A=B8?= =?UTF-8?q?=EC=97=90=20/maps=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../explore/controller/WaybleZoneSearchController.java | 2 +- .../explore/WaybleZoneSearchApiIntegrationTest.java | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/wayble/server/explore/controller/WaybleZoneSearchController.java b/src/main/java/com/wayble/server/explore/controller/WaybleZoneSearchController.java index 00141839..0ac6d6c6 100644 --- a/src/main/java/com/wayble/server/explore/controller/WaybleZoneSearchController.java +++ b/src/main/java/com/wayble/server/explore/controller/WaybleZoneSearchController.java @@ -21,7 +21,7 @@ public class WaybleZoneSearchController { private final WaybleZoneSearchService waybleZoneSearchService; - @GetMapping("") + @GetMapping("/maps") public CommonResponse> findByCondition( @Valid @ModelAttribute WaybleZoneSearchConditionDto conditionDto, @RequestParam(name = "page", defaultValue = "0") int page, diff --git a/src/test/java/com/wayble/server/explore/WaybleZoneSearchApiIntegrationTest.java b/src/test/java/com/wayble/server/explore/WaybleZoneSearchApiIntegrationTest.java index dd561d35..5b38ba6e 100644 --- a/src/test/java/com/wayble/server/explore/WaybleZoneSearchApiIntegrationTest.java +++ b/src/test/java/com/wayble/server/explore/WaybleZoneSearchApiIntegrationTest.java @@ -144,7 +144,7 @@ public void checkDataExists() { @Test @DisplayName("좌표를 전달받아 반경 이내의 웨이블 존을 거리 순으로 조회") public void findWaybleZoneByDistanceAscending() throws Exception{ - MvcResult result = mockMvc.perform(get(baseUrl) + MvcResult result = mockMvc.perform(get(baseUrl + "/maps") .header("Authorization", "Bearer " + token) .param("latitude", String.valueOf(LATITUDE)) .param("longitude", String.valueOf(LONGITUDE)) @@ -216,7 +216,7 @@ public void findWaybleZoneByDistanceAscending() throws Exception{ @DisplayName("특정 단어가 포함된 웨이블존을 거리 순으로 반환") public void findWaybleZoneByNameAscending() throws Exception{ final String word = nameList.get((int) (Math.random() * nameList.size())).substring(0, 2); - MvcResult result = mockMvc.perform(get(baseUrl) + MvcResult result = mockMvc.perform(get(baseUrl + "/maps") .header("Authorization", "Bearer " + token) .param("latitude", String.valueOf(LATITUDE)) .param("longitude", String.valueOf(LONGITUDE)) @@ -270,7 +270,7 @@ public void findWaybleZoneByNameAscending() throws Exception{ @DisplayName("특정 타입의 웨이블존을 거리 순으로 반환") public void findWaybleZoneByZoneTypeAscending() throws Exception{ final WaybleZoneType zoneType = WaybleZoneType.CAFE; - MvcResult result = mockMvc.perform(get(baseUrl) + MvcResult result = mockMvc.perform(get(baseUrl + "/maps") .header("Authorization", "Bearer " + token) .param("latitude", String.valueOf(LATITUDE)) .param("longitude", String.valueOf(LONGITUDE)) @@ -325,7 +325,7 @@ public void findWaybleZoneByZoneTypeAscending() throws Exception{ public void findWaybleZoneByNameAndZoneTypeAscending() throws Exception{ final String word = nameList.get((int) (Math.random() * nameList.size())).substring(0, 2); final WaybleZoneType zoneType = WaybleZoneType.CAFE; - MvcResult result = mockMvc.perform(get(baseUrl) + MvcResult result = mockMvc.perform(get(baseUrl + "/maps") .header("Authorization", "Bearer " + token) .param("latitude", String.valueOf(LATITUDE)) .param("longitude", String.valueOf(LONGITUDE)) From 8b70d24bb6506aa0d62be91b26b1d738bb05a57a Mon Sep 17 00:00:00 2001 From: KiSeungMin Date: Mon, 21 Jul 2025 23:26:30 +0900 Subject: [PATCH 15/15] =?UTF-8?q?[feat]=20WaybleZoneDocument=EC=9D=98=20?= =?UTF-8?q?=EC=8D=B8=EB=84=A4=EC=9D=BC=20=EC=9D=B4=EB=AF=B8=EC=A7=80?= =?UTF-8?q?=EB=A5=BC=20=EC=9B=A8=EC=9D=B4=EB=B8=94=EC=A1=B4=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=EB=A1=9C=EB=B6=80=ED=84=B0=20=EC=A0=84?= =?UTF-8?q?=EB=8B=AC=EB=B0=9B=EB=8F=84=EB=A1=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/wayble/server/explore/entity/WaybleZoneDocument.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/wayble/server/explore/entity/WaybleZoneDocument.java b/src/main/java/com/wayble/server/explore/entity/WaybleZoneDocument.java index f5cdce4d..59fdbe1f 100644 --- a/src/main/java/com/wayble/server/explore/entity/WaybleZoneDocument.java +++ b/src/main/java/com/wayble/server/explore/entity/WaybleZoneDocument.java @@ -45,7 +45,7 @@ public static WaybleZoneDocument fromEntity(WaybleZone waybleZone) { .zoneId(waybleZone.getId()) .zoneName(waybleZone.getZoneName()) .zoneType(waybleZone.getZoneType()) - .thumbnailImageUrl("thumbnail image url") // TODO: 이미지 경로 추가 + .thumbnailImageUrl(waybleZone.getMainImageUrl() != null ? waybleZone.getMainImageUrl() : null) // TODO: 이미지 경로 추가 .address(EsAddress.from(waybleZone.getAddress())) .facility(EsWaybleZoneFacility.from(waybleZone.getFacility())) .averageRating(0.0)