From ab21ae49e10089af8cfc2bea8e70199a92b2656b Mon Sep 17 00:00:00 2001 From: youbeen Date: Tue, 17 Jun 2025 09:21:11 +0900 Subject: [PATCH] member preferences serviceimpl add --- dump.rdb | Bin 0 -> 92 bytes .../member/repository/jpa/TagRepository.java | 48 ++++++++ .../member/service/PreferenceServiceImpl.java | 116 ++++++++++++++++++ .../ktds/hi/store/biz/service/TagService.java | 2 - 4 files changed, 164 insertions(+), 2 deletions(-) create mode 100644 dump.rdb create mode 100644 member/src/main/java/com/ktds/hi/member/repository/jpa/TagRepository.java create mode 100644 member/src/main/java/com/ktds/hi/member/service/PreferenceServiceImpl.java diff --git a/dump.rdb b/dump.rdb new file mode 100644 index 0000000000000000000000000000000000000000..5c686cf3bf8d8ba093e8e6eb235efa7941364f4d GIT binary patch literal 92 zcmWG?b@2=~Ffg$E#aWb^l3A=^c#YZY07LpCjQ{`u literal 0 HcmV?d00001 diff --git a/member/src/main/java/com/ktds/hi/member/repository/jpa/TagRepository.java b/member/src/main/java/com/ktds/hi/member/repository/jpa/TagRepository.java new file mode 100644 index 0000000..5e8b7da --- /dev/null +++ b/member/src/main/java/com/ktds/hi/member/repository/jpa/TagRepository.java @@ -0,0 +1,48 @@ +// member/src/main/java/com/ktds/hi/member/repository/jpa/TagRepository.java +package com.ktds.hi.member.repository.jpa; + +import com.ktds.hi.member.repository.entity.TagEntity; +import com.ktds.hi.member.repository.entity.TagCategory; +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 TagRepository extends JpaRepository { + + /** + * 태그명 목록으로 활성 태그 조회 + */ + List findByTagNameInAndIsActiveTrue(List tagNames); + + /** + * 활성 태그 전체 조회 (카테고리, 정렬순서별 정렬) + */ + List findByIsActiveTrueOrderByTagCategoryAscSortOrderAsc(); + + /** + * 카테고리별 활성 태그 조회 (정렬순서별 정렬) + */ + List findByTagCategoryAndIsActiveTrueOrderBySortOrderAsc(TagCategory tagCategory); + + /** + * 태그명으로 태그 조회 + */ + Optional findByTagNameAndIsActiveTrue(String tagName); + + /** + * 카테고리별 태그 개수 조회 + */ + Long countByTagCategoryAndIsActiveTrue(TagCategory tagCategory); + + /** + * 활성 태그 존재 여부 확인 + */ + boolean existsByTagNameAndIsActiveTrue(String tagName); +} \ No newline at end of file diff --git a/member/src/main/java/com/ktds/hi/member/service/PreferenceServiceImpl.java b/member/src/main/java/com/ktds/hi/member/service/PreferenceServiceImpl.java new file mode 100644 index 0000000..d8206f9 --- /dev/null +++ b/member/src/main/java/com/ktds/hi/member/service/PreferenceServiceImpl.java @@ -0,0 +1,116 @@ +// member/src/main/java/com/ktds/hi/member/service/PreferenceServiceImpl.java +package com.ktds.hi.member.service; + +import com.ktds.hi.member.dto.PreferenceRequest; +import com.ktds.hi.member.dto.TasteTagResponse; +import com.ktds.hi.member.domain.TagType; +import com.ktds.hi.member.repository.entity.PreferenceEntity; +import com.ktds.hi.member.repository.entity.TagEntity; +import com.ktds.hi.member.repository.entity.TagCategory; +import com.ktds.hi.member.repository.jpa.PreferenceRepository; +import com.ktds.hi.member.repository.jpa.TagRepository; +import com.ktds.hi.common.exception.BusinessException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 취향 관리 서비스 구현체 + * 취향 정보 등록/수정 및 태그 관리 기능을 구현 + */ +@Service +@RequiredArgsConstructor +@Slf4j +@Transactional +public class PreferenceServiceImpl implements PreferenceService { + + private final PreferenceRepository preferenceRepository; + private final TagRepository tagRepository; + + @Override + public void savePreference(Long memberId, PreferenceRequest request) { + // 태그 유효성 검증 + List existingTags = tagRepository.findByTagNameInAndIsActiveTrue(request.getTags()); + if (existingTags.size() != request.getTags().size()) { + throw new BusinessException("유효하지 않은 태그가 포함되어 있습니다"); + } + + // 기존 취향 정보 조회 + PreferenceEntity preference = preferenceRepository.findByMemberId(memberId) + .orElse(null); + + if (preference != null) { + // 기존 정보 업데이트 + preference.updatePreference(request.getTags(), request.getHealthInfo(), request.getSpicyLevel()); + } else { + // 새로운 취향 정보 생성 + preference = PreferenceEntity.builder() + .memberId(memberId) + .tags(request.getTags()) + .healthInfo(request.getHealthInfo()) + .spicyLevel(request.getSpicyLevel()) + .build(); + } + + preferenceRepository.save(preference); + + log.info("취향 정보 저장 완료: memberId={}, tags={}", memberId, request.getTags()); + } + + @Override + @Transactional(readOnly = true) + public List getAvailableTags() { + List tags = tagRepository.findByIsActiveTrueOrderByTagCategoryAscSortOrderAsc(); + + return tags.stream() + .map(tag -> TasteTagResponse.builder() + .id(tag.getId()) + .tagName(tag.getTagName()) + .tagType(convertTagCategoryToTagType(tag.getTagCategory())) + .description(tag.getTagCategory().getDescription()) + .build()) + .collect(Collectors.toList()); + } + + @Override + @Transactional(readOnly = true) + public List getTagsByType(TagType tagType) { + TagCategory tagCategory = convertTagTypeToTagCategory(tagType); + List tags = tagRepository.findByTagCategoryAndIsActiveTrueOrderBySortOrderAsc(tagCategory); + + return tags.stream() + .map(tag -> TasteTagResponse.builder() + .id(tag.getId()) + .tagName(tag.getTagName()) + .tagType(tagType) + .description(tag.getTagCategory().getDescription()) + .build()) + .collect(Collectors.toList()); + } + + /** + * TagCategory를 TagType으로 변환 (기존 호환성을 위해) + */ + private TagType convertTagCategoryToTagType(TagCategory tagCategory) { + // TagType enum이 존재한다면 적절한 매핑 로직 구현 + // 임시로 기본값 반환 + return TagType.TASTE; // 실제 매핑 로직 필요 + } + + /** + * TagType을 TagCategory로 변환 (기존 호환성을 위해) + */ + private TagCategory convertTagTypeToTagCategory(TagType tagType) { + // TagType에 따른 TagCategory 매핑 + switch (tagType) { + case TASTE: + return TagCategory.TASTE; + default: + return TagCategory.TASTE; + } + } +} \ No newline at end of file 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 38dd36a..9fcf1a9 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 @@ -28,8 +28,6 @@ public class TagService implements TagUseCase { private final TagRepositoryPort tagRepositoryPort; - - @Override public List getTopClickedTags() { log.info("가장 많이 클릭된 상위 5개 태그 조회 시작");