From d92f6b7bac7eeacaa03bf79b1af3f59e5e6c86b9 Mon Sep 17 00:00:00 2001 From: lsh9672 Date: Thu, 12 Jun 2025 18:34:02 +0900 Subject: [PATCH] =?UTF-8?q?Fix=20:=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../recommend/biz/domain/PreferenceTag.java | 33 ++++++++ .../biz/service/TasteAnalysisInteractor.java | 25 ++++++ .../biz/usecase/in/TasteAnalysisUseCase.java | 8 ++ .../usecase/out/PreferenceTagRepository.java | 33 ++++++++ .../PreferenceTagRepositoryAdapter.java | 78 +++++++++++++++++++ .../gateway/entity/PreferenceTagEntity.java | 44 +++++++++++ .../PreferenceTagJpaRepository.java | 31 ++++++++ 7 files changed, 252 insertions(+) create mode 100644 recommend/src/main/java/com/ktds/hi/recommend/biz/domain/PreferenceTag.java create mode 100644 recommend/src/main/java/com/ktds/hi/recommend/biz/usecase/out/PreferenceTagRepository.java create mode 100644 recommend/src/main/java/com/ktds/hi/recommend/infra/gateway/PreferenceTagRepositoryAdapter.java create mode 100644 recommend/src/main/java/com/ktds/hi/recommend/infra/gateway/entity/PreferenceTagEntity.java create mode 100644 recommend/src/main/java/com/ktds/hi/recommend/infra/gateway/repository/PreferenceTagJpaRepository.java diff --git a/recommend/src/main/java/com/ktds/hi/recommend/biz/domain/PreferenceTag.java b/recommend/src/main/java/com/ktds/hi/recommend/biz/domain/PreferenceTag.java new file mode 100644 index 0000000..362e012 --- /dev/null +++ b/recommend/src/main/java/com/ktds/hi/recommend/biz/domain/PreferenceTag.java @@ -0,0 +1,33 @@ +package com.ktds.hi.recommend.biz.domain; + +import lombok.Builder; +import lombok.Getter; + +/** + * 취향 태그 도메인 클래스 + * 사용자 취향 태그 정보를 나타냄 + */ +@Getter +@Builder +public class PreferenceTag { + + private Long id; + private String tagName; + private String category; + private String icon; + private String description; + private boolean isActive; + + /** + * 정적 팩토리 메서드 - 기본 태그 생성 + */ + public static PreferenceTag of(String tagName, String category, String icon, String description) { + return PreferenceTag.builder() + .tagName(tagName) + .category(category) + .icon(icon) + .description(description) + .isActive(true) + .build(); + } +} diff --git a/recommend/src/main/java/com/ktds/hi/recommend/biz/service/TasteAnalysisInteractor.java b/recommend/src/main/java/com/ktds/hi/recommend/biz/service/TasteAnalysisInteractor.java index 24e094b..67a31c0 100644 --- a/recommend/src/main/java/com/ktds/hi/recommend/biz/service/TasteAnalysisInteractor.java +++ b/recommend/src/main/java/com/ktds/hi/recommend/biz/service/TasteAnalysisInteractor.java @@ -1,9 +1,12 @@ package com.ktds.hi.recommend.biz.service; +import com.ktds.hi.recommend.biz.domain.PreferenceTag; import com.ktds.hi.recommend.biz.usecase.in.TasteAnalysisUseCase; +import com.ktds.hi.recommend.biz.usecase.out.PreferenceTagRepository; import com.ktds.hi.recommend.biz.usecase.out.UserPreferenceRepository; import com.ktds.hi.recommend.biz.domain.TasteProfile; import com.ktds.hi.recommend.biz.domain.TasteCategory; +import com.ktds.hi.recommend.infra.dto.response.PreferenceTagResponse; import com.ktds.hi.recommend.infra.dto.response.TasteAnalysisResponse; import com.ktds.hi.common.exception.BusinessException; import lombok.RequiredArgsConstructor; @@ -26,6 +29,7 @@ import java.util.stream.Collectors; public class TasteAnalysisInteractor implements TasteAnalysisUseCase { private final UserPreferenceRepository userPreferenceRepository; + private final PreferenceTagRepository preferenceTagRepository; @Override @Transactional(readOnly = true) @@ -76,4 +80,25 @@ public class TasteAnalysisInteractor implements TasteAnalysisUseCase { throw new BusinessException("취향 프로필 업데이트 중 오류가 발생했습니다: " + e.getMessage()); } } + + @Override + public List getAvailablePreferenceTags() { + log.info("가용한 취향 태그 목록 조회"); + + try { + List tags = preferenceTagRepository.findAllActiveTags(); + + return tags.stream() + .map(tag -> PreferenceTagResponse.builder() + .tagName(tag.getTagName()) + .icon(tag.getIcon()) + .description(tag.getDescription()) + .build()) + .collect(Collectors.toList()); + + } catch (Exception e) { + log.error("취향 태그 목록 조회 중 오류 발생", e); + throw new BusinessException("취향 태그 목록 조회에 실패했습니다"); + } + } } diff --git a/recommend/src/main/java/com/ktds/hi/recommend/biz/usecase/in/TasteAnalysisUseCase.java b/recommend/src/main/java/com/ktds/hi/recommend/biz/usecase/in/TasteAnalysisUseCase.java index ce5f58c..65ed3b3 100644 --- a/recommend/src/main/java/com/ktds/hi/recommend/biz/usecase/in/TasteAnalysisUseCase.java +++ b/recommend/src/main/java/com/ktds/hi/recommend/biz/usecase/in/TasteAnalysisUseCase.java @@ -1,5 +1,8 @@ package com.ktds.hi.recommend.biz.usecase.in; +import java.util.List; + +import com.ktds.hi.recommend.infra.dto.response.PreferenceTagResponse; import com.ktds.hi.recommend.infra.dto.response.TasteAnalysisResponse; /** @@ -17,4 +20,9 @@ public interface TasteAnalysisUseCase { * 취향 프로필 업데이트 */ void updateTasteProfile(Long memberId); + + /** + * 가용한 취향 태그 목록 조회 + */ + List getAvailablePreferenceTags(); } diff --git a/recommend/src/main/java/com/ktds/hi/recommend/biz/usecase/out/PreferenceTagRepository.java b/recommend/src/main/java/com/ktds/hi/recommend/biz/usecase/out/PreferenceTagRepository.java new file mode 100644 index 0000000..d04b224 --- /dev/null +++ b/recommend/src/main/java/com/ktds/hi/recommend/biz/usecase/out/PreferenceTagRepository.java @@ -0,0 +1,33 @@ +package com.ktds.hi.recommend.biz.usecase.out; + +import com.ktds.hi.recommend.biz.domain.PreferenceTag; + +import java.util.List; +import java.util.Optional; + +/** + * 취향 태그 Repository 인터페이스 + * 취향 태그 관련 데이터 액세스 기능을 정의 + */ +public interface PreferenceTagRepository { + + /** + * 활성화된 모든 취향 태그 조회 + */ + List findAllActiveTags(); + + /** + * 태그 ID로 태그 조회 + */ + Optional findById(Long tagId); + + /** + * 태그명으로 태그 조회 + */ + Optional findByTagName(String tagName); + + /** + * 카테고리별 태그 조회 + */ + List findByCategory(String category); +} diff --git a/recommend/src/main/java/com/ktds/hi/recommend/infra/gateway/PreferenceTagRepositoryAdapter.java b/recommend/src/main/java/com/ktds/hi/recommend/infra/gateway/PreferenceTagRepositoryAdapter.java new file mode 100644 index 0000000..3476ade --- /dev/null +++ b/recommend/src/main/java/com/ktds/hi/recommend/infra/gateway/PreferenceTagRepositoryAdapter.java @@ -0,0 +1,78 @@ +package com.ktds.hi.recommend.infra.gateway; + +import com.ktds.hi.recommend.biz.usecase.out.PreferenceTagRepository; +import com.ktds.hi.recommend.biz.domain.PreferenceTag; +import com.ktds.hi.recommend.infra.gateway.repository.PreferenceTagJpaRepository; +import com.ktds.hi.recommend.infra.gateway.entity.PreferenceTagEntity; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * 취향 태그 Repository 어댑터 클래스 + * PreferenceTagRepository를 구현하여 취향 태그 데이터 액세스 기능을 제공 + */ +@Component +@RequiredArgsConstructor +@Slf4j +public class PreferenceTagRepositoryAdapter implements PreferenceTagRepository { + + private final PreferenceTagJpaRepository preferenceTagJpaRepository; + + @Override + public List findAllActiveTags() { + log.info("활성화된 모든 취향 태그 조회"); + + List entities = preferenceTagJpaRepository.findByIsActiveTrueOrderByTagName(); + + return entities.stream() + .map(this::toPreferenceTag) + .collect(Collectors.toList()); + } + + @Override + public Optional findById(Long tagId) { + log.info("태그 ID로 태그 조회: tagId={}", tagId); + + return preferenceTagJpaRepository.findById(tagId) + .filter(entity -> entity.getIsActive()) + .map(this::toPreferenceTag); + } + + @Override + public Optional findByTagName(String tagName) { + log.info("태그명으로 태그 조회: tagName={}", tagName); + + return preferenceTagJpaRepository.findByTagNameAndIsActiveTrue(tagName) + .map(this::toPreferenceTag); + } + + @Override + public List findByCategory(String category) { + log.info("카테고리별 태그 조회: category={}", category); + + List entities = preferenceTagJpaRepository.findByCategoryAndIsActiveTrueOrderByTagName(category); + + return entities.stream() + .map(this::toPreferenceTag) + .collect(Collectors.toList()); + } + + /** + * 엔티티를 도메인으로 변환 + */ + private PreferenceTag toPreferenceTag(PreferenceTagEntity entity) { + return PreferenceTag.builder() + .id(entity.getId()) + .tagName(entity.getTagName()) + .category(entity.getCategory()) + .icon(entity.getIcon()) + .description(entity.getDescription()) + .isActive(entity.getIsActive()) + .build(); + } +} diff --git a/recommend/src/main/java/com/ktds/hi/recommend/infra/gateway/entity/PreferenceTagEntity.java b/recommend/src/main/java/com/ktds/hi/recommend/infra/gateway/entity/PreferenceTagEntity.java new file mode 100644 index 0000000..568f528 --- /dev/null +++ b/recommend/src/main/java/com/ktds/hi/recommend/infra/gateway/entity/PreferenceTagEntity.java @@ -0,0 +1,44 @@ +package com.ktds.hi.recommend.infra.gateway.entity; + + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +//TODO : BASEENtity 빠져있음. 추가 필요 + + +/** + * 취향 태그 엔티티 클래스 + * 데이터베이스 preference_tags 테이블과 매핑되는 JPA 엔티티 + */ +@Entity +@Table(name = "preference_tags") +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PreferenceTagEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "tag_name", unique = true, nullable = false, length = 50) + private String tagName; + + @Column(name = "category", length = 50) + private String category; + + @Column(name = "icon", length = 10) + private String icon; + + @Column(name = "description", length = 200) + private String description; + + @Column(name = "is_active") + @Builder.Default + private Boolean isActive = true; +} diff --git a/recommend/src/main/java/com/ktds/hi/recommend/infra/gateway/repository/PreferenceTagJpaRepository.java b/recommend/src/main/java/com/ktds/hi/recommend/infra/gateway/repository/PreferenceTagJpaRepository.java new file mode 100644 index 0000000..f9f5094 --- /dev/null +++ b/recommend/src/main/java/com/ktds/hi/recommend/infra/gateway/repository/PreferenceTagJpaRepository.java @@ -0,0 +1,31 @@ +package com.ktds.hi.recommend.infra.gateway.repository; + +import com.ktds.hi.recommend.infra.gateway.entity.PreferenceTagEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +/** + * 취향 태그 JPA 리포지토리 인터페이스 + * 취향 태그 데이터의 CRUD 작업을 담당 + */ +@Repository +public interface PreferenceTagJpaRepository extends JpaRepository { + + /** + * 활성화된 태그 목록 조회 + */ + List findByIsActiveTrueOrderByTagName(); + + /** + * 태그명으로 태그 조회 + */ + Optional findByTagNameAndIsActiveTrue(String tagName); + + /** + * 카테고리별 활성화된 태그 조회 + */ + List findByCategoryAndIsActiveTrueOrderByTagName(String category); +}