diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/user/dto/ManagerSignupRequestDto.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/user/dto/ManagerSignupRequestDto.java index 8b327e01..7f807bea 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/user/dto/ManagerSignupRequestDto.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/user/dto/ManagerSignupRequestDto.java @@ -28,7 +28,7 @@ public class ManagerSignupRequestDto { private String password; @NotBlank - @Pattern(regexp = "^[a-zA-Z가-힣]{2,12}$") + @Pattern(regexp = "^[a-zA-Z가-힣0-9]{2,12}$", message = "2~12자 사이의 영문, 한글, 숫자만 입력 가능합니다.") @Schema(description = "이름(예시)", example = "김노웻") private String nickname; diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/controller/StoreController.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/controller/StoreController.java index b39a53a8..1373b875 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/controller/StoreController.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/controller/StoreController.java @@ -88,12 +88,12 @@ public ResponseEntity getStoreById(@PathVariable Long storeId) { @GetMapping("/search") @Operation(summary = "주점 이름으로 주점 검색", description = "주점 이름을 기준으로 주점을 검색합니다.") @ApiResponse(responseCode = "200", description = "주점 검색 성공") - public ResponseEntity searchStores(@RequestParam("name") String name) { + public ResponseEntity searchStores(@RequestParam("keyword") String keyword) { return ResponseEntity .ok() .body( ApiUtils.success( - storeService.searchStoresByName(name) + storeService.searchByKeywordNative(keyword) ) ); } diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreService.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreService.java index 3df99912..78fe8738 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreService.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreService.java @@ -19,6 +19,6 @@ public interface StoreService { StorePageReadDto getStoreByStoreId(Long storeId); - List searchStoresByName(String name); + List searchByKeywordNative(String name); } diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreServiceImpl.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreServiceImpl.java index 8b9a5a5e..e365df8f 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreServiceImpl.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreServiceImpl.java @@ -144,13 +144,14 @@ public StorePageReadDto getStoreByStoreId(Long storeId) { } @Override - public List searchStoresByName(String name) { - if (name == null || name.isBlank()) { + public List searchByKeywordNative(String keyword) { + if (keyword == null || keyword.isBlank()) { throw new StoreParamEmptyException(); } // 1) 페이징된 Store 스냅샷 조회 - List stores = storeRepository.findByNameContainingIgnoreCaseAndDeletedFalse(name); + // List stores = storeRepository.findByNameContainingIgnoreCaseAndDeletedFalse(keyword); + List stores = storeRepository.searchByKeywordNative(keyword); // 2) 각 StoreId / Department ID 추출 List storeIds = stores.stream() diff --git a/nowait-domain/domain-core-rdb/build.gradle b/nowait-domain/domain-core-rdb/build.gradle index 954fbd42..48bcad51 100644 --- a/nowait-domain/domain-core-rdb/build.gradle +++ b/nowait-domain/domain-core-rdb/build.gradle @@ -39,7 +39,6 @@ dependencies { annotationProcessor 'org.projectlombok:lombok:1.18.26' //QueryDsl - // TODO Q클래스 생성시 오류 발생 해결 필요 implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" diff --git a/nowait-domain/domain-admin-rdb/src/main/java/com/nowait/domainadminrdb/config/QueryDslConfig.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/config/QueryDslConfig.java similarity index 91% rename from nowait-domain/domain-admin-rdb/src/main/java/com/nowait/domainadminrdb/config/QueryDslConfig.java rename to nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/config/QueryDslConfig.java index 6c04df39..f75d497b 100644 --- a/nowait-domain/domain-admin-rdb/src/main/java/com/nowait/domainadminrdb/config/QueryDslConfig.java +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/config/QueryDslConfig.java @@ -1,4 +1,4 @@ -package com.nowait.domainadminrdb.config; +package com.nowait.domaincorerdb.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/repository/StoreCustomRepository.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/repository/StoreCustomRepository.java new file mode 100644 index 00000000..4d6a1f2a --- /dev/null +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/repository/StoreCustomRepository.java @@ -0,0 +1,4 @@ +package com.nowait.domaincorerdb.store.repository; + +public interface StoreCustomRepository { +} diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/repository/StoreCustomRepositoryImpl.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/repository/StoreCustomRepositoryImpl.java new file mode 100644 index 00000000..82820c1d --- /dev/null +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/repository/StoreCustomRepositoryImpl.java @@ -0,0 +1,17 @@ +package com.nowait.domaincorerdb.store.repository; + +import org.springframework.stereotype.Repository; + +import com.nowait.domaincorerdb.store.entity.QStore; +import com.querydsl.jpa.impl.JPAQueryFactory; + +import lombok.RequiredArgsConstructor; + +@Repository +@RequiredArgsConstructor +public class StoreCustomRepositoryImpl implements StoreCustomRepository { + + private final JPAQueryFactory queryFactory; + + private final QStore store = QStore.store; +} diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/repository/StoreRepository.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/repository/StoreRepository.java index fbc0ebca..283a1a0e 100644 --- a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/repository/StoreRepository.java +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/repository/StoreRepository.java @@ -8,22 +8,30 @@ import org.springframework.data.domain.Slice; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import com.nowait.domaincorerdb.store.entity.Store; @Repository -public interface StoreRepository extends JpaRepository { +public interface StoreRepository extends JpaRepository, StoreCustomRepository { List findAllByDeletedFalse(); Optional findByStoreIdAndDeletedFalse(Long storeId); - List findByNameContainingIgnoreCaseAndDeletedFalse(String name); - Slice findAllByDeletedFalseOrderByStoreIdAsc(Pageable pageable); - // TODO queryDSL으로 전환? - @Query("select s.storeId from Store s where s.isActive = true and s.deleted = false") - List findAllActiveStoreIds(); + @Query(value = """ + SELECT DISTINCT s.* + FROM stores s + LEFT JOIN departments d ON s.department_id = d.id + WHERE s.deleted = false + AND ( + MATCH(s.name) AGAINST(:kw) + OR MATCH(d.name) AGAINST(:kw) + ) + """, + nativeQuery = true) + List searchByKeywordNative(@Param("kw") String booleanKeyword); }