diff --git a/analytics/src/main/java/com/ktds/hi/analytics/infra/controller/AnalyticsController.java b/analytics/src/main/java/com/ktds/hi/analytics/infra/controller/AnalyticsController.java index 16f89d2..119510b 100644 --- a/analytics/src/main/java/com/ktds/hi/analytics/infra/controller/AnalyticsController.java +++ b/analytics/src/main/java/com/ktds/hi/analytics/infra/controller/AnalyticsController.java @@ -13,6 +13,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; import jakarta.validation.constraints.*; @@ -151,8 +152,10 @@ public class AnalyticsController { @Parameter(description = "AI 피드백 ID", required = true) @PathVariable @NotNull Long feedbackId, @RequestBody ActionPlanCreateRequest request, + @AuthenticationPrincipal long id, HttpServletRequest httpRequest) { + System.out.println("test => " + id); // validation 체크 if (request.getActionPlanSelect() == null || request.getActionPlanSelect().isEmpty()) { diff --git a/common/src/main/resources/application-common.yml b/common/src/main/resources/application-common.yml index 0ce9faa..f7ecdf3 100644 --- a/common/src/main/resources/application-common.yml +++ b/common/src/main/resources/application-common.yml @@ -20,7 +20,7 @@ spring: # Redis 설정 data: redis: - host: ${REDIS_HOST:localhost} //로컬 + host: ${REDIS_HOST:localhost} port: ${REDIS_PORT:6379} password: ${REDIS_PASSWORD:} timeout: 2000ms diff --git a/dump.rdb b/dump.rdb index 5c686cf..1d341a2 100644 Binary files a/dump.rdb and b/dump.rdb differ diff --git a/logs/recommend-service.log.2025-06-16.0.gz b/logs/recommend-service.log.2025-06-16.0.gz new file mode 100644 index 0000000..fcbaa6a Binary files /dev/null and b/logs/recommend-service.log.2025-06-16.0.gz differ diff --git a/store/src/main/java/com/ktds/hi/store/biz/service/TagService.java b/store/src/main/java/com/ktds/hi/store/biz/service/TagService.java index 9fcf1a9..ae4d93a 100644 --- a/store/src/main/java/com/ktds/hi/store/biz/service/TagService.java +++ b/store/src/main/java/com/ktds/hi/store/biz/service/TagService.java @@ -3,6 +3,7 @@ package com.ktds.hi.store.biz.service; import com.ktds.hi.store.biz.usecase.in.TagUseCase; import com.ktds.hi.store.biz.usecase.out.TagRepositoryPort; import com.ktds.hi.store.domain.Tag; +import com.ktds.hi.store.infra.dto.response.AllTagResponse; import com.ktds.hi.store.infra.dto.response.TopClickedTagResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -29,10 +30,28 @@ public class TagService implements TagUseCase { private final TagRepositoryPort tagRepositoryPort; @Override - public List getTopClickedTags() { + public List getAllTags() { + log.info("모든 활성화된 태그 목록 조회 시작"); + + List tags = tagRepositoryPort.findAllActiveTags(); + + List responses = tags.stream() + .map(tag -> AllTagResponse.builder() + .id(tag.getId()) + .tagCategory(tag.getTagCategory().name()) + .tagName(tag.getTagName()) + .build()) + .collect(Collectors.toList()); + + log.info("모든 활성화된 태그 목록 조회 완료: count={}", responses.size()); + return responses; + } + + @Override + public List getTopClickedTags(Integer storeId) { log.info("가장 많이 클릭된 상위 5개 태그 조회 시작"); - List topTags = tagRepositoryPort.findTopClickedTags(); + List topTags = tagRepositoryPort.findTopClickedTags(storeId); AtomicInteger rank = new AtomicInteger(1); diff --git a/store/src/main/java/com/ktds/hi/store/biz/usecase/in/TagUseCase.java b/store/src/main/java/com/ktds/hi/store/biz/usecase/in/TagUseCase.java index ac15128..0954242 100644 --- a/store/src/main/java/com/ktds/hi/store/biz/usecase/in/TagUseCase.java +++ b/store/src/main/java/com/ktds/hi/store/biz/usecase/in/TagUseCase.java @@ -1,5 +1,6 @@ package com.ktds.hi.store.biz.usecase.in; +import com.ktds.hi.store.infra.dto.response.AllTagResponse; import com.ktds.hi.store.infra.dto.response.TopClickedTagResponse; import java.util.List; @@ -13,10 +14,17 @@ import java.util.List; */ public interface TagUseCase { + /** + * 모든 활성화된 태그 목록 조회 + * + * @return 모든 태그 목록 + */ + List getAllTags(); + /** * 가장 많이 클릭된 상위 5개 태그 조회 */ - List getTopClickedTags(); + List getTopClickedTags(Integer storeId); /** * 태그 클릭 이벤트 처리 diff --git a/store/src/main/java/com/ktds/hi/store/biz/usecase/out/ExternalPlatformPort.java b/store/src/main/java/com/ktds/hi/store/biz/usecase/out/ExternalPlatformPort.java index b0f2f60..f535187 100644 --- a/store/src/main/java/com/ktds/hi/store/biz/usecase/out/ExternalPlatformPort.java +++ b/store/src/main/java/com/ktds/hi/store/biz/usecase/out/ExternalPlatformPort.java @@ -1,108 +1,108 @@ -package com.ktds.hi.store.biz.usecase.out; + package com.ktds.hi.store.biz.usecase.out; -import java.util.List; -import java.util.Map; - -/** - * 외부 플랫폼 포트 인터페이스 - * 외부 플랫폼 연동 기능을 정의 - * - * @author 하이오더 개발팀 - * @version 1.0.0 - */ -public interface ExternalPlatformPort { + import java.util.List; + import java.util.Map; /** - * 네이버 리뷰 동기화 + * 외부 플랫폼 포트 인터페이스 + * 외부 플랫폼 연동 기능을 정의 * - * @param storeId 매장 ID - * @param externalStoreId 외부 매장 ID - * @return 동기화된 리뷰 수 + * @author 하이오더 개발팀 + * @version 1.0.0 */ - int syncNaverReviews(Long storeId, String externalStoreId); + public interface ExternalPlatformPort { - /** - * 카카오 리뷰 동기화 - * - * @param storeId 매장 ID - * @param externalStoreId 외부 매장 ID - * @return 동기화된 리뷰 수 - */ - int syncKakaoReviews(Long storeId, String externalStoreId); + /** + * 네이버 리뷰 동기화 + * + * @param storeId 매장 ID + * @param externalStoreId 외부 매장 ID + * @return 동기화된 리뷰 수 + */ + int syncNaverReviews(Long storeId, String externalStoreId); - /** - * 구글 리뷰 동기화 - * - * @param storeId 매장 ID - * @param externalStoreId 외부 매장 ID - * @return 동기화된 리뷰 수 - */ - int syncGoogleReviews(Long storeId, String externalStoreId); + /** + * 카카오 리뷰 동기화 + * + * @param storeId 매장 ID + * @param externalStoreId 외부 매장 ID + * @return 동기화된 리뷰 수 + */ + int syncKakaoReviews(Long storeId, String externalStoreId); - /** - * 하이오더 리뷰 동기화 - * - * @param storeId 매장 ID - * @param externalStoreId 외부 매장 ID - * @return 동기화된 리뷰 수 - */ - int syncHiorderReviews(Long storeId, String externalStoreId); + /** + * 구글 리뷰 동기화 + * + * @param storeId 매장 ID + * @param externalStoreId 외부 매장 ID + * @return 동기화된 리뷰 수 + */ + int syncGoogleReviews(Long storeId, String externalStoreId); - /** - * 네이버 계정 연동 - * - * @param storeId 매장 ID - * @param username 사용자명 - * @param password 비밀번호 - * @return 연동 성공 여부 - */ - boolean connectNaverAccount(Long storeId, String username, String password); + /** + * 하이오더 리뷰 동기화 + * + * @param storeId 매장 ID + * @param externalStoreId 외부 매장 ID + * @return 동기화된 리뷰 수 + */ + int syncHiorderReviews(Long storeId, String externalStoreId); - /** - * 카카오 계정 연동 - * - * @param storeId 매장 ID - * @param username 사용자명 - * @param password 비밀번호 - * @return 연동 성공 여부 - */ - boolean connectKakaoAccount(Long storeId, String username, String password); + /** + * 네이버 계정 연동 + * + * @param storeId 매장 ID + * @param username 사용자명 + * @param password 비밀번호 + * @return 연동 성공 여부 + */ + boolean connectNaverAccount(Long storeId, String username, String password); - /** - * 구글 계정 연동 - * - * @param storeId 매장 ID - * @param username 사용자명 - * @param password 비밀번호 - * @return 연동 성공 여부 - */ - boolean connectGoogleAccount(Long storeId, String username, String password); + /** + * 카카오 계정 연동 + * + * @param storeId 매장 ID + * @param username 사용자명 + * @param password 비밀번호 + * @return 연동 성공 여부 + */ + boolean connectKakaoAccount(Long storeId, String username, String password); - /** - * 하이오더 계정 연동 - * - * @param storeId 매장 ID - * @param username 사용자명 - * @param password 비밀번호 - * @return 연동 성공 여부 - */ - boolean connectHiorderAccount(Long storeId, String username, String password); + /** + * 구글 계정 연동 + * + * @param storeId 매장 ID + * @param username 사용자명 + * @param password 비밀번호 + * @return 연동 성공 여부 + */ + boolean connectGoogleAccount(Long storeId, String username, String password); - /** - * 외부 플랫폼 연동 해제 - * - * @param storeId 매장 ID - * @param platform 플랫폼명 (NAVER, KAKAO, GOOGLE, HIORDER) - * @return 연동 해제 성공 여부 - */ - boolean disconnectPlatform(Long storeId, String platform); - /** - * 연동된 플랫폼 목록 조회 - * - * @param storeId 매장 ID - * @return 연동된 플랫폼 목록 - */ - List getConnectedPlatforms(Long storeId); + /** + * 하이오더 계정 연동 + * + * @param storeId 매장 ID + * @param username 사용자명 + * @param password 비밀번호 + * @return 연동 성공 여부 + */ + boolean connectHiorderAccount(Long storeId, String username, String password); - public List> getTempReviews(Long storeId, String platform); -} \ No newline at end of file + /** + * 외부 플랫폼 연동 해제 + * + * @param storeId 매장 ID + * @param platform 플랫폼명 (NAVER, KAKAO, GOOGLE, HIORDER) + * @return 연동 해제 성공 여부 + */ + boolean disconnectPlatform(Long storeId, String platform); + /** + * 연동된 플랫폼 목록 조회 + * + * @param storeId 매장 ID + * @return 연동된 플랫폼 목록 + */ + List getConnectedPlatforms(Long storeId); + + public List> getTempReviews(Long storeId, String platform); + } \ No newline at end of file diff --git a/store/src/main/java/com/ktds/hi/store/biz/usecase/out/TagRepositoryPort.java b/store/src/main/java/com/ktds/hi/store/biz/usecase/out/TagRepositoryPort.java index c511d33..62516c3 100644 --- a/store/src/main/java/com/ktds/hi/store/biz/usecase/out/TagRepositoryPort.java +++ b/store/src/main/java/com/ktds/hi/store/biz/usecase/out/TagRepositoryPort.java @@ -33,7 +33,7 @@ public interface TagRepositoryPort { /** * 가장 많이 클릭된 상위 5개 태그 조회 */ - List findTopClickedTags(); + List findTopClickedTags(Integer storeId); /** * 태그 클릭 수 증가 diff --git a/store/src/main/java/com/ktds/hi/store/infra/controller/TagController.java b/store/src/main/java/com/ktds/hi/store/infra/controller/TagController.java index ad467ba..8b474a3 100644 --- a/store/src/main/java/com/ktds/hi/store/infra/controller/TagController.java +++ b/store/src/main/java/com/ktds/hi/store/infra/controller/TagController.java @@ -1,6 +1,7 @@ package com.ktds.hi.store.infra.controller; import com.ktds.hi.store.biz.usecase.in.TagUseCase; +import com.ktds.hi.store.infra.dto.response.AllTagResponse; import com.ktds.hi.store.infra.dto.response.TopClickedTagResponse; import com.ktds.hi.common.dto.ApiResponse; import io.swagger.v3.oas.annotations.Operation; @@ -26,14 +27,26 @@ public class TagController { private final TagUseCase tagUseCase; + /** + * 모든 활성화된 태그 목록 조회 API + */ + @GetMapping + @Operation(summary = "모든 태그 조회", description = "활성화된 모든 태그 목록을 조회합니다.") + public ResponseEntity>> getAllTags() { + + List tags = tagUseCase.getAllTags(); + + return ResponseEntity.ok(ApiResponse.success(tags)); + } + /** * 가장 많이 클릭된 상위 5개 태그 조회 API */ - @GetMapping("/top-clicked") + @GetMapping("/top-clicked/{storeId}") @Operation(summary = "인기 태그 조회", description = "가장 많이 클릭된 상위 5개 태그를 조회합니다.") - public ResponseEntity>> getTopClickedTags() { + public ResponseEntity>> getTopClickedTags(Integer storeId) { - List topTags = tagUseCase.getTopClickedTags(); + List topTags = tagUseCase.getTopClickedTags(storeId); return ResponseEntity.ok(ApiResponse.success(topTags)); } diff --git a/store/src/main/java/com/ktds/hi/store/infra/dto/response/AllTagResponse.java b/store/src/main/java/com/ktds/hi/store/infra/dto/response/AllTagResponse.java new file mode 100644 index 0000000..50fbbb4 --- /dev/null +++ b/store/src/main/java/com/ktds/hi/store/infra/dto/response/AllTagResponse.java @@ -0,0 +1,31 @@ +package com.ktds.hi.store.infra.dto.response; + +import lombok.Builder; +import lombok.Getter; + +/** + * 모든 태그 응답 DTO + * 태그 기본 정보를 담는 응답 클래스 + * + * @author 하이오더 개발팀 + * @version 1.0.0 + */ +@Getter +@Builder +public class AllTagResponse { + + /** + * 태그 ID + */ + private Long id; + + /** + * 태그 카테고리 + */ + private String tagCategory; + + /** + * 태그명 + */ + private String tagName; +} diff --git a/store/src/main/java/com/ktds/hi/store/infra/gateway/ExternalPlatformAdapter.java b/store/src/main/java/com/ktds/hi/store/infra/gateway/ExternalPlatformAdapter.java index c025780..18ad7ea 100644 --- a/store/src/main/java/com/ktds/hi/store/infra/gateway/ExternalPlatformAdapter.java +++ b/store/src/main/java/com/ktds/hi/store/infra/gateway/ExternalPlatformAdapter.java @@ -71,6 +71,8 @@ public class ExternalPlatformAdapter implements ExternalPlatformPort { return 0; } } + + //*****// @Override public int syncKakaoReviews(Long storeId, String externalStoreId) { log.info("카카오 리뷰 동기화 시작: storeId={}, externalStoreId={}", storeId, externalStoreId); diff --git a/store/src/main/java/com/ktds/hi/store/infra/gateway/TagRepositoryAdapter.java b/store/src/main/java/com/ktds/hi/store/infra/gateway/TagRepositoryAdapter.java index d81799d..cd90fec 100644 --- a/store/src/main/java/com/ktds/hi/store/infra/gateway/TagRepositoryAdapter.java +++ b/store/src/main/java/com/ktds/hi/store/infra/gateway/TagRepositoryAdapter.java @@ -57,10 +57,10 @@ public class TagRepositoryAdapter implements TagRepositoryPort { } @Override - public List findTopClickedTags() { + public List findTopClickedTags(Integer storeId) { log.info("가장 많이 클릭된 상위 5개 태그 조회"); - List entities = tagJpaRepository.findTop5ByOrderByClickCountDesc( + List entities = tagJpaRepository.findTop5ByOrderByClickCountDesc(storeId, PageRequest.of(0, 5) ); diff --git a/store/src/main/java/com/ktds/hi/store/infra/gateway/repository/TagJpaRepository.java b/store/src/main/java/com/ktds/hi/store/infra/gateway/repository/TagJpaRepository.java index 9653d85..01e3019 100644 --- a/store/src/main/java/com/ktds/hi/store/infra/gateway/repository/TagJpaRepository.java +++ b/store/src/main/java/com/ktds/hi/store/infra/gateway/repository/TagJpaRepository.java @@ -4,6 +4,7 @@ import com.ktds.hi.store.domain.TagCategory; import com.ktds.hi.store.infra.gateway.entity.TagEntity; import io.lettuce.core.dynamic.annotation.Param; import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; @@ -55,6 +56,6 @@ public interface TagJpaRepository extends JpaRepository { /** * 클릭 수 기준 상위 5개 태그 조회 */ - @Query("SELECT t FROM TagEntity t WHERE t.isActive = true ORDER BY t.clickCount DESC") - List findTop5ByOrderByClickCountDesc(PageRequest pageRequest); + @Query("SELECT t FROM TagEntity t JOIN t.stores s WHERE s.id = :storeId AND t.isActive = true ORDER BY t.clickCount DESC") + List findTop5ByStoreIdOrderByClickCountDesc(@Param("storeId") Long storeId, Pageable pageable); List findTop5ByOrderByClickCountDesc(Integer storeId, PageRequest pageRequest); } diff --git a/store/src/main/resources/application.yml b/store/src/main/resources/application.yml index ee056a3..5293339 100644 --- a/store/src/main/resources/application.yml +++ b/store/src/main/resources/application.yml @@ -24,6 +24,7 @@ spring: eventhub: connection-string: ${AZURE_EVENTHUB_CONNECTION_STRING} + data: redis: host: ${REDIS_HOST:localhost}